如题.
我自己用了2种钩子 都不爽.
第一种cbt 全局钩子.
看代码:function CBTProc(icode:Integer;awParam:WPARAM;alParam:LPARAM):LongInt;stdcall;
begin
Result:=0;
if icode<0 then
begin
Result:=CallNextHookEx(aHook,icode,awParam,alParam);
Exit;
end;
case icode of
HCBT_MOVESIZE: ;//0
HCBT_MINMAX: ; //1
HCBT_QS: ; //2
HCBT_CREATEWND: ;//3
HCBT_DESTROYWND: ;//4
HCBT_ACTIVATE:PostMessage(aHWND,WM_MYACTIVATENEW,awParam,alParam); //给主程序发一个消息,主程序的caption就是显示当前激活窗口的句柄//5
HCBT_SETFOCUS:;//9
end;
end; 问题就是不管我点其他什么窗口,没效果,就点主程序自己,窗体的caption变成句柄了,下断不知道怎么调试.郁闷中
第二种shell钩子.
代码,差不多function ShellProc(icode:Integer;awParam:WPARAM;alParam:LPARAM):LongInt;stdcall;
begin
Result:=0;
if icode<0 then
begin
Result:=CallNextHookEx(aHook,icode,awParam,alParam);
Exit;
end;
case icode of
HSHELL_WINDOWACTIVATED:PostMessage(aHWND,WM_MYACTIVATENEW,awParam,alParam); //4//同样发消息
HSHELL_WINDOWCREATED:; //1
HSHELL_WINDOWDESTROYED:; //2
HSHELL_ACTIVATESHELLWINDOW:; //3
HSHELL_GETMINRECT:;//5
HSHELL_REDRAW:; //6
HSHELL_TASKMAN:; //7
HSHELL_LANGUAGE://8
end;
end;这一次效果好一些,但也只有几个程序的句柄能够被发送过来.,比如ie的句柄就不能,虽然我已经激活了它.
看msdn发现一个地方,它这样解释的.The activation has changed to a different top-level, unowned window.
必须是置顶的窗口被激活才能激活这个消息么?
.
大家说说自己的看法.谢谢.有人说分少.
我的错.
我自己用了2种钩子 都不爽.
第一种cbt 全局钩子.
看代码:function CBTProc(icode:Integer;awParam:WPARAM;alParam:LPARAM):LongInt;stdcall;
begin
Result:=0;
if icode<0 then
begin
Result:=CallNextHookEx(aHook,icode,awParam,alParam);
Exit;
end;
case icode of
HCBT_MOVESIZE: ;//0
HCBT_MINMAX: ; //1
HCBT_QS: ; //2
HCBT_CREATEWND: ;//3
HCBT_DESTROYWND: ;//4
HCBT_ACTIVATE:PostMessage(aHWND,WM_MYACTIVATENEW,awParam,alParam); //给主程序发一个消息,主程序的caption就是显示当前激活窗口的句柄//5
HCBT_SETFOCUS:;//9
end;
end; 问题就是不管我点其他什么窗口,没效果,就点主程序自己,窗体的caption变成句柄了,下断不知道怎么调试.郁闷中
第二种shell钩子.
代码,差不多function ShellProc(icode:Integer;awParam:WPARAM;alParam:LPARAM):LongInt;stdcall;
begin
Result:=0;
if icode<0 then
begin
Result:=CallNextHookEx(aHook,icode,awParam,alParam);
Exit;
end;
case icode of
HSHELL_WINDOWACTIVATED:PostMessage(aHWND,WM_MYACTIVATENEW,awParam,alParam); //4//同样发消息
HSHELL_WINDOWCREATED:; //1
HSHELL_WINDOWDESTROYED:; //2
HSHELL_ACTIVATESHELLWINDOW:; //3
HSHELL_GETMINRECT:;//5
HSHELL_REDRAW:; //6
HSHELL_TASKMAN:; //7
HSHELL_LANGUAGE://8
end;
end;这一次效果好一些,但也只有几个程序的句柄能够被发送过来.,比如ie的句柄就不能,虽然我已经激活了它.
看msdn发现一个地方,它这样解释的.The activation has changed to a different top-level, unowned window.
必须是置顶的窗口被激活才能激活这个消息么?
.
大家说说自己的看法.谢谢.有人说分少.
我的错.
解决方案 »
- 《Windows程序设计》第四章例子
- Run->Parameters无法成功调试dll,而showMessage也有困难,请教
- 如何在SQL中建立字段链接到实际硬盘文件
- 关于mxoutlookbarpro的问题!
- fastreport调整上、下、左、右边界就好了
- 关于数据库的一个问题
- 很恶心的怪问题:TForm在停靠到TPanel时总会清空TForm中控件的数据,什么原因???
- 祈祷sars早日被消灭!
- 今天终于搞定了有密码的Access数据库压缩的问题,CSDN又升了一级,我高兴我散分!
- 有用过MDaemon的吗?
- delphi 有没有读取文本内容为源代码的函数
- Delphi 的 VCL 与 RTL
但是cbt钩子不需要.所以采用cbt钩子吧.
关键之前我没有理解钩子的全局变量的作用范围.
现在加入内存映射文件就好了.
huangjacky.blog.163.com
PostMessage(aHWND,WM_MYACTIVATENEW,awParam,alParam); aHWND一定要系统全局,要不然当别的窗口响应时,这个aHWND的值就不原来的值了。
这就是为什么HOOK程序中经常要用到映射内存的原因。
查一下如果几个关键词你就知道怎么弄了
OpenFileMapping CreateFileMapping MapViewOfFile