2010-03-12 159 views
19

如何在Linux下使用C程序在光標位置設置鼠標光標位置? 謝謝:) (如setcursorpos()在WIN)如何在C上設置鼠標光標位置?

編輯: 我試過這個代碼,但不工作:

#include <curses.h> 

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

你的光標位置......在哪?一個X窗口?終端窗口? VI? – 2010-03-12 14:47:15

+0

在一個X窗口..但我沒有得到光標位置,我必須設置它在屏幕上的任何地方 – frx08 2010-03-12 14:48:24

+0

(我已經編輯你的問題,你真的想這樣做,當你回答我的評論。)你會看到具體的價值。 :-)現在你有三個與問題完全無關的答案(它們都是關於在終端窗口中設置光標位置的)。 – 2010-03-12 14:57:13

回答

31

12.4 - Moving the Pointer

雖然指針 的運動通常留給控制最終用戶的 ,有時是 必須將指針移動到一個新的 位置在程序控制下。

要將指針移動到窗口中的任意點 ,請使用XWarpPointer()


實施例:

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

謝謝,但它不起作用:我編輯XWarpPointer的第二個參數從NULL到None,編譯時沒有錯誤,但光標不移動 – frx08 2010-03-12 16:14:10

+0

它也沒有爲我編譯,我認爲這是因爲缺少庫。我嘗試過包括@Achernar提到的庫,但是我的編譯器仍然找不到對XOpenDisplay和其他庫調用的引用。 我包括他們如下(當然,不是一條線,而是我無法格式化我的意見): '#包括 的#include 的#include 的#include ' 關於這裏有什麼問題的任何想法? – Seanny123 2013-07-22 02:49:19

+0

原來,您必須確保在編譯時鏈接X庫。 'gcc text.cpp -lX11 -o t' – Seanny123 2013-07-22 03:31:11

3

可以使用XWarpPointer移動鼠標光標在一個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

你要編寫使用通話功能XWarpPointer的點移動到一個相對或全球位置的X11 program。 (Xlib編程手冊,第1卷)

一般來說,使用Xlib編程X Window系統是Unix或Linux系統上圖形編程的最基本和最低級的接口。現在開發的大多數應用程序都使用更高級別的庫,如GTKQt開發其GUI應用程序。 Curses或NCurses(New Curses)用於編程面向終端的接口,因此在這種情況下無用。

11

這是舊的,但以防其他人遇到此問題。 tusbar提供的答案是正確的,但必須在最後添加命令XFlush(dpy)以更新光標的位置。需要的庫有: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

哦對!謝謝:)我會更新我的答案。 – 2010-07-25 09:51:42

3

使用Jordan Sissel的優秀實用程序xdotool。

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

它提供像xdo_mousemove()XWarpPointer包裝函數,這裏是一些例子:

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 – 2016-03-14 04:55:39