首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从未发送过KeyRelease事件

从未发送过KeyRelease事件
EN

Stack Overflow用户
提问于 2011-03-12 04:20:22
回答 2查看 1.2K关注 0票数 0

我有一个小问题,捕捉一个关键释放的事件,以阻止我的角色在我的游戏中行走。

我正在尝试这样做:

代码语言:javascript
复制
switch (xev.type)
    {
        case Expose:
        {
            XGetWindowAttributes(dpy, win, &gwa);
            glViewport(0, 0, gwa.width, gwa.height);
        }
        break;

        case KeyPress:
            {
                int key = XLookupKeysym(&xev.xkey, 0);
                if (key == XK_Escape)
                {
                    glXMakeCurrent(dpy, None, NULL);
                    glXDestroyContext(dpy, glc);
                    XDestroyWindow(dpy, win);
                    XCloseDisplay(dpy);

                    running = false;
                    return 0;
                }
                else
                {
                    input->setKey(key, true);
                }
            }
            break;

        case KeyRelease:
            {
                unsigned short is_retriggered = 0;

                if (XEventsQueued(dpy, QueuedAfterReading))
                {
                    XEvent nev;
                    XPeekEvent(dpy, &nev);

                    if (nev.type == KeyPress && nev.xkey.time
                            == xev.xkey.time && nev.xkey.keycode
                            == xev.xkey.keycode)
                    {
                        // delete retriggered KeyPress event
                        XNextEvent(dpy, &xev);
                        is_retriggered = 1;
                    }
                }

                if (!is_retriggered)
                    input->setKey(XLookupKeysym(&xev.xkey, 0), false);
            }
            break;
    }

但我只得到重新触发的按键释放事件,这是我不想要的。(即使释放/重新按下也会有相同的结果,但将来可能会出现问题)当我物理释放该键时,没有捕捉到任何事件。

哦,input->setKey()基本上就是在std::map中将bool设置为true (或false),没什么特别的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-14 19:06:53

这是一个常见的陷阱。如果您没有注册特定事件(或所有事件),您将不会收到通知。我们所有人,无论经历了什么,都会在这一天坠落...:)

一些有用的完整链接:

  • XSelectInput @Xorg
  • XSelectInput @tronche
  • Anatomy of the most basic Xlib program
票数 1
EN

Stack Overflow用户

发布于 2011-03-12 06:57:33

注册KeyReleaseMask解决了这个问题。

XSelectInput(dis, win, KeyPressMask | KeyReleaseMask);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5277885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档