Comment faire en sorte qu'une icône systray (zone de notification) reçoive des messages WM_MOUSEWHEEL?

StackOverflow https://stackoverflow.com/questions/90411

  •  01-07-2019
  •  | 
  •  

Question

Je souhaite étendre une application existante que j'ai créée pour lui permettre de régler le volume du mélangeur en faisant défiler la souris sur son icône de zone de notification.

Autant que je sache, la zone de notification ne reçoit aucun message WM_MOUSEWHEEL, mais j’ai quand même trouvé une application qui fait exactement ce que je veux atteindre ( http://www.actualsolution.com/power_mixer ). À l'aide de WinspectorSpy, j'ai remarqué quelques messages étranges dans le formulaire de l'application: 0x000003d0 et 0x000003d1, mais je n'ai trouvé aucune référence à leur sujet.

Quelqu'un at-il une idée de la manière dont je pourrais atteindre la fonctionnalité souhaitée?

Était-ce utile?

La solution

Si vous souhaitez capturer des événements de souris / clavier en dehors de votre application, vous devez disposer d'un Crochets de faible niveau .

Un bon article pour les débutants sur l'installation d'un crochet de souris dans Delphi est Comment accrocher la souris pour capturer des événements en dehors de votre application sur About.com écrit par Zarko Gajic.

L'utilisateur qui lance votre application aura besoin de droits d'administrateur pour installer un hook.

Après avoir capturé le message, vous devez déterminer s'il est au-dessus de votre icône dans la barre de notification (ce qui peut s'avérer difficile, car il n'y a pas d'API exacte pour obtenir votre position sur la barre) et ensuite traiter l'événement de défilement.

Autres conseils

J'ai expliqué comment accrocher la souris et mentionné qu'il pourrait être difficile de localiser votre icône exacte. J'ai trouvé l'article suivant sur la recherche d'une icône dans la zone de notification.

CTrayIconPosition - où se trouve mon icône de barre d'état? par Irek Zielinski. Je pense que si vous essayez de comprendre son fonctionnement, vous pouvez l’inverser et l’utiliser pour vérifier si votre souris est actuellement positionnée au-dessus de votre icône.

Mais vous devez d’abord vérifier si la souris est bien dans la zone du bac. J'ai trouvé un de mes vieux codes (2005) qui localise la bonne région.

var
 hwndTaskBar, hwndTrayWnd, hwndTrayToolBar : HWND;
 rTrayToolBar : tRect;
begin
 hwndTaskBar  := FindWindowEx (0, 0, 'Shell_TrayWnd', nil);
 hwndTrayWnd  := FindWindowEx (hwndTaskBar , 0, 'TrayNotifyWnd',nil);
 hwndTrayToolBar := FindWindowEx(hwndTrayWnd, 0, 'ToolbarWindow32',nil);

 Windows.GetClientRect(hwndTrayToolBar, rTrayToolBar);
end

En utilisant ce morceau de code et les connaissances de l'article mentionné, je pense que vous pourriez implémenter la fonctionnalité que vous souhaitiez.

Je ne sais pas si cela résoudra le problème, mais cela pourrait valoir le coup d’être essayé. Vous pouvez créer une fenêtre transparente de niveau supérieur que vous positionnez ensuite au-dessus de l'icône de la barre des tâches. Cette fenêtre de niveau supérieur recevra des notifications de la souris lorsque la souris le survolera. Vous pouvez ensuite les traiter au besoin. Je ne sais pas comment trouver l'emplacement de l'icône de la barre des tâches à l'écran. Cela pourrait donc être un problème.

Je ne sais pas si cela vous aidera, mais dans Delphi, la bibliothèque de messages standard indique:

WM_MOUSEWHEEL = $ 020A;

Il serait également utile de laisser savoir quelle langue vous utilisez.

Je pensais juste que je ferais remarquer que Power Mixer capture les événements de la molette de défilement sur toute la barre des tâches, tandis que le clic du milieu de la souris agit uniquement sur l'icône de la barre d'état système.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top