在Mutex失败后将窗口置于前台

时间:2009-11-14 11:20:58

标签: c# winforms process mutex foreground

我想知道是否有人可以告诉我,如果无法为新实例创建互斥锁,那么将我的应用程序带到前台的最佳方法是什么。

例如:应用程序X正在运行但在后台。我看不到它,所以我尝试运行另一个实例;因为互斥锁返回false,所以最好的办法是将现有实例置于前台。

任何人都知道与您自己的应用程序进行交互的最佳方式,但是来自一个单独的流程吗?

4 个答案:

答案 0 :(得分:2)

您需要获取其他应用程序主窗口的hWnd。我记得如何做的唯一方法是遍历所有窗口,直到找到你的窗口。可能有更直接的方式

[DllImport("user32.dll")] private static extern 
              int EnumWindows(EnumWindowsProc ewp, int lParam); 

public delegate bool EnumWindowsProc(int hWnd, int lParam);

public void EnumerateAllWindows()
{
   EnumWindowsProc ewp = new EnumWindowsProc(EvalWindow);
   EnumWindows(ewp, 0);
 }

private bool EvalWindow(int hWnd, int lParam)
{
    //this will be called for each window..         
    // use GetWindowThreadProcessId to get the PID for each window
    // and use Process.GetProcessById to get the PID you are looking for
    // then bring it to foregroun using of these calls below:

}

    [DllImport("user32.dll")]
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    [DllImport("user32.dll")]
    public static extern bool BringWindowToTop(IntPtr hWnd);

    DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd

答案 1 :(得分:2)

实现目标的一种方法是创建一个命名的共享内存。

第一个应用程序将创建命名共享内存并存储在其窗口句柄,进程标识符或任何其他对此有用的信息中。

当第二个应用程序尝试创建具有相同名称的共享内存时,它将检索同一共享内存的句柄,而返回值将告诉您该对象已存在。然后,第二个应用程序可以从共享内存和任何其他信息中读取窗口句柄。然后,它可以使用BringWindowToTop()SetForegroundWindow()等。

您将在Windows SDK中找到an example of a named shared memory。虽然这个例子使用直接的Win32 API,但我很确定你可以在C#中执行相同的操作。

答案 2 :(得分:2)

.Net中内置了一个feature,让您的应用程序的第二个实例通过在第一个实例中引发事件来与第一个实例进行通信。虽然它是VB.Net的一部分,但它也是can be used和C#。

然而,了解错误非常重要。对于某些防火墙,甚至可以打开一个实例impossible - 您的应用程序在启动时崩溃了!有关详细信息和替代技术,请参阅Bill McCarthy的this excellent article。他使用.NET 3.5中的管道从第二个实例传回第一个实例。我建议你使用它。他的代码是VB.Net,但你可能convert to C# with Telerik

答案 3 :(得分:0)

google for forceForegroundWindow(如果你在Windows上),无论如何