Clipboard.ContentChanged in Purebasic?

Anfängerfragen zum Programmieren mit PureBasic.
EmmJott
Beiträge: 40
Registriert: 25.10.2024 12:23

Clipboard.ContentChanged in Purebasic?

Beitrag von EmmJott »

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?
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!
Axolotl
Beiträge: 265
Registriert: 31.12.2008 16:34

Re: Clipboard.ContentChanged in Purebasic?

Beitrag von Axolotl »

Moin,
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
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Clipboard.ContentChanged in Purebasic?

Beitrag von H.Brill »

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

Code: Alles auswählen

 SetGadgetText(#deinEditorgadget, GetClipboardText())
z.b. in ein Editorgadget einfügen.
PB 6.10
Axolotl
Beiträge: 265
Registriert: 31.12.2008 16:34

Re: Clipboard.ContentChanged in Purebasic?

Beitrag von Axolotl »

In der theorie und in der praxis etwa so:
Add/Remove ClipboardFormatListener ?
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Clipboard.ContentChanged in Purebasic?

Beitrag von H.Brill »

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.
PB 6.10
Axolotl
Beiträge: 265
Registriert: 31.12.2008 16:34

Re: Clipboard.ContentChanged in Purebasic?

Beitrag von Axolotl »

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.)

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
Antworten