Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在linux中读取低级鼠标点击位置。_C++_Linux_Mouse - Fatal编程技术网

C++ 如何在linux中读取低级鼠标点击位置。

C++ 如何在linux中读取低级鼠标点击位置。,c++,linux,mouse,C++,Linux,Mouse,我使用这段代码从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 in

我使用这段代码从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;
}
#包括
#包括
#包括
#包括
#包括
#定义鼠标文件“/dev/input/event4”
int main()
{
int-fd;
结构输入\事件ie;
如果((fd=open(MOUSEFILE,orduonly))=-1){
perror(“开启装置”);
退出(退出失败);
}
while(读取(fd,&ie,sizeof(struct input_事件))){
printf(“时间%ld.%06ld\t类型%d\t代码%d\t值%d\n”,
ie.time.tv_sec,ie.time.tv_usec,ie.type,ie.code,ie.value);
}
返回0;
}
它以以下格式给出了结果:

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

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

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

“值”是事件所承载的值。或者是一个相对的变化 EV_REL,EV_ABS(操纵手柄…)的绝对新值,或EV_钥匙的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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义鼠标文件“/dev/input/event4”
int main()
{
int-fd;
结构输入\事件ie;
显示*dpy;
窗根,子;
int rootX,rootY,winX,winY;
无符号整数掩码;
dpy=XOpenDisplay(空);
XQueryPointer(dpy、DefaultRootWindow(dpy)、根目录和子目录、,
&rootX,&rootY,&winX,&winY,&mask);
如果((fd=open(MOUSEFILE,orduonly))=-1){
perror(“开启装置”);
退出(退出失败);
}
while(读取(fd,&ie,sizeof(struct input_事件))){
如果(即类型==2){
如果(即代码==0){
XQueryPointer(dpy、DefaultRootWindow(dpy)、根目录和子目录、,
&rootX,&rootY,&winX,&winY,&mask);
//rootX+=ie.value;
}
else if(即,代码==1){
XQueryPointer(dpy、DefaultRootWindow(dpy)、根目录和子目录、,
&rootX,&rootY,&winX,&winY,&mask);
//rootY+=ie.value;
}
printf(“时间%ld.%06ld\tx%d\ty%d\n”,
ie.time.tv_sec,ie.time.tv_usec,rootX,rootY);
}否则
printf(“时间%ld.%06ld\t类型%d\t代码%d\t值%d\n”,
ie.time.tv_sec,ie.time.tv_usec,ie.type,ie.code,ie.value);
}
返回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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义鼠标文件“/dev/input/event6”
int main()
{
int-fd;
结构输入\事件ie;
显示*dpy;
窗根,子;
int rootX,rootY,winX,winY;
无符号整数掩码;
dpy=XOpenDisplay(空);
XQueryPointer(dpy、DefaultRootWindow(dpy)、根目录和子目录、,
&rootX,&rootY,&winX,&winY,&mask);
如果((fd=open(MOUSEFILE,orduonly))=-1){
perror(“开启装置”);
退出(退出失败);
}
while(读取(fd,&ie,sizeof(struct input_事件))){
如果(即类型==2){
如果(ie.code==0){rootX+=ie.value;}
如果(ie.code==1){rootY+=ie.value;}
printf(“时间%ld.%06ld\tx%d\ty%d\n”,
ie.time.tv_sec,ie.time.tv_usec,rootX,rootY);
}else if(即type==1){
如果(即代码==272){
printf(“鼠标按钮”);
如果(即值==0)
printf(“已发布!!\n”);
如果(即值==1)
printf(“按下!!\n”);
}否则{
printf(“时间%ld.%06ld\t类型%d\t代码%d\t值%d\n”,
ie.time.tv_sec,ie.time.tv_usec,ie.type,ie.code,ie.value);
}
}
返回0;
}

Hi,代码看起来非常优雅。谢谢。但它给了我以下错误:1.
未定义对XOpenDisplay的引用
,2.
未定义对XQueryPointer的引用
。您需要使用X11库编译:
gcc main.c-lX11
。是的,它工作了:)。但是坐标混乱,0,0点在某个地方屏幕之间。我理解问题所在,当我走到屏幕的角落时,鼠标无法移动,但它仍在不断增加mmouse坐标的值。可能的解决方案是什么?@rajat在代码中添加了一个按钮示例。希望能有所帮助