![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Транслит [D7, WinXP]
Greenchel © (2006-11-08 22:06:00)Существует строка вида: Ghbdtn
Как перевести в нормальный вид?
Ketmar (2006-11-09 13:32:00) [41]>[32] Anatoly Podgoretsky(c) 9-Nov-2006, 13:20
>Насколько эффективно на разных локализациях?
честно признаться, не знаю. судя по моим тестам (далеко не полным) -- перекодировка из $419 в $409 и назад работает стабильно, если обе установлены. %-) какая локаль винды при этом -- не важно.
по идее должно работать между любыми локалями -- никаких причин для глюков не вижу. кроме, правда, диакритических символов, набираемых несколькими нажатиями. на это я злобно положил. %-)
впрочем, для решения [0] способ вполне подходящий.
>[33] Reindeer Moss Eater(c) 9-Nov-2006, 13:23
???
*Стажер* (2006-11-09 13:27:00) [42]
> [34]
Пример надыбанный, не помню откуда
*Стажер* (2006-11-09 13:26:00) [43]program Layout;
uses
windows, Messages, ShellApi, SysUtils, Clipbrd;
{$R *.RES}
const CharEngRus: array [32..126] of byte =
($20,$21,$DD,$B9,$3B,$25,$3F,$FD,$28,$29,$2A,{*}
$2B,$E1,$2D,$FE,$2E,$30,$31,$32,$33,$34,$35, {5}
$36,$37,$38,$39,$C6,$E6,$C1,$3D,$DE,$2C,$22,{@}
$D4,$C8,$D1,$C2,$D3,$C0,$CF,$D0,$D8,$CE,$CB,{K}
$C4,$DC,$D2,$D9,$C7,$C9,$CA,$DB,$C5,$C3,$CC, {V}
$D6,$D7,$CD,$DF,$F5,$5C,$FA,$3A,$5F,$B8,$F4,{a}
$E8,$F1,$E2,$F3,$E0,$EF,$F0,$F8,$EE,$EB,$E4,{l}
$FC,$F2,$F9,$E7,$E9,$EA,$FB,$E5,$E3,$EC,$F6,{w}
$F7,$ED,$FF,$D5,$2F,$DA,$A8 );
var
WindowHandle, EditHandle: HWnd;
Instance: HWnd; {дескриптор модуля приложения}
WindowClass: TWndClass; {класс окна приложения}
FHandle: HWnd; {дескриптор окна приложения}
mesg: TMsg; {сообщения приложения}
Ico_Message: integer=wm_User; {сообщение от иконки окну}
noIconData: TNotifyIconData; {дескриптор структуры NotifyIconData}
HIcon1: hIcon; {дескриптор иконки}
stClb:string;
pstw:PWideChar;
stw:WideString;
stSize,i,n:integer; {размер строки и счетчики}
Version: TOSVersionInfo;
stHdl: THandle;
stPtr: Pointer;
function WindowProc (Hwn,msg,wpr,lpr: longint): longint; stdcall;
{обработка сообщений}
begin
result:=defwindowproc(hwn,msg,wpr,lpr); {ищет стандартный обработчик}
if Msg = wm_Destroy then {если команда на закрытие}
begin
Shell_NotifyIcon(NIM_Delete,@noIconData); {удаляем иконку}
UnregisterHotKey(FHandle, 1); {убираем горячую клавишу}
halt; {закрываем программу}
end;
if Msg = Ico_Message then {если это сообщение от иконки}
begin
if lpr=WM_RBUTTONUP then {была отпущена левая кнопка}
begin
if MessageBox(FHandle,'Вы хотите закрыть программу Layout?',
'Warning',MB_YESNO)=idYES then
begin
Shell_NotifyIcon(NIM_Delete,@noIconData); {удаляем иконку}
UnregisterHotKey(FHandle, 1); {убираем горячую клавишу}
halt; {закрываем программу}
end;
end;
end;
if Msg = WM_HOTKEY then {если нажата горячая клавиша}
if wpr=1 then {и ее номер 1}
begin
WindowHandle := GetForegroundWindow; {активное окно}
EditHandle := GetTopWindow(WindowHandle); {активный элемент}
keybd_event(VK_CONTROL,0,0,0); { нажатие клавиши Ctrl}
keybd_event(ord('C'),0,0,0); {нажатие клавиши "C"}
keybd_event(ord('C'),0,KEYEVENTF_KEYUP,0); {отпускание "C"}
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0); {отпускание Ctrl }
SendMessage(EditHandle,WM_COMMAND, $00010043, $00000000); {ускоритель}
Sleep(100);
Clipboard.Open;
if Clipboard.HasFormat(CF_UNICODETEXT) then
begin
stHdl:=Clipboard.GetAsHandle(CF_UNICODETEXT);
stPtr:=GlobalLock(stHdl);
pstw:=stPtr;
stw:=pstw;
GlobalUnlock(stHdl);
stClb:=stw;
end
else stClb:=Clipboard.AsText; {забрали в строку чистый текст}
if stClb='' then exit; {на случай, если в буфере пусто}
i:=1; {ищем первый буквенный символ}
while (not (stClb[i] in ['A'..'Z'])) and (not (stClb[i] in ['a'..'z'])) and
(not (stClb[i] in ['А'..'я'])) do
begin i:=i+1; if i>length(stClb) then exit end; {если ни одного буквенного символа, то на выход}
{определям раскладку по найденному буквенному символу:}
if (stClb[i] in ['A'..'Z']) or (stClb[i] in ['a'..'z'])
then {то это английский}
begin
for n:=1 to length(stClb) do
if (ord(stClb[n])>=32) and (ord(stClb[n])<=127) then
stClb[n]:=chr(CharEngRus[ord(stClb[n])]); {заменяем символом из таблицы}
end
else {это русский}
begin
for n:=1 to length(stClb) do
for i:=32 to 126 do
begin {обратный поиск по таблице}
if ord(stClb[n])=CharEngRus[i] then
begin stClb[n]:=chr(i); break; end;
end;
end;
Version.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
GetVersionEx(Version);
if Version.dwPlatformId = VER_PLATFORM_WIN32_NT then
begin {это NT}
with Clipboard do
begin
stSize:=length(stClb)*sizeof(WideChar)+2; {длина строки в Unicode}
stHdl:=GlobalAlloc(GMEM_MOVEABLE,stSize); {отводим память в куче}
stPtr:=GlobalLock(stHdl); {указатель на эту память}
MultiByteToWideChar(CP_ACP,0,PChar(stClb),Length(stClb),stPtr,stSize);
{преобразуем в Unicode}
Clear; {очищаем буфер}
Clipboard.SetAsHandle(CF_UNICODETEXT,stHdl); {забираем в него}
GlobalUnlock(stHdl);
GlobalFree(stHdl); {очищаем память}
end;
end else {это 9х}
Clipboard.AsText:=stClb; {просто забрали обратно в буфер}
Clipboard.Close;
{вставляем поверх выделенного:}
keybd_event(VK_CONTROL,0,0,0); { нажатие клавиши Ctrl}
keybd_event(ord('V'),0,0,0); {нажатие клавиши "V"}
keybd_event(ord('V'),0,KEYEVENTF_KEYUP,0); {отпускание "V"}
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0); {отпускание Ctrl }
SendMessage(EditHandle,WM_COMMAND, $00010043, $00000000); {ускоритель}
end {hotkey}
end;
procedure CreateMyicon;
begin
HIcon1:=LoadIcon(Instance,'MAINICON'); {получаем дескриптор иконки}
with noIconData do begin
cbSize:=Sizeof(TNotifyIconData); {размер структуры}
Wnd:=FHandle; {дескриптор окна}
uID:=0; {единственная иконка}
UFlags:=NIF_MESSAGE or NIF_ICON or NIF_TIP; {взводим все флаги}
SzTip:='Language Layout'; {всплывающая подсказка}
HIcon:=HIcon1; {дескриптор иконки}
uCallBackMessage:=Ico_Message;{oпределяемое пользователем сообщение}
end;
Shell_NotifyIcon(NIM_ADD,@noIconData); {создали иконку}
end;
begin
instance :=GetModuleHandle(nil); {получаем дескриптор модуля}
with WindowClass do {задаем свойства окна}
begin
style:=CS_HRedraw or CS_VRedraw;
Lpfnwndproc:=@windowproc;
Hinstance:=Instance;
HbrBackground:= color_btnface;
LpszClassName:='DX';
Hcursor:=LoadCursor(0,IDC_ARROW);
hIcon:=LoadIcon(Instance,'MAINICON');
end;
RegisterClass(WindowClass); {регистрируем класс}
FHandle:=CreateWindowEx (0,'DX','',WS_POPUP, 5,5, 200, 200,0,0,instance, nil);
{получаем дескриптор окна}
RegisterHotKey(FHandle, 1 ,MOD_CONTROL, vk_F12); {регистрируем клавишу Ctrl-F12}
CreateMyicon; {создаем иконку}
while (GetMessage(mesg, 0, 0, 0)) do {обработка сообщений}
begin
TranslateMessage(mesg);
DispatchMessage (mesg);
end;
end.
Reindeer Moss Eater (2006-11-09 13:23:00) [44]Выставить старший бит у каждого "английского" символа в 1.
Получим русский текст в koi8r
Далее делаем перекодировку в 1251 и - вуаля.
Anatoly Podgoretsky (2006-11-09 13:20:00) [45]Неординарный подход.
Насколько эффективно на разных локализациях?
Ketmar (2006-11-09 13:05:00) [46]>[30] Anatoly Podgoretsky(c) 9-Nov-2006, 12:56
>Ух ты какой хитрый, я бы не догадался так сделать.
я бы тоже. юзер пинал. %-)
Anatoly Podgoretsky (2006-11-09 12:56:00) [47]
> он clipboard из предыдущей раскладки переводит в текущую.
> всё.
Ух ты какой хитрый, я бы не догадался так сделать.
Ketmar (2006-11-09 12:47:00) [48]>[28] Anatoly Podgoretsky(c) 9-Nov-2006, 12:15
Ghbdtn=Привет
вот этот "Привет" только что был перекодирован моим переключателем раскладок. никаких таблиц перекодировки в нём нет. ему вообще плевать на таблицы и установленые языки, он clipboard из предыдущей раскладки переводит в текущую. всё.
Anatoly Podgoretsky (2006-11-09 12:15:00) [49]> Ketmar (09.11.2006 12:07:27) [27]
> а ещё есть OS Windows и её API.
И чем оно поможет
> Существует строка вида: Ghbdtn
Ketmar (2006-11-09 12:07:00) [50]>[19] API(c) 9-Nov-2006, 09:48
>Ну и какой тогда будет алгоритм преобразования строки "
>йцукен" в строку "qwerty"?
именно тот, который успешно используется в моём переключателе раскладок.
>[23] Anatoly Podgoretsky(c) 9-Nov-2006, 10:27
>А знание какому скан-коду соответствует тот или другой
>символ, он откуда возьмет.
это винда знает. она умная.
>[24] Anatoly Podgoretsky(c) 9-Nov-2006, 10:31
>Я бы не советовал использовать скан коды, да и откуда они
>у автора, у него есть строка.
а ещё есть OS Windows и её API.
>[25] API(c) 9-Nov-2006, 10:58
>Я - тоже.
ну-ну. а о том, что клавиатуры -- они не только стандарта "qwerty" бывают -- осведомлён?
>[26] Anatoly Podgoretsky(c) 9-Nov-2006, 11:11
>Это я понял, в любом случае неодназначность, как с кодами,
>так и символами - это надо отдать на откуп пользователю.
а не операционке? кому, как не ей лучше знать соответствия?
Anatoly Podgoretsky (2006-11-09 11:11:00) [51]API © (09.11.06 10:58) [25]
Это я понял, в любом случае неодназначность, как с кодами, так и символами - это надо отдать на откуп пользователю.
API (2006-11-09 10:58:00) [52]Я бы не советовал использовать скан коды
Я - тоже.
Это просто был "наш ответ Чемберлену", то есть, на [18]...
Anatoly Podgoretsky (2006-11-09 10:31:00) [53]> API (09.11.2006 10:07:21) [21]
Я бы не советовал использовать скан коды, да и откуда они у автора, у него есть строка. Значит работать со значениями символов, а это одна строка кода.
Anatoly Podgoretsky (2006-11-09 10:27:00) [54]
> и на основе скан-кодов преобразовывать
А знание какому скан-коду соответствует тот или другой символ, он откуда возьмет.
Anatoly Podgoretsky (2006-11-09 10:25:00) [55]> API (09.11.2006 10:07:21) [21]
> Ch - не является скан-кодом клавиатуры
Ch - является идентификатором.
API (2006-11-09 10:07:00) [56]ch := Tbl[ Ch];
Ch - не является скан-кодом клавиатуры (как посоветовано в [18])...
Да и регистр при использовании скан-кодов теряется...
Anatoly Podgoretsky (2006-11-09 09:53:00) [57]> API (09.11.2006 09:48:19) [19]
Простой ch := Tbl[Ch];
API (2006-11-09 09:48:00) [58]правильно -- это API.
Звали?
на основе скан-кодов преобразовывать
Ну и какой тогда будет алгоритм преобразования строки "йцукен" в строку "qwerty"?
Ketmar (2006-11-09 01:02:00) [59]>[14] Percent 8-Nov-2006, 23:17
>Используй константный массив.
>Типа такого:
const
Digits: array[0..9] of Char = '0123456789';
%-)
и всё равно неправильно. правильно -- это API. и на основе скан-кодов преобразовывать.
Percent (2006-11-08 23:24:00) [60]То есть, не ASCII, а ANSI, русскую кодировку, или Windows-1251, что почти то же, что и ANSI...