2010-04-09 31 views
8

Tôi cần chụp màn hình (như màn hình in) để có thể truy cập dữ liệu màu pixel, để thực hiện nhận dạng hình ảnh, sau đó tôi sẽ cần tạo sự kiện chuột trên màn hình như nhấp chuột trái, kéo và thả (di chuyển chuột trong khi nhấn nút và sau đó thả nó). Sau khi hoàn thành, hình ảnh của bạn sẽ bị xóa.Linux, cách chụp màn hình và mô phỏng chuyển động của chuột

Lưu ý: Tôi cần phải nắm bắt tất cả mọi thứ toàn bộ màn hình mà người dùng có thể nhìn thấy, và tôi cần để mô phỏng nhấp chuột bên ngoài cửa sổ của chương trình của tôi (nếu nó làm cho bất kỳ sự khác biệt)

Spec: Linux Ubuntu Ngôn ngữ: C++

Hiệu suất không phải là rất quan trọng, "chức năng in màn hình" sẽ được thực hiện một lần ~ 10 giây. Thời gian của quá trình có thể lên đến 24 giờ để phương thức cần ổn định và rò rỉ bộ nhớ miễn phí (như usuall :)

Tôi có thể làm trong các cửa sổ có GDI và một số sự kiện cửa sổ, nhưng tôi không ý tưởng làm thế nào để làm điều đó trong Linux.

Cảm ơn rất nhiều

+1

Điều này có thể liên quan đến X-server. (X11) – ereOn

Trả lời

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

Xây dựng nó và sau đó để mô phỏng một nhấp chuột vào x, y làm:

$ ./a.out x y 

tức

$ g ++ -lX11 sgmousesim2.cpp

$ ./ a.out 123 13

Chỉ trong trường hợp bạn vẫn còn quan tâm.

+0

Bạn có thể giải thích dòng này 'mouseClick (Button1); '? Button1 là gì? Tôi là một nhà phát triển Java và không thể hiểu nó. –

1

Swinput là giải pháp để mô phỏng sự kiện chuột/phím. Bạn cần biên dịch nó cho kernel của bạn. Xorg cung cấp một số tiêu đề để ghi lại các sự kiện chuột/phím nhưng tôi nghĩ rằng nó bị hỏng vào lúc này. Có mã Cevtest có thể được sử dụng để nắm bắt các sự kiện từ các tệp /dev/input/eventX, /dev/input/mice. Nó có thể hữu ích.

Edit:

Các bug was fixed trong phần mở rộng kỷ lục Xorg, vì vậy nó có thể làm việc quá.

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