领导让我开发一个应用程序监视器,监视该应用程序运行情况,如果应用程序报错弹出对话框,监视器自动关闭出错进程(不用手动点击确定退出)。我的想法是捕获系统发给应用程序的消息,屏蔽掉出错对话框。只用c#能不能实现呢,被监视的应用程序是用pb+vc++开发的。大虾们帮我看看有没有什莫解决方案,谢了

解决方案 »

  1.   

    问题是出错的对话框有什么特别标识,而且是所有都有特征的,否则你很难hook监控。
      

  2.   

    只用c++写过hook, 用c#估计是不行的。用消息行不行,你要先用消息侦听器验证一下。欢迎大家来我的博客作客:http://blog.csdn.net/aafshzj/
    我正在写一系列关于AAF组件框架的文章。该框架能对开发工作提供很多帮助,并极大地提高开发效率。希望大家看一看并提出宝贵建议。
      

  3.   

    to Knight94(愚翁):
    出错标识是winxp的数字签名错误,事件id 1000,我该怎样获得被监视进程的窗口句柄呢
      

  4.   

    to aafshzj():
    消息侦听器是什莫呢,能不能提供点资料,谢谢
      

  5.   

    出错标识是winxp的数字签名错误,事件id 1000,我该怎样获得被监视进程的窗口句柄呢==============================================窗口标题是什么如果你找到标题以后用findwindows的找到窗口句柄,然后还是 用findwindows获取确定按牛的句柄,然后用sendmessage发送电击消息。。就ok了。。
      

  6.   

    以上的操作你在处理错误信息中调用
    try
    {
    }
    catch
    {
    这里调用。。
    }
      

  7.   

    我觉得这个用hook不好解决你最好隔一段时间,看看那错误窗体是否弹出,然后模拟鼠标去点击,再关闭
      

  8.   

    visual studio工具里有一个spy++就是征听windows事件的,你可以看一看。用hook可能是可行的,但不一定是窗口事件hook,而可能是特定dll的hook,基本思路如下:
    1)用进程察看器查看出错时系统调用了什么dll来提示出错
    2)编写针对该dll的hook,截取相关调用不过,这是要花点时间的。还有性能差点的做法,不过也未必不可以用。那就是你写一个windows服务进程,每若干秒察看一下指定位置(这就要做试验了,看看出错的窗口其父窗口是谁?是不是桌面窗口)有没有符合指定特征(如窗口类型、其中子窗口,比如一个文本框控件,的内容包含某些文本内容特征)的报错窗口。这种方式比较简单,就是食用点常用的win32api罢了:
    GetDescktopWindow
    EnumWindow
    等等。你自己权衡一下,初步尝试可以考虑使用最后一种方法。
    欢迎大家来我的博客作客:http://blog.csdn.net/aafshzj/
    我正在写一系列关于AAF组件框架的文章。该框架能对开发工作提供很多帮助,并极大地提高开发效率。希望大家看一看并提出宝贵建议。
      

  9.   

    一般出错都有特征比如它的标题
    你把所有的出错产生的标题保存到一个数组里面然后用个定时器控件比如每秒检查一次吧
    然后遍历数组使用FindWindow函数检查指定窗口是都存在如果存在的话用SENDMESSAGE关闭窗体即可
      

  10.   

    基本问题已经解决了,感谢sgear,愚翁,aafshzj() ,散分
      

  11.   

    如果是弹出对话框后再关闭,可用FINDWINDOWS,反正出错框的标题你肯定能控制.关闭对话框.如果不弹出,可用
    try
    {
    }
    catch
    {
    }