当前位置: 首页 > 面试题库 >

如何在Linux中读取低级鼠标单击位置。

姬慎之
2023-03-14
问题内容

我正在使用此代码从linux中的dev / input / event *读取鼠标事件。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <linux/input.h>
#include <fcntl.h>

#define MOUSEFILE "/dev/input/event4"

int main()
{
    int fd;
    struct input_event ie;

    if((fd = open(MOUSEFILE, O_RDONLY)) == -1) {
        perror("opening device");
        exit(EXIT_FAILURE);
    }

    while(read(fd, &ie, sizeof(struct input_event))) {
        printf("time %ld.%06ld\ttype %d\tcode %d\tvalue %d\n",
               ie.time.tv_sec, ie.time.tv_usec, ie.type, ie.code, ie.value);

}
    return 0;
}

它给我的结果格式:

时间1342517261.840285类型2代码0值-1

“时间”是时间戳,它返回事件发生的时间。

“代码”是事件代码,例如REL_X或KEY_BACKSPACE,完整列表位于include / linux / input.h中。

“价值”是事件带来的价值。EV_REL的相对更改,EV_ABS(操纵杆…)的绝对新值,或EV_KEY的释放为0,按键为1以及自动重复为2。

当我单击时,我得到了事件,但没有在屏幕上获得鼠标的位置,如何在屏幕上获得鼠标的位置。

编辑1:所以事实证明我必须使用相对坐标来获取鼠标坐标。我相信这是一个普遍的要求,因此可能会有库/预先存在的代码可用于获取坐标。关于该主题的任何信息将非常有用。

Edit2:解决方案

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <linux/input.h>
#include <fcntl.h>
#include <X11/Xlib.h>

#define MOUSEFILE "/dev/input/event4"

int main()
{
  int fd;
  struct input_event ie;
  Display *dpy;
  Window root, child;
  int rootX, rootY, winX, winY;
  unsigned int mask;

  dpy = XOpenDisplay(NULL);
  XQueryPointer(dpy,DefaultRootWindow(dpy),&root,&child,
              &rootX,&rootY,&winX,&winY,&mask);

  if((fd = open(MOUSEFILE, O_RDONLY)) == -1) {
    perror("opening device");
    exit(EXIT_FAILURE);
  }

  while(read(fd, &ie, sizeof(struct input_event))) {
    if (ie.type == 2) {
      if (ie.code == 0) {
          XQueryPointer(dpy,DefaultRootWindow(dpy),&root,&child,
                        &rootX,&rootY,&winX,&winY,&mask);
          //rootX += ie.value;
          }
      else if (ie.code == 1) {
          XQueryPointer(dpy,DefaultRootWindow(dpy),&root,&child,
                        &rootX,&rootY,&winX,&winY,&mask);
         // rootY += ie.value;
          }
      printf("time%ld.%06ld\tx %d\ty %d\n",
         ie.time.tv_sec, ie.time.tv_usec, rootX, rootY);
    } else
      printf("time %ld.%06ld\ttype %d\tcode %d\tvalue %d\n",
          ie.time.tv_sec, ie.time.tv_usec, ie.type, ie.code, ie.value);
  }
  return 0;
}

XQueryPointer似乎是更方便的解决方案。谢谢@perreal的指导。


问题答案:

您可以从X11获取初始位置,并使用相对坐标来跟踪指针:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <linux/input.h>
#include <fcntl.h>
#include <X11/Xlib.h>

#define MOUSEFILE "/dev/input/event6"

int main()
{
  int fd;
  struct input_event ie;
  Display *dpy;
  Window root, child;
  int rootX, rootY, winX, winY;
  unsigned int mask;

  dpy = XOpenDisplay(NULL);
  XQueryPointer(dpy,DefaultRootWindow(dpy),&root,&child,
              &rootX,&rootY,&winX,&winY,&mask);

  if((fd = open(MOUSEFILE, O_RDONLY)) == -1) {
    perror("opening device");
    exit(EXIT_FAILURE);
  }

  while(read(fd, &ie, sizeof(struct input_event))) {
    if (ie.type == 2) {
      if (ie.code == 0) { rootX += ie.value; }
      else if (ie.code == 1) { rootY += ie.value; }
      printf("time%ld.%06ld\tx %d\ty %d\n", 
         ie.time.tv_sec, ie.time.tv_usec, rootX, rootY);
    } else if (ie.type == 1) {
      if (ie.code == 272 ) { 
        printf("Mouse button ");
        if (ie.value == 0)  
          printf("released!!\n");
        if (ie.value == 1)  
          printf("pressed!!\n");
    } else {
        printf("time %ld.%06ld\ttype %d\tcode %d\tvalue %d\n",
            ie.time.tv_sec, ie.time.tv_usec, ie.type, ie.code, ie.value);
    }
  }
  return 0;
}


 类似资料:
  • 所以我开始在我的应用程序中为不同的功能设置键,我想知道是否有一种方法可以设置鼠标左键或右键来执行某些操作?我在keycode.java中找不到任何鼠标事件,我不知道如何应用它。 下面是我的代码: 我要完成的是使右键点击你的鼠标按钮停止移动,左键点击再次开始。我该怎么做?谢谢你。

  • 问题内容: 我很难理解如何使用JQuery模拟鼠标单击。有人可以告诉我我做错了什么吗? HTML: jQuery的: 当我单击#foo按钮时,我想模拟对#bar的单击,但是当我尝试这样做时,什么也没有发生。我也尝试过但没有成功。 问题答案: 您需要使用模拟实际的DOM元素(而不是jQuery对象)上的鼠标单击,而不是使用jQuery方法。 注意:DOM Level 2在Safari中的某些元素上不

  • 我试图在图片框上获取鼠标点击坐标,并将信息放入文本框中。 我可以在表单中获取鼠标单击坐标,但无法在picturebox中获取鼠标坐标(当我在picturebox中单击时,不会发生任何事情)。我已经看过了stackoverflow类似问题的答案,但似乎没有什么对我有用。 这是我的完整代码:

  • 问题内容: 我需要一个JavaScript代码来单独使鼠标双击。我将在Java代码中使用它。这是一个用于测试目的的selenium项目,但是没有任何方法可以使鼠标双击selenium,因此我想使用javaScript在我的java代码中执行此操作。你有什么主意吗? 他们说我应该使用JavaScript双击鼠标,但是怎么做? 问题答案: 为了使 您可以编写脚本并将其传递给方法,如下所示: 剧本: “

  • 现在我有一个应用程序,可以让用户单击按钮浏览用作画布背景的图片。我想这样做,如果用户单击画布上的某个地方,则在该点放置一个节点。我假设我需要获取鼠标坐标。有没有一个简单的方法可以调用将节点放置在鼠标单击位置,或者我必须在这个链接中选择路线:WPF-使用鼠标事件在画布上绘图?提前谢谢。 编辑:添加了我尝试制作椭圆的代码。不过它不起作用,而且我不确定如何使用鼠标点击椭圆的坐标。我知道对于一行来说,它只

  • 问题内容: 在Linux下如何使用C程序在X窗口中设置 鼠标 光标的位置?谢谢:)(就像WIN中的setcursorpos()一样) 编辑:我尝试过此代码,但不起作用: 问题答案: 12.4- 移动指针 尽管通常 应将 指针的移动留给最终用户控制,但有时有必要在程序控制下将指针移动到新位置。 要将指针移动到窗口中的任意点,请使用XWarpPointer()。 例: