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

时间:2012-07-15 20:40:32

标签: winforms systray

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

当它被激活时,我们想要建立一个BalloonText,不会涉及任何形式。

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

  1. 使我们的SysTray应用程序成为单个实例(因为生成多个实例并不好)。

  2. 允许此其他应用使用参数

  3. 激活我们的应用

    有很多帮助帮助学习者创建简单的SysTray应用程序(实际上我们已经将其作为未连接项目解决方案的一部分来完成)。 但是我们以前从未尝试过将它作为单个实例。

    有很多帮助帮助学习者创建单实例Winforms应用程序(我们已经将其作为其他项目的一部分完成)但总是使用传统表单(而不是SysTray)的简单应用程序。我们使用VisualBasic WindowsFormsApplicationBase方法。

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

    更新
    汉斯回答下面指出它(特别是他的评论):

      

    这已经通过NotifyIcon处理,将其放在表单上。   和“制作单实例应用程序”复选框。而且   StartupNextInstance事件。你需要停止假设   这个有什么特别的

2 个答案:

答案 0 :(得分:2)

关于检查其他实例的第一个问题,这似乎有效。我使用CodeProject example作为基线。在Sub Main例程中,您可以使用GetProcessesByName类的Process方法检查其他实例。像这样:

Public Sub Main()
    'Turn visual styles back on
    Application.EnableVisualStyles()

    'Run the application using AppContext
    Dim p() As Process
    p = Process.GetProcessesByName("TrayApp") 'Your application name here
    If UBound(p) >= 0 Then
        End
    End If
    Application.Run(New AppContext)

End Sub

对于第二个问题,如果您的SysTray应用程序已在运行,您可能需要尝试在.Net进程间通信上提供此article。否则,在Sub Main创建时解析CommandLine参数。

从以上文章:

  

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

答案 1 :(得分:1)

当你真正使用表格时,一切都变得微不足道。将您的应用程序与设计器放在一起很简单,简单地让您的应用程序终止,简单地避免托盘中的鬼图标,简单地创建上下文菜单,如果您需要它们,可以简单地添加弹出窗口。

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

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