Skip to content

如何使用自定义的按键映射功能

h46incon edited this page May 17, 2013 · 1 revision

This is a Simplified Chinese translation version of How to Use Custom Keyboard Mapping

注:本页面是How to Use Custom Keyboard Mapping的简体中译版。因译者水平捉急,会有不少翻译不到位的地方,见谅。

在VoodooPS2Controller.kext的1.7.2版之后,我增加了基于扫描码的按键重映射功能。因为该功能是在驱动的中断服务程序(ISR)中实现的,所以其仅支持PS2键盘(如USB键盘则不被支持)。如果你希望使用更通用的按键映射服务,使用类似KeyRemap4MacBook(http://pqrs.org/macosx/keyremap4macbook) 的程序。就我而言,我这两者都在使用。

首先,本驱动提供以下两种重映射的方法:

  • 将一个按键的PS2扫描码(scan code)映射至另一个扫描码。
  • Remapping by changing how PS2 scan codes are mapped into Apple ADB codes.

在文件:VoodooPS2Controller.kext/Contents/PlugIns/VoodooPS2Keyboard/Contents/Info.plist 中,分别有一个数据段用来配置上述的重映射操作。如果你使用Finder,可以通过右键,然后选择“显示包内容”来打开kext驱动。

特别注意Info.plist文件的以下数据段:

		<key>Custom PS2 Map</key>
		<array>
			<string>;Items must be strings in the form of scanfrom=scanto</string>
			<string>;The following 12 items map Fn+fkeys to fkeys</string>
			<string>e05f=3b</string>
			<string>e012=3c</string>
			<string>e017=3d</string>
			.
			.
			.
			<string>57=e022</string>
			<string>58=e019</string>
		</array>

这个部分表示将Fn+fkeys和正常的fkeys的扫描码进行交换。这个array标签中的每个string对一个扫描码进行重映射。扫描码用十六进制表示,这个数值与你在voodoo kext的Debug版本看到的完全一致。这个数据段使用的是PS2扫描码至PS2扫描码映射的功能实现的。它也可以使用PS2扫描码至ADB码实现。但是除非你能阅读源码,否则不容易操作ADB码。在这里,我们只希望能够将一个按键映射为另一个,所以使用PS2至PS2扫描码映射实现就可以了。

看看这组映射的第一项: e05f=3b。每个映射条目遵循模式:scanFrom=scanTo。在HP 4530s的键盘上,e05f是按键Fn+F1的扫描码(其他键盘可能有所不同),3b是按键F1的扫描码。所以这一项将按键Fn+F1映射至F1。注释行以分号(;)开始。扫描码可以是普通扫描码或扩展扫描码。以e0开始(如前面所说的e05f)的表示一个扩展扫描码。当把扫描码发送至驱动时,一次只会发送一个字节。所以当发送一个扩展扫描码时,首先会发送“e0”,接着才是具体的按键扫描码。当在检查调试输出时,你会分别看到这些项目。

上面贴出的配置中的最后一个条目是将按键F12映射为Fn+F12。

如果你想要移除任何一组映射,直接删除Info.plist中对应行即可。在编辑Info.plist前,最好将整个驱动从/System/Library/Extensions拷贝出来。当完成编辑时,把Info.plist文件保存在该处,然后重新安装整个驱动。当然,也可以直接编辑安装好的驱动中的Info.plist文件,但这里不讨论这个问题。如果你不知道如何操作,则遵循以上的建议。

你可以通过文件编辑器或plist文件编辑器来编辑Info.plist文件。如果你使用文件编辑器的话,你必须很仔细地遵守XML文件的语法规则。苹果的Xcode开发环境包含了一个plist文件编辑器,而且我确定也会有其他免费的plist文件编辑器。

另外,也可以在Custom ADB Map中将PS2扫描码映射至ADB码。

		<key>Custom ADB Map</key>
		<array>
			<string>;Items must be strings in the form of scanfrom=adbto</string>
		</array>

除了是映射至ADB码外,其余与Custom PS2 Map十分相似。例如,下面的这段配置将HP 4530键盘中,位于WiFi按钮左边的“world”按钮映射至OS X Launchpad。

		<key>Custom ADB Map</key>
		<array>
			<string>;Items must be strings in the form of scanfrom=adbto</string>
			<string>e032=83</string>
		</array>

Launchpad的ADB码是83,“World”按钮的扫描码是e032。在驱动的Debug版本中,你可以发送任意的ADB码:按住Alt键,然后用数字键盘输入ADB码。当松开Alt键时,这个ADB代码将会被发送。这也是我发现Launchpad的ADB码的方法(按下Alt,1,3,1,松开Alt)。

You can’t perform that action at this time.