<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倉庫 |  文件格式轉換 
    主站蜘蛛池模板: 成人免费黄色网址| 91精品啪在线观看国产线免费| 在线观看免费高清视频| 日韩亚洲Av人人夜夜澡人人爽 | 国产成人亚洲综合色影视 | 日韩av无码免费播放| 国产亚洲情侣一区二区无码AV | 美女被免费视频网站a| 免费国产成人午夜私人影视| 亚洲aⅴ无码专区在线观看| 国产极品美女高潮抽搐免费网站| 中文字幕乱码亚洲无线三区| 成人黄动漫画免费网站视频| 亚洲人成网站免费播放| 国产猛烈高潮尖叫视频免费| 国产成人高清亚洲一区91| 亚洲精品无码你懂的网站| 成在人线av无码免费高潮水 | 亚洲情XO亚洲色XO无码| 黄色片免费在线观看| 久久精品国产亚洲AV嫖农村妇女| 最近2019免费中文字幕6| 亚洲精品中文字幕无乱码麻豆| 嫩草影院免费观看| 一区二区三区免费高清视频| 亚洲精品国精品久久99热一| 一区二区三区观看免费中文视频在线播放 | 久99久精品免费视频热77| 亚洲国产精品久久人人爱| 成人免费视频一区| 一级特黄色毛片免费看| 久久精品国产96精品亚洲| 国产成人免费网站| 一本到卡二卡三卡免费高| 99久久亚洲精品无码毛片| 日本免费一区二区三区最新| 久久er国产精品免费观看2| 亚洲中文字幕久久久一区| 国产成人高清亚洲| 黄页网站免费观看| 国产精品高清免费网站 |