/ src / modules / fancyzones / FancyZones / FancyZonesApp.h
FancyZonesApp.h
 1  #pragma once
 2  
 3  #include <common/hooks/LowlevelKeyboardEvent.h>
 4  #include <common/utils/EventWaiter.h>
 5  
 6  #include <FancyZonesLib/FancyZones.h>
 7  
 8  class FancyZonesApp
 9  {
10  public:
11      FancyZonesApp(const std::wstring& appName, const std::wstring& appKey);
12      ~FancyZonesApp();
13  
14      void Run();
15  
16  private:
17      static inline FancyZonesApp* s_instance = nullptr;
18      static inline HHOOK s_llKeyboardHook = nullptr;
19  
20      winrt::com_ptr<IFancyZones> m_app;
21      HWINEVENTHOOK m_objectLocationWinEventHook = nullptr;
22      std::vector<HWINEVENTHOOK> m_staticWinEventHooks;
23  
24      EventWaiter m_exitEventWaiter;
25      DWORD m_mainThreadId;
26  
27      void DisableModule() noexcept;
28  
29      void InitHooks();
30  
31      void HandleWinHookEvent(WinHookEvent* data) noexcept;
32      intptr_t HandleKeyboardHookEvent(LowlevelKeyboardEvent* data) noexcept;
33  
34      static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
35      {
36          LowlevelKeyboardEvent event;
37          if (nCode == HC_ACTION && wParam == WM_KEYDOWN)
38          {
39              event.lParam = reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam);
40              event.wParam = wParam;
41              if (s_instance)
42              {
43                  if (s_instance->HandleKeyboardHookEvent(&event) == 1)
44                  {
45                      return 1;
46                  }
47              }
48          }
49          return CallNextHookEx(NULL, nCode, wParam, lParam);
50      }
51  
52      static void CALLBACK WinHookProc(HWINEVENTHOOK winEventHook,
53                                       DWORD event,
54                                       HWND window,
55                                       LONG object,
56                                       LONG child,
57                                       DWORD eventThread,
58                                       DWORD eventTime)
59      {
60          WinHookEvent data{ event, window, object, child, eventThread, eventTime };
61          if (s_instance)
62          {
63              s_instance->HandleWinHookEvent(&data);
64          }
65      }
66  };