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

时间:2016-10-12 17:53:50

标签: c++ winapi

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

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是使用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();