Dies kann entweder einige Probe C-Code oder ein Dienstprogramm, die mir zeigen, wird entweder gui oder auf der Konsole spielt es keine Rolle, aber ich muss in der Lage sein, es "zu befehlen", die Koordinaten zu einer exakten Zeit zu greifen, was xev nicht sehr nützlich macht (das könnte ich herausfinden).Wie kann ich die aktuellen Maus (Cursor) mit Positionskoordinaten in X
Antwort
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;
}
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.
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);
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
Vielleicht, dass jemand etwas Zeit sparen: es zu kompilieren, es unter pointerposition.c speichern und starten: gcc pointerposition.c -o pointerposition -lX11' – exic
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