Mon icône cesse de répondre lorsque mon application est réduite au minimum!
-
20-09-2019 - |
Question
Après avoir trouvé cette question et en suivant les instructions qui y sont, plus suivant la plupart des liens, j'ai réussi à obtenir mon application à apparaître comme une icône de la barre système, et il disparaît de la barre des tâches lorsque je le réduire.
- comportement bizarre! Lorsque le formulaire est ouvert, l'icône de la barre système fonctionne très bien. Mais dès que je minimisez, l'icône de la barre cesse de répondre à tout type de clic de souris.
D'autres faits qui peuvent entrer en jeu: la forme est mise en route par un fil filé hors du fil conducteur, et il est ouvert avec .ShowDialog()
. Il y a aussi plusieurs autres threads en cours d'exécution en arrière-plan.
Toutes les idées ce qui ne va pas?
La solution
Remplacer f.ShowDialog();
avec Application.Run(f);
où f
est la variable qui contient votre Form
et il devrait fonctionner correctement. Le problème est que revient ShowDialog
(et il est termine boucle de message) lorsque vous masquez la forme. Application.Run
fournit une boucle de message approprié et la fenêtre fonctionne après qu'il a été caché et peut être montrer à nouveau en utilisant l'icône de la barre système.
Autres conseils
Pas trop sûr de ce que votre code ressemble, mais au-dessous est un code que je tiré d'une de nos applications. Il est écrit en VB, mais ne devrait pas être trop difficile pour vous de convertir. La clé est de créer une classe ApplicationContext pour héberger votre code. Ce code n'a pas de problèmes montrant une forme, puis le fermer de façon répétée ou avec minimiser ou maximiser.
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
Classe publique de démarrage
<STAThread()> _
Public Shared Sub Main()
Dim N As ApplicationContext = New NotifyApplicationContext
Application.Run(N)
End Sub
End Class