C++ 带有X11/xlib的Ubuntu热键,X错误:BadAccess

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

我正在尝试创建一个完全基于热键的应用程序,我使用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 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;
}
否则,仅对这些错误值进行解释并不能得到精确的键组合,我认为是哪个进程/客户端已经捕获了它。

也许该线程有助于: