Y
YuZi
Unregistered / Unconfirmed
GUEST, unregistred user!
我的目标是Hook Shell_NotifyIconA和Shell_NotifyIconW,通过WH_GETMESSAGE加载Hook API 模块。先请看下面的代码<br>//WH_GETMESSAGE处理过程<br>function GetMsgProc(nCode : Integer; wParam : WPARAM; lParam: LPARAM): LRESULT; stdcall;<br>begin<br> if (nCode = HC_ACTION) and (not TrayData^.Hooked) then<br> begin<br> HookAPI; //加载Hook API模块<br> DLLData^.Hooked := True;<br> end;<br><br> //调用下一个Hook<br> Result := CallNextHookEx(DLLData^.Hook, nCode, wParam, lParam);<br>end;<br>//安装WH_GETMESSAGE钩子<br>function InstallHook(aWnd : HWND):Boolean;stdcall;<br>var<br> ThreadID : DWORD;<br>begin<br> Result := False;<br> TrayData^.Hook := 0;<br> ThreadID := GetWindowThreadProcessId(aWnd, nil);<br> //给指定窗口挂上钩子<br> TrayData^.Hook := SetWindowsHookEx(WH_GETMESSAGE, @GetMsgProc, Hinstance, ThreadID);<br> if TrayData^.Hook > 0 then //是否成功HOOK<br> Result := True;<br>end;<br><br> 用这种方法Hook某一窗口的Shell_NotifyIconA能成功,一切正常。(其实我的目的就是拦截程序添加、删除托盘图标的消息),但这样只能Hook一个窗口。<br> 后来我想到这样加载钩子:InstallHook(0); 试图Hook系统所有的窗口,发现确是可以Hook到,但却出现了几个致命的问题:<br> 1、启动Hook正常,Hook处理过程也正常,但在Delphi中关闭的项目时却出现了如下错误:“Access violation at address 06da7ec8. Read of address 06DA7EC8.”<br> 也无法打开新的项目了,只能退出Delphi,而且退出时还有几个错误对话框。<br> 2、有部分程序启动加截托盘图标HOOK不到,比如:网际快车、MSN,但这些软件退出时删除托盘的消息却可以HOOK到,起初怀疑那些软件是用Shell_NotifyIconW添加的托盘图标,后来也Hook了Shell_NotifyIconW函数,但仍旧HOOK不到,为什么?<br> 3、第一个问题最重要,如果有高手帮我写出有效代码,将得到300分或260分以上。