Gibt es eine Möglichkeit über ein "event" festzustellen, ob ein neuer Eintrag ins Clipboard erfolgt ist oder muss ich das Clipboard mit ClipGet() pollen?
Neuen Eintrag ins Clipboard feststellen
-
HansJ54 -
6. Juli 2021 um 22:26 -
Erledigt
-
-
ja ist möglich jedoch aber etwas umständlich.
man muss erst einmal über setclipboardviewer seine Anwendung registrieren damit sie die Zwischenablage überwachen kann. dann kann man das Event WM_CHANGECBCHAIN auswerten.
am besten mal das Beispiel in der Hilfe zu _ClipBoard_SetViewer ansehen.
-
Ich habe ein kurzes Script aus 2012 gefunden, aber verstehe nicht die Funktionsweise. Irgendwie hängt das an einer GUI. Ich brauche nur den String ClipGet() ohne das Fenster in meinem Programm.
C
Alles anzeigen#cs ---------------------------------------------------------------------------- AutoIt Version: 3.3.6.1 Author: Zedna (Modified By Me) Script Function: Template AutoIt script. #ce ---------------------------------------------------------------------------- ; Script Start - Add your code below here #include <GUIConstants.au3> #include <WindowsConstants.au3> Global $origHWND,$lastCopied='',$WM_CLIPUPDATE=0x031D,$DefMsG='__•¯¯' $gui = GUICreate("Clip Hook",400,400,-1,-1,BitOR($WS_CAPTION,$WS_SYSMENU)) Global $label=GUICtrlCreateLabel('Clipboard Contains',30,30,340,30) Global $label1=GUICtrlCreateEdit('Clipboard Contains',30,80,340,210) ; remember last clip viewer in queue and set our GUI as first in queue $origHWND = DLLCall("user32.dll","int","AddClipboardFormatListener","hwnd",$gui) $origHWND = $origHWND[0] GUIRegisterMsg($WM_CLIPUPDATE,"OnClipBoardChange") WinSetOnTop($gui,'',1) GUISetState() While 1 $msg = GUIGetMsg() If $msg = $GUI_EVENT_CLOSE Then ExitLoop WEnd Exit Func OnClipBoardChange($hWnd, $Msg, $wParam, $lParam) ; do what you need when clipboard changes _write(ClipGet()) EndFunc Func _write($data) If $data<>$lastCopied Then $lastCopied=$data Return GUICtrlSetData($label1,$data) Else Return $DefMsG EndIf EndFunc
-
Habe die Lösung gefunden: das GUI ist hier im Beispiel nur ein Dummy. Jede Veränderung im Clipboard führt zu einer Anzeige der letzten Änderung.
C
Alles anzeigen#include <GUIConstants.au3> #include <MsgBoxConstants.au3> Global $WM_CLIPUPDATE=0x031D $gui = GUICreate("Clip Hook",400,400,-1,-1) DLLCall("user32.dll","int","AddClipboardFormatListener","HWND",$gui) GUIRegisterMsg($WM_CLIPUPDATE,"OnClipBoardChange") While 1 $msg = GUIGetMsg() If $msg = $GUI_EVENT_CLOSE Then ExitLoop WEnd Exit Func OnClipBoardChange() MsgBox($MB_TOPMOST,"Test",ClipGet(),1) EndFunc
-
Verstanden habe ich die Sache allerdings trotzdem nicht:
DLLCall("user32.dll","int","AddClipboardFormatListener","HWND",$gui)
hängt das Fenster $gui in die Clipboard-Event-Liste
GUIRegisterMsg($WM_CLIPUPDATE,"OnClipBoardChange")
$WM_CLIPUPDATE=0x031D <-- ist das eine Windows-ID für das Event im Clipboard hat sich etwas geändert?
Wenn ja:
Gibt es irgendwo eine Liste der Codes für alle möglichen Windows-Events so wie CLIPUPDATE=0x031D? Habe gesucht, aber nichts gefunden.
-
Ja, da lagst du schon richtig.
https://docs.microsoft.com/en-us/windows/…clipboardupdate