c++ - 检查另一个窗口是否关闭c++

标签 c++ winapi

我正在开发一个应用程序来检查 Windows 用户计算机上打开的窗口(就像任务管理器一样)

我使用 EnumWindows 列出所有事件窗口并且它有效,现在我想创建一个函数,当窗口关闭时在控制台上写一条消息。是可能的还是我必须在单独的线程中检查 WindowHandler 数组 以及如何检查它们的状态?

感谢您的帮助。

最佳答案

最简单的解决方案是使用 WinEvents ,通过注册 EVENT_OBJECT_DESTROY 事件。代码相当简单:

#include <windows.h>

namespace {
    HWINEVENTHOOK g_WindowDestructionHook = NULL;
}

inline void CALLBACK WinEventProc( HWINEVENTHOOK hWinEventHook,
                                   DWORD         event,
                                   HWND          hwnd,
                                   LONG          idObject,
                                   LONG          idChild,
                                   DWORD         dwEventThread,
                                   DWORD         dwmsEventTime ) {
    // Filter interesting events only:
    if ( idObject == OBJID_WINDOW && idChild == CHILDID_SELF ) {
        wprintf( L"Window destroyed: HWND = %08X\n", hwnd );
    }
}

inline void RegisterWindowDestructionHook() {
    g_WindowDestructionHook = ::SetWinEventHook( EVENT_OBJECT_DESTROY,
                                                 EVENT_OBJECT_DESTROY,
                                                 NULL,
                                                 WinEventProc,
                                                 0, 0,
                                                 WINEVENT_OUTOFCONTEXT );
}

inline void UnregisterHook() {
    ::UnhookWinEvent( g_WindowDestructionHook );
}

使用这个同样简单:

::CoInitialize( NULL );
RegisterWindowDestructionHook();

MSG msg = {};
while ( ::GetMessageW( &msg, nullptr, 0, 0 ) > 0 ) {
    ::TranslateMessage( &msg );
    ::DispatchMessageW( &msg );
}

UnregisterHook();
::CoUninitialize();

关于c++ - 检查另一个窗口是否关闭c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40005240/

相关文章:

c++ - iOS:找不到架构 i386 的 sin() 符号

winapi - 如何在Forth中使用ReadConsoleOutputCharacterA?

delphi - 从非 unicode Delphi 调用 GetStringTypeW (7)

windows - 如何手动读/写.exe机器代码?

c++ - 调整大小后win32重绘

c++ - Boost spirit解析器如何打印符号表匹配的变量?

c++ - 如何在 DLL 中隐藏导出函数

c++ - reinterpret_cast 上的字节顺序

c++ - 是否可以从项目依赖项覆盖包含文件

c++ - 在 win32 用户态代码中 Hook OpenProcess() 或 ReadVirtualMemory()