2010-01-13 40 views
0

在找到this question后,按照其中的说明以及下面的许多链接,我设法让我的应用程序显示为系统托盘图标,并在我将其最小化时从任务栏中消失。当我的应用程序最小化时,我的托盘图标停止响应!

但是 - 奇怪的行为!当表单打开时,系统托盘图标正常工作。但只要我将其最小化,托盘图标就会停止响应任何类型的鼠标点击。

其他可能发挥作用的事实:表单由从主线程分离出来的线程启动,并以.ShowDialog()打开。还有其他几个线程在后台运行。

任何想法发生了什么问题?

回答

1

更换f.ShowDialog();Application.Run(f);其中f是可变的牵着你的Form,它应该工作的罚款。问题是当您隐藏表单时,ShowDialog返回(并且它的消息循环结束)。 Application.Run提供了一个正确的消息循环,并且在窗口隐藏后可以使用系统托盘图标再次显示窗口。

+1

而且......我们有一个赢家! 感谢您提供清晰,简洁和准确的答案! :) – 2010-01-27 08:42:09

0

不太清楚你的代码是什么样的,但下面是我从我们的应用程序中提取的一些代码。它用VB编写,但不应该太难转换。关键是创建一个ApplicationContext类来托管你的代码。此代码没有任何问题显示表单,然后重复关闭或最小化或最大化。

Public Class NotifyApplicationContext 
Inherits ApplicationContext 

Private components As System.ComponentModel.IContainer 
Private Notify As System.Windows.Forms.NotifyIcon 
Private Menu As System.Windows.Forms.ContextMenu 
Private mnuForm As System.Windows.Forms.MenuItem 
Private F As Form 

Public Sub New() 
    InitializeContext() 
End Sub 

Private Sub InitializeContext() 
    Me.components = New System.ComponentModel.Container 
    Me.Notify = New System.Windows.Forms.NotifyIcon(Me.components) 
    SetupContextMenu() 
    Notify.ContextMenu = Me.Menu 
    Notify.Icon = New Icon("YourApplicationIcon", 16, 16) 
    Notify.Text = "Your Application Text" 
    Notify.Visible = True 
    F = New Form 
    F.Show() 
End Sub 

Protected Overrides Sub Dispose(ByVal disposing As Boolean) 
    MyBase.Dispose(disposing) 
End Sub 

Protected Overrides Sub ExitThreadCore() 
    MyBase.ExitThreadCore() 
End Sub 

Private Sub SetupContextMenu() 
    Me.Menu = New System.Windows.Forms.ContextMenu 
    Me.mnuForm = New System.Windows.Forms.MenuItem 
    Me.Menu.MenuItems.Add(mnuForm) 
    mnuForm.Index = 7 
    mnuForm.Text = "FormText" 
    AddHandler mnuForm.Click, AddressOf Me.mnuTemp_Click 
End Sub 

Private Sub mnuForm_Click(ByVal sender As Object, ByVal e As System.EventArgs) 
    If F IsNot Nothing Then 
     If F.Visible = True Then 
      F.Close() 
      F.Dispose() 
      F = Nothing 
     End If 
    Else 
     F = New Form 
     F.Show() 
    End If 
    Notify.Text = "Change Application Text Here" 
End Sub 

末级

公共类启动

<STAThread()> _ 
Public Shared Sub Main() 
    Dim N As ApplicationContext = New NotifyApplicationContext 
    Application.Run(N) 
End Sub 

末级

相关问题