Значок на панели задач перестает отвечать, когда мое приложение свернуто!
-
20-09-2019 - |
Вопрос
После нахождения этот вопрос и следуя инструкциям, а также следуя многим ссылкам, мне удалось заставить мое приложение отображаться в виде значка на панели задач, и оно исчезает с панели задач, когда я его сворачиваю.
НО - странное поведение!Когда форма открыта, значок на панели задач работает нормально.Но как только я его сворачиваю, значок в трее перестает реагировать на любые щелчки мыши.
Другие факты, которые могут иметь значение:форма запускается потоком, отделенным от основного потока, и открывается с помощью .ShowDialog()
.В фоновом режиме также работает несколько других потоков.
Есть идеи, что происходит не так?
Решение
Заменять f.ShowDialog();
с Application.Run(f);
где f
это переменная, содержащая ваш Form
и он должен работать нормально.Проблема в том, что ShowDialog
возвращается (и цикл сообщений заканчивается), когда вы скрываете форму. Application.Run
обеспечивает правильный цикл сообщений, и ваше окно работает после того, как оно было скрыто, и его можно снова отобразить с помощью значка на панели задач.
Другие советы
Не совсем уверен, как выглядит ваш код, но ниже приведен код, который я извлек из одного из наших приложений.Он написан на 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
Конечный класс