键盘映射机制详解

合集下载

键盘映射工具的使用方法

键盘映射工具的使用方法

键盘映射工具的使用方法相信大家都试过想玩一款游戏时,键盘操作远远比不上手柄操作的,但电脑游戏又无法支持手柄操作怎么办?店铺在这里给大家带来了键盘映射工具joytokey以及它的使用方法。

JoyToKey是通过手柄或操纵杆来模拟键盘、鼠标的软件,它可以将手柄输入模拟成键、鼠输入传到系统中,完成不支持手柄或操纵杆的操作。

更为难得的是,该软件支持几乎所有的游戏手柄,连低端的仿PS的并口手柄也不例外。

其实,一切都可以用JoyT oKey来解决。

下面以《仙剑奇侠传》DOS版为例来介绍一下使用办法:首先下载JoyT oKey汉化版,这是一个免安装软件,运行进入程序主界面,点击“新建”按钮,为《仙剑奇侠传》程序建立一个配置文件,文件可以取名为“仙剑奇侠传”。

了解《仙剑奇侠传》需要用到的键盘上的按键:“上下左右”为“↑ ↓ → ←”,“ESC”和空格键为功能键。

(另:有些游戏可以修改键盘设置,如果用到JoyT oKey就不用按照自己的习惯来个性化设置,默认就可以,但是手柄与键盘的对应关系必须搞清楚,可以按照自己的意愿来对应。

)接下来我们便可以根据前面提到的按键进行手柄模拟设置了。

例如,要将手柄方向键向左的按键模拟为键盘的左箭头“←”,只需在JoyT oKey主界面右侧的按钮列表中双击“←”标记在弹出的“设置功能”对话框中选择“键盘”选项卡,将鼠标定位在“键盘模拟输入”栏下的第一个空白输入框中,并在键盘上按一下左箭头“←”,在该输入框内则会出现一个向左的箭头符号(见图)。

单击“确定”按钮后便完成了对该按键的设置。

按照同样的方法,我们可以将键盘上的方向键和其他功能按键都模拟成为手柄上的相应按钮。

如果需要用到鼠标,那么就在鼠标设置面板相应设置即可。

比如FPS 游戏需要鼠标左键射击,就可以点上“左键”的勾。

设置完成后,保持JoyToKey不要关闭,拿起手柄就可以直接操作了。

通过介绍可以看出,JoyT oKey是将手柄与键盘关联起来的纽带,与游戏没有必然的关系。

【笔记】AHK(AutoHotKey)键盘映射

【笔记】AHK(AutoHotKey)键盘映射

【笔记】AHK(AutoHotKey)键盘映射
原起:
⼿头⽤的键盘是联想SK 9271,有四个多功能按键与⼀个关机键,在不装官⽅键盘驱动的情况下只能使⽤关机键。

为了利⽤起这四个多媒体按键,便有了90分钟的摸索。

