You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux X11环境下C语言统计鼠标按键数异常问题求助

问题:使用XInput统计鼠标按键数量结果异常

我正在用C语言编写统计鼠标按键数量的程序,选择用XI.h实现,但程序运行结果不符合预期。

注:提供的代码来自一个更大的程序,包含的诸多库无需关注。

程序代码(mouse.c)

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/extensions/Xfixes.h>
#include <X11/extensions/XInput.h>
#include <X11/extensions/XI.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h> /* socket() connect() bind() listen() accept() socketpair() */
#include <sys/types.h>
#include <unistd.h> 
#include <string.h> /* strcpy() */
#include <stdio.h> /* perror() */
#include <errno.h> /* error numbers */
#include <stdlib.h>

int main ( void )
{
    XDeviceInfo mouse_info;
    XDeviceInfoPtr ptr_mouse_info;
    XDevice *mouse;
    XID mouse_id;
    XButtonInfoPtr ptr_mouse_buttons;
    XKeyInfoPtr ptr_mouse_keys;
    XValuatorInfoPtr ptr_mouse_axes;
    char * mouse_name;
    int num_devices, num_props, i;
    Display *display = XOpenDisplay(NULL);
    if (display == NULL)
    {
        perror("XOpenDisplay error");
        exit(-1);
    }
    
    ptr_mouse_info = XListInputDevices(display, &num_devices);
    for (i = 0; i < num_devices; i++)
    {
        if (XInternAtom(display, XI_MOUSE, 1) == ptr_mouse_info[i].type)
        {
            mouse_id=ptr_mouse_info[i].id;
            mouse_name=ptr_mouse_info[i].name;
            mouse = XOpenDevice(display, mouse_id);
            
            ptr_mouse_buttons = (XButtonInfoPtr)&ptr_mouse_info[i].inputclassinfo[ButtonClass];
            ptr_mouse_keys = (XKeyInfoPtr) &ptr_mouse_info[i].inputclassinfo[KeyClass];
            printf("Mouse name: %s\n", mouse_name);
            printf("Number of buttons: %d\n", ptr_mouse_buttons->num_buttons);
            printf("Number of keys: %d\n", ptr_mouse_keys->num_keys);
        }
    }
    printf("Mouse name: %s\n", mouse_name);
    printf("Number of buttons: %d\n", ptr_mouse_buttons->num_buttons);
    printf("Number of keys: %d\n", ptr_mouse_keys->num_keys);
    XFreeDeviceList(ptr_mouse_info);
    exit(0);
}

编译命令

cc mouse_test.c -lX11 -lXfixes -lXi -o mouse_test

程序输出(不符合预期)

我的鼠标实际有7个按键,但程序输出始终如下:

Mouse name: Logitech Mechanical keyboard Logitech Mechanical keyboard Keyboard
Number of buttons: 4
Number of keys: 2
Mouse name: ROCCAT ROCCAT Kone Pro Keyboard
Number of buttons: 4
Number of keys: 2
Mouse name: ROCCAT ROCCAT Kone Pro
Number of buttons: 4
Number of keys: 2
Mouse name: ROCCAT ROCCAT Kone Pro
Number of buttons: 4
Number of keys: 2

我怀疑这可能和Linux驱动有关,但不确定。


内容的提问来源于stack exchange,提问作者Loxbert Loxdogs Asher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:33:15