<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 三人行,必有我師焉 閱讀(3683) 評論(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倉庫 |  文件格式轉換 
    主站蜘蛛池模板: 一级毛片免费播放视频| 亚洲精品无码久久久久秋霞| 男女作爱免费网站| 亚洲第一区精品日韩在线播放| 亚洲欧美日韩一区二区三区 | 亚洲人成色7777在线观看不卡| 美女羞羞免费视频网站| 亚洲国产av无码精品| www在线观看播放免费视频日本| 国产AⅤ无码专区亚洲AV| a级毛片高清免费视频就| 亚洲人成网站在线播放影院在线| 无码AV片在线观看免费| 亚洲毛片免费视频| 搡女人免费视频大全| 国产亚洲综合一区二区三区| 亚洲国产精品成人网址天堂| 黄视频在线观看免费| 久久久久亚洲av无码专区喷水| 国产a视频精品免费观看| 亚洲综合一区无码精品| 亚洲国产精品自产在线播放| 在线观看特色大片免费网站| 亚洲系列中文字幕| 免费大香伊蕉在人线国产| 国产日韩久久免费影院 | www.亚洲色图.com| 国产精品hd免费观看| 亚洲小视频在线观看| 日本免费网站观看| 亚洲av麻豆aⅴ无码电影| 一级做性色a爰片久久毛片免费| 久久久亚洲精品视频| 天天天欲色欲色WWW免费| 国产精品99爱免费视频| 亚洲专区中文字幕| 国产成人A亚洲精V品无码| 美女视频黄免费亚洲| aaa毛片免费观看| 亚洲乱码国产乱码精华| 亚洲av福利无码无一区二区|