(先不理会过程了。


结论:在AHK设定中,⼀个键有三个标识符:ScanCode(SC)、VirtualKey(VK)、KeyName。

SC是每个键硬件扫描上来的值(排列顺序⼤致为1、2、3……9、0……q、w……o、p、a、s……),VK值是其对应的ASCII值。

我们⼀般是⽤键名KeyName如a,F11,NumPad1等等。

可以通过AHK的KeyboardHook找到⽬标按键的SC值或者VK值,⽤SC***(三位16进制数)或者VK**(两位16进制数)表⽰⼀个键,且与KEYNAME⽆异,可加!#^+前缀。

帮助:
开启KeyboardHook:代码头处添加 #InstallKeybdHook
查看:双击任务栏图标→View→Key History and ScriptInfo
过程:
0、在⽹上找不到与此相关的问题;
1、找键盘映射⼯具,下了⼀个按键精灵来查询按键码,查都是查到了,但不会⽤,T-T;
2、⽆果后,便打算从AHK的帮助⽂件寻找解决⽅案。

了解到可以⽤KeyboardHook捕捉按键信息。

测试后发现只有其中三个的KeyName,还有⼀个居然没有定义。

3、继尔只能从按键码尝试,最终根据帮助⽂件的说明与KeybdHook提⽰的其VK与SC完成任务。

android键盘映射

android键盘映射
key 51 COMMA
key 52 PERIOD
key 28 ENTER
key 56 ALT_LEFT
key 42 SHIFT_LEFT
key 215 AT
key 57 SPACE
key 53 SLASH
key 127 SYM
注:
Android的应用不仅仅是平板电脑,MID,phone,还可以放到STB机顶盒,智能家庭终端上面去,所以按键的映射是一定要自定义的,不管按键是固定在设备上,还是通过无线设备还是蓝牙遥控,都需要键的映射。
Android也是基于Linux的核心,大部分时候都是操作系统在调度任务,执行任务。相应的,Android输入系统也是遵循LINUX的input输入输出子系统,关于这部分的分析可以Google,有许多原理方面的分析。Android使用标准的Linux输入事件设备(/dev/event0),驱动描述可以查看内核树头文件include/linux/input.h。如果想深入学习Linux input subsystem,可以访问:/?p=linux/k ... /linux-2.6.24.y.git;a=blob;f=Documentation/input/input.txt
android/src/device/product/generic/tuttle2.kl
# Copyright 2007 The Android Open Source Project
key 2 1
key 3 2
key 4 3
key 5 4
key 6 5
1 窗口管理器从Linux键盘驱动获取键盘事件 按键消息不指定任何逻辑事件,它只与其硬件位置有关, 也就是说,按键的键盘码没有任何软件含义,映射键盘码

键盘工作原理

键盘工作原理

键盘工作原理键盘是计算机输入设备中最常见的一种,它通过按键输入字符和命令,是我们与计算机进行交互的主要方式之一。

键盘的工作原理涉及到按键的检测和字符的传输,下面将详细介绍键盘的工作原理。

1. 按键检测当我们按下键盘上的一个按键时,按键被按下的力会使得按键开关闭合。

按键开关通常采用矩阵形式排列,每个按键都与矩阵中的一个交叉点相连。

按键闭合后,与之对应的交叉点会产生电流,作为按键的信号传输给键盘控制器。

2. 键盘控制器键盘控制器是键盘的核心部件,它负责接收并处理按键的信号。

键盘控制器通常位于计算机主板上,可以是一个独立的芯片或者集成在北桥芯片中。

键盘控制器通过扫描矩阵中的交叉点,检测到按键闭合后,将对应的按键码发送给计算机。

3. 按键码传输按键码是键盘控制器根据按键的位置和类型所对应的数字代码。

按键码可以分为两种类型:扫描码和ASCII码。

扫描码是键盘控制器根据按键的位置编码生成的,用于传输给计算机进行按键识别。

ASCII码是字符编码,用于将按键码转换为对应的字符。

4. 中断处理键盘控制器通过中断信号告知计算机有按键操作发生。

当键盘控制器检测到按键闭合后,会发送一个中断请求给CPU,CPU接收到中断请求后,会暂停当前任务,转而处理键盘中断。

通过中断处理程序,计算机可以获取到按键的按下和释放状态,并进行相应的处理。

5. 操作系统处理操作系统接收到键盘中断后,会调用相应的设备驱动程序进行处理。

设备驱动程序负责解析按键码,将其转换为对应的字符或命令,并将其传递给应用程序或操作系统内核。

应用程序可以根据接收到的字符或命令进行相应的操作,例如输入文本、执行命令等。

总结:键盘的工作原理主要包括按键检测、键盘控制器、按键码传输、中断处理和操作系统处理。

通过按键的闭合与开启,键盘控制器将按键信号转化为按键码,并通过中断方式通知计算机有按键操作发生。

操作系统接收到键盘中断后,调用设备驱动程序进行处理,最终将按键转换为字符或命令,供应用程序使用。

了解电脑键盘的按键映射

了解电脑键盘的按键映射

了解电脑键盘的按键映射电脑键盘的按键映射是指键盘上每个按键所对应的字符或者功能。

了解电脑键盘的按键映射对于提高打字速度和效率非常重要。

本文将介绍常见的标准键盘布局以及常用的按键映射。

一、标准键盘布局标准键盘布局是指大多数电脑键盘所采用的按键排列方式,其主要分为三个区域:字母区、数字区和功能区。

1. 字母区:字母区是键盘上最常用的区域,包含26个字母键以及与之相关的符号和功能键。

字母键按照QWERTY布局排列,源于打字机时代的键盘设计。

2. 数字区:数字区主要用于输入数字和进行简单的计算。

包含0-9的数字键、加减乘除等运算符号以及小数点等。

3. 功能区:功能区位于键盘的顶部,包含一系列的特殊功能键。

常见的功能键有ESC键、Tab键、Caps Lock键、Shift键、Ctrl键、Alt键和Windows键等。

二、常用的按键映射1. 字母键:字母键是键盘上最常用的键,用于输入文本和命令。

按下字母键会在屏幕上显示相应的字母字符。

字母键区分大小写,通过同时按下Shift键可以输入大写字母。

2. 数字键:数字键主要用于输入数字字符。

按下数字键会在屏幕上显示相应的数字字符。

数字键不受大小写的影响。

3. 符号键:符号键用于输入各种符号,如感叹号、问号、冒号等。

符号键通常位于字母键和数字键之间,通过同时按下Shift键可以输入相应的符号字符。

4. 功能键:功能键提供了一系列特殊功能,用于控制计算机的操作。

例如,F1-F12键用于调用特定的功能菜单或者快捷键组合。

5. 控制键:控制键用于组合其他键盘按键以实现一些特殊操作。

例如,Ctrl键通常与其他键组合,用于复制、粘贴、撤销等操作。

6. 动作键:动作键用于控制光标的移动和删除字符。

常见的动作键有退格键、Enter键和方向键等。

三、快捷键快捷键是指通过按下组合键来执行特定的命令或者操作。

常用的快捷键可以大大提高操作效率。

1. 剪切、复制和粘贴:剪切操作可以通过组合键Ctrl+X实现,复制操作可以通过组合键Ctrl+C实现,粘贴操作可以通过组合键Ctrl+V实现。

映射是什么工作原理的应用

映射是什么工作原理的应用

映射是什么工作原理的应用1. 什么是映射映射是一种将一个值与另一个值关联起来的方式。

在计算机科学中,映射通常用于将一个键值与一个数据值相关联。

通过将键映射到值,我们可以根据给定的键查找或检索对应的值。

映射也被称为字典、关联数组或哈希表。

2. 映射的工作原理映射的工作原理是基于哈希函数的,哈希函数可以将任意长度的输入(键)转换为固定长度的输出(哈希值)。

哈希函数将键映射到一个哈希表中的索引位置,这个索引位置就是与该键相关联的值所在的位置。

在哈希表中,每一个索引位置被称为一个槽。

当我们执行映射时,首先使用哈希函数计算键的哈希值,然后将哈希值映射到哈希表中的一个槽。

如果多个键具有相同的哈希值,它们将被映射到哈希表的同一个槽中。

在每个槽中,可以存储一个或多个键值对。

3. 映射的应用映射在计算机科学中有许多应用。

下面列举了几个常见的应用场景:3.1 数据库索引在数据库系统中,映射用于索引查询和搜索。

数据库索引常常使用映射结构来加快查询速度。

通过使用映射,数据库可以根据指定的关键字迅速找到与之相关的记录。

3.2 缓存管理在计算机系统中,缓存是一种临时存储,用于加快数据访问速度。

映射常用于缓存管理中,通过将缓存的键映射到缓存的值,系统可以快速检索所需的数据,而不必每次都从较慢的存储介质中获取。

3.3 路由和寻址在网络通信中,路由和寻址是实现数据包传输的重要步骤。

映射被广泛用于路由和寻址表中,以确定数据包应该被发送到哪个目标地址。

3.4 编译器符号表在编译器中,符号表用于存储程序中的变量、函数等标识符的信息。

映射常常用于实现符号表,通过将标识符映射到其相关信息,编译器可以根据需要查找和访问标识符。

3.5 哈希算法在密码学中,哈希函数被广泛用于密码存储和验证。

密码通常被转换为哈希值并存储在数据库中。

当需要验证密码时,系统将用户输入的密码与数据库中存储的哈希值进行比较。

4. 总结映射是一种将键和值相关联的数据结构,通过哈希函数将键映射到槽位上,实现快速查找和访问。

Android键盘映射

Android键盘映射
}
...... } } } };
按键、触摸屏流、轨迹球程分析
输入事件分发线程 在 frameworks/base/services/java/com/android/server/WindowManagerService.java 里创 建了一个输入事件分发线程,它负责把事件分发到相应的窗口上去。
bool EventHub::getEvent (int32_t* outDeviceId, int32_t* outType,
int32_t* outScancode, int32_t* outKeycode, uint32_t *outFlags,
int32_t* outValue, nsecs_t* outWhen)
scancode,...));
QueuedEvent ev = obtainLocked(device, when, flags, classType, event);
} }; readEvent() 实际上调用的是 com_android_server_KeyInputQueue.cpp (frameworks\base\services\jni)中的 static jboolean android_server_KeyInputQueue_readEvent(JNIEnv* env, jobject clazz,jobject event) 来读取事件, bool res = hub->getEvent(&deviceId, &type, &scancode, &keycode,&flags, &value, &when) 调用的是 EventHub.cpp (frameworks\base\libs\ui)中的:

