Guude Morsche (wie man in Hessen grüßt),
offenbar gibt es das "Clipboard.ContentChanged"-Event, was genau das wäre, was meine App braucht, um das Clipboard auf neuen bzw. geänderten Inhalt zu prüfen. Nur habe ich Null Ahnung, wie das in Purebasic umzusetzen wäre. Wer kann mir helfen?
Clipboard.ContentChanged in Purebasic?
Clipboard.ContentChanged in Purebasic?
Bin aktiv in der rentenvorbereitenden Arbeitslosigkeit - zwangsweise. Auch nach >30 Jahren im Betrieb springst Du über die Klinge, wenn der (Miss-)Manager seinen Hintern retten will. Lasst Euch von euren Arbeitgebern bloß nix von wegen Loyalität erzählen - wenn's drauf ankommt, ist die nix Wert!
Re: Clipboard.ContentChanged in Purebasic?
Moin,
unter windows geht es in etwa so:
unter windows geht es in etwa so:
Code: Alles auswählen
EnableExplicit
Global g_hwndNextViewer
Procedure WindowCallback(hwnd, msg, wParam, lParam)
Protected text$
Select msg
Case #WM_CHANGECBCHAIN
If hwnd = g_hwndNextViewer
g_hwndNextViewer = hwnd
Else
If g_hwndNextViewer ; <> #Null
SendMessage_(g_hwndNextViewer, msg, wParam, lParam)
EndIf
EndIf
ProcedureReturn 0 ; If an application processes this message, it should return zero.
Case #WM_DRAWCLIPBOARD ; clipboard contents changed
text$ = GetClipboardText() ; text only here
If text$ ; <>""
AddGadgetItem(0, -1, text$)
SendMessage_(GadgetID(0), #EM_SETSEL, $FFFF, $FFFF)
EndIf
; Pass the message to the next window in clipboard viewer chain
SendMessage_(g_hwndNextViewer, msg, wParam, lParam)
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure Main()
Protected hwnd
hwnd = OpenWindow(0, 80, 80, 600, 400,"Clipboard...",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
If hwnd
StickyWindow(0, 1)
EditorGadget(0, 0, 0, 600, 400)
g_hwndNextViewer = SetClipboardViewer_(hwnd)
SetWindowCallback(@WindowCallback(), 0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break ; bye
EndSelect
ForEver
; remove this app window from the chain of clipboard viewers
ChangeClipboardChain_(hwnd, g_hwndNextViewer)
EndIf
ProcedureReturn 0
EndProcedure
End Main()
Zuletzt geändert von Axolotl am 24.06.2025 11:16, insgesamt 1-mal geändert.
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Re: Clipboard.ContentChanged in Purebasic?
Geht das nicht noch einfacher ?
Mit AddClipboardFormatListener_(HandleDeinWindow) dein Fenster registrieren und den Event $031D abfragen.
Wenn der Event dann ankommt, mit den PB - Clipboard Funktionen auslesen
z.b. in ein Editorgadget einfügen.
Mit AddClipboardFormatListener_(HandleDeinWindow) dein Fenster registrieren und den Event $031D abfragen.
Wenn der Event dann ankommt, mit den PB - Clipboard Funktionen auslesen
Code: Alles auswählen
SetGadgetText(#deinEditorgadget, GetClipboardText())
PB 6.10
Re: Clipboard.ContentChanged in Purebasic?
In der theorie und in der praxis etwa so:
Add/Remove ClipboardFormatListener ?
Add/Remove ClipboardFormatListener ?
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Re: Clipboard.ContentChanged in Purebasic?
Naja, ist dann doch etwas umfangreicher.
Ich dachte nun, da PB ja die Api-Funktionen (mit _) kennt, wäre das einfacher.
Da hatte ich mich wohl getäuscht.
Warum muß man da den Code der orig. Windowsprozedur unterschieben ?
Ist doch das gleiche, wie bei anderen Messages auch.
Ich konnte das damals in XProfan mit einer UserMessage ganz einfach lösen,
ohne irgendwelches SubClassing, was XProfan ja auch beherrscht.
Aber egal.
Ich dachte nun, da PB ja die Api-Funktionen (mit _) kennt, wäre das einfacher.
Da hatte ich mich wohl getäuscht.
Warum muß man da den Code der orig. Windowsprozedur unterschieben ?
Ist doch das gleiche, wie bei anderen Messages auch.
Ich konnte das damals in XProfan mit einer UserMessage ganz einfach lösen,
ohne irgendwelches SubClassing, was XProfan ja auch beherrscht.
Aber egal.
PB 6.10
Re: Clipboard.ContentChanged in Purebasic?
Die Funktionen müssen irgendwo bekannt gemacht werden. Für viele (nicht alle) API Funktionen gibt es das innerhalb der PB-Bibliotheken.
Eine Alternative zum dyn. Aufruf über OpenLibrary kann man natürlich auch Import verwenden.
Dann sieht das Ganze so aus: (Um die PB-typischen Underscores im Funktionsnamen zu behalten muss man über den Symbolnamen gehen.)
Eine Alternative zum dyn. Aufruf über OpenLibrary kann man natürlich auch Import verwenden.
Dann sieht das Ganze so aus: (Um die PB-typischen Underscores im Funktionsnamen zu behalten muss man über den Symbolnamen gehen.)
Code: Alles auswählen
EnableExplicit
Import "user32.lib"
; for 64-bit - in PB Style with underscore
AddClipboardFormatListener_(hwnd.i) As "AddClipboardFormatListener"
RemoveClipboardFormatListener_(hwnd.i) As "RemoveClipboardFormatListener"
EndImport
#WM_CLIPBOARDUPDATE = $031D ; missing by now
Procedure WindowCallback(hwnd, msg, wParam, lParam)
Protected text$
Select msg
Case #WM_CLIPBOARDUPDATE
text$ = GetClipboardText() ; text only here
If text$ ; <>""
AddGadgetItem(0, -1, text$)
SendMessage_(GadgetID(0), #EM_SETSEL, $FFFF, $FFFF)
EndIf
ProcedureReturn 0 ; If an application processes this message, it should return zero.
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure Main()
Protected hwnd
hwnd = OpenWindow(0, 80, 80, 600, 400,"Clipboard...",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
If hwnd
StickyWindow(0, 1)
EditorGadget(0, 0, 0, 600, 400)
AddClipboardFormatListener_(hwnd)
SetWindowCallback(@WindowCallback(), 0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break ; bye
EndSelect
ForEver
RemoveClipboardFormatListener_(hwnd)
EndIf
ProcedureReturn 0
EndProcedure
End Main()
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home