检测某个程序是否已经运行,如果运行就切换到该程序界面。
以下代码还存在一个问题,程序最小化之后就不能恢复了
/// 该函数设置由不同线程产生的窗口的显示状态
/// </summary>
/// <param name="hWnd">窗口句柄</param>
/// <param name="cmdShow">指定窗口如何显示。查看允许值列表,请查阅ShowWlndow函数的说明部分</param>
/// <returns>如果函数原来可见,返回值为非零;如果函数原来被隐藏,返回值为零</returns>
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
/// <summary>
/// 该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。
/// 系统给创建前台窗口的线程分配的权限稍高于其他线程。
/// </summary>
/// <param name="hWnd">将被激活并被调入前台的窗口句柄</param>
/// <returns>如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零</returns>
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
/// 窗口是否已最小化
[System.Runtime.InteropServices.DllImport("User32.dll")]
private static extern bool IsIconic(IntPtr hWnd);
[System.Runtime.InteropServices.DllImport("User32.dll")]
private static extern bool OpenIcon(IntPtr hWnd);
//相关常量
private const int SW_HIDE = 0; //隐藏窗口,活动状态给另一个窗口
private const int SW_SHOWNORMAL = 1; //用原来的大小和位置显示一个窗口,同时令其进入活动状态
private const int SW_SHOWMINIMIZED = 2; //最小化窗口,并将其激活
private const int SW_SHOWMAXIMIZED = 3; //最大化窗口,并将其激活
private const int SW_SHOWNOACTIVATE = 4; //用最近的大小和位置显示一个窗口,同时不改变活动窗口
private const int SW_RESTORE = 9; //用原来的大小和位置显示一个窗口,同时令其进入活动状态
private const int SW_SHOWDEFAULT = 10; //根据默认 创建窗口时的样式 来显示
private static void HandleRunningInstance(Process instance)
{
IntPtr hWnd = instance.MainWindowHandle;
bool isIcon = IsIconic(hWnd); // 窗口是否已最小化
if (isIcon)
{
// 还原窗口
ShowWindowAsync(hWnd, SW_RESTORE);
}
else
{
OpenIcon(hWnd);
//如果期望窗口显示为Normal模式,可先做如下设置
ShowWindowAsync(hWnd, 10);
// 将窗口设为前台窗口
SetForegroundWindow(hWnd);
}
}
private void btn_Click(object sender, EventArgs e)
{
Process process = IsProcessStarted("F");
if (process != null)
{
HandleRunningInstance(process);
// System.Environment.Exit(1);
}
else
{
string tempPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "F.exe";
if (File.Exists(tempPath))
{
System.Diagnostics.Process.Start(tempPath);
}
else
{
MessageBox.Show("未找到程序", "提示信息");
}
}
}
private Process IsProcessStarted(string processName)
{
Process[] temp = Process.GetProcessesByName(processName);
if (temp.Length > 0)
{
return temp[0];
}
else
return null;
}