窗体关闭钩子 该捕获哪一个消息呀??? ( 积分: 50 )

  • 主题发起人 主题发起人 暗夜中独舞
  • 开始时间 开始时间

暗夜中独舞

Unregistered / Unconfirmed
GUEST, unregistred user!
是窗体关闭,不是窗体销毁。。。销毁是 HCBT_DESTROYWND ,但是我想知道销毁前的关闭的消息。。。。。。。。。。。
 
TWMSysCommand<br>procedure&nbsp;TForm1.WMSysCommand(var&nbsp;message:&nbsp;TWMSysCommand);<br>&nbsp;&nbsp;with&nbsp;message&nbsp;do&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//消息处理,&nbsp;当收到系统关闭程序消息时<br>&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;CmdType&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SC_CLOSE:;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;inherited;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;
 
to&nbsp;redsky.l,:<br>那个窗体不是我自己写的程序,所以你这样的方法也不行呀
 
我刚查了下&nbsp;好象不能捕捉到窗体关闭的消息<br><br>WH_CBT&nbsp;Hook<br>系统在激活,创建,消毁,最小化,最大化,移动,改变窗体前;在完成一条系统命令前;在从系统消息队列中移去鼠标或键盘事件前;在设置输入焦点前,或同步系统消息队列前,将调用WH_CBT&nbsp;HOOK。你可以在你的HOOK&nbsp;过程拦截该类HOOK,并返回一个值,告诉系统,是否继续执行上面的操作。
 
嘿嘿!<br>是不是想让某个程序关闭不了!<br>护花使者类的程序!
 
我已经搞定了,我就弄了个鼠标钩子<br>当鼠标左键点下的时候判断鼠标的位置,如果是在右上角,就说明是用户点了关闭,然后就处理一下
 
WH_CALLWNDPROC&nbsp;这个可以吧,子类化目标窗口,然后处理WM_CLOSE消息<br>鼠标钩子不能金钩Alt+F4关闭窗口的动作.
 
to&nbsp;ysai:<br>&nbsp;怎么子类化窗口???<br>&nbsp;我不大明白你的意思
 
暗夜中独舞<br>&nbsp;&nbsp;&nbsp;&nbsp;窗体子类化技术有啊,你要的话我给你贴点代码,google上也很多。专门有一篇叫做窗体子类化拦截其他窗体消息的文章。<br>你用的鼠标钩子不是一个最好的办法,如果开发人员用了皮肤控件,这个关闭按钮不在右上角呢?
 
