检测到当前语言布局的按下键c#

时间:2017-05-27 16:18:49

标签: c# unicode keyboard

我正在尝试从键盘获取用户类型的文本。当我有英文键盘布局时,一切似乎工作正常,当我将它改为俄语时它不起作用。我用过

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
        { 
            int vkCode = Marshal.ReadInt32(lParam);
            if ((Keys)vkCode == Keys.Enter || (Keys)vkCode == Keys.Tab || (Keys)vkCode == Keys.LButton || (Keys)vkCode == Keys.RButton)
                WriteNewLine(_text);
            else
            if (ShiftKey)
                _text += GetCharsFromKeys((Keys)vkCode, true, false);
            else
                _text += GetCharsFromKeys((Keys)vkCode, false, false);
        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }

此函数获取密钥代码。如你所见,我调用下一个函数

static string GetCharsFromKeys(Keys keys, bool shift, bool altGr)
    {
        var buf = new StringBuilder(256);
        var keyboardState = new byte[256];
        if (shift)
            keyboardState[(int)Keys.ShiftKey] = 0xff;
        if (altGr)
        {
            keyboardState[(int)Keys.ControlKey] = 0xff;
            keyboardState[(int)Keys.Menu] = 0xff;
        }
        ToUnicode((uint)keys, 0, keyboardState, buf, 256, 0);
        return buf.ToString();
    }

它返回实际键的用户类型。但它仅适用于ENG键盘布局。 如果您知道如何添加国际键盘布局处理,请告诉我。 附:当我进入:

  

Руский

我明白了:

  

Hecrbq

My keyboard

1 个答案:

答案 0 :(得分:0)

您需要使用InstalledInputLanguagesCurrentInputLanguage。您可以遵循一个示例here。我会在这里复制代码以防链接死亡。此代码希望识别欧洲键盘中的@符号条目,因此您需要对其进行调整以满足您的需求。

DllImport("user32.dll")]      
public static  extern short VkKeyScanEx(char ch, IntPtr dwhkl);   

public static  void GetKeyboardShortcutForChar(char c, InputLanguage lang, out Keys key, out  bool shift)      
{      
    var keyCode = VkKeyScanEx(c, lang.Handle);      
    key = (Keys) (keyCode & 0xFF);      
    shift = (keyCode & 0x100) == 0x100;      
}  

[DllImport("user32.dll",  CharSet = CharSet.Unicode)]      
public static  extern int ToUnicodeEx(int wVirtKey, uint wScanCode, byte[] lpKeyState,  StringBuilder pwszBuff, int cchBuff, uint wFlags, IntPtr dwhkl);      

public static  char? FromKeys(int keys, bool shift, bool capsLock)      
{      
    var keyStates = new byte[256];      
    if (shift)      
        keyStates[16] = 0x80;      
    if (capsLock)      
        keyStates[20] = 0x80;      

    var sb = new StringBuilder(10);      
    int ret = User32.ToUnicodeEx(keys, 0,  keyStates, sb, sb.Capacity, 0, InputLanguage.CurrentInputLanguage.Handle);      

    return ret == 1 ? (char?)sb[0] : null;      
}