1. 程式人生 > >VB.NET實現Windows剪貼簿監視器

VB.NET實現Windows剪貼簿監視器

Windows剪貼簿

剪貼簿(ClipBoard)是記憶體中的一塊區域,是Windows內建的一個非常有用的工具,通過小小的剪貼簿,架起了一座彩橋,使得在各種應用程式之間,傳遞和共享資訊成為可能。然而美中不足的是,剪貼簿只能保留一份資料,每當新的資料傳入,舊的便會被覆蓋。

相關Windows API

最主要的是SetClipboardViewer,每當剪貼簿的內容發生變化時,該函式通過WM_DRAWCLIPBOARD訊息將視窗加入被通知的視窗鏈。
由於剪貼簿觀察器鏈中下一個視窗的控制代碼還沒有返回,應用程式不應傳遞它在SetClipboardViewer
呼叫過程中接收到的WM_DRAWCLIPBOARD訊息。
如果要從剪貼簿觀察器鏈中去掉視窗鏈,則應用程式必須呼叫ChangeClipboard成員函式。

Declare Auto Function SetClipboardViewer Lib "user32" (ByVal HWnd As IntPtr) As IntPtr
Declare Auto Function ChangeClipboardChain Lib "user32" (ByVal HWnd As IntPtr, ByVal HWndNext As IntPtr) As Boolean
Declare Auto Function SendMessage Lib "User32" (ByVal HWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Long

wndproc函式

作業系統嚮應用程式傳送一系列訊息,如左鍵按下和左鍵擡起,應用程式將通過GetMessage等方法最終將訊息提交到視窗過程(WndProc[英文全稱windows process])指向一個應用程式定義的視窗過程的指標。

我們需要重寫該函式來處理剪貼簿內容改變事件:

    'Override WndProc to get messages...
    Protected Overrides Sub WndProc(ByRef m As Message)
        Select Case m.Msg
            Case Is = WM_DRAWCLIPBOARD 'The clipboard has changed...
                '##########################################################################
                ' Process Clipboard Here :)........................
                '##########################################################################
                SendMessage(mNextClipBoardViewerHWnd, m.Msg, m.WParam, m.LParam)

                '顯示剪貼簿中的文字資訊
                If Clipboard.ContainsText() = True Then
                    Label1.Text = Clipboard.GetText()
                End If
                '顯示剪貼簿中的圖片資訊
                If Clipboard.ContainsImage() = True Then
                    PictureBox1.Image = Clipboard.GetImage()
                    PictureBox1.Update()
                End If

            Case Is = WM_CHANGECBCHAIN 'Another clipboard viewer has removed itself...
                If m.WParam = CType(mNextClipBoardViewerHWnd, IntPtr) Then
                    mNextClipBoardViewerHWnd = m.LParam
                Else
                    SendMessage(mNextClipBoardViewerHWnd, m.Msg, m.WParam, m.LParam)
                End If
        End Select

        MyBase.WndProc(m)
    End Sub

效果: