У меня есть виртуальная клавиатура как часть большого приложения, которое я разрабатываю. Синтезированные нажатия клавиш достигаются с помощью 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 не работает. Любая помощь будет принята с благодарностью.