【发布时间】:2012-03-28 09:06:11
【问题描述】:
意图:运行 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();
}
谁能指出我做错了什么。再次重申,它适用于已经运行的窗口处于最大化状态但事后诸葛亮的情况。当已经运行的窗口最小化到通知托盘时,它会失败。
谢谢
【问题讨论】: