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

Mono 如何使用传递给Gdk.Window.AddFilter的FilterFunction?,mono,event-handling,gtk#,imessagefilter,Mono,Event Handling,Gtk#,Imessagefilter,我需要截获几个事件,然后再将它们传递给小部件的标准处理程序,因此我已经完成了这项工作: //Inside the definition of my custom widget protected override void OnRealized() { base.OnRealized(); this.GdkWindow.AddFilter(PreFilterMessage); ... } 因此,稍后我将定义PreFilterMessage方法: public Gdk.F

我需要截获几个事件,然后再将它们传递给小部件的标准处理程序,因此我已经完成了这项工作:

//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网站上的文档,在filter func中收到的GdkEvent未被填充。此AddFilter机制的目的是允许用户在gdk事件处理启动之前拦截X个事件。我们不绑定Gtk#中的任何X数据结构,因此您需要使用System.Runtime.InteropServices封送来手动封送来自IntPtr的数据


这样,除非你想完成的事情听起来很熟悉,否则你可能想考虑其他的选择。

< P>在GTK.ORG网站上的文档中,过滤器FUNC中接收到的GDKEVER是未填充的。此AddFilter机制的目的是允许用户在gdk事件处理启动之前拦截X个事件。我们不绑定Gtk#中的任何X数据结构,因此您需要使用System.Runtime.InteropServices封送来手动封送来自IntPtr的数据

除非你想达到的目标听起来很熟悉,否则你可能想考虑其他的选择。