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

标签 c# wpf

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

SendNotifyMessage(proc.MainWindowHandle, ShowYourself, IntPtr.Zero, IntPtr.Zero);

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

问题是,当 proc 隐藏在系统托盘中时。 MainWindowHandle 为 0。我进行了大量搜索,但没有找到 MainWindowHandle

有人知道吗?

谢谢

最佳答案

最好的方法是使用跨进程处理程序,例如互斥量。 Here是一个很好的例子。 还有一点,如果你想从另一个实例打开隐藏的应用程序,你应该在两个应用程序之间进行客户端-服务器通信。已经运行的应用程序应该是服务器并且应该监听命令变得可见。这很简单,但要花很多时间才能理解。

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

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

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

关于c# - 隐藏窗口时如何获取 Process.MainWindowHandle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5036860/

相关文章:

c# - 使用 Roslyn 查找特定方法的所有方法调用

c# - 我可以通过引用传递锁定对象吗?

wpf - 如何获取Visual Studio 2013 Express的Blend

c# - 如何将 viewModel 绑定(bind)到 View

c# - 如何从 ResourceDictionary 引用 BindingProxy 实例

c# - 使用 telerik 在表格中显示员工的教育背景

c# - 在 CRM 2011 插件中模拟 IOrganizationService.Execute 的问题

c# - 如何让 EventLog 将用户名记录到 Window 事件日志中?

c# - SQLite无法连接到另一台PC上的数据库

WPF 组合框绑定(bind)