2011-05-13 36 views
2

我需要他們被傳遞到Widget的標準處理程序之前截獲的幾個事件,所以我已經這樣做了:如何使用傳遞給Gdk.Window.AddFilter的FilterFunction?

//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

根據gtk.org網站上的文檔,在過濾器函數中收到的GdkEvent未被填充。這個AddFilter機制的目的是允許用戶在gdk事件處理啓動之前攔截X事件。我們不綁定Gtk#中的任何X數據結構,因此您需要使用System.Runtime.InteropServices Marshal手動編排來自IntPtr的數據。

所以,除非聽起來很熟悉,你可能想要考慮其他的選擇。

相關問題