天天看點

【.net 深呼吸】監聽剪貼闆更新(針對Vista之後系統)

針對 XP 及以前的監視剪貼闆更改的方法就不講了,因為 XP 已嚴重過時。本篇老周介紹的方法面向 Vista 以上的系統。

在托管應用程式中監聽剪貼闆更新行為必須用到 Win 32 API ,具體做法,我先簡單說一下。

首先,調用 AddClipboardFormatListener 函數來向視窗注冊監聽行為,它需要一個視窗句柄作為傳入參數,該句柄所指的視窗即是監聽剪貼闆更新的視窗。

然後,當剪貼闆的内容被更新,處理程式會收到一條 WM_CLIPBOARDUPDATE 消息。我們在應用程式中,隻要收到這條消息,就說明剪貼闆的内容已被更新。

WM_CLIPBOARDUPDATE 消息的宏定義如下:

這個消息的 wParam 和 lParam 參數都不曾使用,是以我們不必理會這兩個參數值。如果使用者已處理該消息,應當傳回 0。

AddClipboardFormatListener 函數的原型如下:

在托管代碼中調用它,要先進行導入。

好,基本理論說完了,下面我們來看看如何在WPF程式中監聽剪貼闆更新。

由于此功能實為WPF與 Win32 的互動操作,是以,要用到 HwndSource 類,這個類公開了一個 AddHook 方法,調用這個方法可以添加一個 HwndSourceHook 委托執行個體,當視窗接收到消息時,就會調用這個委托。

該委托的定義如下。

你一定會猛然發現,這個委托很像 WinProc 函數指針。msg 參數就是被攔截到的消息。在與該委托綁定的方法中,我們可以對收到的消息進行篩選,因為我們這裡隻關心 WM_CLIPBOARDUPDATE 消息,其他的咱們不管。

ClipboardUpdated 事件是我封裝時定義的,這是為了友善引發。

還有一件事,各位會發現,HwndSource 執行個體建立時需要與一個視窗的句柄綁定,那麼,如何擷取到 Window 執行個體的句柄呢,這就要用到一個幫助類—— WindowInteropHelper。有了它,想得到視窗的句柄就很簡單了。

在添加 hook 處理之前,一定要記得調用 AddClipboardFormatListener 函數為視窗注冊監聽行為。

要是監聽行為注冊成功,就可以添加 hook 了。

那麼,咱們封裝的這些代碼如何用到視窗代碼中呢。Window 有一個 SourceInitialized 事件,當句柄初始化完成就會發生。我們可以重寫 OnSourceInitialized 方法,然後在方法中使用我們上面封裝的代碼。

隻要監聽到剪貼闆被更新,那麼要擷取剪貼闆上的資料就很容易了,因為System.Windows下面已經有一個 Clipboard 類,它有一堆靜态方法,可以直接讀寫剪貼闆上的内容。

運作程式後,随便複制點東東到剪貼闆中,就會看到程式有反應了。如下面高清無碼截圖所示。

【.net 深呼吸】監聽剪貼闆更新(針對Vista之後系統)

好了,本文就扯到這裡了。

本文示例源代碼下載下傳