Используя SendInput на Win7 x64, SHIFT не работает - PullRequest
0 голосов
/ 22 ноября 2011

У меня есть виртуальная клавиатура как часть большого приложения, которое я разрабатываю. Синтезированные нажатия клавиш достигаются с помощью SendInput. Изначально клавиатура была разработана для win 7 x86, и все работало нормально и работает до сих пор. Однако у меня проблема с x64.

Сначала команда Caps Lock застревает. Это может быть включено, но никогда не отключено. В этот момент я определял структуру INPUT без MOUSEINPUT и HARDWAREINPUT.

    [StructLayoutAttribute(LayoutKind.Explicit)]
    public struct KEYBDINPUT
    {
        [FieldOffset(0)]
        public ushort wVk;
        [FieldOffset(4)]
        public ushort wScan;
        [FieldOffset(8)]
        public uint dwFlags;
        [FieldOffset(16)]
        public long time;
        [FieldOffset(20)]
        public IntPtr dwExtraInfo;
    };

    [StructLayout(LayoutKind.Explicit, Size = 28)]
    public struct INPUT
    {
        [FieldOffset(0)]
        public uint type;
#if WIN64
        [FieldOffset(8)]
#else 
        [FieldOffset(4)]
#endif
        public KEYBDINPUT ki;
    };

В попытке заставить функционировать Caps Lock я переключился на определение INPUT как:

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

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

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

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

    [FieldOffset(0)]
    public KEYBDINPUT ki;

    [FieldOffset(0)]
    public HARDWAREINPUT hi;
}

[StructLayout(LayoutKind.Sequential)]
public struct INPUT {
    public uint type;
    public MouseKeybdHardwareInputUnion mkhi;
}

Однако теперь команда SHIFT не работает. Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 24 ноября 2011

Разобрался. В какой-то момент для вызова KeyDown я изменил параметр размера SendInput на:

intReturn = SendInput(1, ref structInput, 28); 

когда это должно быть:

intReturn = SendInput(1, ref structInput, Marshal.SizeOf(structInput));

Это не действует ни на одну клавишу, кроме SHIFT.

...