GetClipboardData (CF_UNICODETEXT);
Sagen Sie mir bitte, warum bekomme ich diese Probleme:
- wenn die Zwischenablage enthält unicode-Zeichen (e.q. Russisch) bekomme ich nur das erste markierte Wort. Erstes Wort, bevor Sie die "space" - Charakter.
- wenn Zwischenablage nicht mit unicode-chars (nur auf Englisch) bekomme ich erste Zeichen des ausgewählten Textes.
Get selected text:
CStringA getClipboard()
{
CStringA strData;
if (OpenClipboard(NULL)){
HANDLE hClipboardData = GetClipboardData(CF_UNICODETEXT);
char *pchData = (char*)GlobalLock(hClipboardData);
strData = pchData;
GlobalUnlock(hClipboardData);
CloseClipboard();
}
return strData;
}
Text:
bool setClipboard(CStringA textToclipboard)
{
bool success = true;
if (OpenClipboard(NULL)){
EmptyClipboard();
HGLOBAL hClipboardData;
size_t size = (textToclipboard.GetLength()+1) * sizeof(TCHAR);
hClipboardData = GlobalAlloc(NULL, size);
TCHAR* pchData = (TCHAR*)GlobalLock(hClipboardData);
memcpy(pchData, LPCTSTR(textToclipboard.GetString()), size);
SetClipboardData(CF_UNICODETEXT, hClipboardData);
GlobalUnlock(hClipboardData);
CloseClipboard();
}
return success;
}
Einfach get-und set-Inhalt der Zwischenablage.
CStringA str = getClipboard();
setClipboard(str);
CStringA ist eine ANSI-Zeichenfolge für UNICODE-Sie müssen CStringW.
Funktioniert nicht. Ich bekomme Symbole B5:AB und zu seltsame "Ecken"
Nicht
Funktioniert nicht. Ich bekomme Symbole B5:AB und zu seltsame "Ecken"
Nicht
CF_UNICODETEXT
UTF-16, also die standard - W
format-string, was bedeutet, für standard-ascii, du bekommst nur einen Charakter.InformationsquelleAutor user1537809 | 2013-03-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
CF_UNICODETEXT
verwendet UTF-16. Unter Windowswchar_t
Daten-Elemente verwendet werden, für die UTF-16, aber Ihr code ist mitchar
statt.CStringA
ist nicht kompatibel mit UTF-16. Sie sind nicht übereinstimmende Daten in beiden Funktionen, das ist, warum Sie nicht bekommen, die Ergebnisse, die Sie erwarten.Eine Lösung ist die Verwendung
CStringW
stattCStringA
:Wenn Sie benötigen, um stick mit
CStringA
, dann entweder:verwenden
CF_TEXT
stattCF_UNICODETEXT
und lassen Sie die Zwischenablage behandeln Konvertierungen zwischen Ansi-und Unicode für Sie:convert to/from UTF-16 manuell bei Verwendung
CF_UNICODETEXT
:Andere Lösung ist die Verwendung
CString
statt entwederCStringA
oderCStringW
, und verwenden Sie dannCF_TEXT
oderCF_UNICODETEXT
je nachdem, obTCHAR
Ansi oder Unicode:Schön erklären, danke..
InformationsquelleAutor Remy Lebeau
Beide sind Unicode...
Aber in Unicode, die mehr als ein byte repräsentiert ein Zeichen. Zum Beispiel vielleicht 2 bytes verwendet für ein Zeichen. Daher:
Wenn es der russe, der string ist wie
Liest es, bis Raum.
Wenn es Englisch ist, wird die Zeichenfolge wie
Es liest nichts. (Wenn Sie zuerst Lesen, es ist, weil der Bestellung der Speicherung von bytes, LE oder BE)
Hinweis: Vielleicht bin ich nicht die Präzision in der Wahl der Worte (Unicode, UTF, ...)
Vielleicht ist die Terminologie falsch ist (ich weiß nicht, oder Pflege), aber die Erklärung ist toll. Extra-Punkte für die Diagramme. 🙂
Ok, ich versuche es zu ändern Sie diese Zeile: strData = pchData; ich brauche noch ein Umbau?
Vielleicht dieser und dieser, sind nützliche links.
Er tatsächlich liest 1 Zeichen im zweiten Fall (Englisch, nur ASCII-Zeichensatz), da das format tatsächlich UTF-16LE und sieht aus wie
0x48 0x00
beendet den string nach dem ersten Zeichen.InformationsquelleAutor deepmax