Использование WinAPI для определения языка системы и ввода символов Unicode - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь создать многоязычную виртуальную клавиатуру.Я использую ToUnicodeEx для преобразования virtualKeyCode в соответствующий символ Unicode.По некоторым причинам это не работает для всех языков, т.е. амхарский.Независимо от того, что я делаю, он возвращает английский 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;
        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...