全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1920
推到 Plurk!
推到 Facebook!

請教一個訊息攔截的問題

尚未結案
dodolong
一般會員


發表:5
回覆:6
積分:2
註冊:2003-12-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-29 10:17:12 IP:211.75.xxx.xxx 未訂閱
有一個問題想請教各位先進 就是小弟最近在研究使用hook來攔截訊息 稍微嘗試過使用KeyboardProc,MouseProc,JournalRecordProc等相關的hook 也能夠成功的攔截到keyboard與mouse的訊息 但是否有辦法在攔截到這些訊息並執行自己的subroutine後,將訊息丟掉呢? 不知道是小弟對hook仍處於一知半解的狀態不會使用 還是實際上hook沒有辦法達成我的要求呢? 請各位先進不吝指導,謝謝
shinjie
資深會員


發表:12
回覆:275
積分:287
註冊:2003-03-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-29 10:42:03 IP:203.73.xxx.xxx 未訂閱
請問一下您有加 Result := CallNextHookEx(hHook,iCode,wParam,lParam); 如果有的話,應該就會Pass目前的訊息。
------
我將在茫茫人海中尋訪我唯一之靈魂伴侶。
得之;我幸。不得;我命。
dodolong
一般會員


發表:5
回覆:6
積分:2
註冊:2003-12-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-29 16:54:30 IP:211.75.xxx.xxx 未訂閱
引言: 請問一下您有加 Result := CallNextHookEx(hHook,iCode,wParam,lParam); 如果有的話,應該就會Pass目前的訊息。
首先感謝shinjie兄的回應 不過您所說的CallNextHookEx我查了查MSDN 上面似乎寫的是pass給hook chain的下一個hook procedure 當然我曾嘗試不將訊息pass給下一個hook procedure (我使用return 0來避免compiler的warning) 但似乎沒有效果,但訊息仍然會傳遞出去 目前嘗試過的只有利用JournalPlaybackProc會讓Keyboard跟Mouse失效 但這個hook的設計原意似乎跟我要達成的效果不太一樣 或許利用
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-29 22:31:55 IP:61.62.xxx.xxx 未訂閱
引言:
引言: 請問一下您有加 Result := CallNextHookEx(hHook,iCode,wParam,lParam); 如果有的話,應該就會Pass目前的訊息。
首先感謝shinjie兄的回應 不過您所說的CallNextHookEx我查了查MSDN 上面似乎寫的是pass給hook chain的下一個hook procedure 當然我曾嘗試不將訊息pass給下一個hook procedure (我使用return 0來避免compiler的warning) 但似乎沒有效果,但訊息仍然會傳遞出去 目前嘗試過的只有利用JournalPlaybackProc會讓Keyboard跟Mouse失效 但這個hook的設計原意似乎跟我要達成的效果不太一樣 或許利用>< face="Verdana, Arial, Helvetica"> 如果你要修改攔截到的訊息, 用WH_GETMESSAGE(Message Hook), 因為Windows 不允許你修改Keyboard Hook的值(Mouse Hook好像也是), 但允許你修改Message Hook攔截到的訊息, 我的做法是把Message改為WM_NULL, 其它值不動, 就可以達到過濾該Message的效果. 例如: ((MSG*)lParam)->message = WM_NULL; 附帶一提, 過濾Message和CallNextHookEx沒關係. CallNextHookEx只是把操作傳給Hook Chain的下一個Hook, 使用CallNextHookEx只是為了讓其它的Hook能正常運作.
dodolong
一般會員


發表:5
回覆:6
積分:2
註冊:2003-12-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-31 13:33:39 IP:211.75.xxx.xxx 未訂閱
引言: 如果你要修改攔截到的訊息, 用WH_GETMESSAGE(Message Hook), 因為Windows 不允許你修改Keyboard Hook的值(Mouse Hook好像也是), 但允許你修改Message Hook攔截到的訊息, 我的做法是把Message改為WM_NULL, 其它值不動, 就可以達到過濾該Message的效果. 例如: ((MSG*)lParam)->message = WM_NULL; 附帶一提, 過濾Message和CallNextHookEx沒關係. CallNextHookEx只是把操作傳給Hook Chain的下一個Hook, 使用CallNextHookEx只是為了讓其它的Hook能正常運作.
感謝Zard兄的回應,您所說的方法達成了我的目的 相信這個方法應該能夠有一些不錯的用途與應用 不過有些再深入一點的相關問題小弟想再向您請教一下 其實我之前在看MSDN裡有關hook的document時有看到這個GetMsgProc 也在當中看到可以修改message,但不知道怎麼個改法(完全忘了WM_NULL...:p) 昨天嘗試了一下,發現真的能夠將一些message給過濾掉 我也針對一些一般的應用程式來做試驗,果真可以達到我要的效果 但是當我測試一些3D遊戲的時候,卻沒有相同的效果 上網查了查資料,也問了問人,得知DirectX是用dx input來做 它是直接抓取keyboard buffer,所以過濾message對它沒有效果 我是有在站上找到一篇站長發表的清除keyboard buffer的方法 但不知道是我沒有看懂還是使用不正確,並沒有達到預期的效果 所以想請教一下Zard兄與各位先進有關於清除keyboard buffer的方法 還望Zard兄及各位先進能不吝指導,謝謝 發表人 - dodolong 於 2004/12/31 13:35:35
系統時間:2024-04-30 2:36:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!