Как я могу получить координаты текущей мыши (указателя) в X - PullRequest
15 голосов
/ 27 августа 2010

Это может быть какой-то пример кода C или утилита, которая покажет мне либо графический интерфейс, либо на консоли это не имеет значения, но я должен быть в состоянии "командовать" им, чтобы получить координаты с точной точностью. время, которое делает XEV не очень полезным (что я мог бы выяснить).

Ответы [ 4 ]

13 голосов
/ 28 августа 2010

Я ни в коем случае не программист на 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;
}
9 голосов
/ 03 января 2012

xdotool может быть лучшим инструментом для этого.

Для C вы можете использовать libxdo .

1 голос
/ 27 августа 2010

На самом деле, xev очень полезен, если вы предоставляете ему идентификатор окна, захваченный с помощью xwininfo, тогда он может легко выполнить эту задачу для вас. Без сомнения, есть гораздо более элегантные решения, но это работает.

0 голосов
/ 15 декабря 2013

В этой строке есть ошибка

root_windows = malloc(sizeof(Window) * number_of_screens);

Измените это на:

root_windows = (Window *)malloc(sizeof(Window) * number_of_screens);
...