一生醉生忘死,就让他继续下去吧!
分类: LINUX
2010-12-13 14:22:54
修改 X 服务器中的键映射。
xmodmap [ Display ] [ Expression ] [ | ] [ ] [ ] [ ] [ ] [ ] [ | ] [ FileName ]
xmodmap 命令编辑并显示键盘修饰符映射和客户机应用程序用来将事件键控代码转换为键符号的键映射表。它通常从会话启动脚本运行,根据用户的个人喜好配置键盘。
每次键控代码表达式被求值时,服务器都会在每个客户机上生成一个 MappingNotify 事件。所有更改都应该成批进行并一次完成。接收键盘输入并忽略 MappingNotify 事件的客户机不会注意到对键盘映射作出的任何更改。
FileName 参数指定包含要运行的 xmodmap 命令表达式的文件。该文件通常保存在用户主目录中,其名称类似于 .xmodmaprc。如果不指定任何文件,就从标准输入获取输入。
xmodmap 命令程序将读取表达式列表并在试图运行其中的任一命令之前对所有这些命令进行分析。这样,我们就能够引用被自然地重新定义过的键符号,而不用过多地担心名称冲突。
add | 键符号名在该行被读取时求值。这允许您从修饰符除去键,而无需担心它们是否被再分配。 |
add ModifierName = KeySymbolName... | 将给定的键符号添加到表明的修饰符映射。键符号名在读取了所有输入表达式之后求值,使编写交换键的表达式变得很容易。 |
clear ModifierName | 为给定的修饰符除去修饰符映射中的所有条目,其中有效的名称为 Shift、Lock、Control、Mod1、Mod2、Mod3、Mod4 和 Mod5(大小写在修饰符名中并不重要,但它会影响其它所有名称)。例如,clear Lock 将除去所有绑定到 shift lock 修饰符的键。 |
keycode Number = KeySymbolName... | 将键符号列表分配到所指示的键控代码(可以由十进制、十六进制或八进制指定,并通过运行 /usr/lpp/X11/Xamples/demos 目录中的 xev 程序决定)。通常,只有一个键符号被分配到给定的代码。 |
keysym KeySymbolName = KeySymbolName... | 左边的 KeySymbolName 将被转换为与其匹配的、用来执行相应的一组 keycode 表达式的键控代码。可以在 keysym 数据库 /usr/lib/X11/XKeysymDB 或头文件 X11/keysymdef.h(没有 XK_ 前缀)中找到 keysym 名的列表。注意:如果同一个 keysym 被绑定到多个键上,就会为每个匹配的键控代码运行表达式。 |
pointer = default | 将指示器映射设置回缺省设置(例如,按钮 1 生成代码 1,按钮 2 生成代码 2,依此类推)。 |
pointer = Button1 Button2 Button3... | 将指针映射设置为包含指定的按钮代码。列表总是以第一个物理按钮开始。 |
remove ModifierName = KeySymbolName... | 从表明的修饰符映射除去所有包含给定 keysym 的键。与 add 不同,keysym 名在读取该行时求值。这样可以从修饰符除去键,而不需担心它们是否被再分配。 |
以 !(感叹号)开头的行将作为注释处理。
如果希望更改修饰符键的绑定,必须从相应的修饰符映射除去它。
-display Display | 指定要使用的主机和显示器。 |
-e Expression | 指定要运行的表达式。可以从命令行指定任意数目的表达式。 |
-grammar | 打印一条描述文件中使用的表达式语法的帮助消息,用 -e Expressions 标志将打印到标准错误。 |
-help | 将一条关于命令行自变量的简要描述打印到标准错误。无论您何时将未处理的参数提供给 xmodmap 命令,系统都会执行这个操作。 |
-n | 表明 xmodmap 命令不应该更改映射,而应该显示当给定此标志时将显示的内容。 |
-pk | 表明当前的键映射表应该打印到标准输出。 |
-pke | 表明当前的键映射表应该按照能够反馈到 xmodmap 的表达式形式打印到标准输出。此标志与 X11R5 有关。 |
-pm | 表明当前的修饰符映射应该打印到标准输出。 |
-pp | 表明当前的指针映射应该打印到标准输出。 |
-quiet | 关闭详细日志记录。这是缺省值。 |
-verbose | 表明 xmodmap 命令应该在分析其输入时打印日志信息。 |
xmodmap -e "pointer = 1 2 3 4 5"
keysym Multi_key = Multi_key Meta_L
! ! make shift-, be < and shift-. be > ! keysym comma = comma less keysym period = period greater
! ! Swap Caps_Lock and Control_L ! remove Lock = Caps_Lock remove Control = Control_L keysym Control_L = Caps_Lock keysym Caps_Lock = Control_L add Lock = Caps_Lock add Control = Control_L
linux 下如何通过软件模拟按键[转-修改]
名词解释:
scancode: 驱动对硬件的标记
keycode: 上层应用程序所见的标记,跟硬件的标记不同, 一般为KEY_F1之类的宏
一般驱动将scancode绑定到keycode
对未绑定的scancode, 可以通过setkeycodes将将其绑定到未使用的keycode
注: 有些按键会被解释成acpi event, 可以通过acpi_listen来监听,但不一定成功,目前还没具体了解
模 拟按键是上层应用程序的行为, 所以不需要编译成模块,只需要想平常的应用程序那样编译就可以了, 不过它要包含这个文件, 同时要明确键盘对应的/dev/input/event[0-4]到底是哪个文件, 此外还需要以root权限来运行
赖半仙注解:
运行命令 cat /proc/bus/input/devices 在输出里面查找 xxx keyboard 对应的文件是/dev/input/event几。我开始想当然的以为键盘文件是event1,结果死人都调不出来,弄了很久最后从event0开始一个一个试,才发现我的手提电脑键盘文件对应的是event4。
在我的电脑上运行命令 ls /dev/input/event* 发现有好多输入设备…………
/dev/input/event0 /dev/input/event10 /dev/input/event2 /dev/input/event4 /dev/input/event6 /dev/input/event8
/dev/input/event1 /dev/input/event11 /dev/input/event3 /dev/input/event5 /dev/input/event7 /dev/input/event9
下面是 cat /proc/bus/input/devices 命令对应键盘文件的一段输出
I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/devices/platform/i8042/serio0/input/input4
U: Uniq=
H: Handlers=kbd event4
B: EV=120013
B: KEY=8000 0 0 0 0 0 5007 2002000 380307c f800d001 feffffdf ffefffff ffffffff ffffffff
B: MSC=10
B: LED=7
下面的程序是模拟按键NumLock,就是控制小键盘灯的那个按键,按下去(运行程序没有问题)后小键盘灯就会点亮或者熄灭。
#include
#include
#include
#include
#include
#include
void simulate_key(int fd, unsigned int keycode, int keyvalue)
{
struct input_event event;
event.type = EV_KEY;
event.code = keycode;
event.value = keyvalue;
gettimeofday(&event.time, 0);
if (write(fd, &event, sizeof(event)) < 0) {
printf("simulate key error ");
return;
}else
printf("simuate key %d, %d ", keycode, keyvalue);
}
int main ( int argc, char *argv[] )
{
char *path = "/dev/input/event1";
unsigned int key_code = KEY_NUMLOCK; //键值: NumLock
//unsigned int key_code = KYE_A; //键值:a
if (argc >= 3) {
path = argv[1];
key_code = atoi(argv[2]);
}else if (argc >= 2)
path = argv[1];
int fd_kbd = open(path, O_RDWR);
if(fd_kbd <= 0) {
printf("error open keyboard:%s ", strerror(errno));
return -1;
}
simulate_key(fd_kbd, key_code, 1);
simulate_key(fd_kbd, key_code, 0);
close(fd_kbd);
return 0;
} /* ---------- end of function main ---------- */