/
githubmirror
/
PowerToys
Обзор
Документация
Войти
/
githubmirror
/
PowerToys
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/modules/ZoomIt/ZoomItModuleInterface/dllmain.cpp
234 строки
6 KB
Kai Tao
Cmdpal extension: Powertoys extension for cmdpal (#44006)
23 дек 2025, 16:07
Не верифицирован
23 дек 2025, 16:07
d87dde1
Код
Авторство
О чём код?
#include "pch.h" #include <modules/interface/powertoy_module_interface.h> #include <common/SettingsAPI/settings_objects.h> #include "trace.h" #include <common/logger/logger.h> #include <common/utils/logger_helper.h> #include <common/utils/resources.h> #include <common/utils/winapi_error.h> #include <common/interop/shared_constants.h> #include <shellapi.h> #include <common/interop/shared_constants.h> namespace NonLocalizable { const wchar_t ModulePath[] = L"PowerToys.ZoomIt.exe"; const inline wchar_t ModuleKey[] = L"ZoomIt"; } BOOL APIENTRY DllMain( HMODULE /*hModule*/, DWORD ul_reason_for_call, LPVOID /*lpReserved*/ ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: Trace::RegisterProvider(); break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: Trace::UnregisterProvider(); break; } return TRUE; } class ZoomItModuleInterface : public PowertoyModuleIface { public: // Return the localized display name of the powertoy virtual PCWSTR get_name() override { return app_name.c_str(); } // Return the non localized key of the powertoy, this will be cached by the runner virtual const wchar_t* get_key() override { return app_key.c_str(); } // Return the configured status for the gpo policy for the module virtual powertoys_gpo::gpo_rule_configured_t gpo_policy_enabled_configuration() override { return powertoys_gpo::getConfiguredZoomItEnabledValue(); } // Return JSON with the configuration options. // These are the settings shown on the settings page along with their current values. virtual bool get_config(wchar_t* buffer, int* buffer_size) override { HINSTANCE hinstance = reinterpret_cast<HINSTANCE>(&__ImageBase); // TODO: Read settings from Registry. // Create a Settings object. PowerToysSettings::Settings settings(hinstance, get_name()); return settings.serialize_to_buffer(buffer, buffer_size); } // Passes JSON with the configuration settings for the powertoy. // This is called when the user hits Save on the settings page. virtual void set_config(const wchar_t*) override { try { // Parse the input JSON string. // TODO: Save settings to registry. } catch (std::exception&) { // Improper JSON. } } // Enable the powertoy virtual void enable() { Logger::info("ZoomIt enabling"); Enable(); } // Disable the powertoy virtual void disable() { Logger::info("ZoomIt disabling"); Disable(true); } // Returns if the powertoy is enabled virtual bool is_enabled() override { return m_enabled; } // Destroy the powertoy and free memory virtual void destroy() override { Disable(false); delete this; } ZoomItModuleInterface() { app_name = L"ZoomIt"; app_key = NonLocalizable::ModuleKey; LoggerHelpers::init_logger(app_key, L"ModuleInterface", LogSettings::zoomItLoggerName); m_reload_settings_event_handle = CreateDefaultEvent(CommonSharedConstants::ZOOMIT_REFRESH_SETTINGS_EVENT); m_exit_event_handle = CreateDefaultEvent(CommonSharedConstants::ZOOMIT_EXIT_EVENT); } private: bool is_enabled_by_default() const override { return false; } void Enable() { m_enabled = true; // Log telemetry Trace::EnableZoomIt(true); // Pass the PID. unsigned long powertoys_pid = GetCurrentProcessId(); std::wstring executable_args = L""; executable_args.append(std::to_wstring(powertoys_pid)); ResetEvent(m_reload_settings_event_handle); ResetEvent(m_exit_event_handle); SHELLEXECUTEINFOW sei{ sizeof(sei) }; sei.fMask = { SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI }; sei.lpFile = NonLocalizable::ModulePath; sei.nShow = SW_SHOWNORMAL; sei.lpParameters = executable_args.data(); if (ShellExecuteExW(&sei) == false) { Logger::error(L"Failed to start zoomIt"); auto message = get_last_error_message(GetLastError()); if (message.has_value()) { Logger::error(message.value()); } } else { m_hProcess = sei.hProcess; } } void Disable(bool const traceEvent) { m_enabled = false; // Log telemetry if (traceEvent) { Trace::EnableZoomIt(false); } // Tell the ZoomIt process to exit. SetEvent(m_exit_event_handle); ResetEvent(m_reload_settings_event_handle); // Wait for 1.5 seconds for the process to end correctly and stop etw tracer WaitForSingleObject(m_hProcess, 1500); // If process is still running, terminate it if (m_hProcess) { TerminateProcess(m_hProcess, 0); m_hProcess = nullptr; } } bool is_process_running() { return WaitForSingleObject(m_hProcess, 0) == WAIT_TIMEOUT; } virtual void call_custom_action(const wchar_t* action) override { try { PowerToysSettings::CustomActionObject action_object = PowerToysSettings::CustomActionObject::from_json_string(action); if (action_object.get_name() == L"refresh_settings") { SetEvent(m_reload_settings_event_handle); } } catch (std::exception&) { Logger::error(L"Failed to parse action. {}", action); } } std::wstring app_name; std::wstring app_key; //contains the non localized key of the powertoy bool m_enabled = false; HANDLE m_hProcess = nullptr; HANDLE m_reload_settings_event_handle = NULL; HANDLE m_exit_event_handle = NULL; }; extern "C" __declspec(dllexport) PowertoyModuleIface* __cdecl powertoy_create() { return new ZoomItModuleInterface(); }