#include "pch.h" #include "powertoy_module.h" #include "centralized_kb_hook.h" #include std::map& modules() { static std::map modules; return modules; } PowertoyModule load_powertoy(const std::wstring_view filename) { auto handle = winrt::check_pointer(LoadLibraryW(filename.data())); auto create = reinterpret_cast(GetProcAddress(handle, "powertoy_create")); if (!create) { FreeLibrary(handle); winrt::throw_last_error(); } auto pt_module = create(); if (!pt_module) { FreeLibrary(handle); winrt::throw_hresult(winrt::hresult(E_POINTER)); } return PowertoyModule(pt_module, handle); } json::JsonObject PowertoyModule::json_config() const { int size = 0; pt_module->get_config(nullptr, &size); std::wstring result; result.resize(size - 1); pt_module->get_config(result.data(), &size); return json::JsonObject::Parse(result); } PowertoyModule::PowertoyModule(PowertoyModuleIface* pt_module, HMODULE handle) : handle(handle), pt_module(pt_module) { if (!pt_module) { throw std::runtime_error("Module not initialized"); } update_hotkeys(); } void PowertoyModule::update_hotkeys() { CentralizedKeyboardHook::ClearModuleHotkeys(pt_module->get_key()); size_t hotkeyCount = pt_module->get_hotkeys(nullptr, 0); std::vector hotkeys(hotkeyCount); pt_module->get_hotkeys(hotkeys.data(), hotkeyCount); auto modulePtr = pt_module.get(); for (size_t i = 0; i < hotkeyCount; i++) { CentralizedKeyboardHook::SetHotkeyAction(pt_module->get_key(), hotkeys[i], [modulePtr, i] { Logger::trace(L"{} hotkey is invoked from Centralized keyboard hook", modulePtr->get_key()); return modulePtr->on_hotkey(i); }); } }