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這樣作。