0

我正在尝试重新映射游戏的一些键(Elsword)。

首先,我使用这段代码来模拟按下的键:

#define WINVER 0x0500

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "dinput.h"

int main()
{
    HWND hWndMain = FindWindow(0, "Elsword");
    SetForegroundWindow(hWndMain);

    Sleep(3000);

    INPUT input[2];

    input[0].type=INPUT_KEYBOARD;
    input[0].ki.wScan = DIK_V; // direct-input scancode for key '1'
    input[0].ki.dwFlags=KEYEVENTF_SCANCODE;

    input[1].type=INPUT_KEYBOARD;
    input[1].ki.wScan = DIK_V; // direct-input scancode for key '1'
    input[1].ki.dwFlags=KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;

    SendInput(2,input,sizeof(INPUT));

    Sleep(1000);
    return 0;
}

在所有其他应用程序中它工作正常,但在游戏窗口中它什么也不做......

4

1 回答 1

1

请注意,挂钩 Direct3D 只会让您访问与图形相关的功能,而不是与输入相关的功能。要挂钩使用 Direct3D 的游戏,您需要挂钩 DirectInput(如果游戏使用它),或者使用 SentInput 或 PostMessage。如今,大多数游戏都使用标准的 Windows 消息作为鼠标,以及 DirectInput 或他们自己的自定义键盘实现。另请注意,SendInput API 是系统范围的,并且需要正确的目标窗口才能获得焦点。此外,一些游戏会创建一个额外的窗口来充当 D3D 窗口的客户区域上的不可见层,从而导致混淆哪个窗口句柄是正确的窗口句柄来发送输入消息。

要检查您的游戏是否使用 Windows 消息进行输入,请打开 Spy++ 并在窗口模式下运行您的游戏。单击“进程”按钮,右键单击游戏的进程并选择“消息”。然后单击“记录选项”按钮并切换到“消息”选项卡。从这里,您可以选择“键盘”和“鼠标”,或按住 CTRL 键并从列表中选择/取消选择单个消息。之后,点击 OK 并在目标应用程序中测试您的键盘和鼠标。如果您看到任何与鼠标相关的消息,那么您就知道 SendInput、PostMessage、SetWindowsHookEx 和可能的 mouse_event() 将适用于鼠标。如果您看到任何与键盘相关的消息,那么您知道 SendInput、PostMessage、SetWindowsHookEx 和可能的 keyb_event() 将适用于键盘。

如果您没有看到任何有关键盘的消息,那么最有可能采取的措施是检查该进程是否加载了 dinput.dll 或 dinput8.dll,如果加载,则安装一个钩子(谷歌“直接输入钩子”) . 如果没有,那么您可以检查 Dependency Walker、IDA 或 OllyDbg 中加载的每个模块,看看它们是否实现了自己的键盘处理程序,但此时事情变得相当复杂,需要大量的 ASM 知识和逆向工程技术。但是,如果您熟悉开发驱动程序,那么这可能会有所帮助:SendInput Not working for Games

于 2013-01-27T22:10:35.270 回答