Détecter la molette de la souris sur une fenêtre non focalisée?

Mon objective est de créer une barre d’outils flottante (en tant que sa propre application C #), et lorsque l’utilisateur utilise la molette de défilement sur moi, je souhaite modifier les boutons visibles. Cela semble assez facile, devrait juste être une question de cette ligne unique:

MouseWheel += new MouseEventHandler(Form1_MouseWheel); 

Le problème que je rencontre est que le gestionnaire de molette de la souris n’est appelé que lorsque mon application est active. Cela signifie que l’utilisateur doit d’abord cliquer, puis mousewheel. Cela ne fera pas pour ce que j’essaye de faire.

Je peux relier le gestionnaire d’événements MouseHover et appeler form.Activate () pour obtenir le focus. C’est sous-optimal, car si l’utilisateur utilise la molette de défilement immédiatement après le survol de mon application (au lieu d’attendre un peu), l’accent sera toujours mis sur l’application précédente et il obtiendra l’événement mousewheel.

Une chose naturelle à faire serait de lier l’événement MouseEnter et d’appeler Activate (), mais au lieu que mon application apparaisse au premier plan, son icône commence à clignoter dans la barre des tâches. J’utilise Win7, mais ce problème est probablement plus ancien que cela.

Idéalement, ce que j’aimerais faire serait de détecter les événements de la molette de la souris sans avoir à vous soucier de savoir si mon application est active ou non. Il serait vraiment préférable que l’application précédente garde le focus, par exemple, si l’utilisateur dans le Bloc-notes peut taper, passer la souris sur mon application, utiliser la molette de défilement, regarder ce qu’il voit et décider de continuer à taper dans le Bloc-notes . Idéalement, je ne veux pas qu’ils aient à cliquer même une fois dans ce scénario.

Je me contenterai d’une solution qui permette de concentrer l’attention sur mon application, s’il n’y a pas d’autre moyen.

Ce que j’ai jusqu’à présent utilise C # et Windows Forms, mais je serais ouvert à l’utilisation de solutions différentes si cela pouvait résoudre mes problèmes.

Alors, comment puis-je voir ces événements de la souris sans que l’utilisateur ait à cliquer pour centrer d’abord mon application?

Si vous devez intercepter des événements de souris en dehors de votre application, vous pouvez utiliser un raccordement système global. Il y a une bonne implémentation .NET ici