【问题标题】:Restore app from tray [duplicate]从托盘恢复应用程序[重复]
【发布时间】:2023-03-26 11:03:01
【问题描述】:

我使用 Hardcodet.Wpf.TaskbarNotification 创建托盘菜单,但我遇到了一些问题,如果我的应用程序(进程)隐藏在托盘中,如何从其他进程打开它

我用过这个方法,但运气不好

    [DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    public static extern IntPtr SetFocus(HandleRef hWnd);

    [DllImport("user32.dll")]
    public static extern bool ShowWindow(IntPtr hWnd, int cmd);

我已经将事件 Activated 添加到 MainWindowGotFocusLoadedTaskbarIcon(TaskBar WPF 元素),但是这些方法(来自 user32)没有触发任何事件(它有效当应用程序最小化时,而不是何时隐藏到托盘)

知道我需要做什么吗?

更新:

它不是重复的,在原帖中有描述如何使用互斥锁,我已经做过了。我需要“带到前面”,激活或触发来自我的应用程序的其他实例的任何事件,当第一个实例在托盘中时,当第二个实例创建时只显示MessageBox,并且第一个实例最小化,该帖子很容易要做,我有比原帖中描述的更难的任务

【问题讨论】:

  • 应用程序不会隐藏在托盘中。托盘图标是一种资源,就像表单本身一样。应用程序仍在运行,但它的表单被隐藏或可能根本没有表单。只需显示您想要响应菜单点击的表单,就像响应按钮或菜单点击一样,例如使用Show()ShowDialog()
  • 如果您创建了一个表单并将其最小化,请恢复它。无需调用任何互操作方法或处理任何事件
  • @PanagiotisKanavos 当Hardcodet.Wpf.TaskbarNotification library 将进程 (1) 移动到托盘时,我需要将进程 (1) 的主窗口从其他进程 (2) 移到前面
  • @PanagiotisKanavos 好的,我需要从其他进程触发我的应用程序的任何事件,该怎么做?
  • 没有“移动”到托盘。 Hardcodet.Wpf.TaskbarNotification创建应用程序的托盘图标和菜单。不需要其他过程。 相同进程应该包含任务栏组件和你要使用的表单

标签: c# wpf taskbar system-tray


【解决方案1】:

来自另一个进程?如果没有提升,您可能很难将您的应用程序带到前台。阅读“备注”部分here

【讨论】:

  • 我不需要将我的应用程序作为前台,我需要从另一个应用程序实例触发我的应用程序的任何事件或方法(读取 cmets 以发布)
  • @VadimBugaiov 您不断重复您假设解决方案的样子。没有任何事件可以开始。如果您想要 IPC,请使用 IPC 机制。如果你想显示一个表单,不要使用两个进程。如果您真的-真的希望托盘进程调用另一个进程,请构建并使用 IPC 机制 - WCF、套接字、TcpListener、共享内存。
  • 确实,IPC 是这里的关键。也许HWND_BROADCAST 是一个好的开始。 stackoverflow.com/questions/14506406/…
  • @l33t 如果目标应用没有窗口,则无法接收该消息。这就是this isn't included in the list of IPC mechanisms 的原因。其他 IPC 机制更好,尽管它们可能有安全限制。此外,Windows 10 允许应用程序以其他far easier 方式进行通信
  • @l33t 我已经用HWND_BROADCAST 完成了它可以像我上面描述的那样通过进程完成吗?
猜你喜欢
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多