【问题标题】:Bring another application to front将另一个应用程序放在前面
【发布时间】:2018-04-13 17:28:00
【问题描述】:

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

【问题讨论】:

标签: c# winforms


【解决方案1】:
[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);

【讨论】:

  • 上述代码如何与我显示的代码集成?当我尝试添加它时,它卡在第二行“handle =”上,说当前上下文中不存在“handle”。
  • 抱歉,您可以移动“私有 IntPtr 句柄;”在方法之外,或者您可以一起删除“私人”。我将编辑帖子以反映前者。我刚刚意识到您的 processName 也是一个数组,所以我也会反映这一点。
【解决方案2】:

虽然这里有几个答案被标记为有效,但在我的情况下它们不起作用。我找到了正确的代码,它在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);
  }
}

【讨论】:

  • 工作得很好,只是一个调用该函数的简单示例会很有用,我这样使用它:FocusProcess(System.Diagnostics.Process.GetCurrentProcess().ProcessName)
  • 这很好用。您已经分配了 hWnd,因此它可以在最后传递给 SetForegroundWindow 而不是 objProcesses[0].MainWindowHandle。
猜你喜欢
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多