Самое простое решение - использовать 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();
Если у вас есть права доступа, один путь с глобальным ТОС Hook прок. Дальнейшее чтение https://msdn.microsoft.com/en-us/library/windows/desktop/ms644977(v=vs.85).aspx см. HCBT_DESTROYWND –
, поэтому, когда пользователь нажимает X на окна, моя программа может «слушать» «через этот крючок CBT? – Kalos92
Начните здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990(v=vs.85).aspx и убедитесь, что вы прочитали о том, в какой поток вы вызываете обратный вызов. –