我有一台罗技 MX400 无线鼠标。它有一个搜索按钮,我想用它来粘贴(而不是非常敏感但很难按的滚轮)。我已经用 xbindkeys 重新映射了其他按钮,并使用 xev 查找按钮按下代码,但这对搜索按钮不起作用。使用 xev 并单击搜索按钮,我得到以下事件
FocusOut event, serial 34, synthetic NO, window 0x3c00001,
mode NotifyGrab, detail NotifyAncestor
FocusIn event, serial 34, synthetic NO, window 0x3c00001,
mode NotifyUngrab, detail NotifyAncestor
KeymapNotify event, serial 34, synthetic NO, window 0x0,
keys: 4294967275 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
PropertyNotify event, serial 34, synthetic NO, window 0x3c00001,
atom 0x1d7 (_NET_WM_ICON_GEOMETRY), time 23653064, state PropertyNewValue
没有 ButtonPress 事件。似乎搜索按钮在 X 事件以下的级别被拦截。有什么想法吗?我有 ubuntu 12.04。Ubuntu 实际上看到了点击并生成了一个搜索对话框,但在 xev 中没有点击事件的踪迹。
编辑
我检查了 xmodmap 提供的方法。我的.Xmodmap
现在包含以下行
keycode 225 = XF86Paste NoSymbol XF86Paste``
现在运行xmodmap ~/.Xmodmap
会完全禁用该按钮(或者至少,按下它不会得到任何结果)。我试过了xmodmap -pke
,它打印出:
keycode 225 = XF86Paste NoSymbol XF86Paste NoSymbol XF86Paste
很奇怪。所有其他条目的格式都类似。我接近解决方案了,但仍然有些奇怪。
编辑2
我尝试运行 xinput(从未听说过此命令。太神奇了)。Logitech 有两个条目。以下是列出每个条目的输出(ID 9 和 10)
Logitech USB Receiver id=9 [slave pointer (2)]
Reporting 7 classes:
Class originated from: 9. Type: XIButtonClass
Buttons supported: 24
Button labels: "Button Left" "Button Middle" "Button Right" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right" "Button Side" "Button Extra" "Button Forward" "Button Back" "Button Task" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown" "Button Unknown"
Button state:
Class originated from: 9. Type: XIValuatorClass
Detail for Valuator 0:
Label: Rel X
Range: -1.000000 - -1.000000
Resolution: 1 units/m
Mode: relative
Class originated from: 9. Type: XIValuatorClass
Detail for Valuator 1:
Label: Rel Y
Range: -1.000000 - -1.000000
Resolution: 1 units/m
Mode: relative
Class originated from: 9. Type: XIValuatorClass
Detail for Valuator 2:
Label: Rel Horiz Wheel
Range: -1.000000 - -1.000000
Resolution: 1 units/m
Mode: relative
Class originated from: 9. Type: XIValuatorClass
Detail for Valuator 3:
Label: Rel Vert Wheel
Range: -1.000000 - -1.000000
Resolution: 1 units/m
Mode: relative
Class originated from: 9. Type: XIScrollClass
Scroll info for Valuator 2
type: 2 (horizontal)
increment: 1.000000
flags: 0x0
Class originated from: 9. Type: XIScrollClass
Scroll info for Valuator 3
type: 1 (vertical)
increment: -1.000000
flags: 0x2 ( preferred )
Logitech USB Receiver id=10 [slave pointer (2)]
Reporting 6 classes:
Class originated from: 10. Type: XIButtonClass
Buttons supported: 7
Button labels: "Button 0" "Button Unknown" "Button Unknown" "Button Wheel Up" "Button Wheel Down" "Button Horiz Wheel Left" "Button Horiz Wheel Right"
Button state:
Class originated from: 10. Type: XIKeyClass
Keycodes supported: 248
Class originated from: 10. Type: XIValuatorClass
Detail for Valuator 0:
Label: Rel X
Range: -1.000000 - -1.000000
Resolution: 1 units/m
Mode: relative
Class originated from: 10. Type: XIValuatorClass
Detail for Valuator 1:
Label: Rel Y
Range: -1.000000 - -1.000000
Resolution: 1 units/m
Mode: relative
Class originated from: 10. Type: XIValuatorClass
Detail for Valuator 2:
Label: Rel Horiz Wheel
Range: -1.000000 - -1.000000
Resolution: 1 units/m
Mode: relative
Class originated from: 10. Type: XIScrollClass
Scroll info for Valuator 2
type: 2 (horizontal)
increment: 1.000000
flags: 0x0
测试设备 9 无法对按钮执行任何操作。测试设备 10 却可以工作,这是我单击时的输出
$ xinput test 10
key press 225
key release 225
key press 225
key release 225
key press 225
key release 225
因此看起来鼠标在这方面充当了键盘的作用,但由于某种原因,xmodmap 在接收到键 225 时不执行任何操作。
** 编辑 **
我可以确认每次单击按钮时添加keycode 225 = a
都会打印a
。因此问题似乎与 XF86Paste 的实际处理方式有关。我正在发送它,但它没有粘贴。
答案1
为了模拟键盘事件,我建议你使用这个伟大的工具工具。
1. 安装xdotool
通过终端(CTRL++ ALT)T:
sudo apt-get install xdotool
或使用软件中心。
2. 创建脚本CTRL使用 xdotool 模拟和的按键事件v。在终端中:
mkdir -p ~/bin
gedit ~/bin/fakepaste
将以下内容复制到打开的编辑器窗口中。复制代码后保存,然后关闭它:
#!/bin/sh
exec /usr/bin/xdotool key CTRL+V
EOF
现在使脚本可执行:
chmod +x ~/bin/fakepaste
3. 退出并登录以重新加载您的小路。
4. 创建自定义快捷方式
前往System Settings
,然后前往Keyboard
,然后Shortcuts
。
按下+
对话框底部的按钮。为您即将创建的快捷方式提供一个名称,并为命令填写:fakepaste
。按下OK
。
您将在新的快捷键旁边看到disabled
。单击该文本,然后按下要分配给键盘模拟的键。
您现在就可以使用搜索键进行粘贴了!
答案2
使用 xdotool 的 xbindkeys 解决方案
对于此解决方案,您将xbindkeys
需要xdotool
杀死 xbindkeys 并转储你的按钮配置
killall xbindkeys
和
xbindkeys --defaults >> ~/.xbindkeysrc
添加新绑定
现在你可以修改此文件来添加自定义绑定,这些绑定具有以下形式
"<command>"
<key combination>
所以如果你添加
"gedit"
m:0x0 +b:4
gedit
每次向上滚动时都会打开。
现在您可以尝试以下方法之一,选择最适合您的方法。在所有情况下xdotool click 2
都会进行模拟,这是按下鼠标中键,这将粘贴内部和外部终端。
拦截鼠标发出的 225:
"xdotool click 2" m:0x0 +b:225
一般情况下拦截键码 225:
"xdotool click 2" c:225
替换所有
XF86Search
事件(首先将鼠标设置恢复为原始设置,以便您获得返回XF86Search
值):"xdotool click 2" XF86Search
启动 xbindkeys 并测试
跑步
xbindkeys
看看它是否有效。