/ / Création d’une touche à l’échelle du système SendInput - c ++, pression de touche, sendinput

Création d’une touche à l’échelle du système SendInput - c ++, pression de touche, entrée

J'essaie de faire un programme qui envoie deuxtouches supplémentaires pour chaque appui sur le bouton gauche de la souris que je fais. Tout cela fonctionne bien sauf lorsque je suis dans un autre programme (dans mon cas, c’est un jeu), alors le bouton gauche de la souris est pressé mais les touches virtuelles supplémentaires ne sont pas appuyées pour moi. Le code entier:

#include <Windows.h>
#include <iostream>
int main ()
{
INPUT ip;
bool press = false;
int i = 0;
while ( true )
{
if ( GetKeyState( VK_LBUTTON) < 0 & !press )
{
std::cout << "press" << i++ << "n";
// PRESS F8
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0x42; // hardware scan code for key
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
ip.ki.wVk = 0x77; // virtual-key code

ip.ki.dwFlags = 0; // 0 for key press
SendInput(1, &ip, sizeof(INPUT));
if (GetKeyState( VK_F8) < 0) { std::cout << "press f8 n";}
ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
SendInput(1, &ip, sizeof(INPUT));

ip.ki.dwFlags = 0; // 0 for key press
SendInput(1, &ip, sizeof(INPUT));
ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
SendInput(1, &ip, sizeof(INPUT));

press = true;
}
if ( GetKeyState( VK_LBUTTON) >= 0 )
{
press = false;
}
}
return(0);
}

Maintenant, j'ai lu tout ce que j'ai pu trouver concernantceci, ce qui n’est pas si important, et je pense que cela a quelque chose à voir avec l’utilisation de scancodes au lieu de virtualkeycodes. Le problème est que lorsque je crée cet ip.ki.wScan = 0; il le fera correctement mais pas à l’intérieur du jeu, comme lorsque j’utilise à la fois scancode et VKcode. Mais lorsque VKcode vaut zéro, il cesse d’appuyer sur la touche F8 même si je ne suis pas dans le jeu.

Donc ma question est: Comment puis-je créer une touche de touche virtuelle à l’échelle du système qui fonctionne également lorsque je ne suis pas sur le bureau?

Réponses:

-1 pour la réponse № 1

Ok, j'ai découvert comment utiliser les scancodes pour faire pression virtuelle

// PRESS F8
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = MapVirtualKey(VK_F8, 0); // hardware scan code for key
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
ip.ki.wVk = 0;//0x77; // virtual-key code

ip.ki.dwFlags = KEYEVENTF_SCANCODE; // 0 for key press
SendInput(1, &ip, sizeof(INPUT));
if (GetKeyState( VK_F8) < 0) { std::cout << "press f8 n";}
ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
SendInput(1, &ip, sizeof(INPUT));

Les dwFlags doivent être KEYEVENTF_SCANCODE, sinon le code VK sera automatiquement utilisé pour déterminer celui qui doit être enfoncé.

Maintenant, il n’envoie toujours pas la touche de touche virtuelle au jeu que je m’exécute. Chaque fois que je suis dans ce jeu, cela ne fonctionne tout simplement pas, comment puis-je résoudre ce problème?