我们只想在任何时候运行我们应用程序的一个实例。因此在启动时它会查看应用程序是否正在运行,如果正在运行,它会在主窗口上调用 SetForegroundWindow。
这一切都很好......大部分......
当我们的应用程序启动时,它将显示启动画面和登录表单。这两种形式都有 ShowInTaskBar = false。
因此,如果您尝试在显示登录表单时启动应用程序的另一个副本,则该登录表单不会被带到前台!
特别是当用户在任务栏中也看不到任何东西时,他们所认为的只是该应用程序是无用的并且无法启动。没有迹象表明有另一个实例在运行。
有什么办法可以解决这个问题吗?
最佳答案
好了,代码在这里。即使 ShowInTaskBar
为 false
,您也应该能够将其置于最前面。
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
public static void bringToFront(string title) {
// Get a handle to the Calculator application.
IntPtr handle = FindWindow(null, title);
// Verify that Calculator is a running process.
if (handle == IntPtr.Zero) {
return;
}
// Make Calculator the foreground application
SetForegroundWindow(handle);
}
注意:您应该FindWindow
使用窗体的类而不是名称,因为初始屏幕窗体有时没有标题甚至控制框。使用 Spy++ 进行更深入的挖掘。
在启动时使用 FindWindow
。我认为这就是您想要做的 - 在加载主窗体时将启动画面放在前面。
关于c# - 当 ShowInTaskbar = false 时将另一个进程窗口置于前台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2636721/