如题.
我自己用了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.
必须是置顶的窗口被激活才能激活这个消息么?
.
大家说说自己的看法.谢谢.有人说分少.
我的错.

解决方案 »

  1.   

    shell钩子是 必须需要置顶才能激活
    但是cbt钩子不需要.所以采用cbt钩子吧.
    关键之前我没有理解钩子的全局变量的作用范围.
    现在加入内存映射文件就好了.
      

  2.   

    还有主程序aHwnd是怎么传进钩子Dll的,其它窗口是否能共享到
      

  3.   

    呵呵 代码在我的博客.
    huangjacky.blog.163.com
      

  4.   

    问题出在CBTProc中的这句中:
    PostMessage(aHWND,WM_MYACTIVATENEW,awParam,alParam);   aHWND一定要系统全局,要不然当别的窗口响应时,这个aHWND的值就不原来的值了。
    这就是为什么HOOK程序中经常要用到映射内存的原因。
    查一下如果几个关键词你就知道怎么弄了
    OpenFileMapping CreateFileMapping MapViewOfFile