如何在c中获取鼠标滚轮事件



我正在尝试从/dev/input/Mice 文件中读取鼠标事件。我能够解析3个字节鼠标输入,以获取三个按钮状态以及x和y坐标中的增量。但是,当我向下滚动时,鼠标输入与下滚动时相同。如何将滚动活动与向下滚动活动区分开?是否有任何 ioctls 可以执行任何必需的配置,以便我在这两个事件上从鼠标中获得不同的输入?

以下是一个简单的程序,可以在发生鼠标事件时查看鼠标的输入。向上滚动并向下滚动事件导致此程序打印相同的输出(即8 0 0)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
int main(void) {
    int mouse_fd = open("/dev/input/mice", O_RDONLY | O_NONBLOCK);
    signed char input[4];
    ssize_t rd_cnt;
    if(mouse_fd < 0)
    {
        perror("Could not open /dev/input/mice");
        exit(EXIT_FAILURE);
    }
    while(true)
    {
        errno = 0;
        rd_cnt = read(mouse_fd, input, 4);
        if(rd_cnt <= 0 && errno != EAGAIN)
        {
            perror("Mouse read error:");
            exit(EXIT_FAILURE);
        }
        else
        {
            for(int i = 0; i < rd_cnt; i++)
            {
                printf("%d", input[i]);
                if(i == rd_cnt - 1)
                {
                    printf("n");
                }
                else
                {
                    printf("t");
                }
            }
        }
    }
    return 0;
}

替代方案是使用sdl2。

我已经设法将读取鼠标输入的示例与SDL融合在一起,因此请从中拿出您喜欢的东西。

#include <SDL2/SDL.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

char* itoa(int i, char b[]){
    char const digit[] = "0123456789";
    char* p = b;
    if(i<0){
        *p++ = '-';
        i *= -1;
    }
    int shifter = i;
    do{ //Move to where representation ends
        ++p;
        shifter = shifter/10;
    }while(shifter);
    *p = '';
    do{ //Move back, inserting digits as u go
        *--p = digit[i%10];
        i = i/10;
    }while(i);
    return b;
}
int main()
{
    //initialize the window
    bool quit = false;
    SDL_Init(SDL_INIT_VIDEO);
    SDL_Window* window = SDL_CreateWindow("Mouse Events", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0);
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);
    // the event that will occur when a mouse event happens
    SDL_Event event;
    while(!quit)
    {
        while (SDL_PollEvent(&event)) //returns one is there is a pending event (if an event happens)
        {
            switch(event.type)
            {
                case SDL_QUIT: //if the window is exited
                    quit = true;
                    break;
                case SDL_MOUSEBUTTONDOWN:
                    switch (event.button.button)
                    {
                        case SDL_BUTTON_LEFT:
                            SDL_ShowSimpleMessageBox(0, "Click", "Left button was pressed!", window);
                            break;
                        case SDL_BUTTON_RIGHT:
                            SDL_ShowSimpleMessageBox(0, "Click", "Right button was pressed!", window);
                            break;
                    }
                    break;
                case SDL_MOUSEWHEEL:
                    if(event.wheel.y == -1) //negative means the scroll wheel has gone away from the user
                    {
                        SDL_ShowSimpleMessageBox(0, "Wheel Event", "You rolled away from yourself!", window);
                    } else if (event.wheel.y == 1) //vice-versa
                    {
                        SDL_ShowSimpleMessageBox(0, "Wheel Event", "You rolled towards yourself!", window);
                    }
            }
        }
        //do some SDL cleanup
        SDL_Rect dstrect = { 288, 208, 64, 64 };
        SDL_RenderClear(renderer);
        SDL_RenderPresent(renderer);
    }
}

event.wheel类型可以在此处找到:https://wiki.libsdl.org/sdl_mousewheelevent

希望这对您有用!

如果您不想使用SDL2,则可能值得看看库的来源,看看它在做什么。

相关内容

  • 没有找到相关文章

最新更新