制作系统范围的按键SendInput

时间:2013-07-14 22:52:35

标签: c++ keypress 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时。但是当VKcode为零时,即使我不在游戏中,它也会停止按下F8键。

所以我的问题是: 当我不在桌面时,如何制作系统范围的虚拟按键?

1 个答案:

答案 0 :(得分:-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代码来确定应该按下哪个。

现在它仍然没有将虚拟按键发送到我正在运行的游戏中。每当我在这个游戏中它只是不起作用,我怎么能解决这个问题?