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

时间:2011-05-13 19:27:58

标签: mono event-handling gtk# imessagefilter

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

//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,所以我不知道如何从中获取我需要的信息(事件类型,指针坐标等)。

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

1 个答案:

答案 0 :(得分:0)

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

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