如何以编程方式生成按键事件

How to generate keypress event programmatically

我正在尝试在 Linux 中开发 GTK 应用程序。在这种情况下,我没有连接键盘,我需要为 GTK 生成 key_press_event

我编写了一个多线程程序来生成按键,但它只能运行一次;之后按键没有生成。

GtkWidget *window; 声明为全局,以便为两个线程获得相同的 window 处理程序。

该程序有 2 个线程。第一个保存 GTK 主和 gtk 屏幕显示代码。第二种根据用户要求生成按键事件

我将 if() 块移植到我的代码中,但结果是一样的。

信号产生一次。之后它不会进入第二个线程(信号生成线程)。

我已经放置了一些调试打印,但它们没有被执行。它似乎在第一个线程中等待 gtk_main

我的代码如下:

void S1(void)
{
    GtkWidget *Win_1;
    GtkBuilder *builder;        
    builder = gtk_builder_new ();
    gtk_builder_add_from_file (builder, "/home/glade/glade1.glade", NULL);
    window = GTK_WIDGET (gtk_builder_get_object (builder, "Win_1"));        
    g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), G_OBJECT(window));
    g_signal_connect (G_OBJECT (window), "key_press_event", G_CALLBACK (kp_event), NULL);
    gtk_widget_show_all(window);
    gtk_main(); 
}

kp_event()
{
    gtk_widget_destroy (window);            
    S2();
}

S2S1 相同,只是屏幕项不同。我从 S1 的按键处理程序调用 S2,反之亦然。

由于我没有连接键盘,我需要根据一些用户通过套接字或其他方式输入的内容来更改两个屏幕。

看看 this article,特别是下面的代码片段:


/* synthesize Alt+O key press */
event = gdk_event_new (GDK_KEY_PRESS);
event->key.window = widget->window;

这一行实际上应该是:

event->key.window = g_object_ref (widget->window);

否则你稍后会在销毁时收到有趣的错误信息 小部件。花了一些时间自己弄清楚。 :)