我现在要频繁的向一个程序中注入代码,由于频繁操作,这个程序会不定时的弹出错误信息(错误信息都是固定相同的,窗口名固定,类也固定),我现在想用全局钩子的方法来屏蔽这个弹出的错误信息,不让他出现,直接隐藏或者直接destroy,我看了网上介绍了的WH_CBT的钩子,自己也测试了一下,没做出来,我想请教高手,对于这种情况,如果我想做一个全局的钩子,实现以下功能,请帮忙给出代码,多谢了!我要实现:
    用全局钩子监控整个系统,当出现类名为 Classname 的窗口或者 标题为 titlename 的弹出窗口时 ,就将它屏蔽掉,要屏蔽的窗口不要显示(也不闪烁,直接隐藏或者destroy掉)请给出测试通过的delphi代码,最好是源程序,谢谢大家了!只要程序调试通过,分数100赠送!

解决方案 »

  1.   

    那个错误消息框大概内容是:'0x???'指令引用的'0x???'内存,该内存不能为'read'   
      

  2.   

    屏蔽这个消息后,程序可以正常运行,我现在用的方法如下:
    procedure checkerror;      {查找错误窗口进行关闭或者隐藏}
    var
      h:hwnd;           //错误窗口句柄
      p,name,ps:array[0..254] of Char;//用来存放制定进程的classname的数组
    begin
        {***方法是便利所有窗口,查找相同标题窗口,找到后再判断类是否相同,相同隐藏***}
      h := GetWindow(Handle, GW_HWNDFIRST);
      while h <> 0 do
      begin
         GetWindowText(h, @name, Length(name));
         if name=ErrorCaption then
           begin
             GetClassName(h, ps, 255);
             if ps<>'classname' then  ShowWindow(h,SW_HIDE);
           end;   
         h := GetWindow(h, GW_HWNDNEXT);
       end;
      Sleep(1500);
    end;以上的程序可以将弹出的错误窗口隐藏,但是偶尔会发生父窗口无法正确显示的问题(在任务栏上右键单击父窗口可以看到父窗口还在运行)
    我就是想解决父窗口无法正确显示的问题。
      

  3.   

    好吧,如果你坚持要用这种办法,用SEH吧
      

  4.   

    SEH是什么?我没听过,麻烦说的清楚一点
      

  5.   

    我搞错了,你向其他程序中注入代码,SEH不起作用,你没法改目标程序的源码,这条路行不通
      

  6.   

    那该怎么办?没有人弄过吗?或者干脆谁有delphi的关于全局钩子wh_cbt的例子给我发一个好了,一个dll文件(包含源码)一个exe文件(包含源码),我自己学习一下好了!我的email:[email protected]
      

  7.   

    远程注入然后安装she是可以的
      

  8.   

    远程注入我用过,安装she是怎么弄的呢?麻烦给连接或者文章看看啊
      

  9.   

    找到句柄后,POSTMESSAGE VK_RETURN 或者 WM_CLOSE 
      

  10.   

    放一个Timer,不停的查询某个窗体是否存在,若是向那边发一个按钮点击消息或窗体关闭消息看看。
      

  11.   

    只需要钩住外部程序的show事件屏蔽即可。100分有点少。如果你加分我可以考虑给你写出完整的代码。否则只能帮你顶下贴子。
      

  12.   

    http://chensongbin0.download.csdn.net/
    这里有源码!!!!
      

  13.   

    用delphi自带的异常处理控件就行了
    ApplicationEvents 控件..在onEvents1ActionExecute 事件加入 Exit; 这一句就可以,但不建议,最好找到问题的根源...
      

  14.   

    應該要從勾外部程序的create或show的事件中去屏蔽...