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.
- cClipboardViewer Klassenmodul und Beispielprojekt [VB5]
(clipview5.zip - ca. 4 KB)
Erfordert Subclassing & Timer Komponente (ssubtmr.dll) - cClipboardViewer Klassenmodul und Beispielprojekt [VB6]
(clipview6.zip - ca. 4 KB)
Erfordert VB6 Subclassing & Timer Komponente (ssubtmr6.dll)