我想挂钩到linux桌面键事件处理.
按CapsLock应该输入某种命令行.
我想要实现的一些命令:
x.(灵感来自vi)这些命令应该适用于任何文本字段:浏览器,邮件客户端,gnome终端,...
AFAIK低级xmodmap在这里不会帮助我.
这样的事情可能吗?
我需要在哪里放钩?
目前的目标平台是Ubuntu> = 14.04
背景:我想把手指放在F和J上,然后在不看键盘的情况下使用电脑.几年以来一直适用于AZ,但是像Pos1/End这样的键不容易访问.
如果您不理解这个问题的一部分,请发表评论.谢谢.
更新
这个问题只是关于如何挂钩关键事件处理.其他东西(命令行)是一个不同的主题.你怎么能抓住这个例子CapsLock x?
Update2 我发现没有简单直接的解决方案.如果你没有答案,但你知道我可以在哪里找到更多的帮助(比如在邮件列表FOO上询问),请告诉我.
Update3 由于有些人不明白我想要什么,我试着解释一下:如果我使用emacs或者bash,我觉得如果计算机控制它:它就像飞行一样,只有很少的动作我可以告诉计算机去做我想要的是.在webbrowser textarea,LibreOffice或使用thunderbird编辑文本会让这种感觉消失.光标移动很麻烦,感觉不像是飞行.我想控制桌面,而不仅仅是一个应用程序,并指着F和J键.
这是一个更大的研究项目的子项目.我试图每隔100ms拍摄一个活动窗口(浏览器)的屏幕截图,然后将其存储在内存中以供OpenCV处理.我从类似的问题中找到了截取屏幕截图的解决方案,我正在使用代码来查看是否可以使用它.在拍摄整个桌面截图或特定的窗口截图时,以下代码段似乎正在工作,但它不适用于GTK窗口.我试图在Debian Squeeze上截取Iceweasel和Nautilus的截图,但它根本不起作用.我在X11中是一个总菜鸟,并且不知道如何检查错误,或者我是否缺少GTK,因为这似乎适用于QT窗口.
typedef int (*handler)(Display *, XErrorEvent *);
int handleX11Error(Display *d, XErrorEvent *er)
{
std::cout << "X11 Error: " << er->error_code << std::endl;
}
int main()
{
std::cout << "Sleeping 5 seconds" << std::endl;
// we may need to sleep if we want to focus another window.
sleep(5);
std::cout << "taking screenshot" << std::endl;
Display *display = XOpenDisplay(NULL);
//Window root = DefaultRootWindow(display);
XWindowAttributes gwa;
int revert = RevertToNone;
Window active;
XErrorEvent *error;
handler myHandler = &handleX11Error;
XSetErrorHandler(myHandler);
// X11 - …Run Code Online (Sandbox Code Playgroud) 我正在尝试用 C 语言实现一个简单的 X11 按键抓取器,用于使用 Alt-Tab 等进行窗口切换。我可以使用函数XSelectInput来处理特定窗口的键盘事件:
XSelectInput(display, window, KeyPressMask | KeyReleaseMask);
Run Code Online (Sandbox Code Playgroud)
无论聚焦哪个窗口,如何接收“全局”键盘事件?
我想监视在运行 X 的 Linux 系统上哪个窗口处于活动状态,以及该活动窗口何时调整大小或移动。我可以监视活动窗口(它保存在_NET_ACTIVE_WINDOW根窗口的属性中,我可以PropertyNotify在根窗口上注册事件以发现该属性何时发生变化)。但是,我不知道如何监视活动窗口以了解它是否被调整大小或移动。
import Xlib
import Xlib.display
disp = Xlib.display.Display()
Xroot = disp.screen().root
NET_ACTIVE_WINDOW = disp.intern_atom('_NET_ACTIVE_WINDOW')
Xroot.change_attributes(event_mask=Xlib.X.PropertyChangeMask)
while True:
# loop until an event happens that we care about
# we care about a change to which window is active
# (NET_ACTIVE_WINDOW property changes on the root)
# or about the currently active window changing
# in size or position (don't know how to do this)
event = disp.next_event()
if (event.type == Xlib.X.PropertyNotify and …Run Code Online (Sandbox Code Playgroud)