2009-09-11 11 views
5

Tôi muốn mô phỏng nhiều sự kiện nhấn phím. Tôi đã tìm thấy giải pháp bằng cách sử dụng XTestFakeKeyEvent, nhưng khi tôi mô phỏng hơn 210 lần chương trình của tôi làm tăng lỗi phân đoạn "Số lượng khách hàng tối đa". Tôi không biết cách giải quyết vấn đề này.Trợ giúp: Đã đạt đến số lượng khách hàng tối đa - Lỗi phân đoạn

Mã của tôi ở đây:

#include <X11/Xlib.h> 
#include <X11/keysym.h> 
#include <X11/extensions/XTest.h> 
#include <stdio.h> 

#define PRESS_UP 0 
#define PRESS_DOWN 1 
#define PRESS_LEFT 2 
#define PRESS_RIGHT 3 
#define PRESS_ENTER 4 
#define PRESS_ESC 5 
#define PRESS_HOME 6 

Display *display; 
unsigned int keycode; 

int press(int key){ 
    display = XOpenDisplay(NULL); 

    if(key == PRESS_UP) 
     keycode = XKeysymToKeycode(display, XK_Up); 
    else if(key == PRESS_DOWN) 
     keycode = XKeysymToKeycode(display, XK_Down); 
    else if(key == PRESS_LEFT) 
     keycode = XKeysymToKeycode(display, XK_Left); 
    else if(key == PRESS_RIGHT) 
     keycode = XKeysymToKeycode(display, XK_Right); 
    else if(key == PRESS_ENTER) 
     keycode = XKeysymToKeycode(display, XK_Return); 
    else if(key == PRESS_ESC) 
     keycode = XKeysymToKeycode(display, XK_Escape); 
    else if(key == PRESS_HOME) 
     keycode = XKeysymToKeycode(display, XK_Home); 

    XTestFakeKeyEvent(display, keycode, True, 0); 
    XTestFakeKeyEvent(display, keycode, False, 0); 
    XFlush(display); 
    return 0; 
} 

int main(int argc, char *argv[]){ 
    int count = 0; 
    while (count < 500){ 
     press(PRESS_UP); 
     printf("count =%d\n" ,count); 
     count ++; 
    } 
} 

Output:

$ gcc -lXtst -lX11 Util_KeyPressSimulator.c 
$ ./a.out 
count =0 
^[[Acount =1 
^[[Acount =2 
... 
^[[Acount =208 
^[[Acount =209 
^[[Acount =210 
^[[AMaximum number of clients reachedSegmentation fault 

Có một xin vui lòng giúp đỡ, Cảm ơn bạn.

Trả lời

12

Bạn đang thực hiện một XOpenDisplay cho mỗi lần lặp mà không khớp với XCloseDisplay. Xem xét mở màn hình một lần, trong main(), bên ngoài vòng lặp và đóng màn hình trước khi bạn thoát.

+2

Cũng không kiểm tra thất bại 'XOpenDisplay', vì vậy nếu không thành công thì khách hàng này gặp sự cố. – mark4o