Winforms 如何发送消息/激活SysTray应用程序?

Winforms 如何发送消息/激活SysTray应用程序?,winforms,systray,Winforms,Systray,我们正在尝试设置一个可以从其他地方激活的SysTray应用程序。更具体地说,激活将来自第三方应用程序,我们无法修改该应用程序,但允许我们通过其路径(加上参数/参数)激活自己的应用程序 当它被激活时,我们想把一个气球文本,没有涉及的形式 因此,我们有两个问题需要解决: 将SysTray应用程序设为单个实例(因为生成多个实例并不好) 允许此其他应用程序使用参数激活我们的应用程序 有很多帮助可以帮助学习者创建简单的SysTray应用程序(事实上,我们自己也这样做了,作为一个未连接项目解决方案的一部分)

我们正在尝试设置一个可以从其他地方激活的SysTray应用程序。更具体地说,激活将来自第三方应用程序,我们无法修改该应用程序,但允许我们通过其路径(加上参数/参数)激活自己的应用程序

当它被激活时,我们想把一个气球文本,没有涉及的形式

因此,我们有两个问题需要解决:

  • 将SysTray应用程序设为单个实例(因为生成多个实例并不好)

  • 允许此其他应用程序使用参数激活我们的应用程序

  • 有很多帮助可以帮助学习者创建简单的SysTray应用程序(事实上,我们自己也这样做了,作为一个未连接项目解决方案的一部分)。 然而,我们以前从未尝试过将其作为单个实例

    有很多帮助帮助学习者创建单实例Winforms应用程序(我们也是在其他项目中这样做的),但总是使用常规表单(而不是SysTray)创建简单的应用程序。我们使用VisualBasic WindowsFormsApplicationBase方法

    似乎无法将这两种方法结合到一个解决方案中

    更新:
    汉斯的回答如下(尤其是他的评论):


    这已经由NotifyIcon处理,请将其放到表单上。 和“生成单实例应用程序”复选框。和 StartupNextInstance事件。你需要停止假设有 这有什么特别的吗


    至于您关于检查其他实例的第一个问题,这似乎是可行的。我用这个作为基线。在子主例程中,可以使用
    Process
    类的
    GetProcessesByName
    方法检查其他实例。大概是这样的:

    Public Sub-Main()
    '重新启用视觉样式
    Application.EnableVisualStyles()
    '使用AppContext运行应用程序
    Dim p()作为进程
    p=Process.getProcessByName(“TrayApp”)“此处显示您的应用程序名称
    如果UBound(p)>=0,则
    终点
    如果结束
    Application.Run(新建AppContext)
    端接头
    
    对于第二个问题,如果您的SysTray应用程序已经在运行,您可能希望尝试使用.Net进程间通信。否则,请在创建时分析
    子主目录中的命令行参数

    从上述条款:

    XDMessaging库为同一机箱跨AppDomain通信提供了易于使用的零配置解决方案。它提供了一个简单的API,用于跨应用程序边界发送和接收目标字符串消息。该库允许使用用户定义的伪“通道”,通过这些通道可以发送和接收消息。任何应用程序都可以向任何通道发送消息,但它必须注册为该通道的侦听器才能接收消息。通过这种方式,开发人员可以通过编程快速地设计出他们的应用程序如何最好地相互通信并协调工作


    至于您关于检查其他实例的第一个问题,这似乎是可行的。我用这个作为基线。在子主例程中,可以使用
    Process
    类的
    GetProcessesByName
    方法检查其他实例。大概是这样的:

    Public Sub-Main()
    '重新启用视觉样式
    Application.EnableVisualStyles()
    '使用AppContext运行应用程序
    Dim p()作为进程
    p=Process.getProcessByName(“TrayApp”)“此处显示您的应用程序名称
    如果UBound(p)>=0,则
    终点
    如果结束
    Application.Run(新建AppContext)
    端接头
    
    对于第二个问题,如果您的SysTray应用程序已经在运行,您可能希望尝试使用.Net进程间通信。否则,请在创建时分析
    子主目录中的命令行参数

    从上述条款:

    XDMessaging库为同一机箱跨AppDomain通信提供了易于使用的零配置解决方案。它提供了一个简单的API,用于跨应用程序边界发送和接收目标字符串消息。该库允许使用用户定义的伪“通道”,通过这些通道可以发送和接收消息。任何应用程序都可以向任何通道发送消息,但它必须注册为该通道的侦听器才能接收消息。通过这种方式,开发人员可以通过编程快速地设计出他们的应用程序如何最好地相互通信并协调工作


    当您实际使用表单时,一切都变得微不足道。将应用程序与设计器放在一起很简单,终止应用程序也很简单,避免托盘中出现重影图标也很简单,创建上下文菜单也很简单,如果需要,还可以添加弹出窗口

    唯一不简单的事情是让表单不显示。将此代码粘贴到窗体的类中:

    Protected Overrides Sub SetVisibleCore(ByVal value As Boolean)
        If Not Me.IsHandleCreated Then
            Me.CreateHandle()
            value = False
        End If
        MyBase.SetVisibleCore(value)
    End Sub
    
    上下文菜单中的“退出”命令现在只是:

    Private Sub ExitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitToolStripMenuItem.Click
        Me.Close()
    End Sub
    

    当您实际使用表单时,一切都变得微不足道。将应用程序与设计器放在一起很简单,终止应用程序也很简单,避免托盘中出现重影图标也很简单,创建上下文菜单也很简单,如果需要,还可以添加弹出窗口

    唯一不简单的事情是让表单不显示。将此代码粘贴到窗体的类中:

    Protected Overrides Sub SetVisibleCore(ByVal value As Boolean)
        If Not Me.IsHandleCreated Then
            Me.CreateHandle()
            value = False
        End If
        MyBase.SetVisibleCore(value)
    End Sub
    
    上下文菜单中的“退出”命令现在只是:

    Private Sub ExitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitToolStripMenuItem.Click
        Me.Close()
    End Sub
    

    您是否尝试过在项目的“属性”应用程序选项卡中选择“生成单实例应用程序”
    ?@MarkHall这太容易了。如果这样做,则需要指定一个常规表单作为启动。正如我所说,我们使用的不是表单,只是一个带气球文本的系统。只是问问。。我想你已经试过在项目的属性应用程序选项卡中选择
    makesingleinstanceapplication
    。@MarkHall这太容易了。如果这样做,您需要指定一个常规表单作为