diff --git a/src/modules/launcher/Wox.Launcher/Wox.Launcher.rc b/src/modules/launcher/Wox.Launcher/Wox.Launcher.rc
new file mode 100644
index 0000000000..c85d6bb9ab
Binary files /dev/null and b/src/modules/launcher/Wox.Launcher/Wox.Launcher.rc differ
diff --git a/src/modules/launcher/Wox.Launcher/Wox.Launcher.vcxproj b/src/modules/launcher/Wox.Launcher/Wox.Launcher.vcxproj
new file mode 100644
index 0000000000..b1761cf44c
--- /dev/null
+++ b/src/modules/launcher/Wox.Launcher/Wox.Launcher.vcxproj
@@ -0,0 +1,123 @@
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ 15.0
+ {e364f67b-bb12-4e91-b639-355866ebcd8b}
+ Win32Proj
+ Wox_Launcher
+ 10.0
+ ModuleTemplate
+
+
+
+ DynamicLibrary
+ true
+ v142
+ Unicode
+
+
+ DynamicLibrary
+ false
+ v142
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ $(SolutionDir)$(Platform)\$(Configuration)\modules\
+
+
+ false
+ $(SolutionDir)$(Platform)\$(Configuration)\modules\
+
+
+
+ Use
+ Level3
+ Disabled
+ true
+ _DEBUG;EXAMPLEPOWERTOY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ pch.h
+ ..\..\common\inc;..\..\common\Telemetry;..\;..\..\;..\..\..\deps\cpprestsdk\include;%(AdditionalIncludeDirectories)
+ MultiThreadedDebug
+ stdcpplatest
+
+
+ Windows
+ true
+ $(OutDir)$(TargetName)$(TargetExt)
+
+
+
+
+ Use
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ NDEBUG;EXAMPLEPOWERTOY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ pch.h
+ ..\..\common\inc;..\..\common\Telemetry;..\;..\..\;..\..\..\deps\cpprestsdk\include;%(AdditionalIncludeDirectories)
+ MultiThreaded
+ stdcpplatest
+
+
+ Windows
+ true
+ true
+ true
+ $(OutDir)$(TargetName)$(TargetExt)
+
+
+
+
+
+
+
+
+
+
+ Create
+ Create
+ pch.h
+ pch.h
+
+
+
+
+
+ {74485049-c722-400f-abe5-86ac52d929b3}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/modules/launcher/Wox.Launcher/Wox.Launcher.vcxproj.filters b/src/modules/launcher/Wox.Launcher/Wox.Launcher.vcxproj.filters
new file mode 100644
index 0000000000..7ab77b0458
--- /dev/null
+++ b/src/modules/launcher/Wox.Launcher/Wox.Launcher.vcxproj.filters
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/modules/launcher/Wox.Launcher/dllmain.cpp b/src/modules/launcher/Wox.Launcher/dllmain.cpp
new file mode 100644
index 0000000000..496a0a4562
--- /dev/null
+++ b/src/modules/launcher/Wox.Launcher/dllmain.cpp
@@ -0,0 +1,324 @@
+#include "pch.h"
+#include
+#include
+#include
+#include
+#include "trace.h"
+
+extern "C" IMAGE_DOS_HEADER __ImageBase;
+
+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;
+}
+
+// The PowerToy name that will be shown in the settings.
+const static wchar_t* MODULE_NAME = L"Wox.Launcher";
+// Add a description that will we shown in the module settings page.
+const static wchar_t* MODULE_DESC = L"";
+
+// These are the properties shown in the Settings page.
+struct ModuleSettings {
+ // Add the PowerToy module properties with default values.
+ // Currently available types:
+ // - int
+ // - bool
+ // - string
+
+ //bool bool_prop = true;
+ //int int_prop = 10;
+ //std::wstring string_prop = L"The quick brown fox jumps over the lazy dog";
+ //std::wstring color_prop = L"#1212FF";
+
+} g_settings;
+
+// Implement the PowerToy Module Interface and all the required methods.
+class Wox_Launcher : public PowertoyModuleIface {
+private:
+ // The PowerToy state.
+ bool m_enabled = false;
+
+ // Load initial settings from the persisted values.
+ void init_settings();
+
+public:
+ // Constructor
+ Wox_Launcher() {
+ init_settings();
+ };
+
+ // Destroy the powertoy and free memory
+ virtual void destroy() override {
+ delete this;
+ }
+
+ // Return the display name of the powertoy, this will be cached by the runner
+ virtual const wchar_t* get_name() override {
+ return MODULE_NAME;
+ }
+
+ // Return array of the names of all events that this powertoy listens for, with
+ // nullptr as the last element of the array. Nullptr can also be retured for empty
+ // list.
+ virtual const wchar_t** get_events() override {
+ static const wchar_t* events[] = { nullptr };
+ // Available events:
+ // - ll_keyboard
+ // - win_hook_event
+ //
+ // static const wchar_t* events[] = { ll_keyboard,
+ // win_hook_event,
+ // nullptr };
+
+ return events;
+ }
+
+ // Return JSON with the configuration options.
+ virtual bool get_config(wchar_t* buffer, int* buffer_size) override {
+ HINSTANCE hinstance = reinterpret_cast(&__ImageBase);
+
+ // Create a Settings object.
+ PowerToysSettings::Settings settings(hinstance, get_name());
+ settings.set_description(MODULE_DESC);
+
+ // Show an overview link in the Settings page
+ //settings.set_overview_link(L"https://");
+
+ // Show a video link in the Settings page.
+ //settings.set_video_link(L"https://");
+
+ // A bool property with a toggle editor.
+ /*settings.add_bool_toogle(
+ L"bool_toggle_1", // property name.
+ L"This is what a BoolToggle property looks like", // description or resource id of the localized string.
+ g_settings.bool_prop // property value.
+ );*/
+
+ // An integer property with a spinner editor.
+ /*settings.add_int_spinner(
+ L"int_spinner_1", // property name
+ L"This is what a IntSpinner property looks like", // description or resource id of the localized string.
+ g_settings.int_prop, // property value.
+ 0, // min value.
+ 100, // max value.
+ 10 // incremental step.
+ );*/
+
+ // A string property with a textbox editor.
+ /*settings.add_string(
+ L"string_text_1", // property name.
+ L"This is what a String property looks like", // description or resource id of the localized string.
+ g_settings.string_prop // property value.
+ );*/
+
+ // A string property with a color picker editor.
+ /*settings.add_color_picker(
+ L"color_picker_1", // property name.
+ L"This is what a ColorPicker property looks like", // description or resource id of the localized string.
+ g_settings.color_prop // property value.
+ );*/
+
+ // A custom action property. When using this settings type, the "PowertoyModuleIface::call_custom_action()"
+ // method should be overriden as well.
+ /*settings.add_custom_action(
+ L"custom_action_id", // action name.
+ L"This is what a CustomAction property looks like", // label above the field.
+ L"Call a custom action", // button text.
+ L"Press the button to call a custom action." // display values / extended info.
+ );*/
+
+ return settings.serialize_to_buffer(buffer, buffer_size);
+ }
+
+ // Signal from the Settings editor to call a custom action.
+ // This can be used to spawn more complex editors.
+ virtual void call_custom_action(const wchar_t* action) override {
+ static UINT custom_action_num_calls = 0;
+ try {
+ // Parse the action values, including name.
+ PowerToysSettings::CustomActionObject action_object =
+ PowerToysSettings::CustomActionObject::from_json_string(action);
+
+ /*
+ if (action_object.get_name() == L"custom_action_id") {
+ // Execute your custom action
+ }
+ */
+ }
+ catch (std::exception ex) {
+ // Improper JSON.
+ }
+ }
+
+ // Called by the runner to pass the updated settings values as a serialized JSON.
+ virtual void set_config(const wchar_t* config) override {
+ try {
+ // Parse the input JSON string.
+ PowerToysSettings::PowerToyValues values =
+ PowerToysSettings::PowerToyValues::from_json_string(config);
+
+ // Update a bool property.
+ /*
+ if (values.is_bool_value(L"bool_toggle_1")) {
+ g_settings.bool_prop = values.get_bool_value(L"bool_toggle_1");
+ }
+ */
+
+ // Update an int property.
+ /*
+ if (values.is_int_value(L"int_spinner_1")) {
+ g_settings.int_prop = values.get_int_value(L"int_spinner_1");
+ }
+ */
+
+ // Update a string property.
+ /*
+ if (values.is_string_value(L"string_text_1")) {
+ g_settings.string_prop = values.get_string_value(L"string_text_1");
+ }
+ */
+
+ // Update a color property.
+ /*
+ if (values.is_string_value(L"color_picker_1")) {
+ g_settings.color_prop = values.get_string_value(L"color_picker_1");
+ }
+ */
+
+ // If you don't need to do any custom processing of the settings, proceed
+ // to persists the values calling:
+ values.save_to_settings_file();
+ // Otherwise call a custom function to process the settings before saving them to disk:
+ // save_settings();
+ }
+ catch (std::exception ex) {
+ // Improper JSON.
+ }
+ }
+
+ // Enable the powertoy
+ virtual void enable() {
+ m_enabled = true;
+ }
+
+ // Disable the powertoy
+ virtual void disable() {
+ m_enabled = false;
+ }
+
+ // Returns if the powertoys is enabled
+ virtual bool is_enabled() override {
+ return m_enabled;
+ }
+
+ // Handle incoming event, data is event-specific
+ virtual intptr_t signal_event(const wchar_t* name, intptr_t data) override {
+ if (wcscmp(name, ll_keyboard) == 0) {
+ auto& event = *(reinterpret_cast(data));
+ // Return 1 if the keypress is to be suppressed (not forwarded to Windows),
+ // otherwise return 0.
+ return 0;
+ }
+ else if (wcscmp(name, win_hook_event) == 0) {
+ auto& event = *(reinterpret_cast(data));
+ // Return value is ignored
+ return 0;
+ }
+ return 0;
+ }
+};
+
+// Load the settings file.
+void Wox_Launcher::init_settings() {
+ try {
+ // Load and parse the settings file for this PowerToy.
+ PowerToysSettings::PowerToyValues settings =
+ PowerToysSettings::PowerToyValues::load_from_settings_file(get_name());
+
+ // Load a bool property.
+ /*
+ if (settings.is_bool_value(L"bool_toggle_1")) {
+ g_settings.bool_prop = settings.get_bool_value(L"bool_toggle_1");
+ }
+ */
+
+ // Load an int property.
+ /*
+ if (settings.is_int_value(L"int_spinner_1")) {
+ g_settings.int_prop = settings.get_int_value(L"int_spinner_1");
+ }
+ */
+
+ // Load a string property.
+ /*
+ if (settings.is_string_value(L"string_text_1")) {
+ g_settings.string_prop = settings.get_string_value(L"string_text_1");
+ }
+ */
+
+ // Load a color property.
+ /*
+ if (settings.is_string_value(L"color_picker_1")) {
+ g_settings.color_prop = settings.get_string_value(L"color_picker_1");
+ }
+ */
+ }
+ catch (std::exception ex) {
+ // Error while loading from the settings file. Let default values stay as they are.
+ }
+}
+
+// This method of saving the module settings is only required if you need to do any
+// custom processing of the settings before saving them to disk.
+/*
+void Wox.Launcher::save_settings() {
+ try {
+ // Create a PowerToyValues object for this PowerToy
+ PowerToysSettings::PowerToyValues values(get_name());
+
+ // Save a bool property.
+ //values.add_property(
+ // L"bool_toggle_1", // property name
+ // g_settings.bool_prop // property value
+ //);
+
+ // Save an int property.
+ //values.add_property(
+ // L"int_spinner_1", // property name
+ // g_settings.int_prop // property value
+ //);
+
+ // Save a string property.
+ //values.add_property(
+ // L"string_text_1", // property name
+ // g_settings.string_prop // property value
+ );
+
+ // Save a color property.
+ //values.add_property(
+ // L"color_picker_1", // property name
+ // g_settings.color_prop // property value
+ //);
+
+ // Save the PowerToyValues JSON to the power toy settings file.
+ values.save_to_settings_file();
+ }
+ catch (std::exception ex) {
+ // Couldn't save the settings.
+ }
+}
+*/
+
+extern "C" __declspec(dllexport) PowertoyModuleIface* __cdecl powertoy_create() {
+ return new Wox_Launcher();
+}
diff --git a/src/modules/launcher/Wox.Launcher/pch.cpp b/src/modules/launcher/Wox.Launcher/pch.cpp
new file mode 100644
index 0000000000..a83d3bb2cc
--- /dev/null
+++ b/src/modules/launcher/Wox.Launcher/pch.cpp
@@ -0,0 +1,2 @@
+#include "pch.h"
+#pragma comment(lib, "windowsapp")
\ No newline at end of file
diff --git a/src/modules/launcher/Wox.Launcher/pch.h b/src/modules/launcher/Wox.Launcher/pch.h
new file mode 100644
index 0000000000..769a37b377
--- /dev/null
+++ b/src/modules/launcher/Wox.Launcher/pch.h
@@ -0,0 +1,5 @@
+#pragma once
+#define WIN32_LEAN_AND_MEAN
+#include
+#include
+#include
\ No newline at end of file
diff --git a/src/modules/launcher/Wox.Launcher/resource.h b/src/modules/launcher/Wox.Launcher/resource.h
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/src/modules/launcher/Wox.Launcher/trace.cpp b/src/modules/launcher/Wox.Launcher/trace.cpp
new file mode 100644
index 0000000000..94ae6d8fd9
--- /dev/null
+++ b/src/modules/launcher/Wox.Launcher/trace.cpp
@@ -0,0 +1,26 @@
+#include "pch.h"
+#include "trace.h"
+
+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::RegisterProvider() {
+ TraceLoggingRegister(g_hProvider);
+}
+
+void Trace::UnregisterProvider() {
+ TraceLoggingUnregister(g_hProvider);
+}
+
+void Trace::MyEvent() {
+ TraceLoggingWrite(
+ g_hProvider,
+ "PowerToyName::Event::MyEvent",
+ ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance),
+ TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"),
+ TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE));
+}
diff --git a/src/modules/launcher/Wox.Launcher/trace.h b/src/modules/launcher/Wox.Launcher/trace.h
new file mode 100644
index 0000000000..92cef7fc80
--- /dev/null
+++ b/src/modules/launcher/Wox.Launcher/trace.h
@@ -0,0 +1,8 @@
+#pragma once
+
+class Trace {
+public:
+ static void RegisterProvider();
+ static void UnregisterProvider();
+ static void MyEvent();
+};