星期四, 4月 01, 2010

Clipboard hooking in Gtk#

Windows 下要攔截 Clipboard 的事件處理的話,除了要 override WndProc 以外,還得利用 Windows 提供的函數 SetClipboardViewer()、ChangeClipboardChain()、SendMessage() 來告訴 Windows 說,你的程式會處理 Clipboard。

那在 Gtk# 下要怎麼作呢?

答案是處理 Clipboard 的 OwnerChange 即可,所以程式可以這樣寫:
 private Gtk.Clipboard m_clipboard;

public MainWindow (): base (Gtk.WindowType.Toplevel)
{
// Other stuff...
m_clipboard = Gtk.Clipboard.Get( Gdk.Selection.Clipboard );
m_clipboard.OwnerChange += new OwnerChangeHandler( delegate( object o, OwnerChangeArgs args ) {
m_clipboard.RequestText( delegate(Gtk.Clipboard clipboard, string text) {
Console.WriteLine( "text={0}", text );
} );
} );
}


首先要取得系統的 Clipboard,所以用 Clipboard 的 static function:Get 來取得,接著再指派我們的處理事件進去就行了。相對於 Windows 上的來說,簡單很多。

我有參考 glippper (gnome提供的剪貼簿工具,用 python 寫的),他拿了不只一個剪貼簿,它還用 GetForDisplay 去拿了另一個剪貼簿,我不知道有什麼差別,或許是處理多螢幕或是從遠端連進來時的情況吧~就目前來說,我應該暫時不必要照著glipper這樣作。

沒有留言: