我正在开发一个应用程序来检查Windows上用户计算机上的打开窗口(就像任务管理器一样)
我使用 EnumWindows 列出所有活动窗口并且它可以工作,现在我想创建一个在窗口关闭时在控制台上写入消息的功能。可以或者我必须在一个单独的线程中检查一个 WindowHandler 数组,如何检查它们的状态?
感谢您的帮助。
答案 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();