2010-08-27 12 views

Trả lời

13

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

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

+0

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

1

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.

9

xdotool có thể là công cụ tốt nhất cho việc này.

Đối với C, bạn có thể sử dụng libxdo.

0

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); 
+1

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