1

我正在尝试制作一个程序,该程序为我每次按下鼠标左键发送两个额外的按键。这一切都很好,除非我在另一个程序中(在我的情况下它是一个游戏),然后它确实感觉到按下鼠标左键但它没有为我按下额外的两个虚拟键。整个代码:

#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 键。

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

4

1 回答 1

0

好的,我发现了如何使用扫描码来制作虚拟按键

// 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 代码来确定应该按下哪个。

现在它仍然没有将虚拟按键发送到我正在运行的游戏。每当我在这个游戏中,它就无法正常工作,我该如何解决这个问题?

于 2013-07-15T09:50:59.553 回答