GetClipboardData (CF_UNICODETEXT);

Dites-moi s’il vous plaît, pourquoi je reçois ce problème:

  • si presse-papiers contient des caractères Unicode (eq russe), je ne reçois que le premier mot sélectionné. Premier mot avant le caractère “espace”.

  • si presse-papiers ne contient pas de caractères unicode (anglais uniquement), le premier caractère du texte sélectionné est obtenu.

Obtenir le texte sélectionné:

CSsortingngA getClipboard() { CSsortingngA strData; if (OpenClipboard(NULL)){ HANDLE hClipboardData = GetClipboardData(CF_UNICODETEXT); char *pchData = (char*)GlobalLock(hClipboardData); strData = pchData; GlobalUnlock(hClipboardData); CloseClipboard(); } return strData; } 

Définir le texte:

 bool setClipboard(CSsortingngA 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.GetSsortingng()), size); SetClipboardData(CF_UNICODETEXT, hClipboardData); GlobalUnlock(hClipboardData); CloseClipboard(); } return success; } 

Simplement obtenir et définir le contenu du presse-papiers.

 CSsortingngA str = getClipboard(); setClipboard(str); 

CF_UNICODETEXT utilise UTF-16. Sous Windows, les éléments de données wchar_t sont utilisés pour UTF-16, mais votre code utilise plutôt char . CSsortingngA n’est pas compatible avec UTF-16. Vous ne concordez pas les données dans les deux fonctions, c’est pourquoi vous n’obtenez pas les résultats escomptés.

Une solution consiste à utiliser CSsortingngW au lieu de CSsortingngA :

 CSsortingngW getClipboard() { CSsortingngW strData; if (OpenClipboard(NULL)) { HANDLE hClipboardData = GetClipboardData(CF_UNICODETEXT); if (hClipboardData) { WCHAR *pchData = (WCHAR*) GlobalLock(hClipboardData); if (pchData) { strData = pchData; GlobalUnlock(hClipboardData); } } CloseClipboard(); } return strData; } bool setClipboard(CSsortingngW textToclipboard) { bool success = true; if (OpenClipboard(NULL)) { EmptyClipboard(); size_t size = (textToclipboard.GetLength()+1) * sizeof(WCHAR); HGLOBAL hClipboardData = GlobalAlloc(NULL, size); if (hClipboardData) { WCHAR* pchData = (WCHAR*) GlobalLock(hClipboardData); if (pchData) { memcpy(pchData, (WCHAR*) textToclipboard.GetSsortingng(), size); GlobalUnlock(hClipboardData); SetClipboardData(CF_UNICODETEXT, hClipboardData); } } CloseClipboard(); } return success; } 

Si vous devez restr avec CSsortingngA , alors soit:

  1. utilisez CF_TEXT au lieu de CF_UNICODETEXT et laissez le presse-papiers gérer les conversions entre Ansi et Unicode pour vous:

     CSsortingngA getClipboard() { CSsortingngA strData; if (OpenClipboard(NULL)) { HANDLE hClipboardData = GetClipboardData(CF_TEXT); if (hClipboardData) { CHAR *pchData = (CHAR*) GlobalLock(hClipboardData); if (pchData) { strData = pchData; GlobalUnlock(hClipboardData); } } CloseClipboard(); } return strData; } bool setClipboard(CSsortingngA textToclipboard) { bool success = true; if (OpenClipboard(NULL)) { EmptyClipboard(); size_t size = (textToclipboard.GetLength()+1) * sizeof(CHAR); HGLOBAL hClipboardData = GlobalAlloc(NULL, size); if (hClipboardData) { CHAR* pchData = (CHAR*) GlobalLock(hClipboardData); if (pchData) { memcpy(pchData, (CHAR*) textToclipboard.GetSsortingng(), size); GlobalUnlock(hClipboardData); SetClipboardData(CF_TEXT, hClipboardData); } } CloseClipboard(); } return success; } 
  2. convertir manuellement vers / depuis UTF-16 lors de l’utilisation de CF_UNICODETEXT :

     CSsortingngA getClipboard() { CSsortingngW strData; if (OpenClipboard(NULL)) { HANDLE hClipboardData = GetClipboardData(CF_UNICODETEXT); if (hClipboardData) { WCHAR *pchData = (WCHAR*) GlobalLock(hClipboardData); if (pchData) { strData = pchData; GlobalUnlock(hClipboardData); } } CloseClipboard(); } return CSsortingngA((WCHAR*)strData.GetSsortingng()); } bool setClipboard(CSsortingngA strData) { CSsortingngW textToclipboard((CHAR*)strData.GetSsortingng()); bool success = true; if (OpenClipboard(NULL)) { EmptyClipboard(); size_t size = (textToclipboard.GetLength()+1) * sizeof(WCHAR); HGLOBAL hClipboardData = GlobalAlloc(NULL, size); if (hClipboardData) { WCHAR* pchData = (WCHAR*) GlobalLock(hClipboardData); if (pchData) { memcpy(pchData, (WCHAR*) textToclipboard.GetSsortingng(), size); GlobalUnlock(hClipboardData); SetClipboardData(CF_UNICODETEXT, hClipboardData); } } CloseClipboard(); } return success; } 

Une autre solution consiste à utiliser CSsortingng au lieu de CSsortingngA ou CSsortingngW , puis de CF_TEXT ou CF_UNICODETEXT selon que TCHAR est Ansi ou Unicode:

 #ifdef UNICODE #define CF_TEXT_T CF_UNICODETEXT #else #define CF_TEXT_T CF_TEXT #endif CSsortingng getClipboard() { CSsortingng strData; if (OpenClipboard(NULL)) { HANDLE hClipboardData = GetClipboardData(CF_TEXT_T); if (hClipboardData) { TCHAR *pchData = (TCHAR*) GlobalLock(hClipboardData); if (pchData) { strData = pchData; GlobalUnlock(hClipboardData); } } CloseClipboard(); } return strData; } bool setClipboard(CSsortingng textToclipboard) { bool success = true; if (OpenClipboard(NULL)) { EmptyClipboard(); size_t size = (textToclipboard.GetLength()+1) * sizeof(TCHAR); HGLOBAL hClipboardData = GlobalAlloc(NULL, size); if (hClipboardData) { TCHAR* pchData = (TCHAR*) GlobalLock(hClipboardData); if (pchData) { memcpy(pchData, (TCHAR*) textToclipboard.GetSsortingng(), size); GlobalUnlock(hClipboardData); SetClipboardData(CF_TEXT_T, hClipboardData); } } CloseClipboard(); } return success; } 

Les deux sont Unicode …

Mais en Unicode, plus d’un octet représente un caractère. Par exemple, 2 octets sont utilisés pour un caractère. Donc:

Quand c’est russe, la corde est comme

  '\0' ---- 0x04 0x3F 0x04 0x40 0x04 0x38 0x04 0x32 0x04 0x35 0x04 0x42 0x00 0x20 ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ п р и в е т space 

Il lit jusqu’à l’espace.

Quand c’est anglais, la chaîne est comme

 '\0' ---- 0x00 0x48 0x00 0x65 0x00 0x6C 0x00 0x6C 0x00 0x6F 0x00 0x20 ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ ~~~~~~~~~ H ello space 

Il ne lit rien. (Si vous lisez en premier, c’est à cause de l’ordre de stockage des octets, LE ou BE)

Remarque: je ne suis peut-être pas précis dans le choix des mots (Unicode, UTF, …)