SendInput在Windows 8(64位)中不起作用,但在Windows 7(32位)中起作用 [英] SendInput does not work in Windows 8(64 bit) but work in Windows 7(32bit)

查看:151
本文介绍了SendInput在Windows 8(64位)中不起作用,但在Windows 7(32位)中起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写了程序将sendInput发送到游戏和桌面应用程序,而不是从键盘上获取输入.结果是:

I wrote program to sendInput to games and desktop applications instead of taking input from keyboard.This is the result:

Windows 7(32位):在游戏和桌面应用程序中完美运行.

Windows 7 (32 bit) : worked perfect in games and desktop applications.

Windows 8(64位):DID在游戏中不起作用,但在notepad.exe中起作用.

Windows 8 (64 bit) : DID NOT work in games but worked in notepad.exe.

那么为什么它在Win 8中不起作用?

so Why it did not work with win 8 ?

这是代码:

      [StructLayout(LayoutKind.Sequential)]
    struct MOUSEINPUT
    {
        public int dx;
        public int dy;
        public uint mouseData;
        public uint dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }

    [StructLayout(LayoutKind.Sequential)]
    struct KEYBDINPUT
    {
        public ushort wVk;
        public ushort wScan;
        public uint dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }

    [StructLayout(LayoutKind.Sequential)]
    struct HARDWAREINPUT
    {
        public int uMsg;
        public short wParamL;
        public short wParamH;
    }

    [StructLayout(LayoutKind.Explicit)]
    struct MouseKeybdHardwareInputUnion
    {
        [FieldOffset(0)]
        public MOUSEINPUT mi;

        [FieldOffset(0)]
        public KEYBDINPUT ki;

        [FieldOffset(0)]
        public HARDWAREINPUT hi;
    }

    [StructLayout(LayoutKind.Sequential)]
    struct INPUT
    {
        public uint type;
        public MouseKeybdHardwareInputUnion mkhi;
    }
    enum SendInputFlags
    {
        KEYEVENTF_EXTENDEDKEY = 0x0001,
        KEYEVENTF_KEYUP = 0x0002,
        KEYEVENTF_UNICODE = 0x0004,
        KEYEVENTF_SCANCODE = 0x0008,
    }

    [DllImport("user32.dll")]
    static extern UInt32 SendInput(UInt32 nInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs, Int32 cbSize);
    public static void StrokeKey(ushort codeOfKey)
    {
        INPUT[] InputData = new INPUT[1];
        ushort ScanCode = codeOfKey;
        InputData[0].type = 1;
        InputData[0].mkhi.ki.wScan = (ushort)ScanCode;
        InputData[0].mkhi.ki.dwFlags = (uint)SendInputFlags.KEYEVENTF_SCANCODE;

        if (SendInput(1, InputData, Marshal.SizeOf(InputData[0])) == 0)
        {
            String blad = "SendInput failed with code: " + Marshal.GetLastWin32Error().ToString();
            System.Diagnostics.Debug.WriteLine(blad);
        }
    }


    public static void ReleaseKey(ushort codeOfKey)
    {
        INPUT[] InputData = new INPUT[1];
        ushort ScanCode = codeOfKey;
        InputData[0].type = 1;
        InputData[0].mkhi.ki.wScan = (ushort)ScanCode;
        InputData[0].mkhi.ki.dwFlags = (uint)SendInputFlags.KEYEVENTF_KEYUP | (uint)SendInputFlags.KEYEVENTF_SCANCODE;
        InputData[0].mkhi.ki.time = 0;
        InputData[0].mkhi.ki.dwExtraInfo = IntPtr.Zero;
        SendInput(1, InputData, Marshal.SizeOf(InputData[0]));
    }

推荐答案

最有可能的指针大小在大小为4的32位上在大小为8的64位上不同

most likely pointersize is different on 32 bits its size 4 on 64 bits its size 8

这篇关于SendInput在Windows 8(64位)中不起作用,但在Windows 7(32位)中起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