我已经尝试了伪造键盘操作的所有常规方法(SendInput / SendKeys / etc),但它们似乎都不适用于使用DirectInput的游戏。经过大量的阅读和搜索,我偶然发现了Interception,这是一个C ++库,允许您挂钩到您的设备。
自从我使用C ++以来已经很长时间了(C#没有任何东西),所以我遇到了一些麻烦。我已粘贴在下面的示例代码中。
看起来无论如何都会使用此代码从代码中启动关键操作?样本都挂钩到设备并重写动作(x键打印y,反转鼠标轴等)。
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;
}
我注释掉的代码是我尝试过的不起作用的代码。
答案 0 :(得分:1)
您需要调整UP和DOWN状态的关键状态才能获得按键。注意在while循环中,interception_wait返回变量 device ,你注释掉的代码会将事件发送到什么? 设备未初始化!忘记你的代码,尝试一些更基本的代码。使用interception_send调用查看循环内部的行,在其后再进行两次调用,但不要忘记在每次调用之前使用INTERCEPTION_KEY_DOWN和INTERCEPTION_KEY_UP更改stroke.state,以便伪造向下和向上事件。您将在每个键盘事件中获得额外的键。
另外,您可以尝试使用INTERCEPTION_FILTER_KEY_ALL而不是INTERCEPTION_FILTER_KEY_DOWN | INTERCEPTION_FILTER_KEY_UP。箭头键可能是网站上提到的特殊键。