核心原理,利用 SetWinEventHook 钩子监测窗口创建事件,然后用 PostMessge 发消息关闭它。使用 SetWinEventHook 后,需要有独立的消息循环,事件的回调才能被调用,参考
https://stackoverflow.com/questions/20732086/setwineventhook-with-createprocess-c
VOID CALLBACK WinEventsProc(HWINEVENTHOOK hWinEventHook, DWORD dwEvent, HWND hwnd, LONG idObject,
LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)
{
char wnd_title[256];
switch (dwEvent)
{
case EVENT_SYSTEM_DIALOGSTART:
::GetWindowTextA(hwnd, wnd_title, sizeof(wnd_title));
TRACE_LOG(TRACE_ERROR, "Close windows %s\n", wnd_title);
::PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
}
}
bool child_quit;
DWORD WINAPI DialogKillerThread(LPVOID process_id)
{
HWINEVENTHOOK hHook = ::SetWinEventHook(EVENT_SYSTEM_DIALOGSTART, EVENT_SYSTEM_DIALOGSTART,
NULL, WinEventsProc, (DWORD)process_id, 0, WINEVENT_OUTOFCONTEXT);
MSG msg;
while (!child_quit)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Sleep(100);
}
}
return 0;
}
网友评论