2010-03-12 14 views
19

मैं माउस लिनक्स के तहत एक सी प्रोग्राम का उपयोग कर एक्स विंडो में कर्सर की स्थिति कैसे सेट कर सकता हूं? धन्यवाद :) (setcursorpos की तरह() विन में)लिनक्स पर सी में माउस कर्सर स्थिति कैसे सेट करें?

संपादित

: मैं इस कोड की कोशिश की है, लेकिन काम नहीं करता:

#include <curses.h> 

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

आपका कर्सर की स्थिति ... क्या में:

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

यह xdo_mousemove (जैसे XWarpPointer आवरण समारोह) प्रदान करते हैं, यहाँ कुछ उदाहरण है? एक एक्स खिड़की? एक टर्मिनल खिड़की? vi? –

+0

एक एक्स विंडो में .. लेकिन मुझे कर्सर की स्थिति प्राप्त करने की आवश्यकता नहीं है, मुझे इसे स्क्रीन पर हर जगह सेट करना होगा – frx08

+0

(मैंने आपके लिए अपना प्रश्न संपादित कर लिया है; आप वास्तव में ऐसा करना चाहते थे जब आपने मेरा जवाब दिया टिप्पणी।) आप विशिष्ट होने का मूल्य देखते हैं। :-) अब आपके पास तीन उत्तरों के सवाल से पूरी तरह से असंबद्ध हैं (वे टर्मिनल विंडोज़ में कर्सर की स्थिति सेट करने के बारे में हैं)। –

उत्तर

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 के दूसरे तर्क को न्यूल से कोई भी संपादित नहीं किया है, मुझे संकलन करते समय कोई त्रुटि नहीं है, लेकिन कर्सर – frx08

+0

नहीं लेता है यह मेरे लिए संकलित नहीं था और मुझे लगता है कि यह पुस्तकालयों की याद आ रही है। मैंने @Achernar द्वारा वर्णित पुस्तकालयों सहित कोशिश की, लेकिन मेरे कंपाइलर को अभी भी XOpenDisplay और अन्य लाइब्रेरी कॉल के संदर्भ नहीं मिल रहे हैं। इस प्रकार मैं उन्हें शामिल कर रहा हूँ (स्पष्ट रूप से नहीं एक पंक्ति में सभी,, लेकिन मैं मुसीबत मेरी टिप्पणी स्वरूपण आ रही हैं): '# शामिल # शामिल # शामिल # शामिल ' क्या गलत है इसके बारे में कोई विचार? – Seanny123

+0

बाहर निकलते समय आपको एक्स लाइब्रेरी को संकलित करते समय लिंक करना सुनिश्चित करना होगा। 'gcc text.cpp -lX11 -o t' – Seanny123

1

सभी आधुनिक टर्मिनल ANSI escape sequences समर्थन करना चाहिए। कुछ और जटिल (और अधिक पोर्टेबल) के लिए, हालांकि, आपको ncurses जैसी लाइब्रेरी का उपयोग करना चाहिए।

3

आप XWarpPointer का उपयोग एक एक्स विंडो में माउस कर्सर ले जाने के लिए कर सकते हैं।

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

आप एक X11 program एक रिश्तेदार या वैश्विक स्थिति के लिए बिंदु को स्थानांतरित करने कॉल XWarpPointer समारोह का उपयोग करता है लिखना चाहते हैं। (Xlib प्रोग्रामिंग मैनुअल, खंड 1)

सामान्य में, X Window सिस्टम प्रोग्रामिंग के लिए Xlib का उपयोग कर, एक यूनिक्स या Linux सिस्टम पर चित्रमय प्रोग्रामिंग के लिए सबसे बुनियादी, और काफी निम्न स्तर इंटरफ़ेस है। अधिकांश जीयूआई अनुप्रयोगों के विकास के लिए GTK या Qt जैसे उच्च स्तरीय लाइब्रेरी का उपयोग करके आजकल अधिकांश एप्लिकेशन विकसित किए गए।

शापित या एनसीर्स (न्यू शापित) प्रोग्रामिंग टर्मिनल उन्मुख इंटरफेस प्रोग्रामिंग के लिए है, इसलिए इस मामले में उपयोगी नहीं हैं।

11

यह पुराना है, लेकिन अगर किसी और को इस मुद्दे पर आता है। टसबार द्वारा प्रदान किया गया उत्तर सही था लेकिन कर्सर की स्थिति को अपडेट करने के लिए कमांड XFlush (dpy) को अंत में जोड़ा जाना चाहिए। आवश्यक पुस्तकालय हैं: एक्स 11/एक्सएच, एक्स 11/एक्सएलबीएच, एक्स 11/एक्सटिल एच।

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

ओह ठीक है! धन्यवाद :) मैं अपना जवाब अपडेट करूंगा। –

3

जॉर्डन सिसेल की उत्कृष्ट उपयोगिता xdotool का उपयोग करें।

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 –

संबंधित मुद्दे