3

我将尝试更好地解释我的意思,并且我还将尝试使问题不受语言影响,尽管如果有一种方法可以在 C# 中执行我想要的操作而无需引用任何内容,那就太好了。反正。

我正在处理键盘输入,并将其转换为字符串。一切都好。我得到了 Shift 和 CapsLock 键的状态并 EXOR 它,所以我可以找出结果字符串的大小写。

bool shift = KeyDown(SHIFT_KEY)
bool capslock = KeyToggled(CAPSLOCK)
bool stringCasing = shift ^ capslock //if both are true/false, the string will be lowercase. Otherwise uppercase.

foreach Key k in [list of keys passed as parameter]
     char c = (char)k
     if stringCasing
          c = Char.ToUpper(c)
     else
          c = Char.ToLower(c)
end foreach

而且暂时没有问题。如果用户在按住 shift 或切换大写锁定时键入“a”,则它变为“A”。

但是,如果用户决定键入“!”,即“1”加上 shift,我只会得到 1,因为“1”大写仍然是“1”。

在问这个问题之前,我在网上看了一些,但我得到的只是“自己映射键”。这真的是唯一的答案吗?此外,如果我映射了按键,然后具有不同键盘布局的用户尝试使用我的应用程序,会发生什么情况?提前致谢。

4

1 回答 1

8

这可以通过 Win32ToAscii函数(MSDN 参考)来完成。我不知道任何包装这些函数的 .NET 框架方法,因此可能需要使用 P/Invoke。

此外ToAscii,您可能需要一个参考来VkKeyScan将键转换为虚拟键代码。此密钥代码用作 的参数ToAscii。这些方法的简单 P/Invoke 声明如下:

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

    [DllImport("user32.dll", SetLastError=true)]
    static extern int ToAscii(
        uint uVirtKey,
        uint uScanCode,
        byte[] lpKeyState,
        out uint lpChar,
        uint flags
        );

注意第三个参数 toToAscii是一个 256 元素的数组,它引用了每个键的状态;值 0x80(设置高位)表示已设置密钥。设置元素 0x10(Shift 的虚拟键代码)模拟Shift被按下。

然后我们可以定义一个辅助方法,它接受一个代表键的字符作为参数,并在按下时输出该键Shift

public static char GetModifiedKey(char c)
{
    short vkKeyScanResult = VkKeyScan(c);

    // a result of -1 indicates no key translates to input character
    if (vkKeyScanResult == -1)
        throw new ArgumentException("No key mapping for " + c);

    // vkKeyScanResult & 0xff is the base key, without any modifiers
    uint code = (uint)vkKeyScanResult & 0xff;

    // set shift key pressed
    byte[] b = new byte[256];
    b[0x10] = 0x80;

    uint r;
    // return value of 1 expected (1 character copied to r)
    if (1 != ToAscii(code, code, b, out r, 0))
        throw new ApplicationException("Could not translate modified state");

    return (char)r;
}

调用此方法将返回与输入字符的 +base 键关联Shift的字符(其中基本键是按下以输入字符的物理键,例如,1是 的基本键!)。例如,对于美式键盘,GetModifiedKey('7')两者GetModifiedKey('&')都将返回“&”。返回值将使用加载的键盘布局;例如,在德语键盘上(其中Shift+7/),该方法将/改为返回。

于 2013-06-30T05:57:42.180 回答