Windows для CefSharp - Как правильно использовать KeyEventArgs? - PullRequest
0 голосов
/ 12 февраля 2019

Я нажимаю на поле ввода, чтобы войти в мою учетную запись.Проблема в том, что сейчас я получаю все буквы в верхнем регистре.На скриншоте вы можете видеть поле ввода, где я набрал "aaaa", но я получил "AAAA".enter image description here

1. Здесь чел. Говорят, что KeyEvent не может обрабатывать строчные буквы, но я не знаю, какая у меня альтернатива.Странно то, что при наборе текста на клавиатуре появляются строчные буквы.Например, нажатие «7» на клавиатуре даст мне «г».И использование строки или символа не рекомендуется, потому что в конце мне нужно целое число / ключ.

2. Это мои строки:

        private void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (!(Tag is TcpDeviceClient client)) return;
        if (e.Key == Key.Back) e.Handled = true;
        client?.SetKey(KeyInterop.VirtualKeyFromKey(e.Key), Keyboard.Modifiers.ToChromiumMods());

Я вставил Console.WriteLine, который вы можете увидеть на скриншоте (здесь его не хватает, потому что я хотел сэкономить место).Каждый раз, когда я печатаю, я получаю три разных формата ключа, и они не соответствуют моему вводу.Обратите внимание: в консоли отображаются разные буквы.Буквы, показанные в поле ввода, являются правыми (но в верхнем регистре).

Моя проблема Как получить правую нажатую клавишу в нижнем регистре?

1 Ответ

0 голосов
/ 14 февраля 2019

Я выкладываю ответ для приезжающих с той же проблемой.Я должен отметить, что это не идеальный ответ / решение:

Так что я все еще использую KeyEventArgs, беру ключ и отправляю его в функцию KeyCodeToUnicode ().Но перед этим вам нужно конвертировать WPF-ключ в виртуальный ключ Win32.

    private void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (!(Tag is TcpDeviceClient client)) return;

        Char str = KeyCodeToUnicode((Key)KeyInterop.VirtualKeyFromKey(e.Key));
        Console.WriteLine("(int)e.Key: " + (int)e.Key + "\n VirtualKeyFromKey(e.Key): " + KeyInterop.VirtualKeyFromKey(e.Key) + "\n (Key)VirtualKeyFromKey(e.Key): " + (Key)KeyInterop.VirtualKeyFromKey(e.Key) + "\n KeyCodeToUnicode(e.Key)->str: " + str);
        Console.ReadLine();

        client?.SetKey(str, Keyboard.Modifiers.ToChromiumMods());
    }

И здесь я получаю обратно символ.

    public Char KeyCodeToUnicode(Key key)
    {
        byte[] keyboardState = new byte[255];
        bool keyboardStateStatus = GetKeyboardState(keyboardState);

        if (!keyboardStateStatus)
        {
            return '\0';
        }

        uint virtualKeyCode = (uint)key;
        uint scanCode = (uint)MapVirtualKey(virtualKeyCode, 0);
        IntPtr inputLocaleIdentifier = GetKeyboardLayout(0);

        StringBuilder result = new StringBuilder();
        ToUnicodeEx(virtualKeyCode, scanCode, keyboardState, result, (int)5, (uint)0, inputLocaleIdentifier);

        if(result.ToString().Length < 1)
            return '\0';
        else
            return Convert.ToChar(result.ToString());
    }

И в моем InputKeyCode () ключ снова неявно приводится к int.

    public void InputKeyCode(Char keycode, int modifier)
    {
        var host = Browser.GetBrowser().GetHost();

        KeyEvent kv = new KeyEvent();
        kv.WindowsKeyCode = keycode;
        //....
...