<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
    SWT-Extension這個項目做了很久,但一直都沒有realease,只是個人做著玩玩,很重要的一個原因是對Windows System Hook的機制沒有能夠很好地實現出來。Hook本身不算是很難的技術,在C++,C#里都能夠很容易的實現,為什么運用Java就那么困難呢?

    首先當然主要還是我個人對C++并不在行了,其次就是Java和C++交互的問題了。要想通過C++把數據傳給Java,就要通過JNI標準的接口來實現,也就是要通過 JNIENV 來實現,但是HookProc 這個CallBack 是給系統進程調用的,不是給你Java調用的,你說系統進程調用了 HookProc 之后,沒法把這個事件傳遞給Java,那么還有一個方法,用Java不間斷的輪循Hook里的數據,這倒是能實現,網上也有一個老外的例子,但不好的地方就是當我系統沒工作的時候,你Java還在那兒輪循我干嘛?這不是浪費資源嗎?所以呢,這解鈴還需系鈴人,系統的事件還得讓系統來通知你才好。在Java里,有一個IO阻塞,比如當調用System.in.read()的時候,系統就是等待你的輸入,如果你不輸入,系統就一直等著不工作。還有線程,有wait方法,非要等著其他的線程通過notify把你喚醒你才能工作。在C++里也有這么一套機制:CreateEvent 和WaitForSingleObject,也就是說我先創建一個事件,然后將這個事件置于未激活狀態,讓它一直等待,將線程阻塞住,當HookProc被系統進程調用的時候,就將這個事件激活,通知Java程序你可以開始干活了,干完活以后再次被阻塞,直到這個Hook被uninstall掉。當然這其中還有一些 C++ 代碼的細節性問題,比如怎么讓不同的進程共享同一個事件,這里要說明的就是不同的進程可以共享同一個事件,但是不能共享同一個事件句柄,同一個事件,在不同的進程里有不同的句柄,句柄是不能跨進程的。 

    我個人認為Hook應當是SWT-Extension里一個很重要的組成部分,SWT本身只能實現線程鉤子,對于系統級的鉤子無能為力。因為系統機鉤子需要實現數據共享操作,還需要DLL入口句柄,這些我已都在SWT-Extension中實現了。唯一讓我遺憾的是沒有辦法實現日志鉤子,這是一個很有用的鉤子,可以用來記入當前用戶行為的操作,然后重新演示,我想如果做自動化測試這個會很有用,或者給游戲軟件練功什么的,呵呵。之所以不能實現是因為這個鉤子很特別,它要的不是DLL的句柄,而是應用程序的句柄,這沒有辦法從Java程序里獲得,我試過javaw.exe,但是也不行,會導致系統假死。以后有時間在研究吧。

    做完Hook,終于可以松一口氣,發一個小小的realease了,剩下的就是document工作要做了,一個枯燥無味的工作,就當練習一下英語好了。

    這里發一個Hook的截圖:




    沒有了標題欄的Eclipse
    最新的Build和代碼也可以在 http://feeling.sf.net 上下載了。
    posted on 2007-12-07 15:08 三人行,必有我師焉 閱讀(2457) 評論(17)  編輯  收藏

    評論

    # re: 準備對SWT-Extension realease了[未登錄] 2007-12-07 17:41 差沙
    樓主佩服,這方面不是很懂, 但一看就是好東東,強帖留名  回復  更多評論
      

    # re: 準備對SWT-Extension realease了 2007-12-08 03:18 gr8vyguy
    挺好的,只是點File System導致JVM退出。

    其實我也做了一些這方面的擴展。包括Hook。還沒看你的Hook的怎么實現的。
    我是用SWT的OS.SetWindowsHookEx + org.eclipse.swt.internal.Callback.
    不需要再定義native的函數。只是實現了鍵盤和鼠標兩個鉤子。

    另外你的Registry基本是抄Core Java II里的吧,我做了一套仿C#里Registry的接口的。

    有意的話,我可以把我的代碼捐出來,加到你的Project里!

    還有這個最好叫SWT Extension on Windows。

      回復  更多評論
      

    # re: 準備對SWT-Extension realease了[未登錄] 2007-12-08 11:41 BeanSoft
    支持!  回復  更多評論
      

    # re: 準備對SWT-Extension realease了 2007-12-08 18:45 三人行,必有我師焉
    To:gr8vyguy
    我知道你的Hook的做法,不過那只能實現線程鉤子,我想實現的是系統全局鉤子,不是一個概念。Core Java II 我沒有看過,不知道里面有Registry的實現。File System導致JVM退出,遺留的Bug,暫時不知道怎么解決。  回復  更多評論
      

    # re: 準備對SWT-Extension realease了 2007-12-09 04:03 gr8vyguy
    @三人行,必有我師焉
    我實現的是絕對是系統全局鉤子。

    Registry? 那就奇怪了,我再仔細看看,如果搞錯了那就不好意思了。

      回復  更多評論
      

    # re: 準備對SWT-Extension realease了 2007-12-09 13:32 cnfree
    @gr8vyguy
    全局鈎子嗎?不可能用swt實現的,因為沒有dll的handle,是無法實現數據共享的。如果你確信你真的實現了,拜托你給我一個例子,不甚感激。你說的那種方法我很久以前就嘗試過了,但是沒有搞定。

    http://www.tkk7.com/cnfree/archive/2006/11/27/83754.html ,我以前的一篇文章,當時以為實現了,后來發現數據在Java的HookProc里無法共享,也就是說,你能拿到 LParam,但是取不出相關數據,只能用用WParam,因此就算你可以實現全局鉤子,你說的那種Case是無法獲得所有的信息。

    別人的文章:http://www.javaworld.com.tw/jute/post/view?bid=35&id=175440&sty=3&age=0

    PS:我已經做成了插件,可以直接在插件開發中使用了。  回復  更多評論
      

    # re: 準備對SWT-Extension realease了 2007-12-09 20:26 gr8vyguy
    @cnfree
    沒有全局的鉤子我的抓圖軟件怎么實現
    http://www.tkk7.com/xilaile/archive/2007/05/02/114983.html

    普通的鉤子函數的確需要定義在獨立的DLL中才能掛進去,不過你不要忘了還存在一類Low Level的鉤子,不需呀dll的
      回復  更多評論
      

    # re: 準備對SWT-Extension realease了 2007-12-10 11:47 三人行,必有我師焉
    @gr8vyguy
    沒有JDK1.6,所以運行不起來,但是看過了你的代碼。
    1,你添加了2個native方法:
    static final native boolean InstallMouseHook(int i, int j);
    static final native boolean UninstallMouseHook(int i);
    所以我不能從你的程序里斷定你用的是哪種鉤子
    2,和我上個回復所說的一樣,你只是使用了wParam,沒有用到lParam,
    wParam 包含了Mouse行為信息, lParam則是一個MSLLHOOKSTRUCT結構體指針,我想你應該是不能夠根據這個指針拿到結構體的,而MSLLHOOKSTRUCT可以用來拿到坐標信息。其實就對窗口某一部位截圖而言,根本就不需要Hook,SWT+Swing的Robot就可以實現了。

    好了不用再爭論了,Mouse Hook自有 Mouse_LL沒有的優勢,可以在98下運行,保證了系統兼容性。畢竟連純C#也只能實現Mouse_LL和Keyboard_LL兩種Hook。

    我現在還有點問題,就是如果我要攔截Hook,比如我以前的一個需求,攔截一個瀏覽器的菜單讓它不顯示出來,如果瀏覽器嵌在Java程序內部,那么在Java內部的HookProc正好處理這個事件,但是如果攔截的外部的瀏覽器,又該如果解決。  回復  更多評論
      

    # re: 準備對SWT-Extension realease了 2007-12-10 15:26 gr8vyguy
    HookProc應該先于WindowProc, 判斷一下,不下傳不就行了  回復  更多評論
      

    # re: 準備對SWT-Extension realease了 2007-12-10 16:38 三人行,必有我師焉
    @gr8vyguy
    是的,關鍵是現在的Hookproc是在C++里實現的,和Java完全沒有關系,如果在Java實現,就無法數據共享了。但是判斷是否下傳的邏輯是在Java里,我在考慮怎么把這兩者結合起來。  回復  更多評論
      

    # re: 準備對SWT-Extension realease了 2007-12-12 17:18 leigh
    可以使用 DuplicateHandle 來實現跨進程的句柄。
      回復  更多評論
      

    # re: 準備對SWT-Extension realease了 2007-12-12 18:21 三人行,必有我師焉
    跨進程我已經實現了,在Java里攔截JNI的HookProc,并對數據做出一些修改,這才是困難所在。  回復  更多評論
      

    # re: 準備對SWT-Extension realease了 2008-01-08 18:02 黑靈
    good job  回復  更多評論
      

    # re: 準備對SWT-Extension realease了 2008-05-16 22:08 brucehu
    請問你那個不需要jre的程序是怎么實現的  回復  更多評論
      

    # re: 準備對SWT-Extension realease了 2009-06-20 11:02 狄德羅
    有沒有SWT linux Extension我想用這個在linux下實現窗口失去鍵盤焦點  回復  更多評論
      

    # re: 準備對SWT-Extension realease了[未登錄] 2012-05-07 13:58 滌生
    哥們你這個keyproess有bug.一旦遇到系統的alert觸發的時候就掛了  回復  更多評論
      

    # re: 準備對SWT-Extension realease了[未登錄] 2013-11-15 15:13 javapon
    想對USB做個監聽,發現用這個方法Hook.CALLWNDPROC 有的時候能監聽到鼠標的拔出和插入, 由于對C一頭霧水,請問如果是這個方法 ,usb設備插入和拔出對應的HookData.getMessage是多少,  回復  更多評論
      


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


    網站導航:
     
    GitHub |  開源中國社區 |  maven倉庫 |  文件格式轉換 
    主站蜘蛛池模板: 亚洲av无码专区青青草原| 亚洲女同成av人片在线观看| 亚洲国产精品无码专区| 欧美三级在线电影免费| 久久国产乱子免费精品| 国产成人高清亚洲一区久久| 亚洲首页国产精品丝袜| 亚洲五月综合缴情在线观看| 日韩免费a级在线观看| 性感美女视频免费网站午夜| 最好看的中文字幕2019免费| 99re6在线精品免费观看| 一级做性色a爰片久久毛片免费| 亚洲av无码成人精品国产 | 亚洲国产精品久久人人爱| 亚洲熟妇色自偷自拍另类| 亚洲精品**中文毛片| 亚洲综合久久1区2区3区| 亚洲理论片在线中文字幕| 亚洲精品国产第1页| 亚洲喷奶水中文字幕电影| 亚洲kkk4444在线观看| 亚洲人成自拍网站在线观看| 性感美女视频免费网站午夜 | 国产成人精品亚洲2020| 亚洲看片无码在线视频| 美女免费精品高清毛片在线视| 黄色三级三级免费看| 久久久久久久99精品免费观看| 久久国产乱子伦精品免费一| 91成年人免费视频| 国产v片免费播放| 久久影院亚洲一区| 亚洲一区免费在线观看| 九九综合VA免费看| 久久精品a一国产成人免费网站| www.亚洲一区| 日韩亚洲产在线观看| 国产一精品一AV一免费| 欧洲精品免费一区二区三区| 国产亚洲人成网站在线观看|