确保WPF应用程序的单个实例:难以将已在运行的应用程序还原到前台

时间:2012-03-28 09:06:12

标签: c# wpf

意图:运行WPF应用程序的单个实例。启动新实例时,应将已运行的实例设置为前台。

虽然我已经实现了,但是当已经运行的应用程序位于通知托盘中时,我遇到了问题。代码运行没有错误,但无法恢复窗口&将它设置为前景。 代码段(c#):

[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport("user32.dll")]
private static extern bool IsIconic(IntPtr hWnd);

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

var currentProcess = Process.GetCurrentProcess();

string processName = currentProcess.ProcessName;
Process[] instances = Process.GetProcessesByName(processName);

if (instances.Length > 1)
{
    foreach(var instance in instances)
    {
        if (!currentProcess.Id.Equals(instance.Id))
        {
            IntPtr hWnd = instance.MainWindowHandle;

            if (IsIconic(hWnd))
                ShowWindow(hWnd, SW_RESTORE);

            SetForegroundWindow(hWnd);
        }
    }
    currentProcess.Kill();
}

任何人都可以指出我做错了什么。再次重申,它适用于已经运行的窗口处于最大化状态但事后才知道的情况。当已经运行的窗口最小化到通知托盘时,它会失败。

由于

1 个答案:

答案 0 :(得分:0)

您是否验证过,当已经运行的进程位于系统托盘中时,您的代码会执行ShowWindow?我问,因为我不认为IsIconic是正确使用的函数:documentation表示它“确定指定的窗口是否被最小化”。如果进程位于系统托盘中,则它不会被最小化,它将被隐藏。

我认为您应该使用IsWindowVisible代替。