From 484f91c52d2de6100661c6dcf40cefc0729a5dd2 Mon Sep 17 00:00:00 2001
From: Jack251970 <1160210343@qq.com>
Date: Thu, 22 May 2025 20:26:41 +0800
Subject: [PATCH] Improve UAC dialog
---
.../Languages/en.xaml | 1 +
.../Programs/Win32.cs | 5 +-
.../UACDialog.xaml | 154 ++++++++++++++++++
.../UACDialog.xaml.cs | 87 ++++++++++
4 files changed, 243 insertions(+), 4 deletions(-)
create mode 100644 Plugins/Flow.Launcher.Plugin.Program/UACDialog.xaml
create mode 100644 Plugins/Flow.Launcher.Plugin.Program/UACDialog.xaml.cs
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
index cd1cc051c..e3eeb4e91 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
+++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
@@ -99,5 +99,6 @@
Unable to run {0}
User Account Control
Do you want to allow this app to make changes to your device?
+ Program location: {0}
diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
index 3dd7ec012..8cf1f77da 100644
--- a/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
+++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
@@ -221,10 +221,7 @@ namespace Flow.Launcher.Plugin.Program.Programs
if (elevated)
{
// Since we are already elevated, we need to create UAC dialog manually
- if (Main.Context.API.ShowMsgBox(
- Main.Context.API.GetTranslation("flowlauncher_plugin_program_user_account_control_subtitle"),
- Main.Context.API.GetTranslation("flowlauncher_plugin_program_user_account_control_title"),
- MessageBoxButton.YesNo) != MessageBoxResult.Yes)
+ if (UACDialog.Show(IcoPath, Name, FullPath) != MessageBoxResult.Yes)
{
return;
}
diff --git a/Plugins/Flow.Launcher.Plugin.Program/UACDialog.xaml b/Plugins/Flow.Launcher.Plugin.Program/UACDialog.xaml
new file mode 100644
index 000000000..d619f4765
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Program/UACDialog.xaml
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Plugins/Flow.Launcher.Plugin.Program/UACDialog.xaml.cs b/Plugins/Flow.Launcher.Plugin.Program/UACDialog.xaml.cs
new file mode 100644
index 000000000..3ab087b48
--- /dev/null
+++ b/Plugins/Flow.Launcher.Plugin.Program/UACDialog.xaml.cs
@@ -0,0 +1,87 @@
+using System;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Input;
+
+namespace Flow.Launcher.Plugin.Program
+{
+ public partial class UACDialog : Window
+ {
+ private static readonly string ClassName = nameof(UACDialog);
+
+ private static UACDialog msgBox;
+ private static MessageBoxResult _result = MessageBoxResult.None;
+
+ private UACDialog()
+ {
+ InitializeComponent();
+ }
+
+ public static MessageBoxResult Show(string iconPath, string appName, string fullPath)
+ {
+ if (!Application.Current.Dispatcher.CheckAccess())
+ {
+ return Application.Current.Dispatcher.Invoke(() => Show(iconPath, appName, fullPath));
+ }
+
+ try
+ {
+ msgBox = new UACDialog
+ {
+ Title = Main.Context.API.GetTranslation("flowlauncher_plugin_program_user_account_control_title")
+ };
+
+ // Set icon & app name & program location
+ _ = msgBox.SetImageAsync(iconPath);
+ msgBox.AppName.Text = appName;
+ msgBox.ProgramLocation.Text = string.Format(
+ Main.Context.API.GetTranslation("flowlauncher_plugin_program_user_account_control_program_location"),
+ fullPath);
+
+ // Focus No by default
+ msgBox.btnNo.Focus();
+ _result = MessageBoxResult.No;
+
+ msgBox.ShowDialog();
+ return _result;
+ }
+ catch (Exception e)
+ {
+ Main.Context.API.LogError(ClassName, $"An error occurred: {e.Message}");
+ msgBox = null;
+ return MessageBoxResult.None;
+ }
+ }
+
+ private async Task SetImageAsync(string imagePath)
+ {
+ var imageSource = await Main.Context.API.LoadImageAsync(imagePath);
+ Img.Source = imageSource;
+ }
+
+ private void KeyEsc_OnPress(object sender, ExecutedRoutedEventArgs e)
+ {
+ DialogResult = false;
+ Close();
+ }
+
+ private void Button_Click(object sender, RoutedEventArgs e)
+ {
+ if (sender == btnYes)
+ _result = MessageBoxResult.Yes;
+ else if (sender == btnNo)
+ _result = MessageBoxResult.No;
+ else
+ _result = MessageBoxResult.None;
+ msgBox.Close();
+ msgBox = null;
+ }
+
+ private void Button_Cancel(object sender, RoutedEventArgs e)
+ {
+ _result = MessageBoxResult.Cancel;
+ msgBox.Close();
+ msgBox = null;
+ }
+ }
+}