公司的服务器上跑了很多VB写的垃圾程序,这些程序跑一段时间就会出问题.VB程序将弹射出Messagebox显示程序运行的错误代码.
1>点击确定后,程序继续运行
2>点击确定后,程序终止非常的烦,需要人经常去看服务器上的程序是否有messagebox弹出,就要去点"确定".要是点"确定"后,程序终止(大部分时候不终止,能继续正常运行),又需要将其打开.我想写个全局的Hook,用LRESULT CALLBACK MessageProc();来捕捉messagebox!问题如下:
1.我怎么知道某个messagebox是我需要去处理的;(VB)
2.我怎么得到messagebox上面的弹出信息,因为我要做记录;
3.发送什么消息才能象人去点击“确定”按钮那样,结束messagebox;另外,我怎么知道机子上某个程序中止了,用什么来捕获?然后,我需要CreateProcess再次启动它?以前只写过全局的MouseProc和KeyboardProc钩子,这个没有搞过.
问题有点多,先行谢过!
1>点击确定后,程序继续运行
2>点击确定后,程序终止非常的烦,需要人经常去看服务器上的程序是否有messagebox弹出,就要去点"确定".要是点"确定"后,程序终止(大部分时候不终止,能继续正常运行),又需要将其打开.我想写个全局的Hook,用LRESULT CALLBACK MessageProc();来捕捉messagebox!问题如下:
1.我怎么知道某个messagebox是我需要去处理的;(VB)
2.我怎么得到messagebox上面的弹出信息,因为我要做记录;
3.发送什么消息才能象人去点击“确定”按钮那样,结束messagebox;另外,我怎么知道机子上某个程序中止了,用什么来捕获?然后,我需要CreateProcess再次启动它?以前只写过全局的MouseProc和KeyboardProc钩子,这个没有搞过.
问题有点多,先行谢过!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
挂节好难哦!~
能不能用全局钩子实现啊??
用FindWindow实现不就行了?
定时查询相应的MessageBox不就行了?
望解答啊,分不够,另起炉灶也要把这个问题搞顶~~
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);
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
char p[10];
问题是为什么GetDlgItemText((HWND)wParam,0x0000FFFF,p,10),得到的文本第一位为空呢??
通过全局钩子钩WM_CREATE好像构不到Windows标准的messagebox创建消息,但是能够钩到WH_CBT钩子的HCBT_ACTIVATE消息,得到的窗口句柄就是messagebox的窗口句柄,然后用enumchildwindow遍历所有的子窗口,就可以得到ok按钮和静态文本的内容。不知道VB的messagebox是不是特殊处理了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
能钩到,但是钩到乱七八糟的东西太多了