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 };