这可以是一些示例 C 代码,也可以是一个实用程序,可以向我显示 gui 或在控制台上没关系,但我必须能够“命令”它在准确的时间获取坐标,这使得xev 不是很有用(我可以弄清楚)。
问问题
20068 次
4 回答
16
我无论如何都不是 C 程序员,但我查看了一些在线教程,并认为这就是你应该如何读取当前鼠标位置的方式。这是我自己的代码,之前我没有对 Xlib 做任何事情,所以它可能会被完全破坏(例如,错误处理程序不应该对每个错误都不做任何事情)但它可以工作。所以这是另一个解决方案:
#include <X11/Xlib.h>
#include <assert.h>
#include <unistd.h>
#include <stdio.h>
#include <malloc.h>
static int _XlibErrorHandler(Display *display, XErrorEvent *event) {
fprintf(stderr, "An error occured detecting the mouse position\n");
return True;
}
int main(void) {
int number_of_screens;
int i;
Bool result;
Window *root_windows;
Window window_returned;
int root_x, root_y;
int win_x, win_y;
unsigned int mask_return;
Display *display = XOpenDisplay(NULL);
assert(display);
XSetErrorHandler(_XlibErrorHandler);
number_of_screens = XScreenCount(display);
fprintf(stderr, "There are %d screens available in this X session\n", number_of_screens);
root_windows = malloc(sizeof(Window) * number_of_screens);
for (i = 0; i < number_of_screens; i++) {
root_windows[i] = XRootWindow(display, i);
}
for (i = 0; i < number_of_screens; i++) {
result = XQueryPointer(display, root_windows[i], &window_returned,
&window_returned, &root_x, &root_y, &win_x, &win_y,
&mask_return);
if (result == True) {
break;
}
}
if (result != True) {
fprintf(stderr, "No mouse found.\n");
return -1;
}
printf("Mouse is at (%d,%d)\n", root_x, root_y);
free(root_windows);
XCloseDisplay(display);
return 0;
}
于 2010-08-28T17:18:11.160 回答
1
实际上,xev 非常有用,如果您将使用 xwininfo 抓取的窗口 id 提供给它,那么它可以轻松地为您执行此任务。毫无疑问,有更优雅的解决方案,但它确实有效。
于 2010-08-27T15:50:59.927 回答
0
xinput 可用于打印任何输入设备的完整设备状态。
首先,您需要发现您的设备 ID:
$ xinput --list | grep -i mouse
⎜ ↳ Logitech USB Receiver Mouse id=11 [slave pointer (2)]
然后你可以要求状态:
$ xinput --query-state 11;
2 classes :
ButtonClass
button[1]=up
button[2]=up
button[3]=up
button[4]=up
button[5]=up
button[6]=up
button[7]=up
button[8]=up
button[9]=up
button[10]=up
button[11]=up
button[12]=up
button[13]=up
button[14]=up
button[15]=up
button[16]=up
button[17]=up
button[18]=up
button[19]=up
button[20]=up
ValuatorClass Mode=Relative Proximity=In
valuator[0]=274
valuator[1]=886
valuator[2]=0
valuator[3]=675
或者只是一个循环:
while sleep .2; do xinput --query-state $(xinput --list | grep -i mouse | cut -d= -f2 | cut -f1| head -1); done
于 2020-01-06T18:40:01.650 回答