SendInput не работает в Windows 8 (64-разрядная версия), но работает в Windows 7 (32-разрядная версия).

Я написал программу для отправки ввода в игры и настольные приложения вместо ввода с клавиатуры. Вот результат:

Windows 7 (32-разрядная): отлично работала в играх и настольных приложениях.

Windows 8 (64-разрядная): НЕ работал в играх, но работал в notepad.exe.

так почему это не работало с 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]));
    }

person Marks Mal    schedule 13.03.2013    source источник
comment
Какой код ошибки вы получаете при сбое? Также см. stackoverflow.com/q/6830651/56778, который выглядит похожим.   -  person Jim Mischel    schedule 13.03.2013
comment
нет ошибки, просто нажатие клавиши не выполняется, как ожидалось, в играх в Windows 8, хотя работало в тех же играх в Windows 7   -  person Marks Mal    schedule 13.03.2013
comment
Я не вижу ничего плохого. Взлом игр никогда не бывает проблемой. Может быть, теперь он использует необработанный ввод, может быть, фокус клавиатуры не там, где вы надеетесь. Невероятный.   -  person Hans Passant    schedule 13.03.2013


Ответы (1)


скорее всего размер указателя отличается на 32 бита его размер 4 на 64 бита его размер 8

person junkew    schedule 16.03.2013