GTK应用检测鼠标移动/进入事件异常:仅收到GDK_DELETE
问题解决:GTK3中
motion-notify-event事件类型异常的修复 核心错误:回调函数参数类型错误
你的回调函数中,GdkEventMotion参数使用了值传递而非指针传递,这会导致内存解析错误,从而读取到错误的事件类型(比如GDK_DELETE)。GTK的事件回调中,所有事件对象都是以指针形式传递的。
修正后的回调函数
GTK_CALLBACK void on_mouse_move( GtkWidget* self, GdkEventMotion *event, // 改为指针类型 gpointer user_data ) { if (event->type == GDK_MOTION_NOTIFY) { // 使用->访问成员 // 处理鼠标移动逻辑 } }
补充:更适合监听鼠标进入/离开的事件
如果你只是需要检测鼠标进入或离开主窗口,不需要监听motion-notify-event,直接使用enter-notify-event和leave-notify-event更高效:
事件设置代码
GtkWidget *mainwin = gui_widget(GUI_MAIN_WIN); // 添加进入/离开事件掩码 gtk_widget_add_events(mainwin, GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); // 绑定进入事件回调 g_signal_connect(mainwin, "enter-notify-event", G_CALLBACK(on_mouse_enter), NULL); // 绑定离开事件回调 g_signal_connect(mainwin, "leave-notify-event", G_CALLBACK(on_mouse_leave), NULL);
对应的回调函数示例
GTK_CALLBACK void on_mouse_enter( GtkWidget* self, GdkEventCrossing *event, gpointer user_data ) { if (event->type == GDK_ENTER_NOTIFY) { // 鼠标进入窗口逻辑 } } GTK_CALLBACK void on_mouse_leave( GtkWidget* self, GdkEventCrossing *event, gpointer user_data ) { if (event->type == GDK_LEAVE_NOTIFY) { // 鼠标离开窗口逻辑 } }
内容的提问来源于stack exchange,提问作者codenamezero
相关产品推荐
相关产品推荐

