<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Feeling

        三人行,必有我師焉

       ::  :: 新隨筆 :: 聯系 ::  :: 管理 ::
      185 隨筆 :: 0 文章 :: 392 評論 :: 0 Trackbacks
    上個星期在Sourceforge的Feeling項目下新增加了一個org.eclipse.swt.extension子項目,意在增強SWT的本機功能。我一向是SWT的Fans,不過卻很抵觸大型的RCP項目,喜歡only dependent SWT。經過一個星期的努力,現在已經整合了在Win32平臺下獲取系統、磁盤、內存、CPU相關信息,注冊表,以及系統鉤子等功能,喜歡SWT的朋友可以試用。目前還沒有放出一個版本,請通過sf的CVS下載代碼:

    cvs -d:pserver:anonymous@feeling.cvs.sourceforge.net:/cvsroot/feeling login

    由于一直使用的都是Java,對Win32編程并不是非常熟悉。但局限于Java的功能,對我們有相當大的限制,IBM就屢屢向突破這個限制,因此產生了SWT。這里我重點想說的是怎么使用Win32的系統鉤子。SWT里已經包含了大量的Win32函數,不過那都是局限于Eclipse的需要,如果Eclipse不需要,SWT是不予以優先考慮的。通過SWT我們很容易使用線程鉤子監控自己程序的鍵盤鼠標事件,而且封裝的很好。但是想使用系統鉤子確是一件不可能的事情,先看看鉤子的函數原型:

    ?HHOOK?SetWindowsHookEx(?int??idHook,?HOOKPROC?lpfn,?HINSTANCE?hMod,?DWORD?dwThreadId);?


    idHook --
    系統鉤子類型,實際上是一個int值,具體的定義請看MSDN
    lpfn -- 鉤子回調函數指針,當收到鉤子消息時就執行這個回調函數,回調函數有3個參數,不同類型的鉤子這3個參數有不同的含義,具體請看MSDN。
    hMod -- DLL實例句柄(我猜是這樣,我不熟悉Win32API編程),當鉤子為系統鉤子時這個參數是必須的,如果是單個程序或者線程使用的鉤子那么可以不用這個值。
    dwThreadId -- 線程ID,如果是單個程序或者線程使用的鉤子這個參數是必須的。

    在SWT生成的DLL中,并沒有系統鉤子必須用到的hMod,并不像一般的DLL有DllMain入口可以接受到DLL實例句柄。因此我們只要在JNI下的C代碼里添加這個DLL實例句柄就可以完成系統鉤子的功能了:

    #define?Dll_Export?__declspec(dllexport)

    HINSTANCE?instance?
    =?NULL;

    BOOL?APIENTRY?DllMain(HINSTANCE?hInstance,?DWORD??ul_reason_for_call,?LPVOID?lpReserved)
    {
    ????instance?
    =?hInstance;
    ????
    return?TRUE;
    }


    Dll_Export?HHOOK?SetHook(
    int?hookType,HOOKPROC?hookproc)
    {
    ????
    return?SetWindowsHookEx(hookType,?hookproc,?instance,?NULL);
    }


    Dll_Export?BOOL?UnHook(HHOOK?hook)
    {
    ????
    if(hook?!=?NULL)
    ????????
    return?UnhookWindowsHookEx(hook);
    ????
    else
    ????????
    return?0;
    }


    #ifndef?NO_SetSystemHook
    JNIEXPORT?jint?JNICALL?Swt_extension_NATIVE(SetSystemHook)
    ????(JNIEnv?
    *env,?jclass?that,?jint?arg0,?jint?arg1)
    {
    ????jint?rc?
    =?0;
    ????rc?
    =?(jint)SetHook(arg0,?(HOOKPROC)arg1);
    ????
    return?rc;
    }

    #endif

    #ifndef?NO_UnSystemHook
    JNIEXPORT?jboolean?JNICALL?Swt_extension_NATIVE(UnSystemHook)
    ????(JNIEnv?
    *env,?jclass?that,?jint?arg0)
    {
    ????jboolean?rc?
    =?0;
    ????rc?
    =?(jboolean)UnHook((HHOOK)arg0);
    ????
    return?rc;
    }

    #endif

    那么通過SWT來實現系統鉤子有多大難度呢?各位看看代碼就知道了:

    Callback?callback?=?new?Callback?(this,?"keyHook",?3);?//$NON-NLS-1$
    int?proc?=?callback.getAddress?();
    hook?
    =?Extension.SetSystemHook(13,?proc);

    ………………………………

    int?keyHook(int?nCode,int?wParam,int?lParam)
    {
    ????
    int?Result=OS.CallNextHookEx(hook,nCode,wParam,lParam);
    ????………………
    ????
    return?Result;
    }

    很簡單吧^_^
    posted on 2006-11-27 11:59 三人行,必有我師焉 閱讀(3687) 評論(4)  編輯  收藏

    評論

    # re: SWT Extension:在Win32平臺下運用Java使用注冊表和系統鉤子 2006-11-28 10:18 心內求法
    頂了!
    另外想請教一下,文中的代碼是怎么發布的呢?  回復  更多評論
      

    # re: SWT Extension:在Win32平臺下運用Java使用注冊表和系統鉤子 2006-11-28 18:53 三人行,必有我師焉
    編輯器里有一個按鈕是編輯代碼的,點進去copy你的代碼就好了  回復  更多評論
      

    # re: SWT Extension:在Win32平臺下運用Java使用注冊表和系統鉤子 2006-11-29 11:20 心內求法
    哦,好的,非常感謝  回復  更多評論
      

    # re: SWT Extension:在Win32平臺下運用Java使用注冊表和系統鉤子 2007-08-24 09:03 WTE
    hook = Extension.SetSystemHook(13, proc);
    為什么不用swt的setWindowsHookEX()?是不是用這個函數須要有dll才能實現全局鉤子的功能?  回復  更多評論
      


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    GitHub |  開源中國社區 |  maven倉庫 |  文件格式轉換 
    主站蜘蛛池模板: 亚洲一卡2卡三卡4卡有限公司| 自拍偷自拍亚洲精品被多人伦好爽| 亚洲高清无在码在线电影不卡| 在线观看片免费人成视频播放| 亚洲欧洲日本在线| 一个人免费播放在线视频看片| 亚洲成av人片天堂网老年人| sihu国产精品永久免费| 亚洲伊人久久精品影院| 久久久精品免费国产四虎| 久久青青成人亚洲精品| 99re免费99re在线视频手机版| 亚洲欧洲一区二区| 久久久久久国产a免费观看黄色大片| 久久亚洲最大成人网4438| 在线免费观看一级片| 美女一级毛片免费观看| 国产日产亚洲系列最新| 欧洲人免费视频网站在线| 自怕偷自怕亚洲精品| 扒开双腿猛进入爽爽免费视频| 亚洲av无码专区在线观看亚 | 久久久久久曰本AV免费免费| 亚洲第一精品电影网| 日本免费中文字幕在线看| 二级毛片免费观看全程| 亚洲黄色在线网站| 国产精品久久久久影院免费| 成人免费777777被爆出| 亚洲免费在线观看视频| 亚洲国产一区视频| 免费A级毛片无码A∨免费| 亚洲乱亚洲乱妇无码| 亚洲精品字幕在线观看| 91情侣在线精品国产免费| 一级毛片免费视频网站| 亚洲精品中文字幕无乱码| 免费大黄网站在线观| 三年片在线观看免费观看大全动漫 | 好男人视频社区精品免费| 久久最新免费视频|