diff --git a/.github/actions/spell-check/expect.txt b/.github/actions/spell-check/expect.txt index 1a29c7eb07..b0ea1c48ac 100644 --- a/.github/actions/spell-check/expect.txt +++ b/.github/actions/spell-check/expect.txt @@ -664,6 +664,7 @@ Functiondiscoverykeys fwlink fwrite fxcop +FZE gabime GAC gacutil diff --git a/src/common/interop/interop.cpp b/src/common/interop/interop.cpp index 6dd4dc151b..6a6169d8d2 100644 --- a/src/common/interop/interop.cpp +++ b/src/common/interop/interop.cpp @@ -179,6 +179,10 @@ public return gcnew String(CommonSharedConstants::RUN_EXIT_EVENT); } + static String ^ FZEExitEvent() { + return gcnew String(CommonSharedConstants::FZE_EXIT_EVENT); + } + static String ^ ColorPickerSendSettingsTelemetryEvent() { return gcnew String(CommonSharedConstants::COLOR_PICKER_SEND_SETTINGS_TELEMETRY_EVENT); } diff --git a/src/common/interop/shared_constants.h b/src/common/interop/shared_constants.h index 9c882e8675..8547703c92 100644 --- a/src/common/interop/shared_constants.h +++ b/src/common/interop/shared_constants.h @@ -18,6 +18,8 @@ namespace CommonSharedConstants const wchar_t RUN_SEND_SETTINGS_TELEMETRY_EVENT[] = L"Local\\PowerToysRunInvokeEvent-638ec522-0018-4b96-837d-6bd88e06f0d6"; const wchar_t RUN_EXIT_EVENT[] = L"Local\\PowerToysRunExitEvent-3e38e49d-a762-4ef1-88f2-fd4bc7481516"; + + const wchar_t FZE_EXIT_EVENT[] = L"Local\\PowerToys-FZE-ExitEvent-ca8c73de-a52c-4274-b691-46e9592d3b43"; const wchar_t COLOR_PICKER_SEND_SETTINGS_TELEMETRY_EVENT[] = L"Local\\ColorPickerSettingsTelemetryEvent-6c7071d8-4014-46ec-b687-913bd8a422f1"; diff --git a/src/modules/fancyzones/FancyZonesModuleInterface/dllmain.cpp b/src/modules/fancyzones/FancyZonesModuleInterface/dllmain.cpp index 8ecb287171..9ec39e0899 100644 --- a/src/modules/fancyzones/FancyZonesModuleInterface/dllmain.cpp +++ b/src/modules/fancyzones/FancyZonesModuleInterface/dllmain.cpp @@ -163,12 +163,31 @@ private: m_hProcess = sei.hProcess; } } - + + void SendFZECloseEvent() + { + auto exitEvent = CreateEventW(nullptr, false, false, CommonSharedConstants::FZE_EXIT_EVENT); + if (!exitEvent) + { + Logger::warn(L"Failed to create exitEvent. {}", get_last_error_or_default(GetLastError())); + } + else + { + Logger::trace(L"Signaled exitEvent"); + if (!SetEvent(exitEvent)) + { + Logger::warn(L"Failed to signal exitEvent. {}", get_last_error_or_default(GetLastError())); + } + + ResetEvent(exitEvent); + CloseHandle(exitEvent); + } + } + void Disable(bool const traceEvent) { m_enabled = false; // Log telemetry - if (traceEvent) { Trace::FancyZones::EnableFancyZones(false); @@ -178,14 +197,15 @@ private: { ResetEvent(m_toggleEditorEvent); } - + if (m_hProcess) { TerminateProcess(m_hProcess, 0); + SendFZECloseEvent(); m_hProcess = nullptr; - } + } } - + std::wstring app_name; //contains the non localized key of the powertoy std::wstring app_key; diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/App.xaml.cs b/src/modules/fancyzones/editor/FancyZonesEditor/App.xaml.cs index e14e018f34..d745263b51 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/App.xaml.cs +++ b/src/modules/fancyzones/editor/FancyZonesEditor/App.xaml.cs @@ -80,6 +80,15 @@ namespace FancyZonesEditor FancyZonesEditorIO = new FancyZonesEditorIO(); Overlay = new Overlay(); MainWindowSettings = new MainWindowSettingsModel(); + + new Thread(() => + { + var eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, interop.Constants.FZEExitEvent()); + if (eventHandle.WaitOne()) + { + Environment.Exit(0); + } + }).Start(); } private void OnStartup(object sender, StartupEventArgs e) diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/FancyZonesEditor.csproj b/src/modules/fancyzones/editor/FancyZonesEditor/FancyZonesEditor.csproj index beb730d203..0133bb2e46 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/FancyZonesEditor.csproj +++ b/src/modules/fancyzones/editor/FancyZonesEditor/FancyZonesEditor.csproj @@ -81,6 +81,7 @@ +