Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过截获发送按键_C++_Keyboard Events_Hid_Keyboard Hook_Interception - Fatal编程技术网

C++ 通过截获发送按键

C++ 通过截获发送按键,c++,keyboard-events,hid,keyboard-hook,interception,C++,Keyboard Events,Hid,Keyboard Hook,Interception,我尝试过所有假装键盘动作的正常方法(SendInput/SendKeys/etc),但它们似乎都不适用于使用DirectInput的游戏。经过大量的阅读和搜索,我偶然发现,这是一个C++库,允许你进入你的设备。 这是我用C++工作的很长一段时间(没有C语言存在),所以我遇到了一些麻烦。我已经粘贴了下面的示例代码 使用此命令从代码中启动关键操作看起来是否仍然存在?这些示例都只是挂接到设备上并重写操作(x键打印y、反转鼠标轴等) enum扫描代码 { 扫描代码_X=0x2D, 扫描代码_Y=0x15

我尝试过所有假装键盘动作的正常方法(SendInput/SendKeys/etc),但它们似乎都不适用于使用DirectInput的游戏。经过大量的阅读和搜索,我偶然发现,这是一个C++库,允许你进入你的设备。 这是我用C++工作的很长一段时间(没有C语言存在),所以我遇到了一些麻烦。我已经粘贴了下面的示例代码

使用此命令从代码中启动关键操作看起来是否仍然存在?这些示例都只是挂接到设备上并重写操作(x键打印y、反转鼠标轴等)

enum扫描代码
{
扫描代码_X=0x2D,
扫描代码_Y=0x15,
扫描代码=0x01
};
int main()
{
语境语境;
拦截装置;
截击击击;
提高进程优先级();
context=拦截\创建\上下文();
截取设置过滤器(上下文,截取为键盘,截取过滤器键为向下,截取过滤器键为向上);
/*
对于(int i=0;i<10;i++)
{
睡眠(1000);
stroke.code=扫描代码_Y;
截取发送(上下文,设备,(常量截取行程*)和行程,1);
}
*/
while(截取\接收(上下文,设备=截取\等待(上下文),(截取冲程*)和冲程,1)>0)
{
如果(stroke.code==SCANCODE_X)stroke.code=SCANCODE_Y;
截取发送(上下文,设备,(常量截取行程*)和行程,1);
如果(stroke.code==SCANCODE_ESC)中断;
}

我注释掉的代码是我尝试过的不起作用的代码。

您需要调整向上和向下状态的键状态以获得按键。请注意while循环中的变量设备是通过侦听返回的。\u wait,您注释掉的代码将发送事件到什么?设备未初始化!忘记您的代码并尝试一些more basic.查看带有侦听发送调用的循环中的行,在该行之后再进行两次调用,但不要忘记在每次调用之前使用侦听向下键和侦听向上键来更改stroke.state,这样您就可以模拟向下和向上事件。在每个键盘事件中,您将获得额外的键


另外,你可以尝试使用截取过滤键,而不是截取过滤键,向下截取过滤键,向上截取过滤键。箭头键可能是网站上提到的特殊键。

只是为了澄清一下,按照你的解释,这只是为了在我按下一个正确的键时得到更多的按键?我正在寻找一种方法来真正地制作按键不按任何键就按。例如,如果我在应用程序中单击一个按钮,我可以让它发送“control+a”的按键。您可以正常操作,只需识别要伪造输入的键盘id,并将其保存在某个变量中,在这种情况下,设备id将保存在变量设备上。在知道与给定设备关联的id后,您可以根据需要发送事件。通常情况下,PS/2设备的get id等于拦截键盘(0),USB设备获得截获键盘(1)或更高版本。
enum ScanCode
{
    SCANCODE_X   = 0x2D,
    SCANCODE_Y   = 0x15,
    SCANCODE_ESC = 0x01
};

int main()
{
    InterceptionContext context;
    InterceptionDevice device;
    InterceptionKeyStroke stroke;

    raise_process_priority();

    context = interception_create_context();

    interception_set_filter(context, interception_is_keyboard, INTERCEPTION_FILTER_KEY_DOWN | INTERCEPTION_FILTER_KEY_UP);

    /*
    for (int i = 0; i < 10; i++)
    {
        Sleep(1000);
        stroke.code = SCANCODE_Y;
        interception_send(context, device, (const InterceptionStroke *)&stroke, 1);
    }
    */

    while(interception_receive(context, device = interception_wait(context), (InterceptionStroke *)&stroke, 1) > 0)
    {
        if(stroke.code == SCANCODE_X) stroke.code = SCANCODE_Y;

        interception_send(context, device, (const InterceptionStroke *)&stroke, 1);

        if(stroke.code == SCANCODE_ESC) break;
    }