- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要一些有关 DirectInput 的帮助,我会告诉您我正在尝试做什么。当我只按一个键时,我想做我的程序将组合键发送到游戏。例如:我将按“r”,它会按“1”、“3”、“2”、“4”键。我从这里找到了一些代码。但它们并没有完全起作用。
public static void Send_Key_Hold(short Keycode)
{
INPUT[] InputData = new INPUT[1];
InputData[0].type = 1;
InputData[0].ki.wScan = Keycode;
InputData[0].ki.dwFlags = (int)(KEYEVENTF_SCANCODE);
SendInput(1, InputData, Marshal.SizeOf(InputData[0]));
}
public static void Send_Key_Release(short Keycode)
{
INPUT[] InputData = new INPUT[1];
InputData[0].type = 1;
InputData[0].ki.wScan = Keycode;
InputData[0].ki.dwFlags = (int)(KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE);
SendInput(1, InputData, Marshal.SizeOf(InputData[0]));
}
这是我的代码和我的问题:当我仅使用 Send_Key_Hold 时,它会按下游戏中的一个键,而其他组合键未按下,因为我认为第一个键被按住。当我同时使用 Send_Key_Hold 和 Send_Key_Release 时,它不会按下游戏中的任何按钮。但是在桌面上(我指的是任何其他应用程序而不是游戏)它按下了键。
最佳答案
我在网上找到了这个例子。当我尝试做与您现在正在尝试的相同的事情时,我自己对其进行了测试。
[Flags]
private enum InputType
{
Mouse = 0,
Keyboard = 1,
Hardware = 2
}
[Flags]
private enum KeyEventF
{
KeyDown = 0x0000,
ExtendedKey = 0x0001,
KeyUp = 0x0002,
Unicode = 0x0004,
Scancode = 0x0008,
}
[DllImport("user32.dll", SetLastError = true)]
private static extern uint SendInput(uint nInputs, Input[] pInputs, int cbSize);
[DllImport("user32.dll")]
private static extern IntPtr GetMessageExtraInfo();
public static void SendKey(ushort key)
{
Input[] inputs =
{
new Input
{
type = (int) InputType.Keyboard,
u = new InputUnion
{
ki = new KeyboardInput
{
wVk = 0,
wScan = key,
dwFlags = (uint) (KeyEventF.KeyDown | KeyEventF.Scancode),
dwExtraInfo = GetMessageExtraInfo()
}
}
}
};
SendInput((uint) inputs.Length, inputs, Marshal.SizeOf(typeof (Input)));
}
private struct Input
{
public int type;
public InputUnion u;
}
[StructLayout(LayoutKind.Explicit)]
private struct InputUnion
{
[FieldOffset(0)] public readonly MouseInput mi;
[FieldOffset(0)] public KeyboardInput ki;
[FieldOffset(0)] public readonly HardwareInput hi;
}
[StructLayout(LayoutKind.Sequential)]
private struct MouseInput
{
public readonly int dx;
public readonly int dy;
public readonly uint mouseData;
public readonly uint dwFlags;
public readonly uint time;
public readonly IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
private struct KeyboardInput
{
public ushort wVk;
public ushort wScan;
public uint dwFlags;
public readonly uint time;
public IntPtr dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
private struct HardwareInput
{
public readonly uint uMsg;
public readonly ushort wParamL;
public readonly ushort wParamH;
}
现在使用 SendKey(0x14)
将您的 T
键发送到事件窗口(或游戏)。
注意:您需要将 KeyEventF.Scancode
作为标志,否则 wScan
属性将被忽略!
关于C# DirectInput SendInput 不影响游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17295374/
我正在使用SendInput()进行鼠标移动,它想要INPUT结构。我正在使用相对运动,并且在有关此结构的docs中,在“备注”中说: Relative mouse motion is subject
我正在通过将字符串发送到备忘录来尝试 SendInput。我将 SendInput 命令与对 Memo.Lines.Add('....') 的调用混合在一起。令我惊讶的是,所有 Memo.Lines.
我正在使用以下标准 GenerateKey 代码: void GenerateKey ( int vk , BOOL bExtended) { KEYBDINPUT kb={0}; INPU
这个问题在这里已经有了答案: SendInput sends "num8" when I want to send "vk_up" ? How come? (3 个答案) 关闭 6 年前。 我需要模
我想通过模仿键盘将 4 位数字的所有可能组合注入(inject)到不同的程序(例如记事本)中,但我终生无法弄清楚如何使用 SendInput() 函数,或者如果有更好的选择。 string code;
这个问题在这里已经有了答案: How to detect if keystroke was emulated by keybd_event or SendInput? (2 个答案) 关闭 11 个
=) 我在 Windows7 笔记本电脑上使用 C++(不是 VC++)。 我对这种从当前位置移动鼠标 x/y 的方法有疑问。每次它为鼠标事件调用发送输入时,它都会移动鼠标,但也会关闭我的屏幕(相当于
我想用下面的代码以编程方式将鼠标运动合成到屏幕上的一个点 (100,100),但它移动到左上角。有什么问题吗? #include "stdafx.h" #include int main() {
我正在尝试使用 SendInput() 函数。我写了这段代码: #include #include #include #include #define WIN32_LEAN_AND_MEAN
我试图弄清楚 SendInput 函数的正确用法,以便我可以直接操纵屏幕上的光标,因此为了进行基本测试以了解其工作原理,我制作了这个应该将光标移动 10 的短片段右边的像素。理论上。 #include
在 Windows 中使用非英语输入键盘语言时,我无法模拟字符按键。 我尝试使用 KEYEVENTF_UNICODE 调用 SendInput(): KEYBDINPUT ki; INPUT inpu
我一直在尝试将一系列输入模拟到流程中。我唯一没有成功实现的是鼠标移动。我在网上找到了最接近的赌注: bool mouse_move(int x, int y) { INPUT input;
我想将从 android 客户端接收到的鼠标和键盘输入发送到在 Windows 上运行的游戏。SendInput 适用于我迄今为止开发的几乎所有游戏。但是要使 SendInput 正常工作,游戏必须是
是否可以在当前没有焦点的窗口上使用 sendInput 函数,并且可能通过使用多线程,同时将输入发送到多个最小化窗口,或者在您工作时将输入发送到一个窗口另一个窗口? 我想在 C# 中做这样的事情 提前
我有以下代码: INPUT Input = { 0 }; Input.type = INPUT_KEYBOARD; Input.mi.dwFlags = KEYEVENTF_EXTENDE
MSDN 指出 keybd_event 已被 SendInput 取代。在重写期间,我切换到使用 SendInput...这很好除了当尝试发送 Alt 键组合时。在 Win7 64 位系统上(尚未在其
我在执行物理鼠标单击时尝试使用SendInput移动鼠标(在Windows 10上)。如果我单击一次或两次,则效果很好,但是如果快速连续单击示例6次,则鼠标滞后几秒钟,则程序将停止响应。 是否有任何明
我希望有人可以提供帮助,我试图找到一个模拟键盘命令的 SendInput 代码示例,我希望找到记事本窗口并输入测试消息。 我最初在我正在处理的项目中使用了 SendKeys,SendKeys 功能使我
我正在尝试创建一个虚拟键盘,它使用 SendInput 方法模拟键盘,如下所示: public static void SendKeyDown(System.Windows.Forms
为了模拟一些按键,我必须向那里发送扫描代码,为此我使用 SendInput() WinAPI 中的函数,在大多数情况下都可以正常工作,但是如何使用它来发送“暂停”等键的扫描码呢?该 key 生成 6
我是一名优秀的程序员,十分优秀!