3

我想知道如何在屏幕上的任何位置使用 Xlib 获取鼠标单击的 x 和 y 坐标。我发现这篇文章获取当前指针位置

如何在 X 中获取当前鼠标(指针)位置坐标

但我不知道如何修改它,以便在单击鼠标时获取 xy 坐标。我试图编写这段代码,但它什么也没做。

#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 中有更简单的方法可以做到这一点,我很高兴听到它。

4

3 回答 3

4

我知道这已经过了几年,所以这对其他人来说是信息。首先,使用另一个库不符合我对更简单的定义。我只使用 xlib 和 C 来做一些自己需要的东西,我想看看我可以使代码变得多么简单。

本质上,您只需要四行代码在现有程序中的 xlib 中执行此操作,其余全部取决于您要如何处理它,printf/sprintf、grab_pixel_color(Display *display, XColor *color) 等。

/** 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;
}

我希望这对其他人有用。

于 2016-10-03T16:40:16.253 回答
3

您可能需要抓住指针。

我不知道您是否只想按下按钮释放。我已将其更改为印刷机,但您可以同时使用:

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;
}
于 2013-04-21T08:15:36.880 回答
1

如果在 C 中有更简单的方法可以做到这一点,我很高兴听到它。

完美的!然后使用一些人已经为您制作的libxdo 库。

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);
于 2013-04-20T15:51:16.620 回答