如何使用传递给 Gdk.Window.AddFilter 的 FilterFunction



我需要在将几个事件传递给小部件的标准处理程序之前拦截它们,所以我已经这样做了:

//Inside the definition of my custom widget
protected override void OnRealized()
{
    base.OnRealized();
    this.GdkWindow.AddFilter(PreFilterMessage);
    ...
}

所以,稍后我定义了 PreFilterMessage 方法:

public Gdk.FilterReturn PreFilterMessage(IntPtr xEvent, Gdk.Event evnt)
{
    Console.WriteLine(evnt.Type);
    ...
}

但问题是,当我测试它时,无论什么消息到达窗口(KeyEvent,ButtonEvent等),它总是打印"Nothing",所以我每次都只得到空事件。我在某处读到真实信息通过 xEvent 参数,但这只是一个 IntPtr,所以我不知道如何从中获取我需要的信息(事件类型、指针坐标等)。

谁能告诉我怎么做?提前谢谢。

根据 gtk.org 网站上的文档,筛选器函数中收到的 GdkEvent 未填充。 此 AddFilter 机制的目的是允许用户在 gdk 事件处理启动之前截获 X 事件。 我们不会绑定 Gtk# 中的任何 X 数据结构,因此您需要使用 System.Runtime.InteropServices Marshal 手动封送来自 IntPtr 的数据。

因此,除非就您要完成的任务而言,这听起来很熟悉,否则您可能需要考虑其他替代方案。

相关内容

  • 没有找到相关文章

最新更新