CCOnScreenKeyBoardClass.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace KeyBoard2
  9. {
  10. public static class CCOnScreenKeyBoardClass
  11. {
  12. private static Process _process;
  13. /// <summary>
  14. /// 启动外部 EXE 程序
  15. /// </summary>
  16. /// <param name="exePath">EXE 文件的完整路径</param>
  17. /// <param name="arguments">启动参数,可选</param>
  18. /// <param name="hidden">是否隐藏窗口,默认为 true</param>
  19. /// <returns>是否成功启动</returns>
  20. public static bool Start(string exePath, string arguments = "", bool hidden = true)
  21. {
  22. // 1. 验证文件是否存在
  23. if (!File.Exists(exePath))
  24. {
  25. throw new FileNotFoundException("指定的 EXE 文件不存在", exePath);
  26. }
  27. // 如果之前已经启动了进程,先尝试关闭
  28. if (_process != null && !_process.HasExited)
  29. {
  30. Stop();
  31. }
  32. try
  33. {
  34. var startInfo = new ProcessStartInfo
  35. {
  36. FileName = exePath,
  37. Arguments = arguments,
  38. UseShellExecute = false, // 必须为 false 才能重定向输入输出或隐藏窗口
  39. CreateNoWindow = hidden, // 不创建窗口
  40. WindowStyle = hidden ? ProcessWindowStyle.Hidden : ProcessWindowStyle.Normal // 隐藏窗口样式
  41. };
  42. _process = new Process { StartInfo = startInfo };
  43. // 启动进程
  44. bool started = _process.Start();
  45. return started;
  46. }
  47. catch (Exception ex)
  48. {
  49. Console.WriteLine($"启动进程失败: {ex.Message}");
  50. return false;
  51. }
  52. }
  53. /// <summary>
  54. /// 停止外部 EXE 程序
  55. /// </summary>
  56. /// <param name="forceKill">是否强制杀死进程。false: 尝试优雅关闭; true: 直接杀死</param>
  57. public static void Stop(bool forceKill = false)
  58. {
  59. if (_process == null || _process.HasExited)
  60. {
  61. return;
  62. }
  63. try
  64. {
  65. if (forceKill)
  66. {
  67. // 强制终止进程
  68. _process.Kill();
  69. }
  70. else
  71. {
  72. // 尝试优雅关闭(发送关闭消息给主窗口)
  73. // 注意:如果程序没有图形界面或无响应,CloseMainWindow 可能无效
  74. if (!_process.CloseMainWindow())
  75. {
  76. // 如果优雅关闭失败,则强制杀死
  77. _process.Kill();
  78. }
  79. }
  80. // 等待进程完全退出,避免资源占用
  81. _process.WaitForExit(5000); // 最多等待 5 秒
  82. }
  83. catch (Exception ex)
  84. {
  85. Console.WriteLine($"停止进程失败: {ex.Message}");
  86. }
  87. finally
  88. {
  89. _process?.Dispose();
  90. _process = null;
  91. }
  92. }
  93. /// <summary>
  94. /// 检查进程是否正在运行
  95. /// </summary>
  96. public static bool IsRunning
  97. {
  98. get
  99. {
  100. if (_process == null) return false;
  101. try
  102. {
  103. return !_process.HasExited;
  104. }
  105. catch
  106. {
  107. return false;
  108. }
  109. }
  110. }
  111. }
  112. }