8
votes

Convertir des événements d'un dispositif d'interface humaine USB à l'aide de C ++

J'ai un USB HID TouchPad qui recueille une entrée. Par défaut, lorsque j'appuie sur le pavé tactile, il génère retour chariot (Entrée) et lorsque j'essaie de l'utiliser comme une souris, il entre en fait un état d'état "fort>.

Ce que je veux faire, c'est convertir le retour de chariot dans un clic clic de souris et l'état glisser dans un curseur bougeoir sans la première partie en cliquant.

J'ai trouvé le Entrée brute alternative. Cependant, je ne sais pas comment le convertir en souris cliquez sur et du curseur déplacer .

Voici le code responsable avec la "lecture" de la souris : xxx

puis la partie du clavier: xxx

puis la partie de journalisation: xxx < / Pré>

Remarque: Je ne sais pas si cela est pertinent, mais je souhaite utiliser le cahier pour jouer dans une instance de chrome sur un système Windows.


5 commentaires

Comment votre fenêtre transparente serait-elle connue, s'il doit envoyer un wm_mousemove ou un wm_ncmousemove à la fenêtre en dessous?


J'ai supposé que la fenêtre transparente doit "savoir" envoyer un wm_ncmousemove (afin d'avoir un meilleur contrôle sur la "sortie"), mais je n'ai pas considéré que cela est très important. Devrais-je m'inquiéter?


Une fenêtre obtient soit toutes les entrées, soit aucune. Si vous souhaitez filtrer l'entrée, vous devrez passer une partie de cette entrée sur Windows en dessous. WM_MOUSEMOVE est l'un des messages que vous souhaitez transmettre, et vous devrez décider, que ce soit wm_mousemove ou wm_ncmousemove . wm_mouseleave est un autre message qui est probablement impossible à obtenir, étant donné votre configuration proposée avec une fenêtre transparente.


Je vois Merci. Votre conseil serait donc de régler cela et de se concentrer sur les deux autres approches?


Vos exemples de code utilisent des crochets de souris / clavier de bas niveau, pas d'une entrée brute. Si vous ouvrez votre appareil pour une entrée RAW, obtenez-vous des structures RIM_TypeKeyboard ou des structures RIM_TYPEHID? (Vous Devriez-vous d'obtenir RIM_TYPEHID.) Une fois que vous avez les données HID, vous devriez pouvoir l'analyser (contourner les pilotes) et appelez SendInput le cas échéant.


3 Réponses :


2
votes

Pour le clic de souris et le déplacement de la souris - Lorsque vous gérez l'entrée de l'entrée de la HID, utilisez le sendinput méthode.

Le clic est facile, pour que l'évacuation de la souris Essayez d'obtenir les coordonnées de glisser à l'échelle et de les convertir dans les coordonnées actuelles de l'échelle de l'écran et utilisez également la méthode sendinput

Vous pouvez également suivre le déplacement dans X, Y et faire un étalonnage approprié pour les traduire en écran X, Y


0 commentaires

2
votes

Le pavé tactile est juste une souris comme n'importe quel autre. Il génère des événements standard de la souris. Utilisez un code global wh_mouse Crochet via SetWindowshookex () pour capturer les événements de la souris globalement. Pour les rejouer, utilisez souris_event () . Alternativement, utilisez wh_journalrecord et wh_journalplayback à la place pour la capture et la lecture, respectivement.


0 commentaires

2
votes

Lorsque vous enregistrez le crochet avec wh_mouse_ll, les valeurs possibles de wparam sont: wm_lbuttonown, wm_lbuttonup , wm_mousemove, wm_mousehwheel, wm_rbutonwown, wm_rbutonwown , ou wm_rbuttonup.

Je m'attends qu'une fois que le wm_lbuttonwown est émis, A correspondant wm_lbuttonup doit être émis pour empêcher le curseur D'entrer dans l'état de traînée.

Je n'ai pas l'appareil à tester cela, mais j'essaierais l'appel ci-dessous pour éviter d'entrer dans l'état de traînée. xxx

ou utilisez souris_event avec mouseeventf_leftup pour injecter la sortie du bouton gauche.

Je ne pense pas que l'alternative d'entrée brute est une bonne idée. Je le vois comme une mesure du dernier recours.


0 commentaires