相关疑难解决方法(0)

通过user32.dll中的SendInput发送密钥

我使用这块板作为键盘用于演示目的.

无论如何,长话短说一切都很好,除了很少的情况.我使用user32.dll中的SendInput函数发送击键.

所以我的程序看起来像:

static void Main(string[] args)
{
    Console.Write("Press enter an on the next secont the key combination shift+end will be send");
    Console.Read();

    Thread.Sleep(1000);

    SendKeyDown(KeyCode.SHIFT);
    SendKeyPress(KeyCode.END);
    SendKeyUp(KeyCode.SHIFT);

    Console.Read(); 
    Console.Read();
}

[DllImport("user32.dll", SetLastError = true)]
private static extern uint SendInput(uint numberOfInputs, INPUT[] inputs, int sizeOfInputStructure);

/// <summary>
/// simulate key press
/// </summary>
/// <param name="keyCode"></param>
public static void SendKeyPress(KeyCode keyCode)
{
    INPUT input = new INPUT {
        Type = 1
    };
    input.Data.Keyboard = new KEYBDINPUT() { …
Run Code Online (Sandbox Code Playgroud)

c# user32 sendkeys sendinput

26
推荐指数
1
解决办法
6万
查看次数

在DirectInput应用程序中使用SendInput API模拟键盘

我正在尝试为自定义游戏控制器应用程序模拟键盘命令.因为我需要在DirectInput环境中模拟命令,所以大多数常用方法都不起作用.我知道使用一个钩子可以100%工作,但我试图找到一个更容易的实现.

我已经做了很多搜索,发现通过使用带有扫描码的SendInput API而不是虚拟键应该可以工作,但它似乎表现得像键是"坚持".我已经发送了KEYDOWN和KEYUP事件,但是当我尝试在DirectInput环境中发送消息时,游戏就像按下键一样.

例如,如果我模拟"W"按键并将该键映射到第一人称射击游戏中以"向前移动"动作,那么一旦我在游戏中,下面的功能将导致角色向前移动.但是,只需发出一次命令,它就会无限地向前移动角色.

这是我正在调用的SendInput函数的代码片段(在C#中):

[DllImport("user32.dll")]
static extern UInt32 SendInput(UInt32 nInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs, Int32 cbSize);

public static void Test_KeyDown()
{
    INPUT[] InputData = new INPUT[2];
    Key ScanCode = Microsoft.DirectX.DirectInput.Key.W;

    InputData[0].type = 1; //INPUT_KEYBOARD
    InputData[0].wScan = (ushort)ScanCode;
    InputData[0].dwFlags = (uint)SendInputFlags.KEYEVENTF_SCANCODE;

    InputData[1].type = 1; //INPUT_KEYBOARD
    InputData[1].wScan = (ushort)ScanCode;
    InputData[1].dwFlags = (uint)(SendInputFlags.KEYEVENTF_KEYUP | SendInputFlags.KEYEVENTF_UNICODE);

    // send keydown
    if (SendInput(2, InputData, Marshal.SizeOf(InputData[1])) == 0)
    {
        System.Diagnostics.Debug.WriteLine("SendInput failed with code: " +
        Marshal.GetLastWin32Error().ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)

我不确定这种方法是否是一个失败的原因,或者是否有一些愚蠢的东西我不知道.如果我不需要使用钩子,我讨厌使代码复杂化,但这对我来说也是一个新的领域.

任何人都可以给予任何帮助非常感谢.

谢谢!

c# directinput sendinput

16
推荐指数
1
解决办法
4万
查看次数

SendInput和64位

下面是我用来通过SendInput API模拟按键的一些代码的摘录.如果我将我的应用程序设置为针对x86 CPU进行编译,则此方法可正常工作,但不适用于x64 CPU编译.

我猜它有一些事情,x64使用双倍大小的指针,但我试图改变这个[FieldOffset(4)],[FieldOffset(8)]但它没有用.

它是否与导入32位版本的user32.dll的事实有关?

    #region SendInput API

    [DllImport("user32.dll", EntryPoint = "SendInput", SetLastError = true)]
    static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);

    [DllImport("user32.dll", EntryPoint = "GetMessageExtraInfo", SetLastError = true)]
    static extern IntPtr GetMessageExtraInfo();

    private enum KeyEvent
    {
        KeyUp = 0x0002,
        KeyDown = 0x0000,
        ExtendedKey = 0x0001
    }

    private struct KEYBDINPUT
    {
        public ushort wVk;
        public ushort wScan;
        public uint dwFlags;
        public long time;
        public uint dwExtraInfo;
    };

    [StructLayout(LayoutKind.Explicit, Size = 28)]
    private struct …
Run Code Online (Sandbox Code Playgroud)

.net 64-bit pinvoke sendinput

10
推荐指数
2
解决办法
3712
查看次数

在C#中模拟键盘输入

我需要知道如何来模拟按键键盘输入W,S,A,D.

我用过SendKeys没有用的InputSimulator图书馆没有修复.

我正在尝试做的是让游戏(战场,自然选择等新的FPS游戏)等应用程序将这些模拟键注册为真正的击键.我正在尝试创建一个虚拟控制器程序,其中外部控件将注册为这些游戏的键盘输入.

有没有办法手动模拟键盘输入,就像有这样的东西?

[DllImport("user32.dll", 
           CharSet = CharSet.Auto, 
           CallingConvention = CallingConvention.StdCall)]
public static extern void mouse_event(uint dwFlags, 
                                      uint dx, 
                                      uint dy, 
                                      int cButtons, 
                                      uint dwExtraInfo);
Run Code Online (Sandbox Code Playgroud)

c# simulation keyboard input

10
推荐指数
3
解决办法
3万
查看次数

标签 统计

c# ×3

sendinput ×3

.net ×1

64-bit ×1

directinput ×1

input ×1

keyboard ×1

pinvoke ×1

sendkeys ×1

simulation ×1

user32 ×1