我已经建立了一个C#Windows Form应用程序。加载表单后,它将全屏显示。表单上带有启动其他应用程序(而不是表单)的图标。我正在尝试确定应用程序是否已经在运行,如果尚未运行,请启动它,否则将其置于最前面。我已经确定了该应用程序是否正在运行,如果无法运行,则要启动它,我只是想不出如何将其置于最前端。我已经在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
?
}
}
Run Code Online (Sandbox Code Playgroud)
虽然这里的几个答案被标记为有效,但它们在我的情况下不起作用。我找到了正确的代码,它在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);
}
}
Run Code Online (Sandbox Code Playgroud)
[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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果即使最小化也希望显示该窗口,请使用:
if (IsIconic(handle))
ShowWindow(handle, SW_RESTORE);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1036 次 |
| 最近记录: |