我有一个 WPF 应用程序。当它启动时,我需要检查是否已经有一个实例在运行。如果是这种情况,那么我会使用 PInvoke 来“显示”正在运行的实例:
SendNotifyMessage(proc.MainWindowHandle, ShowYourself, IntPtr.Zero, IntPtr.Zero);
Run Code Online (Sandbox Code Playgroud)
其中 proc 是另一个正在运行的实例
问题是,当proc隐藏在系统托盘中时。MainWindowHandle是 0。我做了很多搜索,但没有运气得到MainWindowHandle.
有人知道怎么做吗?
谢谢
最好的方法是使用跨进程处理程序,例如互斥锁。 这是一个很好的例子。另一件事,如果您想从另一个实例打开隐藏的应用程序,您应该在两个应用程序之间进行客户端-服务器通信。已经运行的应用程序应该是服务器,并且应该监听命令以使其可见。这很简单,但需要很多时间来理解。
更新: 这里我提交了一个简单的库,允许您控制应用程序实例。这很简单,但我留下一些评论
ApplicationSingleInstance - 它是控制应用程序实例的主类。应用程序启动时检查属性 IsInstanceAlreadyRun,如果为 true,则调用 StartServer() 方法,如果为 false,则调用 NotifyAboutNewInstance() 方法。此外,您还应该订阅 NewApplicationInstanceLoaded 事件以了解新的应用程序实例是否已启动。不要忘记取消订阅事件并处置 ApplicationSingleInstance 的实例
更新:我已经在codeproject上发布了这个库和解释