捕获Linux中的输入

时间:2008-09-24 07:19:48

标签: c++ linux

首先,是的我知道this question,但我正在寻找更多信息。实际上,我有一个相当类似的问题,因为我需要能够捕获鼠标/键盘/操纵杆的输入,而且我还想尽可能避免使用SDL。我或多或少想知道是否有人知道在哪里可以获得一些关于处理来自Linux设备的输入的一些不错的引物,甚至可能是一些教程。 SDL非常适合跨平台输入处理,但我不会在SDL中使用任何其他东西,所以我想完全删除它。建议,意见和帮助都表示赞赏。谢谢!

为清晰起见编辑:

重点是捕捉鼠标动作,键盘按下/释放,鼠标点击以及游戏的潜在操纵杆处理。

5 个答案:

答案 0 :(得分:5)

使用下面的链接查看函数void kGUISystemX :: Loop(void)

这是我在Linux上使用X Windows通过键盘和鼠标输入的主要循环。

http://code.google.com/p/kgui/source/browse/trunk/kguilinux.cpp

这是一个片段:

    if(XPending(m_display))
    {
        XNextEvent(m_display, &m_e);
        switch(m_e.type)
        {
        case MotionNotify:
            m_mousex=m_e.xmotion.x;
            m_mousey=m_e.xmotion.y;
        break;
        case ButtonPress:
            switch(m_e.xbutton.button)
            {
            case Button1:
                m_mouseleft=true;
            break;
            case Button3:
                m_mouseright=true;
            break;
            case Button4:/* middle mouse wheel moved */
                m_mousewheel=1;
            break;
            case Button5:/* middle mouse wheel moved */
                m_mousewheel=-1;
            break;
            }
        break;
        case ButtonRelease:
            switch(m_e.xbutton.button)
            {
            case Button1:
                m_mouseleft=false;
            break;
            case Button3:
                m_mouseright=false;
            break;
            }
        break;
        case KeyPress:
        {
            XKeyEvent *ke;
            int ks;
            int key;

            ke=&m_e.xkey;
            kGUI::SetKeyShift((ke->state&ShiftMask)!=0);
            kGUI::SetKeyControl((ke->state&ControlMask)!=0);
            ks=XLookupKeysym(ke,(ke->state&ShiftMask)?1:0);
......

答案 1 :(得分:2)

如果你知道你的项目只能在Linux下运行(不是Windows甚至是其中一个BSD),你应该查看Linux内核的输入系统。下载kernel source并阅读Documentation/input/input.txt,尤其是evdev系统的说明。

对于更高级别(更便携)的解决方案,read up on Xlib。显然它需要一个正在运行的X服务器,但它具有继承用户键盘设置的优点。遗憾的是,不包括游戏杆事件,您可能需要使用内核操纵杆API。

答案 2 :(得分:1)

答案 3 :(得分:1)

您没有说明您的应用程序的目的,但是从输入设备读取原始数据很少是您想要的,除非您只是为了娱乐(或学校项目或其他)而这样做

如果您正在编写GUI应用程序(在X11图形环境中运行),您可以依赖图形工具包(或原始X)输入驱动程序。

如果您正在编写文本模式客户端,那么readline甚至ncurses可能是不错的选择。

答案 4 :(得分:-1)

您可以从/ dev / input中的文件直接输入。这是最简单的方法,您不需要任何额外的软件。