【问题标题】:Chrome remote desktop Console.ReadKey yelds System.ConsoleKey.Packet instead of keystrokeChrome 远程桌面 Console.ReadKey 输出 System.ConsoleKey.Packet 而不是击键
【发布时间】:2021-04-02 19:23:30
【问题描述】:

说实话,这更像是一种好奇心。

在我正在开发的控制台项目中,我以这样的循环形式请求用户输入:

ConsoleKey response;

Console.Write("Write messages to log? [y/n] ");
response = Console.ReadKey(false).Key;

assume 4 cases: 
case 1: Pressing the 'y' key on a keyboard directly atached to the pc running the software.
case 2: Connecting from another computer trough remote desktop connection and pressing the 'y' key on that machine.
case 3: Using on screen keyboard and press the 'y' key trough clicking on it (remotely or locally had no difference)
case 4: Connecting from another machine (specifically a phone) trough chrome remote desktop and pressing the 'y' key.

在情况 1、2 和 3 中,“响应”将包含“Y”。 如果 4 'response' 将包含 System.ConsoleKey.Packet aka enum 231 PACKET 键(用于通过按键传递 Unicode 字符)。

我在第二台电脑上尝试过同样的事情,我注意到这种行为似乎没有发生。 最有趣的是控制台向我显示了这个

将消息写入日志? [y/n] 是的

据此,我证明确实收到了击键,但我的代码处理不正确。 我不知道如何继续。

Console.ReadLine 输出正确的击键,但如果可能,我更愿意使用 Console.ReadKey。

这是电话键盘的特定行为吗?如何获取实际密钥?

【问题讨论】:

    标签: c# chrome-remote-desktop


    【解决方案1】:

    如何获取实际密钥?

    ConsoleKey.PacketMSDN docs 没有说任何有用的信息,所以我 found references to ConsoleKey in the source 领导 here。那是ir.keyEvent.virtualKeyCode to a ConsoleKeyir is an InputRecord

    快速谷歌发现 WinApi 等价物是 INPUT_RECORD,并通过 KEY_EVENT_RECORD 追逐文档导致 this doc of Virtual-Key codes,其中包含更多 VK_PACKET 的文档:

    用于传递 Unicode 字符,就好像它们是击键一样。 VK_PACKET 键是用于非键盘输入法的 32 位虚拟键值的低位字。更多信息请参见KEYBDINPUTSendInputWM_KEYDOWNWM_KEYUP中的备注

    Remarks for KEYBDINPUT 说:

    INPUT_KEYBOARD 支持非键盘输入方法(例如手写识别或语音识别),就像使用 KEYEVENTF_UNICODE 标志进行文本输入一样。如果指定了 KEYEVENTF_UNICODE,SendInput 将 WM_KEYDOWN 或 WM_KEYUP 消息发送到前台线程的消息队列,其中 wParam 等于 VK_PACKET。一旦 GetMessage 或 PeekMessage 获得此消息,将消息传递给 TranslateMessage 就会发布一条 WM_CHAR 消息,该消息具有最初由 wScan 指定的 Unicode 字符。如果将此 Unicode 字符发布到 ANSI 窗口,它将自动转换为适当的 ANSI 值。

    根据我的搜索,.NET 似乎没有为您实现此机制,因此您可能必须自己做!

    恐怕我不知道为什么会发生这种情况……

    【讨论】:

    • 我必须说非常有趣的链接链。毕竟这似乎不是预期的行为,我将进一步检查以查看我是否没有做错任何事情,在这种情况下,我会将它以这种方式表现的原因添加到问题中。我认为您的回答已经解决了我的问题。
    猜你喜欢
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多