vc++实现监控子进程,自动关闭弹出的窗口

2022-05-13  本文已影响0人  叶迎宪

核心原理,利用 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;
}
上一篇下一篇

猜你喜欢

热点阅读