如何在Linux下模拟键盘输入 利用X11实现

http://blog.chinaunix.net/uid-1695538-id-229133.html

 

自己写了一个小例子:
基于GTK的

    1. #include <gtk/gtk.h>
    2. #include <gdk/gdkkeysyms.h>
    3. #include <fakekey/fakekey.h>
    4. #include <X11/keysym.h>
    5. Display* disp ;
    6. FakeKey *fk;
    7. static char *keyboard_display[] =
    8. {
    9.     "A\0", "B\0", "C\0", "D\0", "E\0", "F\0", "G\0"
    10. };
    11. static gushort keyboard_send[] =
    12. {
    13.     XK_A, XK_B, XK_C, XK_D, XK_E, XK_F, XK_G
    14. };
    15. void da_call (GtkDialog *dialog, gint response_id, gpointer user_data)
    16. {
    17.     if (GTK_RESPONSE_OK == response_id)
    18.         g_print("OK_Pressed");
    19.     else if (GTK_RESPONSE_CANCEL == response_id)
    20.         g_print("CANCEL_Pressed");
    21. }
    22. gboolean bt_release (GtkWidget *widget, GdkEventButton *event,
    23.         gpointer user_data)
    24. {
    25.     gint i = GPOINTER_TO_UINT(user_data);
    26.     fakekey_press_keysym(fk, keyboard_send[i], 0);
    27.     fakekey_release(fk);
    28.     return TRUE;
    29. }
    30. void clicked_callback(GtkButton *button, GtkWindow *window) {
    31.     gint i, j;
    32.     GtkWidget *button1;
    33.     GtkWidget *win = gtk_window_new (GTK_WINDOW_POPUP);
    34.     GtkWidget *vbox = gtk_vbox_new(FALSE, 5);
    35.     GtkWidget *hbox;
    36.     for ( i = 0 ; i < 7; i++)
    37.     {
    38.         hbox = gtk_hbox_new(FALSE, 5);
    39.         for (j = 0 ; j < 7; j++ ) {
    40.             button1 = gtk_button_new_with_label (keyboard_display[j]);
    41.             gtk_box_pack_start_defaults(GTK_BOX(hbox), button1);
    42.             g_signal_connect(G_OBJECT(button1), "button-release-event",
    43.                     G_CALLBACK(bt_release), GUINT_TO_POINTER (j));
    44.         }
    45.         gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox);
    46.     }
    47.     gtk_container_add(GTK_CONTAINER(win), vbox);
    48.     gtk_window_move (GTK_WINDOW (win), 200, 200); /* 设置窗口位置 */
    49.     gtk_widget_show_all(win);
    50. }
    51. int main(int argc, char *argv[])
    52. {
    53.     GtkWidget *window;
    54.     GtkWidget *button;
    55.     GtkWidget *entry;
    56.     GtkWidget *vbox;
    57.     gtk_init(&argc, &argv);
    58.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    59.     gtk_window_set_title(GTK_WINDOW(window), "GtkDialog");
    60.     disp = XOpenDisplay(NULL);
    61.     if( disp == NULL )
    62.         return 1;
    63.     fk = fakekey_init(disp);
    64.     vbox = gtk_vbox_new(FALSE, 5);
    65.     button = gtk_button_new_with_label("按我");
    66.     gtk_container_add(GTK_CONTAINER(window), vbox);
    67.     gtk_box_pack_start_defaults(GTK_BOX(vbox), button);
    68.     entry = gtk_entry_new();
    69.     gtk_box_pack_start_defaults(GTK_BOX(vbox), entry);
    70.     g_signal_connect(GTK_OBJECT(window), "destroy",
    71.             G_CALLBACK(gtk_main_quit), NULL);
    72.     g_signal_connect(GTK_OBJECT(button), "clicked",
    73.             G_CALLBACK(clicked_callback), window);
    74.     gtk_widget_show_all(window);
    75.     gtk_main();
    76.     return 0;
    77. }
posted @ 2014-11-23 01:58  alxe_yu  阅读(1447)  评论(0)    收藏  举报