2011-11-22 121 views
0

我有一个虚拟键盘作为我正在开发的一个更大的应用程序的一部分。合成的击键是使用SendInput实现的。原本键盘是为win 7 x86开发的,一切运行良好,仍然如此。但是,我有问题与64位。在Win7 x64上使用SendInput,SHIFT不起作用

首先,Caps Lock命令会卡住。它可以启用,但从不禁用。在这一点上,我定义了INPUT结构,没有MOUSEINPUTHARDWAREINPUT

[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; 
    }; 

在试图获取大写锁定功能工作,我切换到定义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

想通了。在某些时候,对在KeyDown电话,我已经改变了SendInput的“大小”参数:

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

当它应该是:

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

这并没有影响任何按键,除了SHIFT 。

相关问题