2010-04-09 21 views
8

Ekrandaki görüntüyü yakalayabilmem için piksel renk verisine erişebileceğim, bazı görüntü tanımalarını yapabilmem için ekranı (yazdırma ekranı olarak) çekmem gerekiyor. Ekranda sol tıklama, sürükle ve bırak (tuşa basarken farenin hareket ettirilmesi ve sonra serbest bırakılması). Tamamlandığında, resim silinecek.Linux, ekran görüntüsünü yakalama ve fare hareketlerini taklit etme

Not: Ben kullanıcı görebilirsiniz bütün ekran herşeyi yakalamak gerekiyor ve benim programın penceresinin dışında tıklamaları simüle etmek gerek

Spec (Bu bir şeyi varsa): Linux ubuntu Dil: C++

Performans çok önemli değil, "baskı ekranı" fonksiyonu her 10 saniyede bir gerçekleştirilecektir. İşlemin süresi 24 saate kadar çıkabiliyor, bu nedenle yöntem kararlı olmalı ve bellek sızıyor (usuall olarak) :)

Windows GDI ve bazı pencere olaylarıyla pencerelerde yapabildim ama Linux'ta nasıl yapılacağı fikri.

Çok teşekkürler

+1

Bu, muhtemelen X sunucusuyla ilgili bir şeydir. (X11) – ereOn

cevap

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

onu kurmak ve daha sonra x'in bir tıklama simüle etmek, y yapın:

$ ./a.out x y 

yani

$ g ++ -lX11 sgmousesim2.cpp

$ ./ a.out 123 13

Sadece hala ilgileniyorsanız.

+0

Bu satırı 'mouseClick (Button1);'? Button1 nedir? Ben bir Java geliştiricisiyim ve bunu anlayamıyorum. –

1

Swinput fare/anahtar olaylarını simüle için bir çözümdür. Muhtemelen çekirdeğin için derlemelisin. Xorg, fare/anahtar olaylarını kaydetmek için bazı başlıklar sağladı ancak şu anda kırıldığını düşünüyorum. /dev/input/eventX, /dev/input/mice dosyalarından olayları yakalamak için kullanılabilecek C kodu evtest vardır. Bu yardımcı olabilir.

Düzenleme:

Xorg rekor uzantısında bug was fixed, bu yüzden de çalışıyor olabilir.

İlgili konular