【问题标题】:Making a system-wide key press SendInput使系统范围的按键按下 SendInput
【发布时间】:2013-07-12 17:57:12
【问题描述】:

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

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

所以我的问题是: 如何使系统范围的虚拟按键在我不在桌面时也能正常工作?

【问题讨论】:

    标签: c++ keypress sendinput


    【解决方案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 代码来确定应该按下哪个。

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

    【讨论】:

      猜你喜欢
      • 2012-05-30
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      相关资源
      最近更新 更多