You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:45:45