我们正在尝试设置一个可以从其他地方激活的SysTray应用程序。更具体地说,激活将来自第三方应用程序,我们不能修改它,但允许我们通过它的路径激活我们自己的应用程序(加上参数/参数)。
当它被激活时,我们想要安装一个BalloonText,不涉及任何形式。
因此,我们有两个问题要解决:
大量的帮助帮助学习者创建简单的SysTray应用程序(实际上,我们已经将其作为一个未连接项目的解决方案的一部分来完成)。然而,我们从来没有尝试过使它成为单一的实例。
有很多帮助帮助学习者创建单个实例Winforms应用程序(同样,我们作为其他项目的一部分完成了这一点),但总是使用常规形式的简单应用程序(不是SysTray)。我们使用VisualBasic WindowsFormsApplicationBase方法。
似乎不能将这两种方法结合到一个单一的解决方案中。
更新:
汉斯在下面回答(尤其是他的评论):
这已经用NotifyIcon来处理了,把它放到表单上。以及“做出单个实例应用程序”复选框。还有StartupNextInstance事件。你不要再假设这件事有什么特别之处
发布于 2012-07-15 22:01:48
当您实际使用表单时,一切都变得琐碎了。把你的应用程序和设计师放在一起很简单,让你的应用程序终止,简单的避免托盘中的鬼图标,简单的创建上下文菜单,如果你需要的话添加弹出窗口很简单。
唯一不简单的事情是让表单不显示。将此代码粘贴到表单的类中:
Protected Overrides Sub SetVisibleCore(ByVal value As Boolean)
If Not Me.IsHandleCreated Then
Me.CreateHandle()
value = False
End If
MyBase.SetVisibleCore(value)
End Sub现在,上下文菜单中的"Exit“命令很简单:
Private Sub ExitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitToolStripMenuItem.Click
Me.Close()
End Sub发布于 2012-07-15 21:43:58
至于您关于检查其他实例的第一个问题,这似乎是可行的。我使用CodeProject实例作为基线。在您的Sub例程中,您可以使用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应用程序已经在运行,您可能希望尝试一下文章 on .Net进程间通信。否则,在创建CommandLine参数时解析Sub Main中的参数。
根据上述条款:
XDMessaging库为同一盒跨应用程序域通信提供了一种易于使用的零配置解决方案.它提供了一个用于跨应用程序边界发送和接收目标字符串消息的简单API。该库允许使用用户定义的伪“通道”来发送和接收消息。任何应用程序都可以向任何通道发送消息,但它必须以侦听器的身份向该通道注册才能接收。通过这种方式,开发人员可以快速和编程地设计出他们的应用程序如何最好地相互通信和协调工作。
https://stackoverflow.com/questions/11495455
复制相似问题