SendInput() n'est pas égal appuyant sur la touche manuellement sur le clavier en C++?
Je voulais écrire un code c++ pour émuler en appuyant sur une touche du clavier "A":
//Set up a generic keyboard event.
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0; //hardware scan code for key
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
//Press the "..." key
ip.ki.wVk = code; //virtual-key code for the "a" key
ip.ki.dwFlags = 0; //0 for key press
SendInput(1, &ip, sizeof(INPUT));
//Release the "..." key
ip.ki.dwFlags = KEYEVENTF_KEYUP; //KEYEVENTF_KEYUP for key release
SendInput(1, &ip, sizeof(INPUT));
Il fonctionne très bien lorsque je lance un autre programme et d'attendre à mon programme à exécuter, à la "Une" est cliqué et le premier programme de réagir. Mais j'ai trouvé que dans l'autre application mon action a été en quelque sorte empêché (je peux manuellement, appuyez sur "A" sur le clavier, mais l'utilisation de mon programme ne cause pas d'action).
Donc, ce que je peux faire pour en appuyant sur la touche "A" à partir du programme identiques manuellement touche "A" (donc le deuxième programme ne reconnaît pas qu'il a été appelé par le programme)?
Je n'ai pas le code source du deuxième programme et ne sais pas comment il reconnaît que "A" n'était pas pressée manuellement.
Je suis sûr que la fenêtre je tiens à réagir à mon code est de premier plan, de recevoir et de bloquer ma clé (donc il peut décider que l'événement ne vient pas de l'utilisateur, mais à partir d'un programme).
SendInput
a été inventée pour résoudre les problèmes avec l'envoi de clavier individuel des messages dans les différents appels à keybd_event
. Ne pas abuser de SendInput
en l'appelant plusieurs fois avec un seul INPUT
structure. Construire un tableau de INPUT
structures et de les envoyer en une seule fois.J'ai aussi utilisé keybd_event avec le même résultat. Encore merci pour pointer quelques conseils.
Je doute que cette question sera d'aller n'importe où jusqu'à ce que vous donner plus de détails à propos de ce "deuxième programme".
Il y a un quelques relative posts à la OldNewThing qui pourrait être d'intérêt...
autant que je sache. il semble que l'autre programme de toujours vérifier le hwnd de l'expéditeur. c'est une sorte de protection.
OriginalL'auteur PolGraphic | 2013-09-05
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser SendInput() pour envoyer du matériel de numérisation de codes (par opposition à l'virtuel codes de balayage, qui DirectInput peut ignorer). C'est mal documentée, mais SendInput() peut en effet contourner DirectInput. La raison Eric solution ne fonctionne pas est-il définir le matériel d'analyse de code, mais il a fini à l'aide d'un virtuel de scan de code (par la mise en dwFlags à 0 et wVk non nulle).
Essentiellement, de faire une pression sur une touche que vous souhaitez définir:
Et de faire une clé de déverrouillage, set:
Un travail complet de l'échantillon est ci-dessous et imprime la lettre "a". Vous pouvez trouver d'autres codes de balayage ici.
Remarque: Vous pouvez combiner les touches (shift + a pour A) en passant SendInput() un tableau de structures d'ENTRÉE.
Yup. Utilisation de la propriété intellectuelle.type = INPUT_MOUSE.
Ok. Mais de quoi ai-je besoin de passer comme un wScan paramètre? Est-il un caractère Unicode représentant un clic de souris?
Pas tout à fait. La structure d'ENTRÉE est une union, et .ki est ce qui est utilisé pour la saisie au clavier. Au lieu de cela, vous voulez les utiliser .mi champ, qui est une structure qui prend dans la position de la souris, l'événement de la souris (molette de défilement, cliquez sur de gauche, etc.), et la durée. Découvrez cette page msdn
Même si je connais mieux, j'ai cherché pendant des caractères unicode à la place de codes de balayage pour la clé j'ai besoin. J'espère que ce lien sauve quelqu'un d'autre de temporaire de l'idiotie: philipstorr.id.au/pcbook/book3/scancode.htm
OriginalL'auteur David
Vous avez souvent besoin de définir le code d'analyse:
Et la construction d'un tableau comme IInspectable suggère est aussi certainement le chemin à parcourir.
Le jeu est peut-être à l'aide de DirectInput pour récupérer la saisie au clavier. DirectInput parle directement le conducteur, ce qui rend l'injection plutôt problématique. Le jeu de la distinction entre minuscules et Un capital?
Lorsque je l'utilise pour aller de l'chacarter avec WSAD (je ne peux pas le faire à partir du code, manuel uniquement en appuyant sur les touches sur le clavier), il ne font pas de différence entre minuscules et des capitaux, dans le jeu, la fenêtre de chat (qui je peux toucher avec mon code), cela fait une différence.
Cela implique que le jeu peut très bien utiliser DirectInput. L'Injection de est toujours possible, mais il est beaucoup plus difficile; vous devez ouvrir le raw périphérique clavier et envoyer des IOCTLs pour injecter de l'analyse brute des codes. Je ne suis pas familier avec ces Api, si vous êtes sur votre propre...
OriginalL'auteur Eric Brown
Si vous êtes à la recherche pour créer un jeu de bot, avez-vous regardé le programme de AutoHotKey?
http://www.autohotkey.com/
Il propose un langage de script, qui permet de faire beaucoup de tâches impliquées dans le " bot " création et c'est plutôt plus facile que d'essayer de tout faire en C++
(Elle a certainement joué Farmville pour moi, quand toute ma famille fait pression sur moi dans la création d'un compte)
OriginalL'auteur Strings