Я пишу тестовое приложение для более крупного проекта и, похоже, извлекаю данные CSV Unicode из буфера обмена Windows, мне удается получить CF_UNICODETEXT, используя встроенный вызов GetClipboardData api, однако, когда я помещаю Unicode CSV в буфер обмена в MSExcel и попытайтесь получить в формате CSV, я получаю плохие данные. Вот какой код;Как получить данные буфера обмена Unicode CSV MS Windows XP?
procedure TForm1.Button7Click(Sender: TObject);
var
hMem : THandle;
dwLen : DWord;
ps1, ps2 : pChar;
begin
OpenClipboard(form1.Handle);
RichEdit1.Lines.Clear;
try
if Clipboard.HasFormat(CF_UNICODETEXT) then
begin
hMem := GetClipboardData(CF_UNICODETEXT);
ps1 := GlobalLock(hMem);
dwLen := GlobalSize(hMem);
ps2 := StrAlloc(1 + dwLen);
StrLCopy(ps2, ps1, dwLen);
GlobalUnlock(hMem);
RichEdit1.Lines.Add(ps2);
end
else
ShowMessage('No CF_UNICODETEXT on Clipboard!');
finally
CloseClipboard;
end;
end;
Теперь этот код должен работать на CSV, а также, но когда я изменить формат буфера обмена на то, что я желая, приложение не получит соответствующие данные. Возможно, важно знать, что я могу получить Unicode с вкладками только в порядке, просто не он CSV, который я желаю.
Но, но, но, получая данные из буфера обмена должен сделать автоматическое преобразование между CF_TEXT и CF_UNICODETEXT. См. Синтезированные форматы буфера обмена в http://msdn.microsoft.com/en-us/library/ms649013(VS.85).aspx. Но что может случиться, так это то, что CF_UNICODETEXT вытаскивает UTF-8 из буфера обмена вместо UTF-16LE? Было бы странно видеть, что Windows является UTF-16LE изначально. –
@Marjan: CF_UNICODE работает, но он * tab * ограничен, не разделен запятой. Excel содержит второй формат в буфере обмена, который является CSV с кодировкой ANSI, и об этом спрашивает wfoster. Его вопрос на самом деле: «Этот код работает правильно, но не работает, если я заменю' CF_UNICODETEXT' на 'RegisterClipboardFormat ('CSV')'. –
Получил это. Спасибо за разъяснение –