using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace KeyBoard2 { public static class CCOnScreenKeyBoardClass { private static Process _process; /// /// 启动外部 EXE 程序 /// /// EXE 文件的完整路径 /// 启动参数,可选 /// 是否隐藏窗口,默认为 true /// 是否成功启动 public static bool Start(string exePath, string arguments = "", bool hidden = true) { // 1. 验证文件是否存在 if (!File.Exists(exePath)) { throw new FileNotFoundException("指定的 EXE 文件不存在", exePath); } // 如果之前已经启动了进程,先尝试关闭 if (_process != null && !_process.HasExited) { Stop(); } try { var startInfo = new ProcessStartInfo { FileName = exePath, Arguments = arguments, UseShellExecute = false, // 必须为 false 才能重定向输入输出或隐藏窗口 CreateNoWindow = hidden, // 不创建窗口 WindowStyle = hidden ? ProcessWindowStyle.Hidden : ProcessWindowStyle.Normal // 隐藏窗口样式 }; _process = new Process { StartInfo = startInfo }; // 启动进程 bool started = _process.Start(); return started; } catch (Exception ex) { Console.WriteLine($"启动进程失败: {ex.Message}"); return false; } } /// /// 停止外部 EXE 程序 /// /// 是否强制杀死进程。false: 尝试优雅关闭; true: 直接杀死 public static void Stop(bool forceKill = false) { if (_process == null || _process.HasExited) { return; } try { if (forceKill) { // 强制终止进程 _process.Kill(); } else { // 尝试优雅关闭(发送关闭消息给主窗口) // 注意:如果程序没有图形界面或无响应,CloseMainWindow 可能无效 if (!_process.CloseMainWindow()) { // 如果优雅关闭失败,则强制杀死 _process.Kill(); } } // 等待进程完全退出,避免资源占用 _process.WaitForExit(5000); // 最多等待 5 秒 } catch (Exception ex) { Console.WriteLine($"停止进程失败: {ex.Message}"); } finally { _process?.Dispose(); _process = null; } } /// /// 检查进程是否正在运行 /// public static bool IsRunning { get { if (_process == null) return false; try { return !_process.HasExited; } catch { return false; } } } } }