C#Windows Form,将另一个应用程序带到前面

时间:2018-04-13 17:28:00

标签: c# winforms

我已经构建了一个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
        ?
    }
}

2 个答案:

答案 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);
  }
}