在使用hook时,我实在搞不懂 CallNextHookEx 起什么作用。

huxin1 2003-05-13 03:29:50
我的理解是如果不是HOOK过程中要处理的消息时,由CallNextHookEx函数将消息传送出去,交由操作系统或其它进程处理。但是我在Hook过程中加了一个showmessage函数.发现无论何时都没有窗口弹出。这又跟我的理解不相符,我有些困惑了。
function KeyboardHookHandler(iCode: Integer;wParam: WPARAM;lParam: LPARAM)
: LRESULT; stdcall; export; //Hook过程
const
_KeyPressMask = $80000000;
begin
Result := 0;
If iCode < 0 Then
begin
showmessage('hu');//这段代码似乎不起作用
Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
Exit;
end;
// 侦测 Ctrl + B 组合键
if ((lParam and _KeyPressMask) = 0) and
(GetKeyState(vk_Control) < 0) and (wParam = Ord('B')) then
begin
Result := 1;
WinExec('Notepad.exe', sw_Normal); // 记事本
end;
end;
...全文
1561 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
vedon_fu 2010-06-10
  • 打赏
  • 举报
回复
学习了。。。
huxin1 2003-05-15
  • 打赏
  • 举报
回复
thank you very much!!!!!!!!!!!!!!
yansea 2003-05-13
  • 打赏
  • 举报
回复 1
我copy一段文字给你看看吧,说的很清楚了。

Hook 串鏈(Hook Chains)
當許多程式都安裝了某種型態的hook 時,就會形成一個filter-function chain。一旦特定
的event 發生,Windows 會呼叫該型態中最新掛上的hook filter function。舉個例,如果
程式A 掛上了一個system-wide WH_KEYBOARD hook,每當有任何執行緒取得鍵盤訊
息,Windows 就會呼叫這個filter function。如果程式B 也掛上了一個system-wide
WH_KEYBOARD hook,那麼當event 發生,Windows 不再呼叫程式A 的filter function,
改呼叫程式B的filter function。這也意味每一個filter function 有責任確保先前掛上的filter
Windows 95 程式設計指南(Windows 95 : A Developer’s Guide)
394
function 被呼叫(也就是維護串鏈的完整性)。
SetWindowsHookEx 函式會將新掛上的hook filter function 的代碼傳回。任何程式只要掛
上一個新的filter function 就必須儲存這個代碼(通常存放在全域變數中):
static HHOOK g_hhook = NULL;
. . .
g_hhook = SetWindowsHookEx(WH_KEYBOARD, Example_kybdHook, hinst, NULL);
. . .
如果有錯誤發生,SetWindowsHookEx 函式會傳回NULL。
如果你希望hook chain 中的其它filter functions 也能夠執行,你可以在你的filter function
中呼叫CallNextHookEx 函式(或許你已經在先前的Example_KybdHook 函式片段中注意
到了)
3

LRESULT CallNextHookEx(HHOOK hhook, int nCode, WPARAM wParam, LPARAM lParam);
這個函式會呼叫filter-function chain 的下一個filter function,並傳入相同的nCode、
wParam 和lParam。下一個filter function 結束之前,應該也遵循這個規則去呼叫
CallNextHookEx 函式,並再次將hook 代碼(通常那是被放在全域變數中)傳入。
CallNextHookEx 函式利用這個hook 代碼,走訪整個串鏈,決定哪一個filter function 是
下一個呼叫目標。如果CallNextHookEx 函式發現已經沒有下一個filter function 可以呼叫
(走到串鏈盡頭了),它會傳回0;否則它就傳回「下一個filter function 執行後的傳回值」。
3
你可能會在許多文件(包括SDK 文件)中發現一個有關CallNextHookEx 函式的過氣警告:「如
果nCode 小於0,則hook 函式應該不做任何處理,直接將它交給CallNextHookEx 函式,並傳回
CallNextHookEx 函式的回返值」。這並不是真的,而且自Windows 3.0 以來(那時還在使用舊版的
SetWindowsHook 函式)就已經不是真的了!撰寫程式時,你可以完全不理會這項警告。
第6章訊息攔截(Hooks)
395
有些時候你可能不希望呼叫其他的filter functions,這種情況下你只要不在你的filter
function 中呼叫CallNextHookEx 函式即可。只要不將CallNextHookEx 函式放到你的filter
function 中,你就不會呼叫其他的filter functions,而你也因此可以指定你自己的傳回值。
不幸的是,這裡埋伏著一個陷阱:另一個執行緒可能也為你安裝了一個hook,新的filter
function 於是比你的filter function 更早被喚起,而它可能不呼叫你的filter function,完蛋
了!這個問題沒有一般性的解決方案,如果你先將自己的hook 卸除,然後再重新掛上,
那麼你的filter function 就成為最新的一個,會最先被呼叫。沒錯,但你不能夠保證其他
人不會依樣畫葫蘆。簡言之,hooks 是一個合作機制,沒有任何保障。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