0

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

当它被激活时,我们想要放置一个 BalloonText,不涉及任何表单。

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

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

  2. 允许这个其他应用程序使用参数激活我们的应用程序

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

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

似乎无法将这两种方法组合成一个解决方案。

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

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

4

2 回答 2

2

至于您关于检查其他实例的第一个问题,这似乎有效。我使用CodeProject 示例作为基线。GetProcessesByName在您的 Sub Main 例程中,您可以使用类的Method检查其他实例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 Interprocess Communication 上的这篇文章。否则,在创建时解析您的命令行参数Sub Main

从上面的文章:

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

于 2012-07-15T21:43:58.870 回答
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
于 2012-07-15T22:01:48.907 回答