如何解决Chrome 远程桌面 Console.ReadKey ylds System.ConsoleKey.Packet 而不是击键
说实话,这更像是一种好奇心。
在我正在开发的控制台项目中,我以循环形式请求用户输入:
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 字符)。
我通过第二台电脑尝试了同样的事情,但我注意到这种行为似乎没有发生。 最有趣的是控制台向我展示了这个
将消息写入日志? [是/否] 是
由此我证明确实收到了击键,但我的代码处理不当。 我不知道如何进行。
Console.ReadLine 给出正确的击键,但如果可能,我更愿意使用 Console.ReadKey。
这是手机键盘的特定行为吗?我将如何获得实际密钥?
解决方法
我如何获得实际的密钥?
ConsoleKey.Packet
的 MSDN docs 没有说明任何有用的信息,所以我 found references to ConsoleKey
in the source 导致 here。这是铸造 ir.keyEvent.virtualKeyCode
to a ConsoleKey
where ir
is an InputRecord
。
一个快速的谷歌发现 WinApi 等价物是 INPUT_RECORD
,通过 KEY_EVENT_RECORD
追踪文档会导致 this doc of Virtual-Key codes,其中包含更多关于 VK_PACKET
的文档:
用于传递 Unicode 字符,就好像它们是击键一样。 VK_PACKET 密钥是用于非键盘输入法的 32 位虚拟密钥值的低位字。有关详细信息,请参阅 KEYBDINPUT、SendInput、WM_KEYDOWN 和 WM_KEYUP
中的备注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 似乎没有为您实现此机制,因此您可能必须自己动手!
恐怕我不知道为什么会在您的情况下发生...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。