gpt4 book ai didi

c - 重新映射 Direct3D 游戏上的按键

转载 作者:行者123 更新时间:2023-11-30 15:52:26 24 4
gpt4 key购买 nike

我正在尝试重新映射游戏(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;
}

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

最佳答案

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

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

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

关于c - 重新映射 Direct3D 游戏上的按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14444304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com