【问题标题】:Remapping keys on Direct3D game在 Direct3D 游戏上重新映射键
【发布时间】:2013-01-21 17:43:08
【问题描述】:

我正在尝试为游戏 (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;
}

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

【问题讨论】:

  • Afaik 很难将输入发送到具有 DirectInput 和全屏模式的应用程序。也许尝试使用窗口模式。
  • 我已经试过了,还是不行……
  • 您可以尝试 API-Hooking en.wikipedia.org/wiki/Hooking#Hooking_Direct3D,来操作输入数据。

标签: c keyboard directx simulate sendinput


【解决方案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,如果加载了,则安装一个挂钩(google“directinput挂钩”)。如果没有,那么您可以检查 Dependency Walker、IDA 或 OllyDbg 中加载的每个模块,看看它们是否实现了自己的键盘处理程序,但此时事情变得相当复杂,需要大量的 ASM 知识和逆向工程技术。但是,如果您熟悉开发驱动程序,那么这可能会有所帮助:SendInput Not working for Games

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 2015-11-15
    • 2011-06-09
    • 2013-11-29
    相关资源
    最近更新 更多