使用WinAPI检测系统语言并输入Unicode字符

时间:2019-02-26 09:11:34

标签: winforms winapi unicode

我正在尝试创建一个多语言的虚拟键盘。 我正在使用ToUnicodeEx将virtualKeyCode转换为相应的Unicode字符。 由于某种原因,它不适用于所有语言,即Amharic。 无论我做什么,它都返回英语Unicode而不是Amharic Unicode。 有人可以建议为什么这样做吗? 我该怎么办才能解决呢?

谢谢。

这是我代码中的摘录:

    [DllImport("user32.dll")] static extern IntPtr GetForegroundWindow();
    [DllImport("user32.dll")] static extern uint GetWindowThreadProcessId(IntPtr hwnd, IntPtr proccess);
    [DllImport("user32.dll")] static extern IntPtr GetKeyboardLayout(uint thread);
    public IntPtr GetCurrentKeyboardLayout()
    {
        try
        {
            IntPtr foregroundWindow = GetForegroundWindow();
            uint foregroundProcess = GetWindowThreadProcessId(foregroundWindow, IntPtr.Zero);
            IntPtr keyboardLayout = GetKeyboardLayout(foregroundProcess);

            if (keyboardLayout == IntPtr.Zero)
                throw new Exception();
            return keyboardLayout;
        }
        catch (Exception)
        {
            // if something goes wrong - just assume English
            return IntPtr.Zero;
        }
    }

    [DllImport("user32.dll")]
    static extern int ToUnicodeEx(uint virtualKeyCode, uint scanCode, byte[] keyboardState, [Out, MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)] StringBuilder receivingBuffer, int bufferSize, uint flags, IntPtr keyboardLayout);
    [DllImport("user32.dll")] static extern short VkKeyScanExW(char ch, IntPtr keyboardLayout);
    private void CheckKeyboardLayout(object sender)
    {
        IntPtr layout = GetCurrentKeyboardLayout();
        int changedLayout = layout == IntPtr.Zero ? 0 : layout.ToInt32() & 0xFFFF;

        if (_currentLayout != changedLayout && KeyboardLayoutChanged != null)
        {
            char[] chars = new char[_keys.Length];
            char[] charsShift = new char[_keys.Length];

            for (int i = 0; i < _keys.Length; i++)
            {
                foreach (int shiftValue in new[] { 0, 0xff })
                {
                    StringBuilder buf = new StringBuilder(256);
                    byte[] keyboardState = new byte[256];

                    switch (shiftValue)
                    {
                        case 0:
                            ToUnicodeEx((uint)_keys[i], 0, keyboardState, buf, 256, 0, layout);
                            try
                            {
                                chars[i] = buf[0];

                            }
                            catch (Exception)
                            {
                                chars[i] = _keys[i].ToString()[0];
                            }
                            break;

                        case 0xff:
                            keyboardState[(int)System.Windows.Forms.Keys.ShiftKey] = 0xff;
                            ToUnicodeEx((uint)_keys[i], 0, keyboardState, buf, 256, 0, layout);
                            try
                            {
                                charsShift[i] = buf[0];
                            }
                            catch (Exception)
                            {
                                charsShift[i] = _keys[i].ToString()[0];
                            }
                            break;
                    }

                }
            }

            KeyboardLayoutChanged(_currentLayout, changedLayout, chars, charsShift);
            _currentLayout = changedLayout;
        }

    }

0 个答案:

没有答案