/ src / modules / Workspaces / WorkspacesWindowArranger / WindowCreationHandler.cpp
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  }