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

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

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

    Feeling

        三人行,必有我?guī)熝?/p>

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

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

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

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


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

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

    #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來實(shí)現(xiàn)系統(tǒng)鉤子有多大難度呢?各位看看代碼就知道了:

    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;
    }

    很簡單吧^_^

    評(píng)論

    # re: SWT Extension:在Win32平臺(tái)下運(yùn)用Java使用注冊(cè)表和系統(tǒng)鉤子 2006-11-28 10:18 心內(nèi)求法
    頂了!
    另外想請(qǐng)教一下,文中的代碼是怎么發(fā)布的呢?  回復(fù)  更多評(píng)論
      

    # re: SWT Extension:在Win32平臺(tái)下運(yùn)用Java使用注冊(cè)表和系統(tǒng)鉤子 2006-11-28 18:53 三人行,必有我?guī)熝?/a>
    編輯器里有一個(gè)按鈕是編輯代碼的,點(diǎn)進(jìn)去copy你的代碼就好了  回復(fù)  更多評(píng)論
      

    # re: SWT Extension:在Win32平臺(tái)下運(yùn)用Java使用注冊(cè)表和系統(tǒng)鉤子 2006-11-29 11:20 心內(nèi)求法
    哦,好的,非常感謝  回復(fù)  更多評(píng)論
      

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


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    GitHub |  開源中國社區(qū) |  maven倉庫 |  文件格式轉(zhuǎn)換 
    主站蜘蛛池模板: jizz在线免费播放| 亚洲中文字幕久久无码| 大片免费观看92在线视频线视频| 在线jyzzjyzz免费视频| 亚洲中文字幕久久精品无码A| 永久免费AV无码国产网站| 亚洲精品人成网在线播放影院| 无码国产精品一区二区免费虚拟VR| 亚洲视频在线观看地址| 日韩免费人妻AV无码专区蜜桃 | 国产精品内射视频免费| 久久影院亚洲一区| 免费在线黄色电影| 亚洲一区二区三区首页| 无码区日韩特区永久免费系列 | a级毛片免费在线观看| 久久亚洲国产精品五月天| 亚洲免费福利视频| 国产成人精品日本亚洲网址| 成人午夜18免费看| 一级毛片免费毛片毛片| 亚洲AV无码不卡在线播放| 亚洲成人在线免费观看| 亚洲GV天堂GV无码男同| 亚洲无码视频在线| 99久热只有精品视频免费看| 亚洲综合国产成人丁香五月激情| 亚洲国产成人久久综合碰| 在线观看肉片AV网站免费| 亚洲人成电影在线观看青青| 凹凸精品视频分类国产品免费| 国产精品美女久久久免费| 亚洲色图黄色小说| 免费一级毛片在线观看| 99视频在线看观免费| 国产亚洲综合久久| 亚洲国产精品婷婷久久| 国产资源免费观看| 久章草在线精品视频免费观看| 国产亚洲精品成人AA片| 亚洲国产精品高清久久久|