我需要在将几个事件传递给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,所以我不知道如何从中获取我需要的信息(事件类型,指针坐标等)。
谁能告诉我怎么做?提前谢谢。
答案 0 :(得分:0)
根据gtk.org网站上的文档,过滤器函数中收到的GdkEvent未填充。此AddFilter机制的目的是允许用户在gdk事件处理启动之前拦截X事件。我们不绑定Gtk#中的任何X数据结构,因此您需要使用System.Runtime.InteropServices Marshal手动封送来自IntPtr的数据。
所以,除非你想要完成的事情听起来很熟悉,否则你可能需要考虑其他选择。