全屏应用隐藏任务栏时如何点击按钮唤醒已运行Edge窗口而非新开实例
实现方案
你需要调用Windows原生User32 API实现窗口状态的操作,具体步骤如下:
1. 导入依赖声明
首先在你的窗口类代码中添加以下命名空间引用与Win32 API声明:
using System.Diagnostics; using System.Runtime.InteropServices; // 你的窗口类内部添加以下代码 [DllImport("user32.dll")] private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); [DllImport("user32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll")] private static extern bool IsIconic(IntPtr hWnd); // 窗口状态常量 private const int SW_RESTORE = 9; private const int SW_MAXIMIZE = 3;
2. 修正按钮点击逻辑
原代码的进程计数逻辑存在缺陷:Edge采用多进程架构,单个窗口也会生成多个msedge进程,直接按进程名计数会出现误判。调整后的完整点击逻辑如下:
private void IE_Button_Click(object sender, RoutedEventArgs e) { var startEdgePath = @"你的Edge/IE路径"; Process targetEdgeProcess = null; // 遍历所有msedge进程,找到带有效主窗口的进程 foreach (var proc in Process.GetProcessesByName("msedge")) { if (proc.MainWindowHandle != IntPtr.Zero) { targetEdgeProcess = proc; break; } } // 进程已存在,直接最大化展示 if (targetEdgeProcess != null) { IntPtr windowHwnd = targetEdgeProcess.MainWindowHandle; // 先恢复最小化的窗口 if (IsIconic(windowHwnd)) { ShowWindow(windowHwnd, SW_RESTORE); } // 最大化窗口 ShowWindow(windowHwnd, SW_MAXIMIZE); // 将窗口提到前台 SetForegroundWindow(windowHwnd); return; } // 进程不存在,新开窗口 Process.Start(new ProcessStartInfo(startEdgePath)); }
3. 可选优化
如果需要避免匹配到用户自行打开的Edge窗口,可以在首次启动Edge时将返回的Process对象的Id存为类全局变量,后续点击按钮时优先匹配该ID的进程,匹配失败再判断是否需要新开进程,不会干扰用户自己打开的浏览器窗口。
内容的提问来源于stack exchange,提问作者ConfusedAndBald
相关产品推荐
相关产品推荐

