我想知道如何在屏幕上的任何位置使用Xlib获取鼠标点击的x和y坐标。我发现这个帖子获取当前指针位置
How can I get the current mouse (pointer) position co-ordinates in X,
但我不知道如何修改它,以便在单击鼠标时获取x y坐标。 我试过写这段代码,但它什么也没做。
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
int main (){
int x=-1,y=-1;
XEvent event;
int button;
Display *display = XOpenDisplay(NULL);
if (display == NULL) {
fprintf(stderr, "Cannot connect to X server!\n");
exit (EXIT_FAILURE);
}
Window root= XDefaultRootWindow(display);
XSelectInput(display, root, ButtonReleaseMask) ;
while(1){
XNextEvent(display,&event);
switch(event.type){
case ButtonRelease:
switch(event.xbutton.button){
case Button1:
x=event.xbutton.x;
y=event.xbutton.y;
button=Button1;
break;
case Button3:
x=event.xbutton.x;
y=event.xbutton.y;
button=Button3;
break;
default:
break;
}
break;
default:
break;
}
if(x>=0 && y>=0)break;
}
if(button==Button1)printf("leftclick at %d %d \n",x,y);
else printf("rightclick at %d %d \n",x,y);
XCloseDisplay(display);
return 0;
}
事件可能会发送到其他窗口,这就是它无法正常工作的原因。另一个问题是,当我将ButtonPressMask添加到XSelectInput函数时,我收到以下错误:
X Error of failed request: BadAccess (attempt to access private resource denied)
Major opcode of failed request: 2 (X_ChangeWindowAttributes)
Serial number of failed request: 7
Current serial number in output stream: 7
如果在C中有更简单的方法,我很高兴听到它。
答案 0 :(得分:2)
你可能需要抓住指针。
我不知道您是否只想要按下按钮发布。我已将其更改为印刷机,但您可以选择:
XSelectInput(display, root, ButtonPressMask|ButtonReleaseMask) ;
并将ButtonRelease案例添加回来。
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
int main (){
int x=-1,y=-1;
XEvent event;
int button;
Display *display = XOpenDisplay(NULL);
if (display == NULL) {
fprintf(stderr, "Cannot connect to X server!\n");
exit (EXIT_FAILURE);
}
Window root= XDefaultRootWindow(display);
XGrabPointer(display, root, False, ButtonPressMask, GrabModeAsync,
GrabModeAsync, None, None, CurrentTime);
XSelectInput(display, root, ButtonPressMask) ;
while(1){
XNextEvent(display,&event);
switch(event.type){
case ButtonPress:
switch(event.xbutton.button){
case Button1:
x=event.xbutton.x;
y=event.xbutton.y;
button=Button1;
break;
case Button3:
x=event.xbutton.x;
y=event.xbutton.y;
button=Button3;
break;
default:
break;
}
break;
default:
break;
}
if(x>=0 && y>=0)break;
}
if(button==Button1)printf("leftclick at %d %d \n",x,y);
else printf("rightclick at %d %d \n",x,y);
XCloseDisplay(display);
return 0;
}
答案 1 :(得分:1)
如果在C中有更简单的方法,我很高兴听到它。
完美!然后使用一些人已为您制作的libxdo library。
int x, y, scrn;
xdo_t *hndl = xdo_new(NULL);
xdo_mouselocation(hndl, &x, &y, &scrn);
xdo_free(hndl);
printf("Mouse coordinates: x = %4d, y = %4d\n", x, y);
答案 2 :(得分:1)
我知道这是几年之后所以这对其他人来说是有用的。首先,使用另一个库不符合我更容易的定义。我自己只使用xlib和C来处理需要的东西,我想看看我能编写代码有多简单。
基本上你只需要四行代码就可以在现有程序的xlib中执行此操作,剩下的就是你要如何处理它,printf / sprintf,grab_pixel_color(显示*显示,XColor *颜色)等。< / p>
/** gcc position.c -o position -lX11 **/
#include <X11/Xlib.h>
#include <stdio.h>
int main (int argc, char **argv) {
Window root_window; //<--one
int root_x, root_y; //<--two
unsigned int mask; //<--three
Display *display = XOpenDisplay(NULL);
/*
Bool XQueryPointer(display, w, root_return, child_return, root_x_return, root_y_return,
win_x_return, win_y_return, mask_return)
Display *display;
Window w;
Window *root_return, *child_return;
int *root_x_return, *root_y_return;
int *win_x_return, *win_y_return;
unsigned int *mask_return;
*/
XQueryPointer(display, DefaultRootWindow(display), &root_window, &root_window, &root_x, &root_y, &root_x, &root_y, &mask); //<--four
printf("Mouse coordinates (X: %d, Y: %d)\n", root_x, root_y);
XCloseDisplay(display);
return 0;
}
我希望这对其他人有用。