2010-08-27 5 views

Antwort

13

Ich bin kein C-Programmierer mit irgendwelchen Mitteln, aber ich sah ein paar Online-Tutorials und denke, das ist, wie Sie die aktuellen Mausposition lesen sollen. Dies ist mein eigener Code und ich habe vorher nichts mit Xlib gemacht, also könnte es komplett kaputt gehen (zum Beispiel sollte der Fehler-Handler nicht nur nichts für jeden Fehler tun), aber es funktioniert. So, hier ist eine andere Lösung:

#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; 
} 
+2

Vielleicht, dass jemand etwas Zeit sparen: es zu kompilieren, es unter pointerposition.c speichern und starten: gcc pointerposition.c -o pointerposition -lX11' – exic

+0

Einige diese nützlich zu wissen, finden können: das aktive Fenster zu erhalten, können use'Window Sie konzentriert; \t int revert_to; \t XGetInputFocus (Anzeige, & fokussiert, & revert_to); 'Ich ersetzte die for-Schleifen mit diesem einen Aufruf, um das aktive Fenster zu erhalten, anstatt das Fenster, das das Beispiel zu finden versucht – user2255242

1

Eigentlich ist xev sehr nützlich, wenn Sie es mit dem Fenster-ID liefern packte mit xwininfo, dann kann es leicht, diese Aufgabe für Sie durchführen. Es gibt zweifellos viel elegantere Lösungen, aber es funktioniert.

9

xdotool könnte das beste Werkzeug für diese sein.

Für C, können Sie libxdo verwenden.

0

auf dieser Linie ein Fehler Es gibt

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

ändern, dass dies auf:

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

Beide Zeilen sind gut mit ANSI-C als die Besetzung ist implizit. Aber für GCC können Sie mit '-WC++ - compat -Werror' die erste Zeile zum Bailout machen. Eine andere Geschichte ist, dass Sie durch das Ersetzen 'root_windows loswerden' root_windows' vollständig erhalten können [i] '' mit XRootWindow (Display, i) 'es in der Schleife. ;) – Tino