【问题标题】:Open system tray icon when click on shortcut on desktop单击桌面上的快捷方式时打开系统托盘图标
【发布时间】:2012-03-07 12:30:47
【问题描述】:

我正在开发 WinForms。现在我想实现一件事:当我点击桌面应用程序的快捷方式,然后应用程序处于最小化状态时,它将从系统托盘打开(不是创建新实例)。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    好的,所以当你双击快捷方式时,实际上会打开另一个应用程序实例,它不知道已经最小化到托盘的那个实例。

    本质上,您想检测您的应用程序的另一个实例是否在启动时运行。如果是,请告诉您应用的现有实例向用户显示其 UI,然后退出。

    您的解决方案包括两件事:

    1. 让您的应用了解它的另一个实例已经在运行的能力。
    2. 您的应用能够与它的其他实例“对话”(进程间通信)并告诉他们该做什么。

    1.让您的应用了解它的另一个实例已在运行的能力。
    这在 .NET 中很简单。当您的应用程序打开时,请使用 Mutex 类。这是一个系统范围的锁,本质上类似于Monitor

    例子:

    // At app startup:
    bool createdNew;
    var mutex = new Mutex(true, Application.ProductName, out createdNew);
    if (!createdNew)
    {
        // Use IPC to tell the other instance of the app to show it's UI
        // Return a value that signals for the app to quit
    }
    
    // At app shutdown (unless closing because we're not the first instance):
    mutex.ReleaseMutex();
    

    2。进程间通信
    有几种方法可以在 .NET 中执行 IPC。 WCF 就是其中之一,虽然很重。命名管道可能是您的最佳选择,尽管这是一个非常简单的要求,基本的套接字消息传递也应该工作。

    这里有一个关于 .NET 中适当的 IPC 方法的问题的链接,可以帮助您:What is the best choice for .NET inter-process communication?

    【讨论】:

    • 你没有进程之间的通信,只要找到合适的进程并激活窗口..
    • 啊,好吧。所以我知道您可以迭代流程,但是您将如何激活窗口?
    • 感谢 Neil 提供的宝贵信息。这些信息成为我申请的种子 :-)
    • 不客气,但请快速查看 Stuart 和我在 cmets 中对我的回答的对话 - 看起来他有一个更简单的解决方案,假设窗口可能对你有用您要显示的是应用程序的主窗口。如果他在评论之外没有发布自己的答案,我可能会更新我的答案以包括他的答案。
    • 感谢 Neil,但我在搜索后得到了答案。通过您的信息,我了解了对我来说是新的 mutex 类,之后我得到了满足我要求的工作应用程序。如果可能的话那么我会在这里提供解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多