【问题标题】:Checking if another window is closed c++检查另一个窗口是否关闭c ++
【发布时间】:2025-12-03 12:30:01
【问题描述】:

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

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

感谢您的帮助。

【问题讨论】:

标签: c++ winapi


【解决方案1】:

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

#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();

【讨论】:

    最近更新 更多