2010-01-13 1 views
0

После нахождения this question и следуя инструкциям там, а также следуя многим ссылкам, мне удалось заставить мое приложение отображаться в виде значка в системном трее, и оно исчезает с панели задач, когда я минимизирую его.Значок моего лотка перестает отвечать, когда мое приложение сведено к минимуму!

НО - странное поведение! Когда форма открыта, значок в системном трее отлично работает. Но как только я минимизирую его, значок в трее перестает отвечать на любой щелчок мышью.

Другие факты, которые могут вступить в игру: форма запускается нитью, отделяемой от основной нити, и открывается с помощью .ShowDialog(). В фоновом режиме также есть несколько других потоков.

Любые идеи, что происходит не так?

ответ

1

Заменить f.ShowDialog(); с Application.Run(f); где f переменная держит ваши Form и он должен работать нормально. Проблема в том, что ShowDialog возвращает (и заканчивается контур сообщения), когда вы скрываете форму. Application.Run обеспечивает правильный цикл сообщений, и ваше окно работает после того, как оно было скрыто, и его можно снова показать с помощью значка в системном трее.

+1

И ... у нас есть ПОБЕДИТЕЛЬ! Спасибо за ваш четкий, краткий и точный ответ! :) –

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 

End Class

Public Class Startup

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

End Class