2010-04-09 11 views
8

मुझे स्क्रीन पर (प्रिंट स्क्रीन के रूप में) कैप्चर करने की आवश्यकता है ताकि मैं कुछ छवि पहचान करने के लिए पिक्सेल रंग डेटा तक पहुंच सकूं, उसके बाद मुझे माउस इवेंट जेनरेट करने की आवश्यकता होगी स्क्रीन पर बाएं क्लिक, ड्रैग और ड्रॉप (बटन दबाए जाने पर माउस को ले जाना, और फिर इसे छोड़ दें) पर। एक बार ऐसा करने के बाद, छवि हटा दी जाएगी।लिनक्स, स्क्रीन कैप्चर कैसे करें, और माउस मूवमेंट्स को अनुकरण करें

नोट: मैं पूरे स्क्रीन सब कुछ है कि उपयोगकर्ता देख सकते हैं पर कब्जा करने की जरूरत है, और मैं अपने कार्यक्रम की खिड़की से बाहर से क्लिक अनुकरण करने की जरूरत है

युक्ति (अगर यह किसी भी फर्क नहीं पड़ता): लिनक्स ubuntu भाषा: सी ++

प्रदर्शन बहुत महत्वपूर्ण नहीं है, "प्रिंट स्क्रीन" फ़ंक्शन प्रत्येक ~ 10 सेकंड में एक बार निष्पादित किया जाएगा। प्रक्रिया की अवधि 24 घंटे तक हो सकती है, इसलिए विधि को स्थिर और मेमोरी लीक मुक्त करने की आवश्यकता है (usuall :)

मैं जीडीआई और कुछ विंडोज़ घटनाओं के साथ विंडोज़ में करने में सक्षम था, लेकिन मैं नहीं विचार करें कि लिनक्स में इसे कैसे करें।

धन्यवाद एक बहुत

+1

यह शायद एक्स-सर्वर के साथ कुछ करने के लिए है। (एक्स 11) – ereOn

उत्तर

13
//sg 

//Solution using Xlib for those who use Linux 
#include <X11/Xlib.h> 
#include<stdio.h> 
#include<unistd.h> 
#include <stdlib.h> 
#include <string.h> 

#include <unistd.h> 

#include <X11/Xlib.h> 
#include <X11/Xutil.h> 

void mouseClick(int button) 
{ 
    Display *display = XOpenDisplay(NULL); 

    XEvent event; 

    if(display == NULL) 
    { 
     fprintf(stderr, "Cannot initialize the display\n"); 
     exit(EXIT_FAILURE); 
    } 

    memset(&event, 0x00, sizeof(event)); 

    event.type = ButtonPress; 
    event.xbutton.button = button; 
    event.xbutton.same_screen = True; 

    XQueryPointer(display, RootWindow(display, DefaultScreen(display)), &event.xbutton.root, &event.xbutton.window, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state); 

    event.xbutton.subwindow = event.xbutton.window; 

    while(event.xbutton.subwindow) 
    { 
     event.xbutton.window = event.xbutton.subwindow; 

     XQueryPointer(display, event.xbutton.window, &event.xbutton.root, &event.xbutton.subwindow, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state); 
    } 

    if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Error\n"); 

    XFlush(display); 

    usleep(100000); 

    event.type = ButtonRelease; 
    event.xbutton.state = 0x100; 

    if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Error\n"); 

    XFlush(display); 

    XCloseDisplay(display); 
} 
int main(int argc,char * argv[]) { 

    int x , y; 
    x=atoi(argv[1]); 
    y=atoi(argv[2]); 
    Display *display = XOpenDisplay(0); 

    Window root = DefaultRootWindow(display); 
    XWarpPointer(display, None, root, 0, 0, 0, 0, x, y); 
    mouseClick(Button1); 
    XFlush(display); 
    XCloseDisplay(display); 
    return 0; 
} 

यह निर्माण और फिर एक्स पर एक क्लिक के अनुकरण करने के लिए, वाई कार्य करें:

$ ./a.out x y 

यानी

$ जी ++ -lX11 sgmousesim2.cpp

$ ./ ए.ओ. 123 13

बस अगर आप अभी भी रुचि रखते हैं।

+0

क्या आप इस पंक्ति को 'माउसक्लिक (बटन 1);' समझा सकते हैं? बटन 1 क्या है? मैं एक जावा डेवलपर हूं, और इसे समझ नहीं सकता। –

1

Swinput माउस/महत्वपूर्ण घटनाओं का अनुकरण के लिए एक समाधान है। आपको इसे अपने कर्नेल के लिए शायद संकलित करने की आवश्यकता है। Xorg ने माउस/कुंजी ईवेंट रिकॉर्ड करने के लिए कुछ शीर्षलेख प्रदान किए लेकिन मुझे लगता है कि इस समय यह टूट गया है। C कोड evtest है जिसका उपयोग /dev/input/eventX, /dev/input/mice फ़ाइलों से ईवेंट को कैप्चर करने के लिए किया जा सकता है। यह सहायक हो सकता है।

संपादित करें:

bug was fixed Xorg रिकॉर्ड विस्तार में, तो यह भी काम कर रहा हो सकता है।

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