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 @@
+