diff --git a/PowerToys.sln b/PowerToys.sln index ac70abbfe9..043585c7ed 100644 --- a/PowerToys.sln +++ b/PowerToys.sln @@ -404,8 +404,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ImageResizerLib", "src\modu EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PowerAccent", "PowerAccent", "{0F14491C-6369-4C45-AAA8-135814E66E6B}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerAccentModuleInterface", "src\modules\poweraccent\PowerAccentModuleInterface\PowerAccentModuleInterface.vcxproj", "{34A354C5-23C7-4343-916C-C52DAF4FC39D}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PowerAccent.Core", "src\modules\poweraccent\PowerAccent.Core\PowerAccent.Core.csproj", "{3264DF53-C805-4B0C-867C-FCEAF7AEF762}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PowerAccent.UI", "src\modules\poweraccent\PowerAccent.UI\PowerAccent.UI.csproj", "{31CAD28E-778A-441C-85BC-40AB3EAA2A10}" @@ -1722,14 +1720,6 @@ Global {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Release|ARM64.Build.0 = Release|ARM64 {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Release|x64.ActiveCfg = Release|x64 {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Release|x64.Build.0 = Release|x64 - {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Debug|ARM64.Build.0 = Debug|ARM64 - {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Debug|x64.ActiveCfg = Debug|x64 - {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Debug|x64.Build.0 = Debug|x64 - {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Release|ARM64.ActiveCfg = Release|ARM64 - {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Release|ARM64.Build.0 = Release|ARM64 - {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Release|x64.ActiveCfg = Release|x64 - {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Release|x64.Build.0 = Release|x64 {3264DF53-C805-4B0C-867C-FCEAF7AEF762}.Debug|ARM64.ActiveCfg = Debug|ARM64 {3264DF53-C805-4B0C-867C-FCEAF7AEF762}.Debug|ARM64.Build.0 = Debug|ARM64 {3264DF53-C805-4B0C-867C-FCEAF7AEF762}.Debug|x64.ActiveCfg = Debug|x64 @@ -3165,7 +3155,6 @@ Global {93B72A06-C8BD-484F-A6F7-C9F280B150BF} = {6C7F47CC-2151-44A3-A546-41C70025132C} {18B3DB45-4FFE-4D01-97D6-5223FEEE1853} = {6C7F47CC-2151-44A3-A546-41C70025132C} {0F14491C-6369-4C45-AAA8-135814E66E6B} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} - {34A354C5-23C7-4343-916C-C52DAF4FC39D} = {0F14491C-6369-4C45-AAA8-135814E66E6B} {3264DF53-C805-4B0C-867C-FCEAF7AEF762} = {0F14491C-6369-4C45-AAA8-135814E66E6B} {31CAD28E-778A-441C-85BC-40AB3EAA2A10} = {0F14491C-6369-4C45-AAA8-135814E66E6B} {A50C70A6-2DA0-4027-B90E-B1A40755A8A5} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} diff --git a/src/modules/poweraccent/PowerAccent.Core/ModuleInterface.cs b/src/modules/poweraccent/PowerAccent.Core/ModuleInterface.cs new file mode 100644 index 0000000000..09f693125b --- /dev/null +++ b/src/modules/poweraccent/PowerAccent.Core/ModuleInterface.cs @@ -0,0 +1,36 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Diagnostics; +using System.Globalization; +using ManagedCommon; +using Microsoft.PowerToys.Settings.UI.Library; +using PowerToys.GPOWrapper; + +namespace PowerAccent.Core +{ + internal sealed class ModuleInterface : IPowerToysModule + { + public string Name => "PowerAccent"; + + public bool Enabled => new SettingsUtils().GetSettingsOrDefault().Enabled.PowerAccent; + + public GpoRuleConfigured GpoRuleConfigured => GPOWrapper.GetConfiguredQuickAccentEnabledValue(); + + public void Disable() + { + foreach (var process in Process.GetProcessesByName("PowerToys.PowerAccent.exe")) + { + process.Kill(); + } + } + + public void Enable() + { + Disable(); + + Process.Start("PowerToys.PowerAccent.exe", Environment.ProcessId.ToString(CultureInfo.InvariantCulture)); + } + } +} diff --git a/src/modules/poweraccent/PowerAccent.Core/PowerAccent.Core.csproj b/src/modules/poweraccent/PowerAccent.Core/PowerAccent.Core.csproj index 1f653884cf..e95f5f655a 100644 --- a/src/modules/poweraccent/PowerAccent.Core/PowerAccent.Core.csproj +++ b/src/modules/poweraccent/PowerAccent.Core/PowerAccent.Core.csproj @@ -13,7 +13,7 @@ - PowerToys.GPOWrapper;PowerToys.PowerAccentKeyboardService + PowerToys.PowerAccentKeyboardService $(OutDir) false @@ -28,7 +28,7 @@ - + diff --git a/src/modules/poweraccent/PowerAccentModuleInterface/PowerAccentConstants.h b/src/modules/poweraccent/PowerAccentModuleInterface/PowerAccentConstants.h deleted file mode 100644 index 1db4a21f56..0000000000 --- a/src/modules/poweraccent/PowerAccentModuleInterface/PowerAccentConstants.h +++ /dev/null @@ -1,7 +0,0 @@ -#include - -namespace PowerAccentConstants -{ - // Name of the powertoy module. - inline const std::wstring ModuleKey = L"QuickAccent"; -} \ No newline at end of file diff --git a/src/modules/poweraccent/PowerAccentModuleInterface/PowerAccentModuleInterface.rc b/src/modules/poweraccent/PowerAccentModuleInterface/PowerAccentModuleInterface.rc deleted file mode 100644 index 68d3300e93..0000000000 --- a/src/modules/poweraccent/PowerAccentModuleInterface/PowerAccentModuleInterface.rc +++ /dev/null @@ -1,108 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include -#include "resource.h" -#include "../../../common/version/version.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "winres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -1 VERSIONINFO -FILEVERSION FILE_VERSION -PRODUCTVERSION PRODUCT_VERSION -FILEFLAGSMASK VS_FFI_FILEFLAGSMASK -#ifdef _DEBUG -FILEFLAGS VS_FF_DEBUG -#else -FILEFLAGS 0x0L -#endif -FILEOS VOS_NT_WINDOWS32 -FILETYPE VFT_DLL -FILESUBTYPE VFT2_UNKNOWN -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" // US English (0x0409), Unicode (0x04B0) charset - BEGIN - VALUE "CompanyName", COMPANY_NAME - VALUE "FileDescription", FILE_DESCRIPTION - VALUE "FileVersion", FILE_VERSION_STRING - VALUE "InternalName", INTERNAL_NAME - VALUE "LegalCopyright", COPYRIGHT_NOTE - VALUE "OriginalFilename", ORIGINAL_FILENAME - VALUE "ProductName", PRODUCT_NAME - VALUE "ProductVersion", PRODUCT_VERSION_STRING - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 // US English (0x0409), Unicode (1200) charset - END -END - - -///////////////////////////////////////////////////////////////////////////// -// English (United States) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""winres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - IDS_POWERACCENT_NAME "QuickAccent" -END - -#endif // English (United States) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/src/modules/poweraccent/PowerAccentModuleInterface/PowerAccentModuleInterface.vcxproj b/src/modules/poweraccent/PowerAccentModuleInterface/PowerAccentModuleInterface.vcxproj deleted file mode 100644 index 06f2722733..0000000000 --- a/src/modules/poweraccent/PowerAccentModuleInterface/PowerAccentModuleInterface.vcxproj +++ /dev/null @@ -1,80 +0,0 @@ - - - - - 15.0 - {34A354C5-23C7-4343-916C-C52DAF4FC39D} - Win32Proj - PowerAccent - PowerAccentModuleInterface - - - - DynamicLibrary - - - - - - - - - - - - ..\..\..\..\$(Platform)\$(Configuration)\ - - - PowerToys.$(ProjectName) - - - - EXAMPLEPOWERTOY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - ..\..\..\common\inc;..\..\..\common\Telemetry;..\..\;..\..\..\;%(AdditionalIncludeDirectories) - - - $(OutDir)$(TargetName)$(TargetExt) - - - - - - - - - - - - Create - - - - - - {d9b8fc84-322a-4f9f-bbb9-20915c47ddfd} - - - {6955446d-23f7-4023-9bb3-8657f904af99} - - - - - - - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - \ No newline at end of file diff --git a/src/modules/poweraccent/PowerAccentModuleInterface/PowerAccentModuleInterface.vcxproj.filters b/src/modules/poweraccent/PowerAccentModuleInterface/PowerAccentModuleInterface.vcxproj.filters deleted file mode 100644 index 01918805fe..0000000000 --- a/src/modules/poweraccent/PowerAccentModuleInterface/PowerAccentModuleInterface.vcxproj.filters +++ /dev/null @@ -1,50 +0,0 @@ - - - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Generated Files - - - - - {e8ef1c4e-cc50-4ce5-b00d-4e3ac5c1a7db} - - - {fbd9cdd2-e7d5-4417-9b52-25e345ae9562} - - - {c2a23a2b-5846-440f-b29e-eea748dba12d} - - - {77f1702b-da7f-4ff6-90a3-19db515cf963} - - - - - Resource Files - - - - - - \ No newline at end of file diff --git a/src/modules/poweraccent/PowerAccentModuleInterface/dllmain.cpp b/src/modules/poweraccent/PowerAccentModuleInterface/dllmain.cpp deleted file mode 100644 index 59a275b0d0..0000000000 --- a/src/modules/poweraccent/PowerAccentModuleInterface/dllmain.cpp +++ /dev/null @@ -1,190 +0,0 @@ -#include "pch.h" -#include -#include -#include -#include "trace.h" -#include "resource.h" -#include "PowerAccentConstants.h" -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include - -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; -} - -const static wchar_t* MODULE_NAME = L"QuickAccent"; -const static wchar_t* MODULE_DESC = L"A module that keeps your computer QuickAccent on-demand."; - -class PowerAccent : public PowertoyModuleIface -{ - std::wstring app_name; - std::wstring app_key; - -private: - bool m_enabled = false; - PROCESS_INFORMATION p_info = {}; - - bool is_process_running() - { - return WaitForSingleObject(p_info.hProcess, 0) == WAIT_TIMEOUT; - } - - void launch_process() - { - Logger::trace(L"Launching PowerToys QuickAccent process"); - unsigned long powertoys_pid = GetCurrentProcessId(); - - std::wstring executable_args = L"" + std::to_wstring(powertoys_pid); - std::wstring application_path = L"PowerToys.PowerAccent.exe"; - std::wstring full_command_path = application_path + L" " + executable_args.data(); - Logger::trace(L"PowerToys QuickAccent launching: " + full_command_path); - - STARTUPINFO info = { sizeof(info) }; - - if (!CreateProcess(application_path.c_str(), full_command_path.data(), NULL, NULL, true, NULL, NULL, NULL, &info, &p_info)) - { - DWORD error = GetLastError(); - std::wstring message = L"PowerToys QuickAccent failed to start with error: "; - message += std::to_wstring(error); - Logger::error(message); - } - } - -public: - PowerAccent() - { - app_name = MODULE_NAME; - app_key = PowerAccentConstants::ModuleKey; - LoggerHelpers::init_logger(app_key, L"ModuleInterface", "QuickAccent"); - Logger::info("Launcher object is constructing"); - }; - - virtual void destroy() override - { - delete this; - } - - virtual const wchar_t* get_name() override - { - return MODULE_NAME; - } - - virtual bool get_config(wchar_t* buffer, int* buffer_size) override - { - HINSTANCE hinstance = reinterpret_cast(&__ImageBase); - - PowerToysSettings::Settings settings(hinstance, get_name()); - settings.set_description(MODULE_DESC); - - return settings.serialize_to_buffer(buffer, buffer_size); - } - - 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::getConfiguredQuickAccentEnabledValue(); - } - - virtual void set_config(const wchar_t* config) override - { - try - { - // Parse the input JSON string. - PowerToysSettings::PowerToyValues values = - PowerToysSettings::PowerToyValues::from_json_string(config, get_key()); - - // If you don't need to do any custom processing of the settings, proceed - // to persists the values. - values.save_to_settings_file(); - } - catch (std::exception&) - { - // Improper JSON. - } - } - - virtual void enable() - { - launch_process(); - m_enabled = true; - Trace::EnablePowerAccent(true); - }; - - virtual void disable() - { - if (m_enabled) - { - Logger::trace(L"Disabling QuickAccent... {}", m_enabled); - - auto exitEvent = CreateEvent(nullptr, false, false, CommonSharedConstants::POWERACCENT_EXIT_EVENT); - if (!exitEvent) - { - Logger::warn(L"Failed to create exit event for PowerToys QuickAccent. {}", get_last_error_or_default(GetLastError())); - } - else - { - Logger::trace(L"Signaled exit event for PowerToys QuickAccent."); - if (!SetEvent(exitEvent)) - { - Logger::warn(L"Failed to signal exit event for PowerToys QuickAccent. {}", get_last_error_or_default(GetLastError())); - - // For some reason, we couldn't process the signal correctly, so we still - // need to terminate the PowerAccent process. - TerminateProcess(p_info.hProcess, 1); - } - - ResetEvent(exitEvent); - CloseHandle(exitEvent); - CloseHandle(p_info.hProcess); - } - } - - m_enabled = false; - Trace::EnablePowerAccent(false); - } - - virtual bool is_enabled() override - { - return m_enabled; - } - - // Returns whether the PowerToys should be enabled by default - virtual bool is_enabled_by_default() const override - { - return false; - } -}; - -extern "C" __declspec(dllexport) PowertoyModuleIface* __cdecl powertoy_create() -{ - return new PowerAccent(); -} \ No newline at end of file diff --git a/src/modules/poweraccent/PowerAccentModuleInterface/packages.config b/src/modules/poweraccent/PowerAccentModuleInterface/packages.config deleted file mode 100644 index 09bfc449e2..0000000000 --- a/src/modules/poweraccent/PowerAccentModuleInterface/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/modules/poweraccent/PowerAccentModuleInterface/pch.cpp b/src/modules/poweraccent/PowerAccentModuleInterface/pch.cpp deleted file mode 100644 index 17305716aa..0000000000 --- a/src/modules/poweraccent/PowerAccentModuleInterface/pch.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "pch.h" \ No newline at end of file diff --git a/src/modules/poweraccent/PowerAccentModuleInterface/pch.h b/src/modules/poweraccent/PowerAccentModuleInterface/pch.h deleted file mode 100644 index 329705f63b..0000000000 --- a/src/modules/poweraccent/PowerAccentModuleInterface/pch.h +++ /dev/null @@ -1,6 +0,0 @@ -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include -#include \ No newline at end of file diff --git a/src/modules/poweraccent/PowerAccentModuleInterface/resource.h b/src/modules/poweraccent/PowerAccentModuleInterface/resource.h deleted file mode 100644 index c4330d7871..0000000000 --- a/src/modules/poweraccent/PowerAccentModuleInterface/resource.h +++ /dev/null @@ -1,26 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by PowerAccent.rc -// -#define IDS_POWERACCENT_NAME 101 - -////////////////////////////// -// Non-localizable - -#define FILE_DESCRIPTION "PowerToys QuickAccent Module" -#define INTERNAL_NAME "PowerToys.PowerAccentModuleInterface" -#define ORIGINAL_FILENAME "PowerToys.PowerAccentModuleInterface.dll" - -// Non-localizable -////////////////////////////// - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 102 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/src/modules/poweraccent/PowerAccentModuleInterface/trace.cpp b/src/modules/poweraccent/PowerAccentModuleInterface/trace.cpp deleted file mode 100644 index 8a063ea99f..0000000000 --- a/src/modules/poweraccent/PowerAccentModuleInterface/trace.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "pch.h" -#include "trace.h" - -#include - -TRACELOGGING_DEFINE_PROVIDER( - g_hProvider, - "Microsoft.PowerToys", - // {38e8889b-9731-53f5-e901-e8a7c1753074} - (0x38e8889b, 0x9731, 0x53f5, 0xe9, 0x01, 0xe8, 0xa7, 0xc1, 0x75, 0x30, 0x74), - TraceLoggingOptionProjectTelemetry()); - -void Trace::EnablePowerAccent(const bool enabled) noexcept -{ - TraceLoggingWriteWrapper( - g_hProvider, - "PowerAccent_EnablePowerAccent", - ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), - TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE), - TraceLoggingBoolean(enabled, "Enabled")); -} diff --git a/src/modules/poweraccent/PowerAccentModuleInterface/trace.h b/src/modules/poweraccent/PowerAccentModuleInterface/trace.h deleted file mode 100644 index 4d729f7683..0000000000 --- a/src/modules/poweraccent/PowerAccentModuleInterface/trace.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include - -class Trace : public telemetry::TraceBase -{ -public: - // Log if the user has PowerAccent enabled or disabled - static void EnablePowerAccent(const bool enabled) noexcept; -};