Значок моего трея перестает отвечать, когда мое приложение свернуто! - PullRequest
0 голосов
/ 13 января 2010

Найдя этот вопрос и следуя там инструкциям, а также пройдя по многим ссылкам, мне удалось заставить мое приложение отображаться в виде значка в системном трее, и оно исчезало с панели задач при сворачивании это.

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

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

Есть идеи, что не так?

Ответы [ 2 ]

1 голос
/ 26 января 2010

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

0 голосов
/ 26 января 2010

Не совсем уверен, как выглядит ваш код, но ниже приведен код, который я извлек из одного из наших приложений. Он написан на 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

Конечный класс

Открытый класс Startup

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

Конечный класс

...