Điều này có thể là một số mã mẫu C hoặc một tiện ích sẽ hiển thị cho tôi hoặc gui hoặc trên bảng điều khiển không quan trọng, nhưng tôi phải có thể "lệnh" nó để lấy các tọa độ tại một thời điểm chính xác mà làm cho xev không phải là rất hữu ích (mà tôi có thể tìm ra).Làm thế nào tôi có thể nhận tọa độ con trỏ (con trỏ) hiện tại trong X
Trả lời
Tôi không phải là lập trình viên C bằng bất kỳ phương tiện nào nhưng tôi đã xem xét một vài hướng dẫn trực tuyến và nghĩ đây là cách bạn phải đọc vị trí chuột hiện tại. Đây là mã của riêng tôi và tôi đã không làm gì với Xlib trước đây vì vậy nó có thể được hoàn toàn bị hỏng (ví dụ, xử lý lỗi không nên chỉ làm gì cho mọi lỗi) nhưng nó hoạt động. Vì vậy, đây là một giải pháp khác:
#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;
}
Thực tế, xev rất hữu ích nếu bạn cung cấp nó với id cửa sổ được lấy bằng xwininfo, sau đó nó có thể dễ dàng thực hiện tác vụ này cho bạn. Không có nghi ngờ nhiều hơn nữa các giải pháp thanh lịch nhưng nó hoạt động.
Có một lỗi trên dòng này
root_windows = malloc(sizeof(Window) * number_of_screens);
Thay đổi đó đến nay:
root_windows = (Window *)malloc(sizeof(Window) * number_of_screens);
Cả hai dòng đều ổn với ANSI-C các diễn viên là implicite. Nhưng đối với GCC, bạn có thể thực hiện dòng đầu tiên để giải cứu bằng '-WC++ - compat -Werror'. Một câu chuyện khác là bạn có thể loại bỏ hoàn toàn 'root_windows' bằng cách thay thế' root_windows [i] 'bằng' XRootWindow (hiển thị, i) 'nó trong vòng lặp. ;) – Tino
Có lẽ đó sẽ tiết kiệm được một người nào đó một thời gian: Để biên dịch nó, lưu nó dưới pointerposition.c và chạy: 'gcc pointerposition.c -o pointerposition -lX11' – exic
Một số có thể thấy điều này hữu ích để biết: để có được cửa sổ đang hoạt động, bạn có thể sử dụng 'Window focus; \t int revert_to; \t XGetInputFocus (hiển thị, & tập trung, & revert_to); 'Tôi đã thay thế các vòng lặp bằng một cuộc gọi này để có cửa sổ hoạt động, thay vì cửa sổ bất kỳ, ví dụ đang cố gắng tìm – user2255242