将字符转换为相应的虚拟键码

问题描述:

目前,我使用Win32 API中的方法VkKeyScan将字符转换为其虚拟键码。但是,这似乎有这样的问题是,当我通过小字母,它工作正常,而当我通过一个大写字母,它不会返回适当的密钥代码和类似的特殊字符,如“(”或“} ”将字符转换为相应的虚拟键码

我如何做到这一点?反正对我来说,直接将字符串转换为它的虚拟相当于不考虑其是否包含大写或特殊字符?

感谢

+0

,你不行,修改关键字是很重要的,尤其是移位。而键盘布局,“}”需要德国键盘上的死钥匙(我认为)。 – 2010-05-29 12:19:56

你应该在更清晰你的要求是什么,更具体地说,你认为是一个合适的密钥代码。documentation中指定的VkKeyScan返回虚函数低位字节中的l键代码和返回值高位字节中的移位状态。

这在下面的代码段中演示,它使用'('字符作为VkKeyScan方法的输入。

[DllImport("user32.dll")]static extern short VkKeyScan(char ch); 

static void Main(string[] args) 
{ 
    var helper = new Helper { Value = VkKeyScan('(') }; 

    byte virtualKeyCode = helper.Low; 
    byte shiftState = helper.High; 

    Console.WriteLine("{0}|{1}", virtualKeyCode, (Keys)virtualKeyCode); 
    Console.WriteLine("SHIFT pressed: {0}", (shiftState & 1) != 0); 
    Console.WriteLine("CTRL pressed: {0}", (shiftState & 2) != 0); 
    Console.WriteLine("ALT pressed: {0}", (shiftState & 4) != 0); 
    Console.WriteLine(); 

    Keys key = (Keys)virtualKeyCode; 

    key |= (shiftState & 1) != 0 ? Keys.Shift : Keys.None; 
    key |= (shiftState & 2) != 0 ? Keys.Control : Keys.None; 
    key |= (shiftState & 4) != 0 ? Keys.Alt : Keys.None; 

    Console.WriteLine(key); 
    Console.WriteLine(new KeysConverter().ConvertToString(key)); 
} 

[StructLayout(LayoutKind.Explicit)] 
struct Helper 
{ 
    [FieldOffset(0)]public short Value; 
    [FieldOffset(0)]public byte Low; 
    [FieldOffset(1)]public byte High; 
} 

运行这段代码将导致下面的输出:

// 56|D8 
// SHIFT pressed: True 
// CTRL pressed: False 
// ALT pressed: False 
// 
// D8, Shift 
// Shift+8 
+0

谢谢一个男人!这工作很好,解决了我的问题! – kambamsu 2010-05-30 03:37:41