Linux X11 C想知道屏幕上任何地方的指针运动

时间:2014-12-31 15:00:14

标签: c linux hook x11

我想编写一个小窗口程序,它将在屏幕上的任何位置显示指针位置(和其他信息)。我不想破坏所有其他程序运行中鼠标的正常使用。有没有办法去"勾"指针运动事件,或者如何在事件循环中设置用于轮询指针位置的计时器事件?

1 个答案:

答案 0 :(得分:2)

我想指出Xautolock code queryPointer function,它会找出鼠标的位置。如果你在main.cdiy.c中挖掘,你应该获得足够的信息,说明根据鼠标光标位置和空闲超时采取行动的必要条件。

实际上,它只使用XQueryPointer来获取信息。但是,您应该记住,所有鼠标移动都是相对的,因此您必须根据初始位置保持状态。示例代码见another SO thread

修改

由于Xautolock代码显然不是很明显,所以我对那些我认为你正在寻找的东西进行了抨击。这是一组最小的代码,只是将x / y坐标转储到stdout。如果你想静态地使用它们,你将不得不创建和定位一个窗口来绘制一些文本。按照此代码的分辨率为1ms进行轮询,程序在我的机器上占用大约0.1%的CPU(Intel(R) Core(TM) i7-4558U CPU @ 2.80GHz)。

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

#include <X11/Xos.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#include <X11/Xresource.h>

static Window root;

static void
query_pointer(Display *d)
{
  static int once;
  int i, x, y;
  unsigned m;
  Window w;

  if (once == 0) {
    once = 1;
    root = DefaultRootWindow(d);
  }

  if (!XQueryPointer(d, root, &root, &w, &x, &y, &i, &i, &m)) {
    for (i = -1; ++i < ScreenCount(d); ) {
      if (root == RootWindow(d, i)) {
        break;
      } 
    }
  }

  fprintf(stderr, "X: %d Y: %d\n", x, y);
}

static int
catchFalseAlarm(void)
{
  return 0;
}   

int 
main(void)
{
  XSetWindowAttributes attribs;
  Display* d;
  Window w;

  if (!(d = XOpenDisplay(0))) {
    fprintf (stderr, "Couldn't connect to %s\n", XDisplayName (0));
    exit (EXIT_FAILURE);
  }

  attribs.override_redirect = True;
  w = XCreateWindow(d, DefaultRootWindow (d), -1, -1, 1, 1, 0,
         CopyFromParent, InputOnly, CopyFromParent,
         CWOverrideRedirect, &attribs);
  XMapWindow(d, w);
  XSetErrorHandler((XErrorHandler )catchFalseAlarm);
  XSync (d, 0);

  for (;;) {
    query_pointer(d);
    usleep(1000);
  }

  return 0;
}