Sledování obsahu schránky
Přidáno: 1.6.2008
Kategorie: Aplikace
Autor: Ondřej Linhart
Ukázkový kód, který vám umožní sledovat schránku ve Windows a reagovat na změny jejího obsahu.
Na tomto principu funguje například funkce Monitor clipboard ve známém stahovacím programu FlashGet (zobrazí se okno pro nastavení stahování vždy když do schránky vložíte adresu URL).
Pro sledování zpráv ohledně schránky se neobejdete bez Windows API.
Imports System.Runtime.InteropServices
Public Class Form1
Private clipboardViewer As IntPtr
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
clipboardViewer = UnsafeNativeMethods.SetClipboardViewer(Me.Handle.ToInt32())
End Sub
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Select Case m.Msg
Case UnsafeNativeMethods.WM_DRAWCLIPBOARD
If Clipboard.ContainsText() Then
MessageBox.Show(Clipboard.GetText(), "Nový obsah schránky")
End If
UnsafeNativeMethods.SendMessage(clipboardViewer, m.Msg, m.WParam, m.LParam)
Case UnsafeNativeMethods.WM_CHANGECBCHAIN
If m.WParam = clipboardViewer Then
clipboardViewer = m.LParam
Else
SendMessage(clipboardViewer, m.Msg, m.WParam, m.LParam)
End If
End Select
MyBase.WndProc(m)
End Sub
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
UnsafeNativeMethods.ChangeClipboardChain(Me.Handle, clipboardViewer)
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
End Class
Friend Module UnsafeNativeMethods
Public Const WM_DRAWCLIPBOARD As Integer = 776
Public Const WM_CHANGECBCHAIN As Integer = 781
<DllImport("user32.dll")> _
Public Function SetClipboardViewer(ByVal hWndNewViewer As Integer) As Integer
End Function
<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Public Function ChangeClipboardChain(ByVal hWndRemove As Integer, ByVal hWndNewNext As Integer) As Integer
End Function
<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Public Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
End Function
End Module