Автор
|
Тема: Clipboard и Unicode
|
kourov |
опубликован 21-12-2001 11:01 MSK
Короче, надо достать CF_TEXT из клипборда. В NT постоянно пишет, что доступно как в UNICODE, так и в ANSI, но если от ANSI окон достать UNICODE текст, он нормально в ANSI не переводиться через WideCharToMultyByte, фигня какая-то. Подскажите, как работает!!!
|
Flex Ferrum
|
опубликован 21-12-2001 11:03 MSK
Не может быть. Поиграйся с кодовыми страницами - должно работать. |
SUnteXx
|
опубликован 21-12-2001 12:44 MSK
Я тут работаю в ХР и создаю свой Clipboard Viewer, так я установил, что эти Микросаксы сделали так, что при засылке обычного текста в память он сразу же переводит в юникод, причем переводит так: берет текст, добовляет после каждого символа символ "\0" и вынь думает, что это юникод! приходится самому делать перевод! Придурки они! А когда засылаешь юникод, то переводится в текст (как ни странно, то в нормальный текст)! Это я заметил тогда, когда работал с NotePad'ом, он полностью на юникоде (т.е. засылка в память и получение из памяти данных все в юникоде!). Я копировал текст из нотепада и пытался с этим текстом сделать пасту. Итог, ставились символы "?" вместо всей строки! Я теперь делаю так: беру текст в юникоде и перевожу в текст (WideCharToMultyByte), если челу не нравится результат, то чел должен убрать в настройках поддержку юникода! Чел закрывает окно, а потом при открытии окна (раз юникод не проверять) достается обычный текст! Как ни странно, но работает! Попробуйте также сделать! |
Flex Ferrum
|
опубликован 21-12-2001 13:22 MSK
Не в этом дело. К сожалению, нет сейчас под рукой исходников, но я эту задачу решал и успешно. WideCharToMultiByte должна работать корректно. |
kourov
|
опубликован 21-12-2001 15:07 MSK
Хрен знает, ничего не выходит. Вот к примеру, в блокноте и Бате нормально, а в VC++ получаются кракозябры. Вот текущий код, мутил с кодовыми страницами. Суть в том, чтобы клипборд изменить по определёоонму алгоритму.void CLCDlg::ConvertClipboard() { HGLOBAL hglb; LPSTR szData; CString strData; BOOL bUnicodeAvailable = ::IsClipboardFormatAvailable(CF_UNICODETEXT); if ((!::IsClipboardFormatAvailable(CF_TEXT)) && (!bUnicodeAvailable)) return; if (!OpenClipboard()) return; if(bUnicodeAvailable) hglb = GetClipboardData(CF_UNICODETEXT); else hglb = GetClipboardData(CF_TEXT); if (hglb != NULL) { szData = (LPSTR) GlobalLock(hglb); if (szData != NULL) { // UNICODE if(bUnicodeAvailable) { LPWSTR lpwData = (LPWSTR) szData; LPSTR szDataFromUnicode = NULL; int nUnicodeLength = lstrlenW(lpwData); TRACE("Unicode! Äëèíà ñòðîêè = %d\n", nUnicodeLength); szDataFromUnicode = new char[nUnicodeLength + 1]; VERIFY(WideCharToMultiByte(CP_THREAD_ACP, 0, lpwData, -1, szDataFromUnicode, nUnicodeLength + 1, 0, 0)); strData = szDataFromUnicode; TRACE("%s %s\n", strData, szData); delete[] szDataFromUnicode; } else strData = szData; InverseWordLanguage(strData); GlobalUnlock(hglb); EmptyClipboard(); int nLength = strData.GetLength(); ///////////////////////////////////////////////////////// HGLOBAL hglbCopy = GlobalAlloc(GMEM_DDESHARE, nLength + 1); LPTSTR lptstrCopy = (LPTSTR) GlobalLock(hglbCopy); lstrcpy(lptstrCopy, strData); GlobalUnlock(hglbCopy); VERIFY(SetClipboardData(CF_TEXT, hglbCopy)); ///////////////////////////////////////////////////////// // UNICODE hglbCopy = GlobalAlloc(GMEM_DDESHARE, 2 * nLength + 2); // äëÿ Unicode - ñèìâîëîâ LPWSTR lpwstrCopy = (LPWSTR) GlobalLock(hglbCopy); ZeroMemory(lpwstrCopy, 2 * nLength + 2); MultiByteToWideChar(CP_THREAD_ACP, 0, (LPCSTR) strData, -1, lpwstrCopy, nLength); GlobalUnlock(hglbCopy); VERIFY(SetClipboardData(CF_UNICODETEXT, hglbCopy)); /////////////////////////////////////////////////// CloseClipboard(); } } } |