2010-03-12 31 views
19

làm cách nào tôi có thể đặt chuột vị trí con trỏ trong cửa sổ X bằng chương trình C trong Linux? nhờ :) (như setcursorpos() trong WIN)Cách đặt vị trí con trỏ chuột trong C trên linux?

EDIT: Tôi đã thử mã này, nhưng không hoạt động:

#include <curses.h> 

main(){ 
move(100, 100); 
refresh(); 
} 
+2

vị trí con trỏ của bạn ... trong những gì? Cửa sổ X? Một cửa sổ đầu cuối? vi? –

+0

trong cửa sổ X. nhưng tôi không phải lấy vị trí con trỏ, tôi phải đặt nó ở mọi nơi trong màn hình – frx08

+0

(Tôi đã chỉnh sửa câu hỏi của bạn cho bạn; bạn thực sự muốn làm điều đó khi bạn trả lời bình luận.) Bạn thấy giá trị của việc cụ thể. :-) Bây giờ bạn có ba câu trả lời hoàn toàn không liên quan đến câu hỏi (tất cả chúng đều là về việc đặt vị trí con trỏ trong cửa sổ đầu cuối). –

Trả lời

31

12,4 - Moving the Pointer

Mặc dù di chuyển của con trỏ thường nên được trái sang kiểm soát của người dùng cuối, đôi khi nó là cần thiết để di chuyển con trỏ đến một vị trí mới dưới sự kiểm soát chương trình.

Để di chuyển con trỏ đến một điểm tùy ý trong cửa sổ, hãy sử dụng XWarpPointer().


Ví dụ:

Display *dpy; 
Window root_window; 

dpy = XOpenDisplay(0); 
root_window = XRootWindow(dpy, 0); 
XSelectInput(dpy, root_window, KeyReleaseMask); 
XWarpPointer(dpy, None, root_window, 0, 0, 0, 0, 100, 100); 
XFlush(dpy); // Flushes the output buffer, therefore updates the cursor's position. Thanks to Achernar. 
+0

cảm ơn nhưng nó không hoạt động: Tôi đã chỉnh sửa đối số thứ 2 của XWarpPointer từ NULL đến None, tôi không nhận được lỗi trong khi biên dịch, nhưng con trỏ không di chuyển – frx08

+0

Nó cũng không biên dịch cho tôi và tôi nghĩ đó là vì thiếu thư viện. Tôi đã thử bao gồm các thư viện được đề cập bởi @Achernar, nhưng trình biên dịch của tôi vẫn không thể tìm thấy các tham chiếu đến XOpenDisplay và các cuộc gọi thư viện khác. tôi bao gồm như sau (rõ ràng, không phải tất cả trong một dòng, nhưng tôi đang gặp rắc rối định dạng nhận xét của tôi): '#include #include #include #include ' Bất kỳ ý tưởng nào về những gì sai ở đây? – Seanny123

+0

Hóa ra bạn phải đảm bảo liên kết thư viện X trong khi biên dịch. 'gcc text.cpp -lX11 -o t' – Seanny123

1

Tất cả các thiết bị đầu cuối hiện đại nên hỗ trợ ANSI escape sequences. Đối với bất cứ điều gì phức tạp hơn (và di động hơn), tuy nhiên, bạn nên xem xét sử dụng một thư viện như ncurses.

3

Bạn có thể sử dụng XWarpPointer để di chuyển con trỏ chuột trong cửa sổ X.

XWarpPointer(display, src_w, dest_w, src_x, src_y, src_width, src_height, dest_x, 
       dest_y) 
     Display *display; 
     Window src_w, dest_w; 
     int src_x, src_y; 
     unsigned int src_width, src_height; 
     int dest_x, dest_y; 
4

Bạn muốn viết một X11 program có sử dụng chức năng gọi XWarpPointer để di chuyển con trỏ đến một vị trí tương đối hay toàn cầu. (Hướng dẫn lập trình Xlib, Vol 1)

Nói chung, sử dụng Xlib để lập trình Hệ thống cửa sổ X, là giao diện cơ bản và cấp thấp nhất cho lập trình đồ họa trên hệ thống Unix hoặc Linux. Hầu hết các ứng dụng được phát triển ngày nay sử dụng thư viện cấp cao hơn như GTK hoặc Qt để phát triển các ứng dụng GUI của chúng.

Curses hoặc NCurses (New Curses) dùng để lập trình các giao diện hướng đầu cuối, vì vậy không hữu ích trong trường hợp này.

11

Đây là cũ, nhưng trong trường hợp người khác gặp phải vấn đề này. Câu trả lời được cung cấp bởi tusbar là chính xác nhưng lệnh XFlush (dpy) phải được thêm vào cuối để cập nhật vị trí của con trỏ. Các thư viện cần thiết là: X11/X.h, X11/Xlib.h, X11/Xutil.h.

int main(int argc, char *argv[]){ 
     //Get system window 
     Display *dpy; 
     Window root_window; 

     dpy = XOpenDisplay(0); 
     root_window = XRootWindow(dpy, 0); 
     XSelectInput(dpy, root_window, KeyReleaseMask); 

     XWarpPointer(dpy, None, root_window, 0, 0, 0, 0, 100, 100); 

     XFlush(dpy); 

     return 0;} 
+0

Ồ đúng rồi! Cảm ơn bạn :) Tôi sẽ cập nhật câu trả lời của tôi. –

3

sử dụng tiện ích tuyệt vời của Jordan Sissel xdotool.

http://www.semicomplete.com/projects/xdotool/

nó cung cấp chức năng bao bọc XWarpPointer như xdo_mousemove(), đây là một số ví dụ:

Display *display = NULL; 
xdo_t *xdo = NULL; 

void mouse_left_down(int x, int y) 
{ 
    xdo_mousemove(xdo, x, y, 0) 
    xdo_mousedown(xdo, CURRENTWINDOW, Button1); 
} 

void mouse_left_up(int x, int y) 
{ 
    xdo_mouseup(xdo, CURRENTWINDOW, Button1, 1, 0); 
} 

void mouse_left_double_click(int x, int y) 
{ 
    xdo_mousemove(xdo, x, y, 0); 
    xdo_click_multiple(xdo, CURRENTWINDOW, Button1, 1, 0); 
    doubleclick = TRUE; 
} 

int main() 
{ 

    display = XOpenDisplay(NULL); 
    if(display == NULL) 
    { 
    fprintf(stderr, "can't open display!\n"); 
    return -1; 
    } 
    xdo = xdo_new((char*) display); 

    //some task here 
    // ... 

    return 0; 
} 
+0

xdo_mousemove() -> xdo_move_mouse() https://github.com/jordansissel/xdotool/blob/master/xdo.h#L238 –

Các vấn đề liên quan