如果用户尝试启动我的应用程序的另一个实例,我想激活已经运行的进程的窗口。
要查找该过程,我调用Process.GetProcessesByName()
,它为我提供了应用程序运行实例的System.Diagnostics.Process
实例。但是,我使用
Form.ShowInTaskbar = false
这导致Process.MainWindowHandle
为零,因此我无法访问正在运行的进程的当前窗口。
我是否可以通过其他方式激活已在运行的流程的窗口?
答案 0 :(得分:2)
是的,ShowInTaskBar属性是特殊的。 Form类的其他几个属性属于同一类别。这些属性由本机CreateWindowEx()winapi调用中指定的样式标志实现。 ShowInTaskBar的WS_EX_APPWIND标志。
更改这些属性时出现问题,窗口必须重新创建。 Winforms会自动为您执行此操作,但它有几个副作用。其中之一是Handle属性值发生变化。使Process类无法找回MainWindowHandle。
你必须以另一种方式找到窗口。对于Winforms表单来说,让EnumWindows工作绝对不容易,你无法得到可猜测的窗口类名。不改变ShowInTaskBar属性肯定是更好的方法。另外考虑使用WindowsFormsApplicationBase class,它使OnStartupNextInstance方法变得微不足道。