我想做一个全局系统钩子,监控所有运行着的程序,要实时的。比如不想让窗体名为“AAA”的程序运行起来的话。如果钩子发现名为“AAA”的窗体启动了,那么就通过窗体名“AAA”返回这个窗体的句柄,然后SendMessage(AAA的handle,WM_CLOSE)这样可以吗?
钩子我正在做,多方搜索没有发现比较好的资料。
我只想拦截窗体创建消息和当前窗体激活消息该如何设置钩子类型?
都说全局钩子必须采用DLL注入式,我自己试了好多遍不是机器卡的没法用就是出地址错误。希望手头有DLL注入式钩子实例的高手们能把代码贴出来

解决方案 »

  1.   

    很简单,利用findwindow这个系统api找窗体,发现后然后SendMessage(AAA的handle,WM_CLOSE)就ok了
      

  2.   

    呵呵,把钩子写在DLL里是很容易出现内存地址错误的,楼主要小心了。。
      

  3.   

    遍历系统窗口标题就行了吧.不需要HOOK
      

  4.   

    我是想实时的,并且不想在系统内留下任何痕迹,所以才考虑到用DLL全局钩子来监控系统,因为采用DLL线程注入隐蔽性最好。
    我想即使是用楼上两位所说的FindWindow和遍历系统标题来做,必须放到循环中或者Timer中吧?
    并且Findwindow只能通过完全准全的窗体名来返回句柄,我不知道具体的窗体名,只知道其中的几个字。所以用Findwindow好像不能解决。
    关键我还是想学习DLL注入式钩子的知识,请各位高手帮忙,谁有好的资料或者例子请至[email protected]或者贴出来,分不够我可以在加200!
      

  5.   

    你去下载《delphi下深入windows核心编程》,里面有钩子的源代码
      

  6.   

    uses PsAPI,function getCurrentProcessExeName: string;
    var
      i: integer;
    begin
      SetLength(result, MAX_PATH);
      i := GetModuleBaseName(GetCurrentProcess, 0, pchar(result), MAX_PATH);
      SetLength(result, i);
    end;function getCurrentDllName: string;
    var
      FN: array[0..255] of char;
    begin
      SetString(result, FN, GetModuleFileName(hInstance, FN, SizeOf(FN)));
    end;
    你获得 当前的 运行的 exe 的名字 (函数 在上面)
    然后 判断  然后 GetCurrentProcess 然后杀进程