Frage zu EmptyClipboard



  • Hi!
    Sagt mal, wie muss man das verstehen?

    http://msdn.microsoft.com/en-us/library/windows/desktop/ms649037

    MSDN schrieb:

    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.

    Wenn ich OpenClipboard(0), dann EmptyClipboard() mache, funktioniert SetClipboardData(CF_UNICODETEXT, ...) so wie es soll! Lasse ich jedoch EmptyClipboard() weg, treten zwar keine Fehler auf, es ist jedoch weiterhin noch der alte Text im Clipboard!

    Also wie jetzt?! SetClipboardData() sollte doch failen? Tut es aber nicht. Und wenn ich EmptyClipboard() weglasse, wird der Text nicht reinkopiert...


  • Mod

    Wieso? Es "failed" doch... oder funktioniert es.

    Ohne EmptyClipBoard bleibt der alte Text drin. Was willst Du denn "einsparen"? Warum verwendest Du EmptyClipboard nicht?



  • Nein, SetClipboardData() failed nicht, obwohl ich EmptyClipboard() aufrufe.
    Wie ist der MSDN Kommentar dann zu verstehen? Es sollte doch failen, wenn ich zuvor OpenClipboard(0) mache?!


  • Mod

    Fail. Bedeutet auch "funktioniert nicht"! 😉
    Schlägt fehl.

    Dein Problem ist höchstens, dass Du einen entsprechenden Returncode erwartest.
    Aber es ist dokumentiert, dass es nicht geht.



  • Aber es geht doch?!
    Drücke ich mich so undeutlich aus? 😃

    MSDN schrieb:

    Note that this causes SetClipboardData to fail.

    codebase! schrieb:

    SetClipboardData() failed nicht, obwohl ich EmptyClipboard() aufrufe.

    Kein Fehlercode, UND es funktioniert, also der Text wird ins clipboard kopiert!



  • Ja und, worauf willst du jetzt hinaus? Selbst wenn dein Windows grad tatsächlich so funktioniert und das Verhalten in der MSDN anders dokumentiert ist - wer sagt, ob das ein Bug oder Feature ist und zukünfig auch noch so ist?

    Da finde ich das Beispiel eingängiger und würde mein Programm genauso aufbauen: OpenClipboard() mit sinnvollem Fensterhandle, dann EmptyClipboard(), SetClipboardData() und schließlich CloseClipboard().



  • Ich verstehe nicht, wozu ein Fenster benötig wird. Was, wenn die Anwendung keines hat?
    Und man kann ja angeblich auch NULL übergeben. Nur wie nutze ich dann EmptyClipboard ?!



  • if (OpenClipboard (NULL) != 0) // no other clipboards opened?
    {
        EmptyClipboard ();
        if (GetOpenClipboardWindow () == NULL) // no problems with clipboard owner?
            SetClipboardData ( ... );
        CloseClipboard ();
    }
    

    Aus einem alten Projekt ... Wie du schon erkannt hast, geht das so und es soll auch so gehen. Es gab wohl früher Probleme mit SetClipboardData und einem NULL-Handle als Owner bzw. es war gar nicht erst möglich. Da Probleme bis heute wohl immer noch nicht ausgeschloßen werden können, ist das auch so in der MSDN verblieben (hängt wohl mit der Angliederung des Clipboards an den Task, sowie dessen Rechte, Windows-interne Speicherverwaltung usw. zusammen). Deshalb hatte ich damals die Abfrage mit GetOpenClipboardWindow eingefügt. Wenn da ein NULL zurückkommt, dann passt alles mit dem NULL-Handle.



  • Ich habe auch noch ein altes Projekt anzubieten (so ca. aus 2008, das seitdem unter WinXP, Vista und 7 problemlos funktioniert). Wollte es gerade posten, und nachdem ich alle irrelevanten Inhalte entfernt hatte... kam genau das selbe Beispiel dabei heraus 😃

    Wie gesagt, klappt seit Jahren unter diversen Windows-Versionen.



  • Danke!


Anmelden zum Antworten