J'ai une NotifyIcon dans la barre d'état système. Comment puis-je détecter si l'utilisateur a cliqué avec le bouton gauche de la souris sur cette icône ? J'ai supposé que le MouseDown
serait ce que je voudrais utiliser, mais il ne gère que le clic droit et le clic du bouton du milieu. Pour le clic gauche, il ne se déclenche qu'une fois que l'utilisateur a lâché le bouton (comme s'il venait d'effectuer un clic normal). Existe-t-il un moyen d'obtenir uniquement l'événement MouseDown ?
Réponses
Trop de publicités?Le shell synthétise le message MouseDown à partir de l'événement up. Vous comprendrez pourquoi il en est ainsi lorsque vous cliquerez sur le bouton et le maintiendrez enfoncé, puis que vous commencerez à le faire glisser. Notez que la fenêtre de débordement de la zone de notification apparaît et vous permet de faire glisser l'icône pour la retirer de la zone visible. Cela ne peut pas fonctionner dans les deux sens.
Techniquement, vous pourriez accrocher la fenêtre appartenant à Explorer.exe pour avoir accès aux messages avant qu'Explorer ne le fasse avec SetWindowsHookEx(). Cependant, cela nécessite une sorte de DLL que vous ne pouvez pas écrire en C#, elle doit être injectée dans Explorer. C'est très déstabilisant et il est difficile de battre la concurrence qui essaie de faire la même chose. C'est aussi le genre de code qui cause des nuits blanches à l'équipe appcompat de Microsoft.
Il semble que l'API Win32 sous-jacente Shell_NotifyIcon
envoie un WM_LBUTTONDOWN
message lorsque l'utilisateur clics l'icône . D'après le MSDN Quoi qu'il en soit.
L'examen du code source Windows Forms pour NotifyIcon révèle une gestion standard de l'événement "mouse down", donc si le message Win32 était envoyé au "bon" moment, il fonctionnerait comme vous le souhaitez/attendez.
Je suis d'accord avec un commentaire précédent selon lequel NotifyIcon va avaler WM_LBUTTONDOWN puisqu'il doit capturer la souris pour permettre à l'utilisateur de faire glisser les icônes.
Il est possible que cet article sur la création d'une icône de barre d'état pour WPF sera utile car elle montre comment utiliser les icônes de la barre d'état. SetWindowsHookEx
etc. en C#.