Spezielle Frage zum Clipboard Löschen



  • Hallo,

    ich habe ein Problem für die Clipboard Spezialisten 🙂

    Eine kleine Windowsanwendung registriert sich als Clipboard Viewer in Windows, und sie bekommt ab dann alle Windows Messages weitergereicht die den Clipboard betreffen. So auch WM_DRAWCLIPBOARD wenn sich der Clipboard-Inhalt ändert. Die Anwendung läuft zwei Mal bei mir, einmal lokal und einmal auf einem PC mit dem ich über Remote Desktop verbunden bin. Mache ich einen kleinen Test, z.B. Copy&Paste eines Textes, so melden beide lfd. Anwendungen gleichzeitig (lokal und remote), daß sich der Clipboard-Inhalt verändert hat (lasse ich durch ein NotifyIcon mit BalloonTip anzeigen).

    Soweit so gut, jetzt kommt mein Problem. Die Anwendung kann den Clipboard programmatisch auch leeren. Ich fand zwei Wege:

    a) mit User32.dll: OpenClipboard() -> EmptyClipBoard() -> CloseClipboard()
    b) mit .NET: ClipBoard.Clear()

    Was passiert beim Clipboard-Leeren ist vielleicht zwar logisch aber merkwürdig. Lasse ich die lokale Anwendung den Clipboard leeren, reagieren zwar beide Anwendungen (lokal und remote), jedoch nur die lokale Anwendung meldet "Clipboard leer", die remote Anwendung dagegen "Clipboard filled". 😕
    Was die remote Anwendung als Datentyp des Clipboard-Inhalts anzeigt lautet "Terminal Services Private Data". 😕

    Umgekehrt dasselbe. Die remote Anwendung lasse ich jetzt den Clipboard leeren, und nun zeigt sie jetzt an "Clipboard leer" und die lokale Anwendung dagegen "Clipboard filled", und als Datentyp des Clipboard-Inhalts wieder "Terminal Services Private Data".

    D.h. beim programmatischen Leeren des Clipboards - egal ob mit User32.dll oder .NET Clipboard - wird das Clipboard eben nur dort wirklich geleert, wo ich das explizit veranlasse (eben entweder nur lokal oder nur remote). Das ist aber nicht in meinem Sinne wenn meine Anwendung den Clipboard leeren können soll.

    Der unangenehme Nebeneffekt ist, daß der Clipboard zwar keine Daten mehr enthält mit der irgendjemand was anfangen kann (z.B. Paste irgendwohin), aber meine Anwendungen melden das unrichtig (lokal "Clipboard leer" und remote "Clipboard filled", und umgekehrt).

    Hat jemand dafür eine Erklärung und Abhilfe, bzw. eine Lösung wie ich wirklich den Clipboard leeren kann für beide Anwendungen?

    Hat die Remote Desktop Verbindung evtl. eine Art Sperre gegen programmatisches Leeren des Clipboards, sprich der Befehl zum Leeren geht über die Remote Desktop Verbindung nicht hinaus?

    Vielen Dank für alle Ratschläge.


  • Administrator

    Das ist doch kein C# oder .Net Problem. Ich verschiebe dich mal in die WinAPI, da gibt es eher Leute, welche sich mit dem grundlegendem Windows-System auskennen.

    Grüssli



  • Dieser Thread wurde von Moderator/in Dravere aus dem Forum C# und .NET in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ohne deinen Code zu kennen, vermute ich mal, dass du den HWND-Parameter der OpenClipboard()-Funktion auf NULL setzt. Was dann passiert, liest sich bei MSDN so:

    Remarks
    Before calling EmptyClipboard, an application must open the clipboard by using the OpenClipboard function. If the application specifies a NULL window handle when opening the clipboard, EmptyClipboard succeeds but sets the clipboard owner to NULL. Note that this causes SetClipboardData to fail.


  • Mod

    Ich vermute das Verhalten ist by design und gewollt, dass der Clipboard Inhalt beim leeren des Clipboardes in der Remotesession erhalten bleibt.

    Detailiert kann Dir das vermutlich nur Microsoft sagen.
    Ich würde Dir raten einen Support-Case auzumachen.


Anmelden zum Antworten