我需要在将几个事件传递给小部件的标准处理程序之前拦截它们,所以我已经这样做了:
//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 的数据。
因此,除非就您要完成的任务而言,这听起来很熟悉,否则您可能需要考虑其他替代方案。