我已经构建了一个C#Windows窗体应用程序。表单加载时,它是全屏。表单上有图标,可以启动其他应用程序(不是表单)。我正在尝试确定应用程序是否已经运行,如果不是,请启动它,否则将它带到前面。我已经完成了确定应用程序是否正在运行,如果不是,启动它,我就无法弄清楚如何将它带到前面。我已经在Google和Stack Overflow上阅读了其他结果,但无法让它们运行起来。任何帮助是极大的赞赏!到目前为止,我的代码是:
private void button4_Click(object sender, EventArgs e)
{
Process[] processName = Process.GetProcessesByName("ProgramName");
if (processName.Length == 0)
{
//Start application here
Process.Start("C:\\bin\\ProgramName.exe");
}
else
{
//Set foreground window
?
}
}
答案 0 :(得分:4)
[System.Runtime.InteropServices.DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr handle);
private IntPtr handle;
private void button4_Click(object sender, EventArgs e)
{
Process[] processName = Process.GetProcessesByName("ProgramName");
if (processName.Length == 0)
{
//Start application here
Process.Start("C:\\bin\\ProgramName.exe");
}
else
{
//Set foreground window
handle = processName[0].MainWindowHandle;
SetForegroundWindow(handle);
}
}
如果您希望显示窗口,即使它已被最小化,请使用:
if (IsIconic(handle))
ShowWindow(handle, SW_RESTORE);
答案 1 :(得分:1)
尽管这里有几个答案被标记为有效,但就我而言,它们却无效。我在Joseph Gozlan的博客上找到了对我有用的正确代码。为了方便起见,我在这里重复这个很棒的代码。与其他答案相比,请注意异步调用有一些细微但非常重要的区别。所有积分归原始代码作者所有。
DllImport("user32.dll")]
public static extern bool ShowWindowAsync(HandleRef hWnd, int nCmdShow);
[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr WindowHandle);
public const int SW_RESTORE = 9;
private void FocusProcess(string procName)
{
Process[] objProcesses = System.Diagnostics.Process.GetProcessesByName(procName);
if (objProcesses.Length > 0)
{
IntPtr hWnd = IntPtr.Zero;
hWnd = objProcesses[0].MainWindowHandle;
ShowWindowAsync(new HandleRef(null,hWnd), SW_RESTORE);
SetForegroundWindow(objProcesses[0].MainWindowHandle);
}
}