Linux 下模拟键盘输入

Linux 下模拟键盘输入
http://blog.csdn.net/haiwil/article/details/6668313

基于GTK 与 Fakekey(将模拟键盘与PC机键盘链接在一起)

#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <fakekey/fakekey.h>
#include <X11/keysym.h>

Display* disp ;
FakeKey *fk;
GtkWidget *win = NULL;
 
static char *numkeyboard_display[]=
{
    "1\0", "2\0", "3\0", "+","4\0", "5\0", "6\0","-", "7\0", "8\0", "9\0", ".", "0\0",  "←\0", "→\0", "Backspace\0", "Delete\0", "Enter\0"
};

static gushort numkeyboard_send[] =
{
    XK_1, XK_2, XK_3, XK_plus, XK_4, XK_5, XK_6, XK_minus, XK_7, XK_8,  XK_9, XK_period, XK_0,  XK_Left, XK_Right, XK_BackSpace, XK_Delete, XK_Return
};



gboolean numbt_release (GtkWidget *widget, GdkEventButton *event,
        gpointer user_data)
{
    gint i = GPOINTER_TO_UINT(user_data);
    fakekey_press_keysym(fk, numkeyboard_send[i], 0);
    fakekey_release(fk);

    return TRUE;
}

void clicked_callback(GtkButton *button1, GtkWindow *window)
{

    gint j;
    GtkWidget *button[5];
    GtkWidget *vbox = gtk_vbox_new(FALSE, 5);
    GtkWidget *hbox[5];
    
    if(win)
    {
        gtk_widget_destroy (win);
        win = NULL ;
    }
    else
    {
        win = gtk_window_new (GTK_WINDOW_POPUP);
        hbox[0] = gtk_hbox_new(TRUE, 5);
        for (j = 0 ; j < 4; j++ ) {
            button[0] = gtk_button_new_with_label (numkeyboard_display[j]);
            gtk_box_pack_start_defaults(GTK_BOX(hbox[0]), button[0]);
            g_signal_connect(G_OBJECT(button[0]), "button-release-event",
                    G_CALLBACK(numbt_release), GUINT_TO_POINTER (j));
        }
        gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox[0]);

        hbox[1] = gtk_hbox_new(TRUE, 5);
        for (j = 4 ; j < 8; j++ ) {
            button[1] = gtk_button_new_with_label (numkeyboard_display[j]);
            gtk_box_pack_start_defaults(GTK_BOX(hbox[1]), button[1]);
            g_signal_connect(G_OBJECT(button[1]), "button-release-event",
                    G_CALLBACK(numbt_release), GUINT_TO_POINTER (j));
        }
        gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox[1]);

        hbox[2] = gtk_hbox_new(TRUE, 5);
        for (j = 8 ; j < 12; j++ ) {
            button[2] = gtk_button_new_with_label (numkeyboard_display[j]);
            gtk_box_pack_start_defaults(GTK_BOX(hbox[2]), button[2]);
            g_signal_connect(G_OBJECT(button[2]), "button-release-event",
                    G_CALLBACK(numbt_release), GUINT_TO_POINTER (j));
        }
        gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox[2]);

        hbox[3] = gtk_hbox_new(TRUE, 5);
        for (j = 12 ; j < 15; j++ ) {
            button[3] = gtk_button_new_with_label (numkeyboard_display[j]);
            gtk_box_pack_start_defaults(GTK_BOX(hbox[3]), button[3]);
            g_signal_connect(G_OBJECT(button[3]), "button-release-event",
                    G_CALLBACK(numbt_release), GUINT_TO_POINTER (j));
        }
        gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox[3]);

        hbox[4] = gtk_hbox_new(TRUE, 5);
        for (j = 15 ; j < 18; j++ ) {
            button[4] = gtk_button_new_with_label (numkeyboard_display[j]);
            gtk_box_pack_start_defaults(GTK_BOX(hbox[4]), button[4]);
            g_signal_connect(G_OBJECT(button[4]), "button-release-event",
                    G_CALLBACK(numbt_release), GUINT_TO_POINTER (j));
        }
        gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox[4]);
        gtk_container_add(GTK_CONTAINER(win), vbox);

        gtk_window_move (GTK_WINDOW (win), 200, 200); /* 设置窗口位置 */
        gtk_widget_show_all(win);
        
    }
    
}

 int main(int argc, char *argv[])
{
     GtkWidget *window;
     GtkWidget *button;
     GtkWidget *entry;
     GtkWidget *vbox;

     gtk_init(&argc, &argv);
     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     gtk_window_set_title(GTK_WINDOW(window), "KeyBoard");
     gtk_window_set_default_size(GTK_WINDOW(window),400,300);

     disp = XOpenDisplay(NULL);//屏幕按键函数改成为内核驱动代发
     if( disp == NULL )
         return 1;
     fk = fakekey_init(disp);


     vbox = gtk_vbox_new(FALSE, 5);
     button = gtk_button_new_with_label("弹出键盘");
     gtk_widget_set_size_request(GTK_WIDGET(button),400,250);
     gtk_box_pack_start_defaults(GTK_BOX(vbox), button);

     entry = gtk_entry_new();
     gtk_box_pack_start_defaults(GTK_BOX(vbox), entry);
     gtk_widget_set_size_request(GTK_WIDGET(entry),400,50);

     g_signal_connect(GTK_OBJECT(window), "destroy",G_CALLBACK(gtk_main_quit), NULL);
     g_signal_connect(GTK_OBJECT(button), "clicked",G_CALLBACK(clicked_callback), window);
     gtk_container_add(GTK_CONTAINER(window), vbox);
     gtk_widget_show_all(window);

     gtk_main();
     return 0;
 }

编译:

gcc  keyboard.c  -o keyboard `pkg-config --cflags --libs gtk+-2.0` -lfakekey

你可能感兴趣的:(linux,object,callback,button,Signal,gtk)