使用EVIOCSMASK过滤关键码

使用EVIOCSMASK过滤关键码,c,linux,ioctl,C,Linux,Ioctl,从/dev/input/event*文件读取时,我只希望接收带有代码224和225的EV_KEY事件。我该怎么做 据我所知,我需要运行ioctl(fd、EVIOCSMASK和mask),但我不知道如何按照我的规范设置struct input\u mask 我尝试将type设置为EV\u KEY,但这似乎会过滤掉EV\u KEY,如果我在code.*中设置任何内容(例如一个代码数组和指向它的指针),那么ioctl返回-1这里是一个如何设置掩码的示例 struct input_mask m

/dev/input/event*
文件读取时,我只希望接收带有代码
224
225
EV_KEY
事件。我该怎么做


据我所知,我需要运行
ioctl(fd、EVIOCSMASK和mask)
,但我不知道如何按照我的规范设置
struct input\u mask


我尝试将
type
设置为
EV\u KEY
,但这似乎会过滤掉
EV\u KEY
,如果我在
code.*
中设置任何内容(例如一个代码数组和指向它的指针),那么
ioctl
返回
-1
这里是一个如何设置掩码的示例

    struct input_mask mask;

    bitset_put(types, KEY_BRIGHTNESSDOWN); // event ID 224
    bitset_put(types, KEY_BRIGHTNESSUP); // event ID 225

    mask = (struct input_mask) {
            .type = EV_KEY,
            .codes_size = sizeof(types),
            .codes_ptr = PTR_TO_UINT64(types),
    };

    if (ioctl(b->fd, EVIOCSMASK, &mask) < 0)
    {
      //log the error here and check errno to get a nice description about the error
    }...
struct-input\u掩码;
位集输入(类型、键亮度下降);//事件ID 224
位集输入(类型、键亮度向上);//事件编号225
掩码=(结构输入\u掩码){
.type=电动钥匙,
.code_size=sizeof(类型),
.code_ptr=ptr_至_UINT64(类型),
};
if(ioctl(b->fd、EVIOCSMASK和mask)<0)
{
//在此处记录错误并检查errno以获得有关错误的详细描述
}...

正如您所看到的,代码很容易理解,您可以声明要接收的事件类型(此处为“EV_KEY”),然后使用一个数组筛选出可以获取的事件。下面是一个如何设置掩码的示例

    struct input_mask mask;

    bitset_put(types, KEY_BRIGHTNESSDOWN); // event ID 224
    bitset_put(types, KEY_BRIGHTNESSUP); // event ID 225

    mask = (struct input_mask) {
            .type = EV_KEY,
            .codes_size = sizeof(types),
            .codes_ptr = PTR_TO_UINT64(types),
    };

    if (ioctl(b->fd, EVIOCSMASK, &mask) < 0)
    {
      //log the error here and check errno to get a nice description about the error
    }...
struct-input\u掩码;
位集输入(类型、键亮度下降);//事件ID 224
位集输入(类型、键亮度向上);//事件编号225
掩码=(结构输入\u掩码){
.type=电动钥匙,
.code_size=sizeof(类型),
.code_ptr=ptr_至_UINT64(类型),
};
if(ioctl(b->fd、EVIOCSMASK和mask)<0)
{
//在此处记录错误并检查errno以获得有关错误的详细描述
}...
正如您所看到的,代码很容易理解,您可以声明要接收的事件类型(此处为“EV_KEY”),然后使用一个数组筛选出可以获得的事件。请参见:

事件掩码是每个客户端的掩码,用于指定要处理的事件 转发给客户。每个事件代码由单个位表示 在事件掩码中。如果设置了位,则将事件传递给客户端 通常

换言之:

#include <stdlib.h>
#include <limits.h>
#include <sys/ioctl.h>
#include <linux/input.h>
#include <errno.h>

#define  ULONG_BITS  (CHAR_BIT * sizeof (unsigned long))

static void set_bit(unsigned long bits[], size_t bit)
{
    bits[bit / ULONG_BITS] |= 1UL << (bit % ULONG_BITS);
}

static void set_keymask(int fd)
{
    unsigned long      bits[(KEY_CNT + ULONG_BITS - 1) / ULONG_BITS] = { 0 };
    struct input_mask  mask;

    mask.type = EV_KEY;
    mask.codes_size = KEY_CNT;
    mask.codes_ptr = &bits;

    /* Only report KEY_BRIGHTNESSDOWN and KEY_BRIGHTNESSUP */
    set_bit(bits, KEY_BRIGHTNESSDOWN);
    set_bit(bits, KEY_BRIGHTNESSUP);

    if (ioctl(fd, EVIOSMASK, &mask))
        return errno;

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#定义ULONG_位(CHAR_位*sizeof(无符号长))
静态无效集\位(无符号长位[],大小\位)
{
位[bit/ULONG_位]|=1UL查看:

事件掩码是每个客户端的掩码,用于指定要处理的事件 转发到客户端。每个事件代码由单个位表示 在事件掩码中。如果设置了位,则将事件传递给客户端 通常

换言之:

#include <stdlib.h>
#include <limits.h>
#include <sys/ioctl.h>
#include <linux/input.h>
#include <errno.h>

#define  ULONG_BITS  (CHAR_BIT * sizeof (unsigned long))

static void set_bit(unsigned long bits[], size_t bit)
{
    bits[bit / ULONG_BITS] |= 1UL << (bit % ULONG_BITS);
}

static void set_keymask(int fd)
{
    unsigned long      bits[(KEY_CNT + ULONG_BITS - 1) / ULONG_BITS] = { 0 };
    struct input_mask  mask;

    mask.type = EV_KEY;
    mask.codes_size = KEY_CNT;
    mask.codes_ptr = &bits;

    /* Only report KEY_BRIGHTNESSDOWN and KEY_BRIGHTNESSUP */
    set_bit(bits, KEY_BRIGHTNESSDOWN);
    set_bit(bits, KEY_BRIGHTNESSUP);

    if (ioctl(fd, EVIOSMASK, &mask))
        return errno;

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#定义ULONG_位(CHAR_位*sizeof(无符号长))
静态无效集\位(无符号长位[],大小\位)
{

bits[bit/ULONG_bits]|=1UL请发布您的代码。如果没有详细的细节,很难为您提供帮助。谢谢!您可以使用简单的输入事件结构,从设备读取并检查所需的密钥代码。根据我的推断,尝试以下操作:通过过滤类型为0的EV位来启用EV_密钥&(struct input_mask){0,1,(uint64_t[1]){1请发布您的代码。如果没有详细的细节,很难为您提供帮助。谢谢!您可以使用简单的input_事件结构,从设备读取并根据我的推断检查所需的密钥代码。尝试以下操作:通过过滤类型为0
ioctl(fd,EVIOSMASK&(结构输入_掩码){0,1,(uint64_t[1]){1