【问题标题】:Get Physical Keyboard Layout Programmatically以编程方式获取物理键盘布局
【发布时间】:2011-01-18 00:50:00
【问题描述】:

有没有办法以编程方式找出计算机的键盘类型(即键的位置,以及在哪些位置存在哪些额外的键)?

如果键盘很不标准,稍微有点误差是可以接受的,但总的来说,重点是构建一个类似屏幕键盘的应用程序,可以在屏幕上动态绘制键盘布局,准确度很高。

【问题讨论】:

  • 您使用什么语言?
  • 无论 Windows 使用什么 :) ... 解决方案是否因语言而异?

标签: winapi keyboard-layout


【解决方案1】:

当连接到计算机时,键盘会向操作系统发送“扫描码”。在 Windows 上,扫描代码然后被转换为虚拟键(键盘的硬件独立映射),然后转换为真实字符。

windows API 的MapVirtualKeyEx() 函数允许您在扫描码、虚拟键和字符之间进行转换。它还应该能够告诉您密钥是否不存在。

GetKeyboardLayout() 一起告诉您在任何时间点哪个键盘处于活动状态(不同运行的应用程序的键盘布局可能不同),它应该允许您构建一个非常准确的键盘映射。

不管怎样,看看keyboard input section of the MSDN

我要补充一点,所有键盘的布局几乎相同。虽然无法知道按键的物理位置,但您可能可以通过扫描码和您自己的键盘的基本知识来猜测。

【讨论】:

  • 但是这样你只能得到布局的键号,对吧?或者检索到的数字包括媒体按钮?
【解决方案2】:

没有一种机制可以让键盘告诉 Windows 其物理布局是什么样的。使用 Windows 版本的屏幕键盘 osk.exe 可以轻松查看。它似乎能够猜出机器的外形尺寸(笔记本电脑与台式机),但在我的笔记本电脑上,它与键盘的布局不匹配。

使用 osk.exe 布局作为模板,这样没有人会抱怨你的布局不匹配。

【讨论】:

  • 真的有没有方法可以直接向/从驱动程序传递数据以获取此信息吗?
  • 没有。甚至司机也不关心用户将手指放在哪里。
  • 这听起来可能很傻,但是有什么办法可以绕过驱动程序并查询键盘本身吗? (例如,相当于 SCSI 直通请求的键盘?)
  • 是的,这很愚蠢。您仍然没有抓住重点,键盘控制器和驱动程序之间没有传递任何类似于物理布局信息的协议。它只是在按下一个键时发送一个带有扫描码号的简单字节。
  • 嗯...有趣。想知道他们为什么不决定标准化这些信息并让键盘报告它。感谢您的信息!
猜你喜欢
  • 2019-12-09
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
相关资源
最近更新 更多