我以前写的一个单元,用的是WH_CALLWNDPROC钩子,把钩子挂上目标窗口后就可以用SetWindowLong子类化窗口了<br>unit&nbsp;WindowExpHook;<br><br>interface<br><br>uses<br>&nbsp;&nbsp;SysUtils,&nbsp;windows,&nbsp;Messages,&nbsp;Graphics,&nbsp;Clipbrd;<br><br>const<br>&nbsp;&nbsp;SMsg_WEH_Hook&nbsp;=&nbsp;'{557F4F7F-2AE2-4902-B8AA-65A609EA5408}';<br>&nbsp;&nbsp;SMsg_WEH_UnHook&nbsp;=&nbsp;'{75CE5BA2-4479-4CEA-AEA7-E61BD2DBDF22}';<br><br>type<br>&nbsp;&nbsp;PWindowHookInfo&nbsp;=&nbsp;^TWindowHookInfo;<br>&nbsp;&nbsp;TWindowHookInfo&nbsp;=&nbsp;record<br>&nbsp;&nbsp;&nbsp;&nbsp;Handle&nbsp;&nbsp;:&nbsp;HWND;<br>&nbsp;&nbsp;&nbsp;&nbsp;OldProc&nbsp;:&nbsp;Pointer;<br>&nbsp;&nbsp;&nbsp;&nbsp;Separator&nbsp;:&nbsp;Boolean;<br>&nbsp;&nbsp;&nbsp;&nbsp;SubMenu&nbsp;:&nbsp;HMENU;<br>&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;PWindowExpHookData&nbsp;&nbsp;=&nbsp;^TWindowExpHookData;<br>&nbsp;&nbsp;TWindowExpHookData&nbsp;&nbsp;=&nbsp;record<br>&nbsp;&nbsp;&nbsp;&nbsp;hWindowHandle&nbsp;&nbsp;&nbsp;:&nbsp;HWND;<br>&nbsp;&nbsp;&nbsp;&nbsp;hHookMessage&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Longword;<br>&nbsp;&nbsp;&nbsp;&nbsp;hUnHookMessage&nbsp;&nbsp;:&nbsp;Longword;<br>&nbsp;&nbsp;&nbsp;&nbsp;Hooks&nbsp;:&nbsp;array[0..99]&nbsp;of&nbsp;TWindowHookInfo;<br>&nbsp;&nbsp;end;<br><br>function&nbsp;HookWindowMenu(<br>&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;AOwner&nbsp;&nbsp;:&nbsp;HWND;<br>&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;AHandle&nbsp;:&nbsp;HWND<br>&nbsp;&nbsp;&nbsp;&nbsp;):Boolean;stdcall;<br>function&nbsp;UnHookAllWindowMenu:Boolean;stdcall;<br><br>var<br>&nbsp;&nbsp;WEHData&nbsp;:&nbsp;PWindowExpHookData;<br><br>implementation<br><br>uses<br>&nbsp;&nbsp;WindowExpRes,&nbsp;ShellAPI;<br><br>const<br>&nbsp;&nbsp;UM_TOPMOST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WM_USER&nbsp;+&nbsp;$0101;<br>&nbsp;&nbsp;UM_PRINTSCREEN&nbsp;&nbsp;=&nbsp;WM_USER&nbsp;+&nbsp;$0102;<br>&nbsp;&nbsp;UM_TRANSPARENT&nbsp;&nbsp;=&nbsp;WM_USER&nbsp;+&nbsp;$0103;<br>&nbsp;&nbsp;UM_ABOUT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;WM_USER&nbsp;+&nbsp;$0110;<br><br>function&nbsp;GetHookInfo(<br>&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;AHandle&nbsp;:&nbsp;HWND<br>&nbsp;&nbsp;&nbsp;&nbsp;):PWindowHookInfo;<br>//取得一个钩子结构<br>var<br>&nbsp;&nbsp;i&nbsp;:&nbsp;Integer;<br>begin<br>&nbsp;&nbsp;Result&nbsp;&nbsp;:=&nbsp;&nbsp;nil;<br>&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;Low(WEHData.hooks)&nbsp;to&nbsp;High(WEHData.Hooks)&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;WEHData.Hooks.Handle&nbsp;=&nbsp;AHandle&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;&nbsp;:=&nbsp;&nbsp;@WEHData.Hooks;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;<br><br>function&nbsp;GetEmptyHookInfo&nbsp;:&nbsp;PWindowHookInfo;<br>//取得空闲的<br>var<br>&nbsp;&nbsp;i&nbsp;:&nbsp;Integer;<br>begin<br>&nbsp;&nbsp;Result&nbsp;&nbsp;:=&nbsp;&nbsp;nil;<br>&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;Low(WEHData.hooks)&nbsp;to&nbsp;High(WEHData.Hooks)&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;IsWindow(WEHData.Hooks.Handle)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WEHData.Hooks.Handle&nbsp;:=&nbsp;&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;0&nbsp;=&nbsp;WEHData.Hooks.Handle&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;&nbsp;:=&nbsp;&nbsp;@WEHData.Hooks;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br>end;<br><br>function&nbsp;ShowAbout(const&nbsp;pwhi&nbsp;&nbsp;:&nbsp;PWindowHookInfo):&nbsp;boolean;<br>//显示关于<br>//var<br>//&nbsp;&nbsp;hIcon,hInst:integer;<br>begin<br>&nbsp;&nbsp;//hInst&nbsp;:=&nbsp;&nbsp;HINSTANCE;<br>&nbsp;&nbsp;//hInst&nbsp;&nbsp;&nbsp;:=&nbsp;&nbsp;GetWindowWord(Application.Handle,GWL_HINSTANCE);<br>&nbsp;&nbsp;//hIcon&nbsp;&nbsp;&nbsp;:=&nbsp;&nbsp;ExtractIcon(hInst,PChar(Application.ExeName),0);<br>&nbsp;&nbsp;Result&nbsp;&nbsp;:=&nbsp;&nbsp;Boolean(ShellAbout(pwhi.Handle,<br>&nbsp;&nbsp;&nbsp;&nbsp;'WindowView','WindowView&nbsp;0.1',0));<br>end;<br><br>procedure&nbsp;WindowProc(<br>&nbsp;&nbsp;&nbsp;&nbsp;Handle&nbsp;&nbsp;:&nbsp;HWND;&nbsp;&nbsp;&nbsp;//&nbsp;handle&nbsp;of&nbsp;window<br>&nbsp;&nbsp;&nbsp;&nbsp;Msg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Longword;&nbsp;&nbsp;&nbsp;//&nbsp;message&nbsp;identifier<br>&nbsp;&nbsp;&nbsp;&nbsp;wParam&nbsp;&nbsp;:&nbsp;wParam;&nbsp;//&nbsp;first&nbsp;message&nbsp;parameter<br>&nbsp;&nbsp;&nbsp;&nbsp;lParam&nbsp;&nbsp;:&nbsp;lParam&nbsp;&nbsp;//&nbsp;second&nbsp;message&nbsp;parameter<br>&nbsp;&nbsp;&nbsp;&nbsp;);stdcall;<br>//窗口回调过程<br>var<br>&nbsp;&nbsp;pwhi&nbsp;&nbsp;:&nbsp;PWindowHookInfo;<br>begin<br>&nbsp;&nbsp;pwhi&nbsp;&nbsp;:=&nbsp;&nbsp;GetHookInfo(Handle);<br>&nbsp;&nbsp;if&nbsp;Assigned(pwhi)&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;Msg&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WM_SYSCOMMAND&nbsp;:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;wParam&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UM_TOPMOST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;;//UpdateTopMost(pwhi);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UM_PRINTSCREEN&nbsp;&nbsp;:&nbsp;;//DoPrintScreen(pwhi);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UM_TRANSPARENT&nbsp;&nbsp;:&nbsp;;//DoTransparent(pwhi);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UM_ABOUT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;;//ShowAbout(pwhi);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WM_CLOSE&nbsp;&nbsp;:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//空过程,不处理WM_CLOSE消息就关不掉窗口了<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;&nbsp;//}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CallWindowProc(pwhi.OldProc,&nbsp;Handle,&nbsp;Msg,&nbsp;wParam,&nbsp;lParam);<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br>end;<br><br>procedure&nbsp;HookProc(nCode,&nbsp;wParam,&nbsp;lParam:&nbsp;LongWORD);stdcall;<br>//HOOK回调过程<br><br>&nbsp;&nbsp;procedure&nbsp;InsertMenus(const&nbsp;AWhi&nbsp;&nbsp;:&nbsp;PWindowHookInfo);<br>&nbsp;&nbsp;//插入菜单<br>&nbsp;&nbsp;var<br>&nbsp;&nbsp;&nbsp;&nbsp;SysMenu&nbsp;:&nbsp;HMenu;<br>&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;array[0..225]&nbsp;of&nbsp;char;<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;SysMenu&nbsp;:=&nbsp;&nbsp;GetSystemMenu(AWhi.Handle,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;&nbsp;GetMenuItemCount(SysMenu)-1;<br>&nbsp;&nbsp;&nbsp;&nbsp;InsertMenu(SysMenu,&nbsp;i,&nbsp;MF_BYPOSITION&nbsp;+&nbsp;MF_SEPARATOR,&nbsp;0,&nbsp;nil);<br>&nbsp;&nbsp;&nbsp;&nbsp;AWhi.SubMenu&nbsp;&nbsp;:=&nbsp;&nbsp;CreateMenu;<br>&nbsp;&nbsp;&nbsp;&nbsp;InsertMenu(AWhi.SubMenu,&nbsp;0,&nbsp;MF_BYPOSITION,&nbsp;UM_ABOUT,&nbsp;PChar(SAbout));<br>&nbsp;&nbsp;&nbsp;&nbsp;InsertMenu(AWhi.SubMenu,&nbsp;0,&nbsp;MF_BYPOSITION&nbsp;+&nbsp;MF_SEPARATOR,&nbsp;0,&nbsp;nil);<br>&nbsp;&nbsp;&nbsp;&nbsp;InsertMenu(AWhi.SubMenu,&nbsp;0,&nbsp;MF_BYPOSITION&nbsp;or&nbsp;MF_UNCHECKED,&nbsp;UM_TRANSPARENT,&nbsp;PChar(STransparent));<br>&nbsp;&nbsp;&nbsp;&nbsp;InsertMenu(AWhi.SubMenu,&nbsp;0,&nbsp;MF_BYPOSITION&nbsp;or&nbsp;MF_UNCHECKED,&nbsp;UM_PRINTSCREEN,&nbsp;PChar(SPrintScreen));<br>&nbsp;&nbsp;&nbsp;&nbsp;InsertMenu(AWhi.SubMenu,&nbsp;0,&nbsp;MF_BYPOSITION&nbsp;or&nbsp;MF_UNCHECKED,&nbsp;UM_TOPMOST,&nbsp;PChar(STopMost));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;InsertMenu(SysMenu,&nbsp;i,&nbsp;MF_BYPOSITION&nbsp;or&nbsp;MF_POPUP,&nbsp;AWhi.SubMenu,&nbsp;PChar(SExpand));<br>&nbsp;&nbsp;&nbsp;&nbsp;GetMenuString(SysMenu,&nbsp;i&nbsp;-&nbsp;1,&nbsp;s,&nbsp;255,&nbsp;MF_BYPOSITION);<br>&nbsp;&nbsp;&nbsp;&nbsp;AWhi.Separator&nbsp;&nbsp;:=&nbsp;&nbsp;s[0]&nbsp;&lt;&gt;&nbsp;#0;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;AWhi.Separator&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InsertMenu(SysMenu,&nbsp;i,&nbsp;MF_BYPOSITION&nbsp;+&nbsp;MF_SEPARATOR,&nbsp;0,&nbsp;nil);<br>&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;procedure&nbsp;DeleteMenus(const&nbsp;AWhi&nbsp;&nbsp;:&nbsp;PWindowHookInfo);<br>&nbsp;&nbsp;//删除菜单<br>&nbsp;&nbsp;var<br>&nbsp;&nbsp;&nbsp;&nbsp;SysMenu&nbsp;:&nbsp;HMenu;<br>&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;:&nbsp;Integer;<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;SysMenu&nbsp;:=&nbsp;&nbsp;GetSystemMenu(AWhi.Handle,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;:=&nbsp;GetMenuItemCount(SysMenu)&nbsp;-&nbsp;3;<br>&nbsp;&nbsp;&nbsp;&nbsp;DeleteMenu(SysMenu,&nbsp;i,&nbsp;MF_BYPOSITION);<br>&nbsp;&nbsp;&nbsp;&nbsp;DeleteMenu(SysMenu,&nbsp;i,&nbsp;MF_BYPOSITION);<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;AWhi.Separator&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteMenu(SysMenu,&nbsp;i&nbsp;-&nbsp;1,&nbsp;MF_BYPOSITION);<br>&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;procedure&nbsp;DoHook(AHandle&nbsp;&nbsp;:&nbsp;HWND);<br>&nbsp;&nbsp;//挂钩<br>&nbsp;&nbsp;var<br>&nbsp;&nbsp;&nbsp;&nbsp;whi&nbsp;:&nbsp;PWindowHookInfo;<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;whi&nbsp;:=&nbsp;&nbsp;GetHookInfo(AHandle);<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Assigned(whi)&nbsp;then&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;whi&nbsp;:=&nbsp;&nbsp;GetEmptyHookInfo;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;Assigned(whi)&nbsp;then&nbsp;Exit;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;whi.Handle&nbsp;&nbsp;&nbsp;:=&nbsp;&nbsp;AHandle;<br>&nbsp;&nbsp;&nbsp;&nbsp;InsertMenus(whi);<br>&nbsp;&nbsp;&nbsp;&nbsp;whi.OldProc&nbsp;&nbsp;:=<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pointer(GetWindowLong(AHandle,&nbsp;GWL_WNDPROC));<br>&nbsp;&nbsp;&nbsp;&nbsp;SetWindowLong(AHandle,&nbsp;GWL_WNDPROC,&nbsp;Longint(@WindowProc));<br>&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;procedure&nbsp;DoUnHook(AHandle&nbsp;&nbsp;:&nbsp;HWND);<br>&nbsp;&nbsp;//脱钩<br>&nbsp;&nbsp;var<br>&nbsp;&nbsp;&nbsp;&nbsp;whi&nbsp;:&nbsp;PWindowHookInfo;<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;whi&nbsp;:=&nbsp;&nbsp;GetHookInfo(AHandle);<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Assigned(whi)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteMenus(whi);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowLong(AHandle,&nbsp;GWL_WNDPROC,&nbsp;Longint(whi.OldProc));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;whi.Handle&nbsp;&nbsp;&nbsp;:=&nbsp;&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br><br>type<br>&nbsp;&nbsp;PWMSysCommand&nbsp;=&nbsp;^TWMSysCommand;<br>begin<br>&nbsp;&nbsp;if&nbsp;PCWPStruct(lParam).Message&nbsp;=&nbsp;WEHData.hHookMessage&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;DoHook(PCWPStruct(lParam).hwnd)<br>&nbsp;&nbsp;else&nbsp;if&nbsp;PCWPStruct(lParam).Message&nbsp;=&nbsp;WEHData.hUnHookMessage&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;DoUnHook(PCWPStruct(lParam).hwnd)<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;CallNextHookEx(0,&nbsp;nCode,&nbsp;wParam,&nbsp;lParam);<br>end;<br><br>function&nbsp;HookWindowMenu(<br>&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;AOwner&nbsp;&nbsp;:&nbsp;HWND;<br>&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;AHandle&nbsp;:&nbsp;HWND<br>&nbsp;&nbsp;&nbsp;&nbsp;):Boolean;stdcall;<br>//导出函数/挂钩<br>var<br>&nbsp;&nbsp;ThreadID&nbsp;&nbsp;:&nbsp;Longword;<br>&nbsp;&nbsp;ProID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Integer;<br>begin<br>&nbsp;&nbsp;Result&nbsp;&nbsp;:=&nbsp;&nbsp;False;<br>&nbsp;&nbsp;if&nbsp;(GetSystemMenu(AHandle,&nbsp;False)&nbsp;&gt;&nbsp;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;(AOwner&nbsp;&lt;&gt;&nbsp;AHandle)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;not&nbsp;Assigned(GetHookInfo(AHandle))&nbsp;then&nbsp;//}<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;ThreadID&nbsp;&nbsp;:=&nbsp;&nbsp;GetWindowThreadProcessId(AHandle,&nbsp;@ProID);<br>&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;&nbsp;SetWindowsHookEx(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WH_CALLWNDPROC,&nbsp;//WH_GETMESSAGE,WH_CALLWNDPROC,WH_CALLWNDPROCRET<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@HookProc,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hinstance,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThreadID<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;&gt;&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Result&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WEHData.hWindowHandle&nbsp;:=&nbsp;&nbsp;AOwner;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(AHandle,&nbsp;WEHData.hHookMessage,&nbsp;0,&nbsp;0);<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br>end;<br><br>function&nbsp;UnHookAllWindowMenu:Boolean;stdcall;<br>//导出函数/脱钩所有<br>var<br>&nbsp;&nbsp;i&nbsp;:&nbsp;Integer;<br>begin<br>&nbsp;&nbsp;Result&nbsp;&nbsp;:=&nbsp;&nbsp;False;<br>&nbsp;&nbsp;for&nbsp;i&nbsp;:=&nbsp;Low(WEHData.Hooks)&nbsp;to&nbsp;High(WEHData.Hooks)&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;WEHData.Hooks.Handle&nbsp;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(WEHData.Hooks.Handle,&nbsp;WEHData.hUnHookMessage,&nbsp;0,&nbsp;0);<br>end;<br><br>end.
 
头都看晕了&nbsp;<br>to&nbsp;cqwty,你说的那篇文章能不能贴出来&nbsp;或者告诉我地址,我找不到呀
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
571
import
I
I
回复
0
查看
544
import
I
I
回复
0
查看
623
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部