Imports System.Runtime.InteropServices
Imports DigitalData.Modules.Windows

Namespace ClipboardWatcher
    Public Class Watcher
        Inherits NativeWindow
        Implements IDisposable

        Public Event ClipboardChanged As EventHandler(Of IDataObject)
        Public Shared Singleton As New Watcher

        Private _Handle As IntPtr

        Private Sub New()
            MyBase.CreateHandle(New CreateParams)
            _Handle = NativeMethods.SetClipboardViewer(Handle)
        End Sub

        Protected Overrides Sub WndProc(ByRef m As Message)
            Select Case m.Msg
                Case NativeMethods.WM_DRAWCLIPBOARD
                    Dim oData As IDataObject = Clipboard.GetDataObject
                    RaiseEvent ClipboardChanged(Me, oData)
            End Select
            MyBase.WndProc(m)
        End Sub

#Region "IDisposable Support"
        ' Für diese Klasse ist korrekte Ressourcenbereinigung besonders wichtig, da 
        ' mit systemübergreifenden Ressourcen gearbeitet wird

        ' So ermitteln Sie überflüssige Aufrufe
        Private _DisposedValue As Boolean = False

        Protected Overridable Sub Dispose(ByVal pDisposing As Boolean)
            If Not _DisposedValue Then
                If pDisposing Then
                    ' TODO: Verwaltete Ressourcen freigeben, wenn sie explizit 
                    ' aufgerufen werden
                End If
                MyBase.DestroyHandle()
                Dim H As IntPtr = NativeMethods.SetClipboardViewer(_Handle)
            End If
            _DisposedValue = True
        End Sub

        ' Dieser Code wird von Visual Basic hinzugefügt, um das Dispose-Muster 
        ' richtig zu implementieren.
        Public Sub Dispose() Implements IDisposable.Dispose
            ' Sie sollten diesen Code nicht ändern, sondern stattdessen ihren
            ' Bereinigungscode oben in 
            ' Dispose(ByVal disposing As Boolean) einfügen.
            Dispose(True)
            System.GC.SuppressFinalize(Me)
        End Sub

        Protected Overrides Sub Finalize()
            MyBase.Finalize()
            Dispose(False)
        End Sub
#End Region
    End Class

End Namespace

