WindowCreationHandler.cpp
1 #include "pch.h" 2 #include "WindowCreationHandler.h" 3 4 WindowCreationHandler::WindowCreationHandler(std::function<void(HWND)> windowCreatedCallback) : 5 m_windowCreatedCallback(windowCreatedCallback) 6 { 7 s_instance = this; 8 InitHooks(); 9 } 10 11 WindowCreationHandler::~WindowCreationHandler() 12 { 13 m_staticWinEventHooks.erase(std::remove_if(begin(m_staticWinEventHooks), 14 end(m_staticWinEventHooks), 15 [](const HWINEVENTHOOK hook) { 16 return UnhookWinEvent(hook); 17 }), 18 end(m_staticWinEventHooks)); 19 } 20 21 void WindowCreationHandler::InitHooks() 22 { 23 std::array<DWORD, 3> events_to_subscribe = { 24 EVENT_OBJECT_UNCLOAKED, 25 EVENT_OBJECT_SHOW, 26 EVENT_OBJECT_CREATE 27 }; 28 for (const auto event : events_to_subscribe) 29 { 30 auto hook = SetWinEventHook(event, event, nullptr, WinHookProc, 0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); 31 if (hook) 32 { 33 m_staticWinEventHooks.emplace_back(hook); 34 } 35 else 36 { 37 Logger::error(L"Failed to initialize win event hooks"); 38 } 39 } 40 } 41 42 void WindowCreationHandler::HandleWinHookEvent(DWORD event, HWND window) noexcept 43 { 44 switch (event) 45 { 46 //case EVENT_OBJECT_UNCLOAKED: 47 //case EVENT_OBJECT_SHOW: 48 case EVENT_OBJECT_CREATE: 49 { 50 if (m_windowCreatedCallback) 51 { 52 m_windowCreatedCallback(window); 53 } 54 } 55 break; 56 57 default: 58 break; 59 } 60 }