| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- 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;
- /// <summary>
- /// 启动外部 EXE 程序
- /// </summary>
- /// <param name="exePath">EXE 文件的完整路径</param>
- /// <param name="arguments">启动参数,可选</param>
- /// <param name="hidden">是否隐藏窗口,默认为 true</param>
- /// <returns>是否成功启动</returns>
- 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;
- }
- }
- /// <summary>
- /// 停止外部 EXE 程序
- /// </summary>
- /// <param name="forceKill">是否强制杀死进程。false: 尝试优雅关闭; true: 直接杀死</param>
- 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;
- }
- }
- /// <summary>
- /// 检查进程是否正在运行
- /// </summary>
- public static bool IsRunning
- {
- get
- {
- if (_process == null) return false;
- try
- {
- return !_process.HasExited;
- }
- catch
- {
- return false;
- }
- }
- }
- }
- }
|