2009-12-07 4 views
2

J'utilise un ContextMenuStrip pour afficher certaines options à l'utilisateur lorsqu'il survole les cellules d'une table en appelant sa méthode Show(Control, int, int) dans l'événement MouseMove de la table, en passant la table en paramètre de contrôle.Comment recevoir des événements de déplacement de souris tout en affichant un ContextMenuStrip?

Si l'application n'est pas active, tout fonctionne comme prévu; mais si l'application est active, les événements MouseMove s'arrêtent une fois que le ContextMenuStrip est affiché.

Comment puis-je recevoir des événements de déplacement de souris tout en affichant une ContextMenuStrip? Je ne veux pas ajouter de hook ou de filtre d'application, je veux juste le comportement de l'application inactive même quand l'application est active.

+0

Êtes-vous simplement en train d'afficher des informations, ou donnez-vous la possibilité aux utilisateurs de cliquer sur ContextMenuStrip pour que quelque chose se produise? – Stewbob

Répondre

0

qui n'est pas possible, lorsque la bande de menu contextuel est affiché, les fenêtres du menu capture la souris

+0

alors pourquoi ça marche quand l'application est inactive? – Simon

+0

que voulez-vous dire, "l'application est inactive"? – serhio

1

Il est non seulement une capture de la souris, ce serait facile à contourner. Il existe une classe interne nommée "ModalMenuFilter" qui est activée lorsqu'une liste déroulante tooltrip est affichée et filtre différents messages. Y compris WM_MOUSEMOVE. Il le fait en utilisant SetWindowsHookEx(). Cela fonctionne lorsque votre application n'est pas active car ce hook n'est installé que lorsque votre formulaire est actif.

Rien de tout cela n'est accessible à partir de votre code, vous devez utiliser Reflection. Il me semble que vous pouvez utiliser ModalMenuFilter.RemoveActiveToolStrip() pour désactiver le filtre. Jetez un oeil-voir avec Reflector. Cela cause plus que probablement d'autres problèmes.

Questions connexes