在将事件传递给小部件的标准处理程序之前,我需要拦截几个事件,所以我已经这样做了:
//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,所以我不知道如何获取所需的信息(事件类型、指针坐标等)。从它开始。
有人能告诉我怎么做吗?提前谢谢。
发布于 2011-05-26 03:55:13
根据gtk.org网站上的文档,过滤器功能中收到的GdkEvent是未填充的。此AddFilter机制的目的是允许用户在gdk事件处理启动之前拦截X事件。我们没有在Gtk#中绑定任何X数据结构,因此您需要使用System.Runtime.InteropServices编组从IntPtr手动编组该数据。
因此,除非这听起来很熟悉您正在尝试实现的目标,否则您可能需要考虑其他替代方案。
https://stackoverflow.com/questions/5996802
复制相似问题