diff --git a/src/modules/Projects/ProjectsLib/ProjectsLib.vcxproj b/src/modules/Projects/ProjectsLib/ProjectsLib.vcxproj
index 41e95bf188..09d1c28c3f 100644
--- a/src/modules/Projects/ProjectsLib/ProjectsLib.vcxproj
+++ b/src/modules/Projects/ProjectsLib/ProjectsLib.vcxproj
@@ -32,11 +32,13 @@
+
Create
+
diff --git a/src/modules/Projects/ProjectsLib/ProjectsLib.vcxproj.filters b/src/modules/Projects/ProjectsLib/ProjectsLib.vcxproj.filters
index edb4a24874..56281ae7e4 100644
--- a/src/modules/Projects/ProjectsLib/ProjectsLib.vcxproj.filters
+++ b/src/modules/Projects/ProjectsLib/ProjectsLib.vcxproj.filters
@@ -14,10 +14,16 @@
Header Files
+
+ Header Files
+
Source Files
+
+ Source Files
+
\ No newline at end of file
diff --git a/src/modules/Projects/ProjectsLib/pch.h b/src/modules/Projects/ProjectsLib/pch.h
index dba977e716..57caf5d38d 100644
--- a/src/modules/Projects/ProjectsLib/pch.h
+++ b/src/modules/Projects/ProjectsLib/pch.h
@@ -6,5 +6,9 @@
#ifndef PCH_H
#define PCH_H
+#define WIN32_LEAN_AND_MEAN
+#include
+#include
+#include
#endif //PCH_H
diff --git a/src/modules/Projects/ProjectsLib/trace.cpp b/src/modules/Projects/ProjectsLib/trace.cpp
new file mode 100644
index 0000000000..6f6acfd3c6
--- /dev/null
+++ b/src/modules/Projects/ProjectsLib/trace.cpp
@@ -0,0 +1,51 @@
+#include "pch.h"
+#include "trace.h"
+
+#include
+
+// 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::RegisterProvider() noexcept
+{
+ TraceLoggingRegister(g_hProvider);
+}
+
+void Trace::UnregisterProvider() noexcept
+{
+ TraceLoggingUnregister(g_hProvider);
+}
+
+void Trace::Projects::Enable(bool enabled) noexcept
+{
+ TraceLoggingWrite(
+ g_hProvider,
+ "Projects_EnableProjects",
+ ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance),
+ TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE),
+ TraceLoggingBoolean(enabled, "Enabled"));
+}
+
+void Trace::Projects::SettingsTelemetry(const PowertoyModuleIface::HotkeyEx& hotkey) noexcept
+{
+ std::wstring hotKeyStr =
+ std::wstring((hotkey.modifiersMask & MOD_WIN) == MOD_WIN ? L"Win + " : L"") +
+ std::wstring((hotkey.modifiersMask & MOD_CONTROL) == MOD_CONTROL ? L"Ctrl + " : L"") +
+ std::wstring((hotkey.modifiersMask & MOD_SHIFT) == MOD_SHIFT ? L"Shift + " : L"") +
+ std::wstring((hotkey.modifiersMask & MOD_ALT) == MOD_ALT ? L"Alt + " : L"") +
+ std::wstring(L"VK ") + std::to_wstring(hotkey.vkCode);
+
+ TraceLoggingWrite(
+ g_hProvider,
+ "Projects_Settings",
+ ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance),
+ TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE),
+ TraceLoggingWideString(hotKeyStr.c_str(), "HotKey"));
+}
diff --git a/src/modules/Projects/ProjectsLib/trace.h b/src/modules/Projects/ProjectsLib/trace.h
new file mode 100644
index 0000000000..db3061a42f
--- /dev/null
+++ b/src/modules/Projects/ProjectsLib/trace.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#include
+
+class Trace
+{
+public:
+ static void RegisterProvider() noexcept;
+ static void UnregisterProvider() noexcept;
+
+ class Projects
+ {
+ public:
+ static void Enable(bool enabled) noexcept;
+ static void SettingsTelemetry(const PowertoyModuleIface::HotkeyEx& hotkey) noexcept;
+ };
+};
diff --git a/src/modules/Projects/ProjectsModuleInterface/ProjectsModuleInterface.vcxproj b/src/modules/Projects/ProjectsModuleInterface/ProjectsModuleInterface.vcxproj
index b3a005fff5..14e029e80b 100644
--- a/src/modules/Projects/ProjectsModuleInterface/ProjectsModuleInterface.vcxproj
+++ b/src/modules/Projects/ProjectsModuleInterface/ProjectsModuleInterface.vcxproj
@@ -51,12 +51,12 @@
{caba8dfb-823b-4bf2-93ac-3f31984150d9}
-
- {d9b8fc84-322a-4f9f-bbb9-20915c47ddfd}
-
{6955446d-23f7-4023-9bb3-8657f904af99}
+
+ {b31fcc55-b5a4-4ea7-b414-2dceae6af332}
+
diff --git a/src/modules/Projects/ProjectsModuleInterface/dllmain.cpp b/src/modules/Projects/ProjectsModuleInterface/dllmain.cpp
index dc316cb264..6a0c40a2f8 100644
--- a/src/modules/Projects/ProjectsModuleInterface/dllmain.cpp
+++ b/src/modules/Projects/ProjectsModuleInterface/dllmain.cpp
@@ -10,6 +10,8 @@
#include
#include
+#include
+
#include
#include "resource.h"
@@ -33,7 +35,7 @@ BOOL APIENTRY DllMain(HMODULE /*hModule*/, DWORD ul_reason_for_call, LPVOID /*lp
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
- // TODO: Trace::RegisterProvider();
+ Trace::RegisterProvider();
break;
case DLL_THREAD_ATTACH:
@@ -41,7 +43,7 @@ BOOL APIENTRY DllMain(HMODULE /*hModule*/, DWORD ul_reason_for_call, LPVOID /*lp
break;
case DLL_PROCESS_DETACH:
- // TODO: Trace::UnregisterProvider();
+ Trace::UnregisterProvider();
break;
}
return TRUE;
@@ -104,8 +106,6 @@ public:
parse_hotkeys(values);
auto settingsObject = values.get_raw_json();
- // TODO: telemetry
-
values.save_to_settings_file();
}
catch (std::exception&)
@@ -159,7 +159,7 @@ public:
virtual void send_settings_telemetry() override
{
Logger::info("Send settings telemetry");
- // TODO
+ Trace::Projects::SettingsTelemetry(m_hotkey);
}
ProjectsModuleInterface()
@@ -176,8 +176,7 @@ private:
Logger::info("Enable");
m_enabled = true;
- // Log telemetry
- // TODO: Trace::Projects::EnableProjects(true);
+ Trace::Projects::Enable(true);
unsigned long powertoys_pid = GetCurrentProcessId();
std::wstring executable_args = L"";
@@ -208,10 +207,9 @@ private:
{
Logger::info("Disable");
m_enabled = false;
- // Log telemetry
if (traceEvent)
{
- // TODO: Trace::Projects::EnableProjects(false);
+ Trace::Projects::Enable(false);
}
if (m_toggleEditorEvent)