隐藏窗口时如何获取 Process.MainWindowHandle

sea*_*717 5 c# wpf

我有一个 WPF 应用程序。当它启动时,我需要检查是否已经有一个实例在运行。如果是这种情况,那么我会使用 PInvoke 来“显示”正在运行的实例:

SendNotifyMessage(proc.MainWindowHandle, ShowYourself, IntPtr.Zero, IntPtr.Zero);
Run Code Online (Sandbox Code Playgroud)

其中 proc 是另一个正在运行的实例

问题是,当proc隐藏在系统托盘中时。MainWindowHandle是 0。我做了很多搜索,但没有运气得到MainWindowHandle.

有人知道怎么做吗?

谢谢

Dis*_*ser 0

最好的方法是使用跨进程处理程序,例如互斥锁。 是一个很好的例子。另一件事,如果您想从另一个实例打开隐藏的应用程序,您应该在两个应用程序之间进行客户端-服务器通信。已经运行的应用程序应该是服务器,并且应该监听命令以使其可见。这很简单,但需要很多时间来理解。

更新: 这里我提交了一个简单的库,允许您控制应用程序实例。这很简单,但我留下一些评论

ApplicationSingleInstance - 它是控制应用程序实例的主类。应用程序启动时检查属性 IsInstanceAlreadyRun,如果为 true,则调用 StartServer() 方法,如果为 false,则调用 NotifyAboutNewInstance() 方法。此外,您还应该订阅 NewApplicationInstanceLoaded 事件以了解新的应用程序实例是否已启动。不要忘记取消订阅事件并处置 ApplicationSingleInstance 的实例

更新:我已经在codeproject上发布了这个库和解释