VB 5/6-Tipp 0348: Zwischenablage überwachen, Clipboard-Viewer
von ActiveVB
Beschreibung
Windows bildet interessanterweise auch bei der Zwischenablage eine Nachrichtenkette. Somit ist es möglich sich mit seinem Programm an deren erste Stelle zu platzieren und auf das eintreffen des Notifies zu warten. Dieses vorgehen hat gegenüber dem ständigen Abtasten des Clipboards mittels z.B. eines Timers eine bessere Performance. Anwendung würde das ganze beispielsweise in einem eigenen Clipboard-Viewer, wie hier vorgestellt, finden.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: CallWindowProcA (CallWindowProc), ChangeClipboardChain, SendMessageA (SendMessage), SetClipboardViewer, SetWindowLongA (SetWindowLong) | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '------------- Anfang Projektdatei Project1.vbp ------------- '--------- Anfang Formular "Form1" alias Form1.frm --------- ' Steuerelement: Rahmensteuerelement "Frame1" ' Steuerelement: Schaltfläche "Command1" auf Frame1 ' Steuerelement: Bildfeld-Steuerelement "Picture1" auf Frame1 ' Steuerelement: Textfeld "Text1" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label1" auf Frame1 Option Explicit Private Sub Command1_Click() Unload Me End Sub Private Sub Form_Load() Call Init(Me.hWnd) End Sub Private Sub Form_Unload(Cancel As Integer) Call Terminate(Me.hWnd) End Sub '---------- Ende Formular "Form1" alias Form1.frm ---------- '--------- Anfang Modul "Module1" alias Module1.bas --------- Option Explicit Private Declare Function SetWindowLong Lib "user32" Alias _ "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As _ Long, ByVal dwNewLong As Long) As Long Private Declare Function CallWindowProc Lib "user32" Alias _ "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal _ hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, _ ByVal lParam As Long) As Long Private Declare Function SetClipboardViewer Lib "user32" _ (ByVal hWnd As Long) As Long Private Declare Function ChangeClipboardChain Lib "user32" _ (ByVal hWnd As Long, ByVal hWndNext As Long) As Long Private Declare Function SendMessage Lib "user32" Alias _ "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As _ Long, ByVal wParam As Long, lParam As Long) As Long Const GWL_WNDPROC = (-4&) Const WM_SYSCOMMAND = &H112 Const WM_DRAWCLIPBOARD = &H308 Const WM_CHANGECBCHAIN = &H30D Dim PrevWndProc&, hView& Public Sub Init(hWnd&) PrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, _ AddressOf WndProc) hView = SetClipboardViewer(hWnd) End Sub Public Sub Terminate(hWnd&) Call ChangeClipboardChain(hWnd, hView) Call SetWindowLong(hWnd, GWL_WNDPROC, PrevWndProc) End Sub Private Function WndProc(ByVal hWnd&, ByVal Msg&, ByVal _ wParam&, ByVal lParam&) As Long Select Case Msg Case WM_CHANGECBCHAIN: If wParam = hView Then hView = lParam ElseIf (hView <> 0) Then Call SendMessage(hView, Msg, _ wParam, lParam) End If Case WM_DRAWCLIPBOARD Beep If Clipboard.GetFormat(vbCFText) Then Form1.Text1.Text = Left$(Clipboard.GetText, 32767) End If If Clipboard.GetFormat(vbCFBitmap) Then Form1.Picture1.Picture = _ Clipboard.GetData(vbCFBitmap) End If If (hView <> 0) Then Call SendMessage(hView, Msg, wParam, lParam) End If End Select WndProc = CallWindowProc(PrevWndProc, hWnd, Msg, _ wParam, lParam) End Function '---------- Ende Modul "Module1" alias Module1.bas ---------- '-------------- Ende Projektdatei Project1.vbp --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 5 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von geri3d am 08.10.2007 um 21:47
Timer ist so eine Unart...
wenn sich ein Bild in der Zwischenablage befindet ist es schwierig zu erkennen ob es sich geändert hat.
Ich bin auch kein Freund von Timer-Steuerelementen
Kommentar von Stefan am 17.05.2005 um 16:53
Hallo,
ich möchte diesen Tipp benutzen, um vor dem Einfügen alle Formatierungen aus dem kopierten Text zu entfernen.
Hat jemand einen Tipp, wie ich das bewerkstelligen kann?
Bin für jede Hilfe dankbar!
Stefan
Kommentar von WellingaDaDon am 31.05.2004 um 08:10
Wie wärs wenn du sagen würdest was fürn Betriebsystem und was fürn VB du hast.
So wird dir sicher niemand helfen können.
(Auch wenn das Thema schon alt war :D)
Kommentar von Daniel am 16.09.2001 um 17:04
meine anwendung stürzt nach dem beenden und "unhooken" des clipboard viewer samt vb gnadenlos ab.
was kann das sein?
weiß einer einen rat?
freundliche grüße und danke im voraus
daniel
Kommentar von Stefan am 08.06.2001 um 22:39
Wenn ich von einem bestimmten Programm (CardServer von Towitoko)eine Botschaft auswerten möchte um mit meinem Prog. darauf zu reagieren. Wie muß ich da vor gehen
MfG und vielen Dank im voraus
Stefan