Wie kopiere ich eine Zeichenfolge in die Zwischenablage in C?

Lesezeit: 3 Minuten

Das SetClipboardData Funktion erfordert a HANDLE Hinweis; Ich habe Probleme beim Konvertieren meiner Zeichenfolge zur Verwendung in der Funktion.

Hier ist mein Code:

char* output = "Test";
HLOCAL hMem =  LocalAlloc( LHND,1024);
char* cptr = (char*) LocalLock(hMem);
memcpy( cptr, output, 500 );
SetClipboardData(CF_TEXT, hMem);
LocalUnlock( hMem );
LocalFree( hMem );
CloseClipboard();

Was mache ich hier falsch und wie mache ich das richtig?

Vielen Dank.

Benutzeravatar von Judge Maygarden
Richter Maygarden

Lesen Sie die MSDN-Dokumentation für die SetClipboardData Funktion. Es scheint, dass Sie ein paar Schritte verpassen und den Speicher vorzeitig freigeben. Zuerst müssen Sie anrufen
Zwischenablage öffnen bevor Sie SetClipboardData verwenden können. Zweitens übernimmt das System den Besitz des an die Zwischenablage übergebenen Speichers und muss entsperrt werden. Außerdem muss der Speicher verschiebbar sein, was das GMEM_MOVEABLE-Flag erfordert, wie es mit verwendet wird GlobalAlloc (anstelle von LocalAlloc).

const char* output = "Test";
const size_t len = strlen(output) + 1;
HGLOBAL hMem =  GlobalAlloc(GMEM_MOVEABLE, len);
memcpy(GlobalLock(hMem), output, len);
GlobalUnlock(hMem);
OpenClipboard(0);
EmptyClipboard();
SetClipboardData(CF_TEXT, hMem);
CloseClipboard();

  • Funktioniert auch für mich … mit zwei Korrekturen: GMEM_MOVEABLE und kein Parameter in OpenClipboard ();

    – Harvey

    21. Juni 2012 um 18:40 Uhr


  • Warum auch den Null-Byte-Terminator kopieren?

    – Jack

    13. Juni 2014 um 20:30 Uhr

  • da SetClipboardData keinen Längenparameter akzeptiert, muss es also herausfinden, wo das Ende der Zeichenfolge ist, wenn Sie CF_TEXT verwenden. Sehen msdn.microsoft.com/en-us/library/windows/desktop/… Für mehr Information

    – Elkvis

    3. September 2014 um 20:33 Uhr


  • Verstehe ich das richtig, wenn der Aufruf von SetClipboardData bei dir Systemcalls free(hMem) gelingt?

    – Pyjong

    13. Mai 2015 um 12:37 Uhr

  • Laut der Dokumentation, diese Antwort ist falsch. Sie müssen eine gültige bestehen HWND zu OpenClipboard. Zitieren: “Wenn eine Anwendung OpenClipboard aufruft und hwnd auf NULL gesetzt ist, setzt EmptyClipboard den Besitzer der Zwischenablage auf NULL; dadurch schlägt SetClipboardData fehl

    – GetFree

    26. Dezember 2018 um 23:24 Uhr

Ich habe ein Open-Source-Befehlszeilentool geschrieben, um dies in Windows zu tun:

http://coffeeghost.net/2008/07/25/ccwdexe-copy-current-working-directory-command/

ccwd.exe kopiert das aktuelle Arbeitsverzeichnis in die Zwischenablage. Es ist praktisch, wenn ich mich mehrere Ebenen tief in einem Quellrepo befinde und den Pfad kopieren muss.

Hier die komplette Quelle:

#include "stdafx.h"
#include "windows.h"
#include "string.h"
#include <direct.h>

int main()
{
    LPWSTR cwdBuffer;

    // Get the current working directory:
    if( (cwdBuffer = _wgetcwd( NULL, 0 )) == NULL )
        return 1;

    DWORD len = wcslen(cwdBuffer);
    HGLOBAL hdst;
    LPWSTR dst;

    // Allocate string for cwd
    hdst = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, (len + 1) * sizeof(WCHAR));
    dst = (LPWSTR)GlobalLock(hdst);
    memcpy(dst, cwdBuffer, len * sizeof(WCHAR));
    dst[len] = 0;
    GlobalUnlock(hdst);

    // Set clipboard data
    if (!OpenClipboard(NULL)) return GetLastError();
    EmptyClipboard();
    if (!SetClipboardData(CF_UNICODETEXT, hdst)) return GetLastError();
    CloseClipboard();

    free(cwdBuffer);
    return 0;
}

  • +1 Ja, es ist einfach zu lesen, zu kopieren und es funktioniert direkt, genau das, wonach ich gesucht habe. Und der CF_UNICODETEXT ist ein Horror nicht zu bekommen. CF_TEXT macht nur einen Buchstaben in normalem US ASCII. Die DWORD-Len sollte eine size_t-Len sein (keine Compiler-Beschwerden erhalten).

    – Jan Bergström

    18. März 2019 um 5:46 Uhr


Benutzeravatar von Kredns
Kredns

Schauen Sie sich an Microsofts Dokumentation zur Verwendung der Zwischenablage. Dies erfordert, dass Sie die WinAPI verwenden, aber das sollte kein Problem sein, da Sie Windows verwenden. Beachten Sie, dass die Programmierung der Windows-API niemals einfach ist, es sei denn, Sie verwenden eine sehr hohe Programmiersprache.

  • Nun, ich habe mir das bereits angesehen und bin auf den Code gekommen, der nicht funktioniert.

    Unbekannt

    12. August 2009 um 4:07 Uhr

  • Sie können einfach versuchen, den genauen Code zu kopieren und zu sehen, ob es funktioniert. Dann kannst du von dort aus gehen.

    – Kredns

    12. August 2009 um 4:10 Uhr

1389860cookie-checkWie kopiere ich eine Zeichenfolge in die Zwischenablage in C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy