【问题标题】:Capturing Input in Linux在 Linux 中捕获输入
【发布时间】:2008-09-24 07:19:47
【问题描述】:

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

为清楚起见进行编辑:

重点是捕捉游戏的鼠标运动、键盘按下/释放、鼠标点击和潜在的操纵杆处理。

【问题讨论】:

  • 我觉得这个问题相当广泛。直接与输入设备对话? (对于高级应用程序来说通常是个坏主意。)使用 X? (如果是 X,你想要 Xlib、XCB、Gtk+、Qt、...)控制台模式下鼠标的 GPM?

标签: c++ linux


【解决方案1】:

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

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

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

这是一个sn-p:

    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);
......

【讨论】:

    【解决方案2】:

    如果您知道您的项目只能在 Linux(而不是 Windows 或什至 BSD 之一)下运行,您应该查看 Linux 内核的输入系统。下载kernel source并阅读Documentation/input/input.txt,尤其是evdev系统的描述。

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

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-13
            • 1970-01-01
            • 2013-04-24
            • 1970-01-01
            相关资源
            最近更新 更多