2016-10-12 3 views
3

Я разрабатываю приложение, которое проверяет открытые окна на компьютере пользователя в Windows (так же, как в Task Manager)Проверка, если другое окно закрыто с ++

я использовал EnumWindows перечислить все активные окна и работает, теперь я хочу создать функцию, которая пишет сообщение на консоли, когда окна будут закрыты. Возможно или я должен проверить массив WindowHandler в отдельном потоке и как проверить их статус?

Благодарим за помощь.

+1

Если у вас есть права доступа, один путь с глобальным ТОС Hook прок. Дальнейшее чтение https://msdn.microsoft.com/en-us/library/windows/desktop/ms644977(v=vs.85).aspx см. HCBT_DESTROYWND –

+0

, поэтому, когда пользователь нажимает X на окна, моя программа может «слушать» «через этот крючок CBT? – Kalos92

+0

Начните здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx и убедитесь, что вы прочитали о том, в какой поток вы вызываете обратный вызов. –

ответ

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(); 
Смежные вопросы