vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: System/Windows   |   VB-Versionen: VB2010 - VB201502.07.21
Überprüfen, ob sich der Inhalt der Zwischenablage geändert hat

Der Tipp stellt eine Klasse zum Prüfen der Zwischenablage auf Änderung des Inhalts zur Verfügung.

Autor:   Dietrich HerrmannBewertung:  Views:  3.390 
ohne HomepageSystem:  Win7, Win8, Win10, Win11kein Beispielprojekt 

In meinem Tipp  Programm zur Anzeige des Clipboard-Inhalts stelle ich eine Lösung zur Verfügung, um den Inhalt der Zwischenablage in einem Fenster anzeigen zu können. In dieser Lösung verwende ich einen Timer, um im Sekundentakt den Inhalt zu überprüfen. Die folgende Klasse gestattet aber jetzt dem Programm immer dann die Anzeige zu ändern, wenn sich der Inhalt der Zwischenablage tatsächlich ändert. Keine Zeitschleife mehr.

Ich habe den betreffenden Code nach langem Suchen im Internet bei einem Forum gefunden und stelle ihn nun hier zur Verfügung. Wie man in obengenannter Lösung den Timer elimiert und durch die neue Klasse ersetzt, kann man als gute Übung selbst einprogrammieren...!

Hier der Code:

Imports System.Runtime.InteropServices
 
Public Class ClipboardWatcher : Inherits NativeWindow : Implements IDisposable
 
  <DllImport("user32", EntryPoint:="SetClipboardViewer")> _
  Private Shared Function SetClipboardViewer(ByVal hWnd As IntPtr) As IntPtr
  End Function
 
  Public Event Changed As EventHandler
 
  Private _hview As IntPtr
 
  ' nur eine globale Instanz zulassen
  Public Shared SingleInst As New ClipboardWatcher
 
  Private Sub New()
    MyBase.CreateHandle(New CreateParams)
    _hview = SetClipboardViewer(Handle)
  End Sub
 
  Protected Overrides Sub WndProc(ByRef m As Message)
    Const WM_DRAWCLIPBOARD As Integer = &H308
    Select Case m.Msg
      Case WM_DRAWCLIPBOARD
        RaiseEvent Changed(Me, EventArgs.Empty)
    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 disposing As Boolean)
    If Not disposedValue Then
      If disposing Then
        ' TODO: Verwaltete Ressourcen freigeben, wenn sie explizit 
        ' aufgerufen werden
      End If
      MyBase.DestroyHandle()
      Dim H As IntPtr = SetClipboardViewer(_hview)
    End If
    Me.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)
    GC.SuppressFinalize(Me)
  End Sub
 
  Protected Overrides Sub Finalize()
    MyBase.Finalize()
    Dispose(False)
  End Sub
#End Region
 
End Class

Und die Anwendung im Programm:

Vereinbarung in der Form:

Private WithEvents theClipWatcher As ClipboardWatcher = ClipboardWatcher.SingleInst
Private clipData As IDataObject

Das Event (an Stelle Timer_Tick)

Private Sub theClipWatcher_Changed(sender As Object, e As EventArgs) _
  Handles theClipWatcher.Changed
 
  ...
End Sub

Anmerkung:
In der verwendenden Form sollte unbedingt das Ereignis Form_Disposed programmiert sein mit:

theClipWatcher.Dispose()



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.