Делаем общесистемное нажатие клавиши SendInput

Я пытаюсь создать программу, которая отправляет два дополнительных нажатия клавиш для каждого нажатия левой кнопки мыши, которое я делаю. Все это работает нормально, за исключением случаев, когда я нахожусь в другой программе (в моем случае это игра), тогда она ощущает нажатие левой кнопки мыши, но не нажимает две дополнительные виртуальные клавиши для меня. Весь код:

#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, даже когда я не в игре.

Итак, мой вопрос: как мне сделать общесистемное виртуальное нажатие клавиши, которое также будет работать, когда я не на рабочем столе?


person Robert    schedule 14.07.2013    source источник


Ответы (1)


Хорошо, я узнал, как использовать скан-коды для виртуального нажатия клавиши

// 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, чтобы определить, какой из них должен быть нажат.

Теперь он по-прежнему не отправляет нажатие виртуальной клавиши в игру, которую я запускаю. Всякий раз, когда я в этой игре, она просто не работает, как я могу это исправить??

person Robert    schedule 15.07.2013