bool SendToClipboard(const String& S)
{
HGLOBAL Data;
void* DataPtr;
TOSVersionInfo Version;
int Size;
Version.dwOSVersionInfoSize = sizeof(TOSVersionInfo);
GetVersionEx(&Version);
if (Version.dwPlatformId == VER_PLATFORM_WIN32_NT) {
Size = S.Length() * sizeof(WideChar) + 2;
Clipboard() ->Open();
try {
Data = GlobalAlloc(GMEM_MOVEABLE + GMEM_DDESHARE, Size);
try {
DataPtr = GlobalLock(Data);
try {
MultiByteToWideChar(CP_ACP, 0, S.c_str(),
S.Length(), (wchar_t*) DataPtr, Size);
Clipboard() ->Clear();
SetClipboardData(CF_UNICODETEXT, Data);
}
__finally
{
GlobalUnlock(Data);
}
}
catch (...) {
GlobalFree(Data);
}
}
__finally
{
Clipboard() ->Close();
}
}
else
Clipboard() ->SetTextBuf(S.c_str());
return true;
}
Pavel Pimenov
---
*Примечание от Victor Kazakov: Функция полезная, но имхо лучше добавить
необязательный параметр - кодировку посылаемой строки. А то при нерусских
локалях имеем крякозяблы :-).
Лучше добавить параметр в функцию:
bool SendToClipboard(const String& S, UINT CodePage = CP_ACP)
...
MultiByteToWideChar(CodePage, ...
Тогда, вызывая SendToClipboard( MyString, 1251), можно быть уверенным,
что в офисе будут вставлены именно русские буквы, независимо от
настроек системы пользователя.
Кстати, в VCL класс TFont имеет свойство Charset, которое для русской
кодовой страницы принимает значение 204. Как из 204 получить 1251 ?
В идеальном случае пользователь выбирает параметры шрифта
интерфейса, а программа должна сама определять кодовую страницу
и вызывать SentToClipboard с соответствующим параметром.
Предыдущий вопрос
|
|
Следующий вопрос
источник
by jenyok
|