激活隐藏进程的窗口

时间:2011-09-19 14:04:23

标签: c# .net winforms process

如果用户尝试启动我的应用程序的另一个实例,我想激活已经运行的进程的窗口。

要查找该过程,我调用Process.GetProcessesByName(),它为我提供了应用程序运行实例的System.Diagnostics.Process实例。但是,我使用

从任务栏隐藏了我的进程
Form.ShowInTaskbar = false

这导致Process.MainWindowHandle为零,因此我无法访问正在运行的进程的当前窗口。

我是否可以通过其他方式激活已在运行的流程的窗口?

1 个答案:

答案 0 :(得分:2)

是的,ShowInTaskBar属性是特殊的。 Form类的其他几个属性属于同一类别。这些属性由本机CreateWindowEx()winapi调用中指定的样式标志实现。 ShowInTaskBar的WS_EX_APPWIND标志。

更改这些属性时出现问题,窗口必须重新创建。 Winforms会自动为您执行此操作,但它有几个副作用。其中之一是Handle属性值发生变化。使Process类无法找回MainWindowHandle。

你必须以另一种方式找到窗口。对于Winforms表单来说,让EnumWindows工作绝对不容易,你无法得到可猜测的窗口类名。不改变ShowInTaskBar属性肯定是更好的方法。另外考虑使用WindowsFormsApplicationBase class,它使OnStartupNextInstance方法变得微不足道。