美文网首页
vc++实现监控子进程,自动关闭弹出的窗口

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

作者: 叶迎宪 | 来源:发表于2022-05-13 21:17 被阅读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;
    }
    

    相关文章

      网友评论

          本文标题:vc++实现监控子进程,自动关闭弹出的窗口

          本文链接:https://www.haomeiwen.com/subject/msvuurtx.html