DOSPY TIMES _ Blog Archive _ DosBox键盘映射方法及经典DOS游戏评测

DOSPY TIMES _ Blog Archive _ DosBox键盘映射方法及经典DOS游戏评测

[订阅] DOSPY TIMES RSS Feed首页多彩生活数位精品新闻·锐点知识技巧读编互动资讯焦点软硬兼施 RSS订阅DOSPY TIMES公告牌:塞班.道杂志门户试运行!如果您在试用当中发现什么问题!请及时联系我们!塞班.道杂志门户试运行!如果您在试用当中发现什么问题!请及时联系我们! 搜索当前位置: 塞班.道 > 软硬兼施 > 文章正文DosBox键盘映射方法及经典DOS游戏评测dospy 发表于 2009-04-23 22:03 | 来源: | 阅读 3,043 views作者:saueustc本文介绍DosBox键盘映射方法和几款经典的DOS游戏初步评测。

一.DosBox键盘映射方法详解新版的DosBox增添了premapper.txt这个键盘文件,通过它来映射全键盘字符到数字键盘上,从而实现随心所欲输入任意的字母,数字和标点符号等。

我们先观察手机键盘的特点(以数字键盘为例,E71等机型QWER全键盘不在此讨论范围中),数字2对应着字母abc,数字3对应着字母def…除了1和0外,每个数字都对应着3个或4个字母,特别注意7和9,它们对应着4个字母,分别是pqrs和wxyz。

