Как я могу использовать функцию FilterFunction, переданную в Gdk.Window.AddFilter? - PullRequest
2 голосов
/ 13 мая 2011

Мне нужно перехватить несколько событий, прежде чем они будут доставлены стандартным обработчикам виджета, поэтому я уже сделал это:

//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 голосов
/ 25 мая 2011

Согласно документам на сайте gtk.org, GdkEvent, полученный в функции фильтра, не заполняется.Цель этого механизма AddFilter - позволить пользователю перехватывать события X до начала обработки события gdk.Мы не связываем ни одну из структур данных X в Gtk #, поэтому вам нужно будет вручную упорядочить эти данные из IntPtr с помощью System.Runtime.InteropServices Marshal.

Так что, если это не звучит знакомо относительно того, чтоВы пытаетесь достичь, вы можете рассмотреть другие альтернативы.

...