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;
}
}
}
}
}