因此,我们可以编制四套映射方案,每套方案实现一个字母的映射,如下所示:映射方案1: 2->a, 3->d ,4->g… 9->w映射方案2: 2->b, 3->e ,4->h… 9->x映射方案3:2->c, 3->f ,4->i… 9->y映射方案4:7->s, 9->z(即数字键7和9对应的第4个字母)在这些映射方案之间,通过一些特殊键来切换(例如左右软键,通话键,1键,#键,*键等等)。

具体要如何实现这些映射方案呢?实现的格式为X Y Z,其中X为待映射的原按键的ASCII码值,Z为被映射的目标按键的ASCII码值(严格说应该是SDLkey值,不过数值与ASCII码是相同的),Y定义了此映射实现的功能,可用参数有4个:0 :normal, 基本功能,表示把X映射到Y1 :special, 特殊功能,表示该映射用于控制虚拟鼠标2 :toggle, 触发功能,表示按下X键后能切换到第Y套映射方案3 :modify, 修正功能,表示按住X键不放开能切换到第Y套映射方案我们看下面一段代码,摘自DosBox For S60原作者kljc给的示例文件:map 0 13278 2 4#substinbg 2->a 3->d … 9->w50 0 9751 0 10052 0 10353 0 10654 0 10955 0 11256 0 11657 0 11948 0 32#modifiers (asterisk, hash, 1):42 3 135 3 249 3 3第一行map 0 13,map开头的语句是定义了一套键盘映射,后面的13表示本套键盘映射一共定义了13个可输入字符。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数组,以找到相应的条目。
*/
theEntry = FindEntry( in->wParam, w->winKeyboard );
/*
消息; 4. 在 WindowDispatchMessage() 里 , 先 找 到 最 上 面 的 活 动 窗 体 , 再 调 用
TranslateMessage()函数来完成按键到具体窗体事件的映射转换; 5. 由此可见,键盘映射的实际转换工作是在 TranslateMessage()函数里实现的,下
Scancode AutoRepeat
KEYTRANSLATION KeyBeep
type
Key KeyInfo
ControlKeyInfo keydownEvent keyupEvent
表1
有了上面的基础知识,我们再来看键盘的映射过程,就比较简单了,其实现机理如下所 述:
首先,对于,每一个窗体 w,其结构体里,都有一个 KEYBOARD 的结构体,其实际上 是一张键盘映射表。具体如下: typedef struct KEYBOARDtag
面,我们就来深入剖析一下此函数;
BOOLEAN TranslateMessage( UIWINDOW * w, UIMSG * out, const UIMSG * in,
BOOLEAN * stopTranslate )
/*
参数说明: 1.w ----要进行按键转换的窗体; 2.out ----出口参数,即返回值,是一个消息结构,其格式是固定的,
1. 用户按下某个键,UH 捕捉到此事件,直接向 AL 层发送一个 ALKeyEventInd 的消 息;
2. AL 层捕捉到此消息后,调用 DoALKeyEventInd()对此消息进行处理; 3. 在 DoALKeyEventInd 里,调用 WindowDispatchMessage( UIMSG * msg )派发此
映射表,则转换过程应该继续到它的父窗体上去进 行,或者键产生的事件同处理键的 AutoRepeat 的 函数派发出去了。
*/ { const KEYTRANSLATION *theEntry; *out = *in;
/* 只转换键盘消息 */
if ( in->cmd == WM_HWKEYEVENT )
extern const UINT16 name##KeydownEvents[]; \ static CONTROLKEYINFO name##CtrlKeyInfo = { name##KeydownEvents,
keyupEvent }; \ static const KEY name##Key = { ControlKey, AKEY( name##CtrlKeyInfo ) }; \ const UINT16 name##KeydownEvents[] 看到这么多,大家是不是快晕了,没关系,宏吗,无外乎就是直接替换而已,我们慢慢 来,一个一个地替换。 /* 声明一个名为 SelectKeydownEvents 的数组,用来存放按键的按下事件, 之所以为数组,原因是一个键按下,可以产生多个事件。 */ extern const UINT16 SelectKeydownEvents[]; /* 声明一个 SelectCtrlKeyInfo 的变量,并赋值为: KeydownEvent = SelectKeydownEvents // 是一个数组哦 KeyupEvent =EV_NULL */ static CONTROLKEYINFO SelectCtrlKeyInfo = { SelectKeydownEvents,
{
if ( w->winKeyboard )
/*
在窗体的键盘映射表里找到相应的条目(通过 ScanCode,所以,
整个按键消息传了好多层,但最重要的,就是这个 ScanCode,因为,
这个唯一标识了一个按键)。键盘映射表的表项可以参看表 1。
其实现原理很简单,就是按 ScanCode 直接搜索存放键盘映射表的
#define AKEY( k ) ((SIMPLEKEYINFO*)(&k))
typedef union { const SIMPLEKEYINFO *const simple; const SHIFTKEYINFO *const shift; const CONTROLKEYINFO *const ctrl; const UCINTLKEYINFO *const UCIntl; const INTLKEYINFO *const intl; } KEYINFO; 最后,再讲一下键的 Repeat 属性,这个东东,其注释的英文没有仔细看懂,由于时间
综合上面的替代过程,可以发现这个宏,其实做的事如下: 声明了一个 Key 结构体的变量 SelectKey,并填充相应的数据(最主要,就两个,一个 是类型域,一个是键信息域(此域按类型的不同,有不同的解释))
SelectKey.type = ControlKey; SelctKey.k = SelectCtrKeyInfo; 而键信息又等于 k.KeydownEvent[] = { EV_SELECT,EV_NULL }; // 键按下时,可以触发多个事件 k.KeyupEvent = EV_NULL; // 键弹起时只触发一个事件 好了,明白了这些道道之后,以后会直接使用它就好了。 接下来,再讲一下 AKEY(k)这个宏定义,这个宏定义的原理很简单,就是将任何 KeyInfo 类型的变量,转化为 SimpleKeyInfo 的类型,之所以要做如此转换,关键是 KeyInfo 是一个 联合体(联合体内存的占用只取最大的那个,其实,每次,不同的类型变量,其指针地址都 是一样的,只是内存所指的区域,其解释不一样罢了!),因此,为了避免不同的 KeyInfo 的 类型不一致,就直接将其转换为占用内存最少的 SimpleKeyInfo 就可以了,这样,指针是一 样的,只是以后,我们用时,解释不一样罢了。
/* The Hardware Keyscan code */
/*
键盘映射表,很有用的东东,这里最重要的就是 Key 这个结构体,包含了
和 Key 有关的所有信息,比如 key 的类型,和 Key 的响应函数等。chh
*/
const KEY *const key;
const AUTOREPEAT *const repeat; /* AutoRepeat 属性 */
但参数内容视具体情况而定, typedef struct
{
UINT16 cmd;
// 消息类型
UINT16 wParam; // 消息参数 1,指针,可以指向任何 // 东东;
// 由于只有 16 位,所以,一般,不用来 // 作指针用,而是用于标识消息
UINT32 lParam; } UIMSG;
EV_NULL};
/* 再声明一个 SelectKey 的变量,并赋初值为: KEYTYPE type = ControlKey KEYINFO k = SelectCtrlKeyInfo
*/ static const KEY SelectKey = { ControlKey, SelectCtrlKeyInfo }; /*
// 消息参数 2,同上; // 一般用来存放发送消息时要传送的 // 信息,指向具体的结构体
3.in ---- 入口参数 cmd = WM_HWKEYEVENT;
wParam = keyScanCode;
lParam = pressed;
4. stopTranslate ---转换是否完成,因为,有可能子窗体没有配置键盘
上述的代码实现的功能为: 定义了一个 KEYTRANSLATION 的键盘映射表 AmoiMenuKeyboardLookup(其实就是 一个结构体数组而已),其中定义了两个按键,一个为 KEY_1(扫描码),其所对应的事件,存 放在 OneKey(这个键的定义,即是我们上面所讲的,只不过,查找时,要将后面的 Key 去掉,因为,宏定义时会帮我们自动填上)里面,再有就是指定此键的 AutoRepeat 属性, 最后,就是此键的按键声音。其详细情况可以参看下面的键盘映射表:
const KEYBEEP beep;
/* 按键声音 */
} KEYTRANSLATION;
如上表 1 所示,每一个窗体都有这样一张键盘映射表------假如它需要的话,至于这个 键盘映射表的实现方式,在程序里,是以结构体数组的方式来实现的;
那一个按键究竟是如何变成一个窗体的事件的呢?其具体步骤如下:(更详细的说明, 可以参看文档《深入剖析 UIF 的消息派发机制.pdf》)。
2.在指定的时间内连续按两次键,只产生两次按下的事件,而只在最后一次产生弹起事 件;
3.相当于双击键; 定义了键,那如何定义键盘映射表呢,很简单,请看下面的代码: static const KEYTRANSLATION AmoiMenuKeyboardLookup[] = { {KEY_1, &OneKey, &NoAutoRepeat, NormalBeep}, {KEY_SOFT1, &SelectKey, &NoAutoRepeat, NormalBeep}, };
首先,我们来看一下如何定义一个按键,下面,就是深度剖析 SelectKey 的定义过程, 其语法如下:
DEFINECTRLKEY( Select, EV_NULL ) = { EV_SELECT, EV_NULL
}; DEFINECTRLKEY 这个宏比较特别,值得深入地讲一下,以后,大家如果理解了,则 不用去深究它了,只要会用就好了。DEFINECTRLKEY 宏的定义如下所示: #define DEFINECTRLKEY( name, keyupEvent ) \
关系,也没有去做测试,只能大致描述如下,有问题的话,还希望其它高手指正。 键的 AutoRepeat 有以下几种类型:
相关文档
最新文档