【问题标题】:Windows to CefSharp - How to use KeyEventArgs the right way?Windows 到 CefSharp - 如何正确使用 KeyEventArgs?
【发布时间】:2019-07-06 06:04:31
【问题描述】:

我正在单击输入字段以登录我的帐户。问题是现在我得到的所有字母都是大写的。在屏幕截图中,您可以看到输入字段是我输入“aaaa”,但我得到“AAAA”。

1.Here ppl 说 KeyEvent 不能处理小写,但我不知道我有什么选择。奇怪的是,在键盘上打字会产生小写字母。例如。按键盘上的“7”会给我一个“g”。并且不推荐使用字符串或字符,因为最后我需要一个整数/键。

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(这里缺少它的原因是我想节省空间)。每次我打字时,我都会得到三种不同格式的密钥,这些与我的输入不匹配。请注意:在控制台中显示不同的字母。输入字段中显示的字母是正确的(但大写)。

我的问题 如何获得小写的正确按下的键?

【问题讨论】:

  • 在您发布的链接中,一些解决方案涉及处理TextInputPreviewTextInput,您尝试过吗?
  • 我尝试了 TextInput 中途,但这意味着我必须使用 String 并在最后转换回 Key。我猜演员阵容会失败。现在我使用 e.Key,假设值是 85,代表 B。如果我愿意 TextInput,我会得到一个字符串“B”代表 B,我不能将它转换为 Key,所以它会变为 85,对吗?
  • 我想这取决于你想对输入的字符做什么。您需要整个文本,还是只需要按下的每个字符?你必须有Key 类型还是char
  • 我想留在Key,现在它只是我传递的每个字符。我猜 keylayout/System.Windows.Input 是否有问题?
  • 如果你得到“B”(a string),你可以得到字符“B”(a char):myString[0]。要获取 ASCII 值,您只需将字符转换为 int(int)myString[0]

标签: wpf keyboard chromium cefsharp chromium-embedded


【解决方案1】:

我为遇到同样问题的访客发布答案。我不得不提一下,这不是完美的答案/解决方案:

所以我仍在使用 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;
        //....

【讨论】:

  • 这将非常慢,请参阅github.com/cefsharp/CefSharp/blob/master/CefSharp.Wpf/Internals/… 了解 WPF 版本是如何做到的。
  • 嘿,你有这方面的更新吗?我试图做与您解释的基本相同的事情,但我似乎无法正确分配 WindowsKeyCode 和 NativeKeyCode,行为似乎是正确的,这意味着我可以看到我在谷歌搜索框示例中键入的字符,但如果我使用调试器检查键盘 DOM 我得到了有趣的结果dvcs.w3.org/hg/d4e/raw-file/tip/key-event-test.html
  • 我可以在星期二检查,因为那是很久以前的事了,但我认为它一直像这里所说的那样。
猜你喜欢
  • 2014-09-19
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 2023-01-01
相关资源
最近更新 更多