RSS
StartseiteKnowledge LibraryTop 10Impressum

Clipboard-Aussichten

Auf Änderungen der Zwischenablage live reagieren

Wenn Sie über Änderungen der Zwischenablage wachen wollen, können Sie das mit einem Timer und den Methoden des Clipboard-Objekts haben oder Sie richten Ihre Anwendung gleich als Clipboard-Viewer ein und sind so immer als erster auf dem neuestem Stand.

Wenn Sie Änderungen der Zwischenablage überwachen wollen, können Sie dies über einen Timer und den Methoden des Clipboard Objekts erledigen. Diese Methode funktioniert zwar, ist aber nicht besonders elegant und berücksichtigt natürlich nur die von VB unterstützten Clipboard Formate.

Für eine genauere Überwachung der Zwischenablage, können Sie Ihre Anwendung in die Reihe der "Clipboard-Viewer" einklinken. Dies erfolgt über die API Funktion SetClipboardViewer, die den Handle des nächsten Clipboard-Viewer zurückgibt. Dieser ist wichtig, da Ihre Anwendung als Clipboard-Viewer nicht nur über Änderungen informiert wird, sondern diese auch an den nächsten Viewer weiterreichen muss.

Als Clipboard-Viewer empfängt Ihre Anwendung die Nachrichten WM_CHANGECBCHAIN, die immer dann empfangen wird, wenn sich ein Clipboard-Viewer abmeldet und WM_DRAWCLIPBOARD, die anzeigt das sich der Inhalt der Zwischenablage geändert hat. Die Auswertung dieser Nachrichten, erfolgt über Subclassing des als Clipboard-Viewer angemeldeten Fensters:

Public Sub Attach(ByVal hWndViewer As Long)

  mlng_hWndViewer = hWndViewer
  
  mlng_hWndNextViewer = SetClipboardViewer(mlng_hWndViewer)
  
  AttachMessage Me, mlng_hWndViewer, WM_CHANGECBCHAIN
  AttachMessage Me, mlng_hWndViewer, WM_DRAWCLIPBOARD
  
End Sub

In der neuen WindowProc - Prozedur können Sie jetzt die Nachrichten bearbeiten und weiterleiten. Wie schon Eingangs erwähnt, informiert die Nachricht WM_CHANGECBCHAIN über Abmeldungen aus der Reihe der Clipboard-Viewer. Der Parameter wParam enthält dabei den Handle des Viewers, der sich gerade abgemeldet hat. Wenn dieser mit dem gespeicherten Viewer Handle (mlng_hWndNextViewer) übereinstimmt, müssen Sie den Handle des neuen Viewer Nachfolger speichern, der dem Parameter lParam zu entnehmen ist. Danach leiten Sie die Nachricht über die SendMessage API Funktion an den nächsten Clipboard-Viewer weiter:

Private Function ISubclass_WindowProc(ByVal hwnd As Long, _
                  ByVal iMsg As Long, ByVal wParam As Long, _
                  ByVal lParam As Long) As Long
  Select Case iMsg
    Case WM_CHANGECBCHAIN
      If (wParam = mlng_hWndNextViewer) Then
        mlng_hWndNextViewer = lParam
      End If

      If (mlng_hWndNextViewer <> 0) Then
        SendMessage mlng_hWndNextViewer, iMsg, wParam, lParam
      End If

Die Nachricht WM_DRAWCLIPBOARD wird empfangen, wenn sich der Inhalt der Zwischenablage geändert hat. Ihre Anwendung muss diese Nachricht an den nächsten Viewer weiterleiten und kann mit dieser Information weiterarbeiten:

    Case WM_DRAWCLIPBOARD
      If (mlng_hWndNextViewer <> 0) Then
        SendMessage mlng_hWndNextViewer, iMsg, wParam, lParam
      End If

      RaiseEvent ClipboardChanged
  End Select
End Function

Wenn Sie die Ereignisse des Clipboard-Viewer nicht mehr benötigen, normalerweise beim Beenden der Anwendung, muss diese aus der Reihe der Viewer abgemeldet werden. Dies erfolgt über die API Funktion ChangeClipboardChain:

Public Sub Detach()
  
  DetachMessage Me, mlng_hWndViewer, WM_CHANGECBCHAIN
  DetachMessage Me, mlng_hWndViewer, WM_DRAWCLIPBOARD
  
  ChangeClipboardChain mlng_hWndViewer, mlng_hWndNextViewer
End Sub

Die benötigten Deklarationen und vollständige Implementierung können Sie dem Beispielprojekt bzw. dem Klassenmodul cClipboardViewer entnehmen.