From 335dcbaae83c8ffb136958a39deceadca35154aa Mon Sep 17 00:00:00 2001 From: Jaylyn Barbee <51131738+Jaylyn-Barbee@users.noreply.github.com> Date: Mon, 5 Jan 2026 20:54:37 -0500 Subject: [PATCH] [Light Switch] Adding telemetry events (#44241) Adding events to track the following:
Event Name Description Data collected
Microsoft.PowerToys.LightSwitch_EnableLightSwitch Triggered when Light Switch is enabled or disabled. Whether the module is enabled or disabled (bool)
Microsoft.PowerToys.LightSwitch_ShortcutInvoked Occurs when the shortcut for Light Switch is invoked.
Microsoft.PowerToys.LightSwitch_ScheduleModeToggled Occurs when a new schedule mode is selected for Light Switch. The new mode selected (string)
Microsoft.PowerToys.LightSwitch_ThemeTargetChanged Occurs when the options for targeting the system or apps is updated. The new options selected (two bools)
The above events that are related to Light Switch settings are tracked in the "LoadSettings" function inside the service but only if the value has changed. The Enabled event as well as the Shortcut event are tracked in the module interface. --- DATA_AND_PRIVACY.md | 24 +++++++++++ .../LightSwitchModuleInterface/dllmain.cpp | 6 ++- .../LightSwitchModuleInterface/trace.cpp | 15 +++++-- .../LightSwitchModuleInterface/trace.h | 3 +- .../LightSwitchService/LightSwitchService.cpp | 7 ++- .../LightSwitchService.vcxproj | 2 + .../LightSwitchService.vcxproj.filters | 6 +++ .../LightSwitchSettings.cpp | 12 ++++++ .../LightSwitch/LightSwitchService/trace.cpp | 43 +++++++++++++++++++ .../LightSwitch/LightSwitchService/trace.h | 17 ++++++++ 10 files changed, 129 insertions(+), 6 deletions(-) create mode 100644 src/modules/LightSwitch/LightSwitchService/trace.cpp create mode 100644 src/modules/LightSwitch/LightSwitchService/trace.h diff --git a/DATA_AND_PRIVACY.md b/DATA_AND_PRIVACY.md index 66a0daa1d8..07089e44c3 100644 --- a/DATA_AND_PRIVACY.md +++ b/DATA_AND_PRIVACY.md @@ -694,6 +694,30 @@ _If you want to find diagnostic data events in the source code, these two links +### Light Switch + + + + + + + + + + + + + + + + + + + + + +
Event NameDescription
Microsoft.PowerToys.LightSwitch_EnableLightSwitchTriggered when Light Switch is enabled or disabled.
Microsoft.PowerToys.LightSwitch_ShortcutInvokedOccurs when the shortcut for Light Switch is invoked.
Microsoft.PowerToys.LightSwitch_ScheduleModeToggledOccurs when a new schedule mode is selected for Light Switch.
Microsoft.PowerToys.LightSwitch_ThemeTargetChangedOccurs when the options for targeting the system or apps is updated.
+ ### Mouse Highlighter diff --git a/src/modules/LightSwitch/LightSwitchModuleInterface/dllmain.cpp b/src/modules/LightSwitch/LightSwitchModuleInterface/dllmain.cpp index 11cfd412b0..bab4e30797 100644 --- a/src/modules/LightSwitch/LightSwitchModuleInterface/dllmain.cpp +++ b/src/modules/LightSwitch/LightSwitchModuleInterface/dllmain.cpp @@ -405,6 +405,7 @@ public: { m_enabled = true; Logger::info(L"Enabling Light Switch module..."); + Trace::Enable(true); unsigned long powertoys_pid = GetCurrentProcessId(); std::wstring args = L"--pid " + std::to_wstring(powertoys_pid); @@ -482,7 +483,8 @@ public: CloseHandle(m_process); m_process = nullptr; } - + + Trace::Enable(false); StopToggleListener(); } @@ -539,6 +541,8 @@ public: if (m_enabled) { Logger::trace(L"Light Switch hotkey pressed"); + Trace::ShortcutInvoked(); + if (!is_process_running()) { enable(); diff --git a/src/modules/LightSwitch/LightSwitchModuleInterface/trace.cpp b/src/modules/LightSwitch/LightSwitchModuleInterface/trace.cpp index 57fa1921f7..40fc67e679 100644 --- a/src/modules/LightSwitch/LightSwitchModuleInterface/trace.cpp +++ b/src/modules/LightSwitch/LightSwitchModuleInterface/trace.cpp @@ -19,12 +19,21 @@ void Trace::UnregisterProvider() TraceLoggingUnregister(g_hProvider); } -void Trace::MyEvent() +void Trace::Enable(bool enabled) noexcept { TraceLoggingWrite( g_hProvider, - "PowerToyName_MyEvent", + "LightSwitch_EnableLightSwitch", + ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), + TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE), + TraceLoggingBoolean(enabled, "Enabled")); +} + +void Trace::ShortcutInvoked() noexcept +{ + TraceLoggingWrite( + g_hProvider, + "LightSwitch_ShortcutInvoked", ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), - TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"), TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE)); } diff --git a/src/modules/LightSwitch/LightSwitchModuleInterface/trace.h b/src/modules/LightSwitch/LightSwitchModuleInterface/trace.h index 55cdedb2ee..bfa32062b9 100644 --- a/src/modules/LightSwitch/LightSwitchModuleInterface/trace.h +++ b/src/modules/LightSwitch/LightSwitchModuleInterface/trace.h @@ -11,5 +11,6 @@ class Trace public: static void RegisterProvider(); static void UnregisterProvider(); - static void MyEvent(); + static void Enable(bool enabled) noexcept; + static void ShortcutInvoked() noexcept; }; diff --git a/src/modules/LightSwitch/LightSwitchService/LightSwitchService.cpp b/src/modules/LightSwitch/LightSwitchService/LightSwitchService.cpp index b6684da54e..8919f4274b 100644 --- a/src/modules/LightSwitch/LightSwitchService/LightSwitchService.cpp +++ b/src/modules/LightSwitch/LightSwitchService/LightSwitchService.cpp @@ -14,6 +14,7 @@ #include "LightSwitchStateManager.h" #include #include +#include SERVICE_STATUS g_ServiceStatus = {}; SERVICE_STATUS_HANDLE g_StatusHandle = nullptr; @@ -357,6 +358,8 @@ DWORD WINAPI ServiceWorkerThread(LPVOID lpParam) int APIENTRY wWinMain(HINSTANCE, HINSTANCE, PWSTR, int) { + Trace::LightSwitch::RegisterProvider(); + if (powertoys_gpo::getConfiguredLightSwitchEnabledValue() == powertoys_gpo::gpo_rule_configured_disabled) { wchar_t msg[160]; @@ -364,12 +367,14 @@ int APIENTRY wWinMain(HINSTANCE, HINSTANCE, PWSTR, int) msg, L"Tried to start with a GPO policy setting the utility to always be disabled. Please contact your systems administrator."); Logger::info(msg); + Trace::LightSwitch::UnregisterProvider(); return 0; } - int argc = 0; LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc); int rc = _tmain(argc, argv); // reuse your existing logic LocalFree(argv); + + Trace::LightSwitch::UnregisterProvider(); return rc; } \ No newline at end of file diff --git a/src/modules/LightSwitch/LightSwitchService/LightSwitchService.vcxproj b/src/modules/LightSwitch/LightSwitchService/LightSwitchService.vcxproj index e1c8052de6..b8e51ee489 100644 --- a/src/modules/LightSwitch/LightSwitchService/LightSwitchService.vcxproj +++ b/src/modules/LightSwitch/LightSwitchService/LightSwitchService.vcxproj @@ -80,6 +80,7 @@ + @@ -94,6 +95,7 @@ + diff --git a/src/modules/LightSwitch/LightSwitchService/LightSwitchService.vcxproj.filters b/src/modules/LightSwitch/LightSwitchService/LightSwitchService.vcxproj.filters index 55c7bde39b..a704e87073 100644 --- a/src/modules/LightSwitch/LightSwitchService/LightSwitchService.vcxproj.filters +++ b/src/modules/LightSwitch/LightSwitchService/LightSwitchService.vcxproj.filters @@ -39,6 +39,9 @@ Source Files + + Source Files + @@ -68,6 +71,9 @@ Header Files + + Header Files + diff --git a/src/modules/LightSwitch/LightSwitchService/LightSwitchSettings.cpp b/src/modules/LightSwitch/LightSwitchService/LightSwitchSettings.cpp index 5221a197fe..488142b95b 100644 --- a/src/modules/LightSwitch/LightSwitchService/LightSwitchSettings.cpp +++ b/src/modules/LightSwitch/LightSwitchService/LightSwitchSettings.cpp @@ -5,6 +5,7 @@ #include #include #include +#include using namespace std; @@ -151,6 +152,7 @@ void LightSwitchSettings::LoadSettings() if (m_settings.scheduleMode != newMode) { m_settings.scheduleMode = newMode; + Trace::LightSwitch::ScheduleModeToggled(val); NotifyObservers(SettingId::ScheduleMode); } } @@ -220,6 +222,8 @@ void LightSwitchSettings::LoadSettings() } } + bool themeTargetChanged = false; + // ChangeSystem if (const auto jsonVal = values.get_bool_value(L"changeSystem")) { @@ -227,6 +231,7 @@ void LightSwitchSettings::LoadSettings() if (m_settings.changeSystem != val) { m_settings.changeSystem = val; + themeTargetChanged = true; NotifyObservers(SettingId::ChangeSystem); } } @@ -238,9 +243,16 @@ void LightSwitchSettings::LoadSettings() if (m_settings.changeApps != val) { m_settings.changeApps = val; + themeTargetChanged = true; NotifyObservers(SettingId::ChangeApps); } } + + // For ChangeSystem/ChangeApps changes, log telemetry + if (themeTargetChanged) + { + Trace::LightSwitch::ThemeTargetChanged(m_settings.changeApps, m_settings.changeSystem); + } } catch (...) { diff --git a/src/modules/LightSwitch/LightSwitchService/trace.cpp b/src/modules/LightSwitch/LightSwitchService/trace.cpp new file mode 100644 index 0000000000..99afe7a95d --- /dev/null +++ b/src/modules/LightSwitch/LightSwitchService/trace.cpp @@ -0,0 +1,43 @@ +#include "pch.h" +#include "trace.h" + +// Telemetry strings should not be localized. +#define LoggingProviderKey "Microsoft.PowerToys" + +TRACELOGGING_DEFINE_PROVIDER( + g_hProvider, + LoggingProviderKey, + // {38e8889b-9731-53f5-e901-e8a7c1753074} + (0x38e8889b, 0x9731, 0x53f5, 0xe9, 0x01, 0xe8, 0xa7, 0xc1, 0x75, 0x30, 0x74), + TraceLoggingOptionProjectTelemetry()); + +void Trace::LightSwitch::RegisterProvider() +{ + TraceLoggingRegister(g_hProvider); +} + +void Trace::LightSwitch::UnregisterProvider() +{ + TraceLoggingUnregister(g_hProvider); +} + +void Trace::LightSwitch::ScheduleModeToggled(const std::wstring& newMode) noexcept +{ + TraceLoggingWriteWrapper( + g_hProvider, + "LightSwitch_ScheduleModeToggled", + ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), + TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE), + TraceLoggingWideString(newMode.c_str(), "NewMode")); +} + +void Trace::LightSwitch::ThemeTargetChanged(bool changeApps, bool changeSystem) noexcept +{ + TraceLoggingWriteWrapper( + g_hProvider, + "LightSwitch_ThemeTargetChanged", + ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), + TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE), + TraceLoggingBoolean(changeApps, "ChangeApps"), + TraceLoggingBoolean(changeSystem, "ChangeSystem")); +} \ No newline at end of file diff --git a/src/modules/LightSwitch/LightSwitchService/trace.h b/src/modules/LightSwitch/LightSwitchService/trace.h new file mode 100644 index 0000000000..a06177075b --- /dev/null +++ b/src/modules/LightSwitch/LightSwitchService/trace.h @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +class Trace +{ +public: + class LightSwitch : public telemetry::TraceBase + { + public: + static void RegisterProvider(); + static void UnregisterProvider(); + static void ScheduleModeToggled(const std::wstring& newMode) noexcept; + static void ThemeTargetChanged(bool changeApps, bool changeSystem) noexcept; + }; +};