意图:运行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();
}
任何人都可以指出我做错了什么。再次重申,它适用于已经运行的窗口处于最大化状态但事后才知道的情况。当已经运行的窗口最小化到通知托盘时,它会失败。
由于
答案 0 :(得分:0)
您是否验证过,当已经运行的进程位于系统托盘中时,您的代码会执行ShowWindow
?我问,因为我不认为IsIconic
是正确使用的函数:documentation表示它“确定指定的窗口是否被最小化”。如果进程位于系统托盘中,则它不会被最小化,它将被隐藏。
我认为您应该使用IsWindowVisible
代替。