Я пытаюсь создать программу, которая посылает два дополнительных нажатия клавиш для каждого нажатия левой кнопки мыши. Все это прекрасно работает, за исключением случаев, когда я нахожусь в другой программе (в моем случае это игра), тогда она чувствует, что левая кнопка мыши нажата, но она не нажимает дополнительные две виртуальные клавиши для меня.
Весь код:
#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);
}
Теперь я прочитал все, что мог найти в отношении этого, что не так уж много, между прочим, и я думаю, что это как-то связано с использованием скан-кодов вместо виртуальных кодов клавиш. Проблема в том, что когда я делаю это ip.ki.wScan = 0; и ip.ki.wVk = 0x77; он будет делать это правильно, но не внутри игры, то же самое, когда я использую и скан-код, и ВК-код. Но когда VKcode равен нулю, он перестает нажимать клавишу F8, даже когда я не в игре.
Итак, мой вопрос:
Как сделать общесистемное нажатие виртуальной клавиши, которое также будет работать, когда я не на рабочем столе?
Хорошо, я узнал, как использовать коды сканирования, чтобы сделать виртуальное нажатие клавиши
// 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));
DwFlags должен быть KEYEVENTF_SCANCODE, иначе он будет автоматически использовать код VK, чтобы определить, какой из них должен быть нажат.
Теперь он все еще не отправляет виртуальное нажатие клавиши в игру, в которой я работаю. Всякий раз, когда я в этой игре, она просто не работает, как я могу это исправить?
Других решений пока нет …