公司的服务器上跑了很多VB写的垃圾程序,这些程序跑一段时间就会出问题.VB程序将弹射出Messagebox显示程序运行的错误代码.
  1>点击确定后,程序继续运行
  2>点击确定后,程序终止非常的烦,需要人经常去看服务器上的程序是否有messagebox弹出,就要去点"确定".要是点"确定"后,程序终止(大部分时候不终止,能继续正常运行),又需要将其打开.我想写个全局的Hook,用LRESULT CALLBACK MessageProc();来捕捉messagebox!问题如下:
1.我怎么知道某个messagebox是我需要去处理的;(VB)
2.我怎么得到messagebox上面的弹出信息,因为我要做记录;
3.发送什么消息才能象人去点击“确定”按钮那样,结束messagebox;另外,我怎么知道机子上某个程序中止了,用什么来捕获?然后,我需要CreateProcess再次启动它?以前只写过全局的MouseProc和KeyboardProc钩子,这个没有搞过.
问题有点多,先行谢过!

解决方案 »

  1.   

    见核心编程一书中的LastMsgBoxInfo示例,修改一下应该满足你的要求!
      

  2.   

    DentistryDoctor
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    挂节好难哦!~
    能不能用全局钩子实现啊??
      

  3.   

    LastMsgBoxInfo实际上就是一个钩子及挂接API的示例。
      

  4.   

    简单啊
    用FindWindow实现不就行了?
    定时查询相应的MessageBox不就行了?
      

  5.   

    可是鬼知道那些程序会弹出什么样的messagebox,定时不太好
      

  6.   

    今天用spy++找到程序的类名,然后LRESULT CALLBACK MessageProc()试了一下,可一捕捉到messagebox.但怎么取得messagebox中的内容,如何终止messagebox.
    望解答啊,分不够,另起炉灶也要把这个问题搞顶~~
      

  7.   

    //我已经写到这里了,中间带"???"号的地方搞不定了,请帮忙啊!//123.dll#include <Afx.h>HHOOK g_hMessage = NULL;
    HWND g_hWnd = NULL;
    DWORD g_dw = 0;LRESULT CALLBACK MessageProc(
      int code,       // hook code
      WPARAM wParam,  // undefined
      LPARAM lParam   // address of structure with message data
    )
    {
    if(code == MSGF_DIALOGBOX)
    {
    //这里该怎么写????
    //1.得到所弹出的MessageBox所显示的信息
    //2.发送消息使该MessageBox点击"OK"中止
    }
    return 1;
    }
    void SetHook()
    {
    g_hWnd = FindWindow("ThunderRT6FormDC","Form1");//一个VB程序
    g_dw = GetWindowThreadProcessId(g_hWnd,NULL);
    if(g_hWnd)
    {
    g_hMessage = SetWindowsHookEx(WH_MSGFILTER,MessageProc,GetModuleHandle("123"),g_dw);
    }
    }
      

  8.   

    通过全局钩子钩WM_CREATE好像构不到Windows标准的messagebox创建消息,但是能够钩到WH_CBT钩子的HCBT_ACTIVATE消息,得到的窗口句柄就是messagebox的窗口句柄,然后用enumchildwindow遍历所有的子窗口,就可以得到ok按钮和静态文本的内容。不知道VB的messagebox是不是特殊处理了
      

  9.   

    楼上正解,我已经将钩子该为WH_CBT,然后判断HCBT_ACTIVATE.之后我用GetDlgItemText((HWND)wParam,0x0000FFFF,p,10)得到了静态文本,但是假设文本为"12345",我得到的总是第一位为空" 2345".不知道为什么???????然后发送BN_CLICK消息,结束MessageBox.
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    char p[10];
    问题是为什么GetDlgItemText((HWND)wParam,0x0000FFFF,p,10),得到的文本第一位为空呢??
      

  10.   

    回复人: orbit(走了走了) ( ) 信誉:116  2006-02-18 13:04:00  得分: 0  
       通过全局钩子钩WM_CREATE好像构不到Windows标准的messagebox创建消息,但是能够钩到WH_CBT钩子的HCBT_ACTIVATE消息,得到的窗口句柄就是messagebox的窗口句柄,然后用enumchildwindow遍历所有的子窗口,就可以得到ok按钮和静态文本的内容。不知道VB的messagebox是不是特殊处理了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    能钩到,但是钩到乱七八糟的东西太多了
      
     
      

  11.   

    钩子问题我看大家已经解释得差不多了。关于进程监视,你可以试试这个函数 PsSetCreateProcessNotifyRoutine , 比较麻烦,需要写一个驱动程序,就可以监视所有进程的启动,结束情况了。具体的程序可以到codeguru下载。