2009-08-11 37 views
7

Có cách nào để mô phỏng nhấn phím trong Linux bằng C không?Mô phỏng nhấn phím trong ứng dụng giao diện điều khiển Linux C

Trong trường hợp cụ thể của mình, tôi đang sử dụng Ubuntu 9.04 và cần một ứng dụng đơn giản gọi báo chí trên nút "tạm dừng" khi được khởi chạy. Điều đó sẽ có được một khung nội tuyến trong Firefox để làm mới bằng cách sử dụng Javascript.

Trả lời

13

Tôi cho rằng bạn có nghĩa là "ứng dụng X11" - nó không hoàn toàn rõ ràng từ mô tả của bạn về những gì bạn định làm. Đoạn mã dưới đây sẽ gửi mã khóa "tạm dừng" tới ứng dụng hiện đang tập trung vào đầu vào bàn phím trong X11 bằng cách sử dụng phần mở rộng XTest - từ những gì tôi đã đọc đây là cách tương thích nhất để "giả" các sự kiện bàn phím. Xem nếu bạn có thể áp dụng điều này cho kịch bản của bạn (không có lỗi kiểm tra xem XOpenDisplay đã thành công, để làm cho nó đơn giản hơn).

#include <X11/Xlib.h> 
#include <X11/keysym.h> 
#include <X11/extensions/XTest.h> 
... 
Display *display; 
unsigned int keycode; 
display = XOpenDisplay(NULL); 
... 
keycode = XKeysymToKeycode(display, XK_Pause); 
XTestFakeKeyEvent(display, keycode, True, 0); 
XTestFakeKeyEvent(display, keycode, False, 0); 
XFlush(display); 

Bạn sẽ cần liên kết với -lX11 -lXtst.

Rõ ràng là firefox sẽ cần phải tập trung vào thời điểm đó.

Tuy nhiên, tôi sẽ tò mò muốn biết công việc lớn hơn mà bạn đang cố gắng thực hiện là gì - tôi nghi ngờ có một giải pháp thanh lịch hơn là giả mạo các sự kiện nhấn phím.

+1

nhận xét phụ về trường hợp sử dụng của riêng tôi cho mã trên: Tôi đã có một bản hack cuối tuần OpenCV cho phép tôi giả phím mũi tên bằng cách di chuyển đầu của tôi trước webcam (để tôi có thể cuộn các /. bài viết và ăn bánh sandwich cùng một lúc :-) –

+0

Tôi muốn sử dụng một người bạn mạnh mẽ griffin để tải lại một iframe :) – Baversjo

+0

Ah, vì vậy nó khá nhiều việc sử dụng tương tự như trường hợp của tôi :) –

6

Có một thư viện lập trình được gọi là 'xdotool':

sudo apt-get install libxdo-dev libxdo2

mèo test.c

#include <stdio.h> 
#include <stdlib.h> 
#include <xdo.h> 
#include <unistd.h> 
int main() { 
    xdo_t * x = xdo_new(":0.0"); 

    while(1) { 
     printf("simulating Shift_L keypress\n"); 
     xdo_keysequence(x, CURRENTWINDOW, "Shift_L", 0); 
     sleep(5); 
    } 

     return 0; 
} 

Run như thế này:

gcc test.c -lxdo -o kiểm tra

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