Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Транслит [D7, WinXP]


Страницы:   1 2 3 4

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...


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо