2009-07-23 5 views
2

J'essaye d'envoyer un coup de clé à une application, via PostMessage. J'utilise aussi Spy ++ pour essayer de comprendre comment envoyer le message, car je ne comprends pas complètement son fonctionnement interne.WM_KEYDOWN: comment l'utiliser?

alt text

Dans cette image, le premier élément (élément sélectionné) a été faite avec une course clé réelle faite par moi-même. Celui avec un Elipse rouge autour d'elle (ci-dessous) a été faite avec le code suivant:

WinApi.PostMessage(InsideLobbyHandle, WinApi.WM_KEYDOWN, (int)WinApi.VK_UP, 1); 

Je suppose qu'il doit avoir quelque chose à voir avec le dernier paramètre PostMessage(), mais je ne peux pas comprendre comment il fonctionne vraiment. Je peux voir dans le coup de touche original le ScanCode = 48, et dans le mien son 0, et aussi fExtended est 1 et dans le mien est 0. Comment puis-je le faire paraître le même?

En http://msdn.microsoft.com/en-us/library/ms646280(VS.85).aspx je ne peux pas comprendre le travail du dernier paramètre.

Répondre

13

Simuler entrée du clavier en utilisant SendInput, non PostMessage.

Vous ne pouvez pas simulate keyboard input with PostMessage.

Il y a encore some caveats par rapport à l'état clavier/async-état:

La fonction SendInput ne réinitialise pas état actuel de clavier. Par conséquent, si l'utilisateur a des touches lorsque vous appelez pressés cette fonction, ils risquent d'interférer avec les événements que cette fonction génère. Si vous êtes préoccupé par éventuelles interférences , vérifiez état du clavier avec la fonction GetAsyncKeyState et corriger au besoin.


Le lParam pour le WM_KEYDOWN Notification est spécifié en fonction des bits du champ:

  • Les 16 premiers bits sont le nombre de répétitions
  • Les 8 bits suivants sont le code de balayage
  • Le bit suivant est 1 pour la clé étendue, 0 sinon
  • Les 4 bits suivants sont réservés et doivent être 0
  • Le bit suivant est toujours 0 (pour WM_KEYDOWN)
  • Le bit suivant est l'état clé précédente
  • Le dernier bit est toujours 0 (pour WM_KEYDOWN)

Un avertissement: Toute solution que vous construisez base autour de PostMessage va être très fragile.

+0

Eh bien, je voudrais l'utiliser comme il allait me permettre d'envoyer des données sans avoir l'accent sur la fenêtre. Y a-t-il un autre moyen d'accomplir cela? –

+1

Pas que je sache. –

+0

Utilisez l'accessibilité pour effectuer l'action souhaitée au lieu de simuler l'entrée. –

0

Dans Spy ++ si vous faites un clic droit sur l'entrée et regardez en surbrillance (message enregistré) à ses propriétés, vous pouvez voir la valeur exacte de la lParam. Vous pouvez ensuite l'utiliser comme lParam pour vous assurer que PostMessage mène à des effets similaires, comme l'a fait l'action manuelle.