C++ 带有X11/xlib的Ubuntu热键,X错误:BadAccess
我正在尝试创建一个完全基于热键的应用程序,我使用Xlib编写了一些代码,这些代码在CentOS 6上非常有效。。当我在我们的Ubuntu(14.04)开发环境中尝试时,我得到了这个例外C++ 带有X11/xlib的Ubuntu热键,X错误:BadAccess,c++,c,ubuntu,xlib,C++,C,Ubuntu,Xlib,我正在尝试创建一个完全基于热键的应用程序,我使用Xlib编写了一些代码,这些代码在CentOS 6上非常有效。。当我在我们的Ubuntu(14.04)开发环境中尝试时,我得到了这个例外 X Error of failed request: BadAccess (attempt to access private resource denied) Major opcode of failed request: 33 (X_GrabKey) Serial number of failed
X Error of failed request: BadAccess (attempt to access private resource denied)
Major opcode of failed request: 33 (X_GrabKey)
Serial number of failed request: 10
Current serial number in output stream: 13
这是密码
void* manage_hotkeys(void* arg)
{
Window root;
XEvent ev;
Display* dpy = XOpenDisplay(0);
char* ckeystr = "c";
...
if (!dpy)
{
printf("Failed to get Display\n");
exit(EXIT_FAILURE);
}
root = DefaultRootWindow(dpy);
KeyCode ckey = XKeysymToKeycode(dpy, XStringToKeysym(ckeystr)); // control panel
// grab keys
XGrabKey(dpy, ckey, AnyModifier, root, True, GrabModeAsync, GrabModeAsync);
....
while (1)
{
printf("Beginning of hotkey loop\n");
XNextEvent(dpy, &ev);
if (ev.type == KeyPress)
{
printf("Key press event!\n");
if (ev.xkey.keycode == ckey)
{
// stuff...
} else if .....
} // if
} // while
...
XUngrabKey(dpy, ckey, AnyModifier, root);
...
pthread_exit(NULL);
} // hotkeythread
我已经查看了其他SO线程(),但它们似乎不适用于我,我正在侦听单键(例如“c”)。我用C语言编写的代码不多,所以我有点生疏,使用了第一个有效的示例(至少在CentOS上),请帮助我调试
根据我的研究,我认为Ubuntu中的某些进程已经抓住了关键点还是什么?我怎样才能知道这个过程是什么?有没有其他我忽略的方法?我只需要抓取键盘输入,而不考虑焦点窗口,xgrabkey看起来是最简单的方法。。。请帮助可以使用函数在应用程序中截获“失败请求的X错误”错误(也被视为例外)
单独设置此错误处理程序可完全消除意外退出。因此,可能需要截取特定错误,忽略或记录它,然后使所有其他错误仍然终止应用程序。这可以通过解释结构来实现,比如:
// Early in your application
XSetErrorHandler( x_error_handler );
//...
int x_error_handler( Display* dpy, XErrorEvent* pErr )
{
printf("X Error Handler called, values: %d/%lu/%d/%d/%d\n",
pErr->type,
pErr->serial,
pErr->error_code,
pErr->request_code,
pErr->minor_code );
if( pErr->request_code == 33 ){ // 33 (X_GrabKey)
if( pErr->error_code == BadAccess ){
printf("ERROR: A client attempts to grab a key/button combination already\n"
" grabbed by another client. Ignoring.\n");
return 0;
}
}
exit(1); // exit the application for all unhandled errors.
return 0;
}
否则,仅对这些错误值进行解释并不能得到精确的键组合,我认为是哪个进程/客户端已经捕获了它。也许该线程有助于: