![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() В программировании являю полное соответствие своему логину. Требуется помощь.
Как подменять нажатые на клавиатуре клавиши в другом приложении? Т.е. имеется следующая ситуация: пользователь, запустив приложение (неважно какое, в том числе Direct3D или OpenGL) чего-то там чепятает (ну например чат на транслите). Задача: то, что чепятает пользователь не выводить на экран, а выводить уже замененный текст (причем не обязательно соответствие одной буквы другой, соответствие может быть одной буквы нескольким, как например, русское "Ш можно получить из англицких "S" и "H") Пример: Пользователь пишет "privet" и нажимает Enter, чтобы послать сообщение, а на экран выводится "привет". В идеале нужно чтобы подмена символов происходила на лету, т.е. при нажатии латинской "p" в строке ввода текста проявлялась уже русская "п" Если нет возможности менять раскладку (например, не поддерживается приложением), то можно подменять идентификаторы клавиш. В таком случае пользователь может написать в строке ввода "ghbdtn", что автоматически заменится другими клавишами на "npuBeT" (с соответствием нескольких букв одной - "gk.irf"="n/\l-0lllKA") Все это должно происходить при нажатии горячей клавиши (чтоб оставить возможность писать некоторые слова без изменения) Другими словами, требуется этакий фоновый транслитератор ![]() Последний раз редактировалось Chaynik, 05.12.2007 в 19:31. |
#2
|
|||
|
|||
![]() Код:
library hackpass; uses Windows, Messages, clipbrd, sysutils; var SysHook : HHook = 0; Wnd : Hwnd = 0; function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall; var s,s1: string; hMem: THandle; pMem: PChar; r,g: integer; begin // Передать сообщение другим ловушкам в системе CallNextHookEx(SysHook, Code, wParam, lParam); // Проверяю сообщение if code = HC_ACTION then begin // Получаю идентификатор окна сгенерировавшего сообщение Wnd := TMsg(Pointer(lParam)^).hwnd; // Проверяю тип сообщения. // Если была нажата левая кнопка мыши и Ctrl+Shift if ((TMsg(Pointer(lParam)^).wParam and MK_SHIFT) = MK_SHIFT) and ((TMsg(Pointer(lParam)^).wParam and MK_CONTROL) = MK_CONTROL) then begin SendMessage(Wnd, wm_cut, 0, 0); if clipboard.hasformat(cf_text) then s := clipboard.astext; g := Length(s); SetLength(s1,g); for r := 1 to g do case s[r] of 'q': s1[r] := 'й'; 'Q': s1[r] := 'Й'; 'w': s1[r] := 'ц'; 'W': s1[r] := 'Ц'; 'e': s1[r] := 'у'; 'E': s1[r] := 'У'; 'r': s1[r] := 'к'; 'R': s1[r] := 'К'; 't': s1[r] := 'е'; 'T': s1[r] := 'Е'; 'y': s1[r] := 'н'; 'Y': s1[r] := 'Н'; 'u': s1[r] := 'г'; 'U': s1[r] := 'Г'; 'i': s1[r] := 'ш'; 'I': s1[r] := 'Ш'; 'o': s1[r] := 'щ'; 'O': s1[r] := 'Щ'; 'p': s1[r] := 'з'; 'P': s1[r] := 'З'; '[': s1[r] := 'х'; '{': s1[r] := 'Х'; ']': s1[r] := 'ъ'; '}': s1[r] := 'Ъ'; 'a': s1[r] := 'ф'; 'A': s1[r] := 'Ф'; 's': s1[r] := 'ы'; 'S': s1[r] := 'Ы'; 'd': s1[r] := 'в'; 'D': s1[r] := 'В'; 'f': s1[r] := 'а'; 'F': s1[r] := 'А'; 'g': s1[r] := 'п'; 'G': s1[r] := 'П'; 'h': s1[r] := 'р'; 'H': s1[r] := 'Р'; 'j': s1[r] := 'о'; 'J': s1[r] := 'О'; 'k': s1[r] := 'л'; 'K': s1[r] := 'Л'; 'l': s1[r] := 'д'; 'L': s1[r] := 'Д'; ';': s1[r] := 'ж'; ':': s1[r] := 'Ж'; Chr(39): s1[r] := 'э'; '"': s1[r] := 'Э'; 'z': s1[r] := 'я'; 'Z': s1[r] := 'Я'; 'x': s1[r] := 'ч'; 'X': s1[r] := 'Ч'; 'c': s1[r] := 'с'; 'C': s1[r] := 'С'; 'v': s1[r] := 'м'; 'V': s1[r] := 'М'; 'b': s1[r] := 'и'; 'B': s1[r] := 'И'; 'n': s1[r] := 'т'; 'N': s1[r] := 'Т'; 'm': s1[r] := 'ь'; 'M': s1[r] := 'Ь'; ',': s1[r] := 'б'; '<': s1[r] := 'Б'; '.': s1[r] := 'ю'; '>': s1[r] := 'Ю'; 'й': s1[r] := 'q'; 'Й': s1[r] := 'Q'; 'ц': s1[r] := 'w'; 'Ц': s1[r] := 'W'; 'у': s1[r] := 'e'; 'У': s1[r] := 'E'; 'к': s1[r] := 'r'; 'К': s1[r] := 'R'; 'е': s1[r] := 't'; 'Е': s1[r] := 'T'; 'н': s1[r] := 'y'; 'Н': s1[r] := 'Y'; 'г': s1[r] := 'u'; 'Г': s1[r] := 'U'; 'ш': s1[r] := 'i'; 'Ш': s1[r] := 'I'; 'щ': s1[r] := 'o'; 'Щ': s1[r] := 'O'; 'з': s1[r] := 'p'; 'З': s1[r] := 'P'; 'х': s1[r] := '['; 'Х': s1[r] := '{'; 'ъ': s1[r] := ']'; 'Ъ': s1[r] := '}'; 'ф': s1[r] := 'a'; 'Ф': s1[r] := 'A'; 'ы': s1[r] := 's'; 'Ы': s1[r] := 'S'; 'в': s1[r] := 'd'; 'В': s1[r] := 'D'; 'а': s1[r] := 'f'; 'А': s1[r] := 'F'; 'п': s1[r] := 'g'; 'П': s1[r] := 'G'; 'р': s1[r] := 'h'; 'Р': s1[r] := 'H'; 'о': s1[r] := 'j'; 'О': s1[r] := 'J'; 'л': s1[r] := 'k'; 'Л': s1[r] := 'K'; 'д': s1[r] := 'l'; 'Д': s1[r] := 'L'; 'ж': s1[r] := ';'; 'Ж': s1[r] := ':'; 'э': s1[r] := chr(39); 'Э': s1[r] := '"'; 'я': s1[r] := 'z'; 'Я': s1[r] := 'Z'; 'ч': s1[r] := 'x'; 'Ч': s1[r] := 'X'; 'с': s1[r] := 'c'; 'С': s1[r] := 'C'; 'м': s1[r] := 'v'; 'М': s1[r] := 'V'; 'и': s1[r] := 'b'; 'И': s1[r] := 'B'; 'т': s1[r] := 'n'; 'Т': s1[r] := 'N'; 'ь': s1[r] := 'm'; 'Ь': s1[r] := 'M'; 'б': s1[r] := ','; 'Б': s1[r] := '<'; 'ю': s1[r] := '.'; 'Ю': s1[r] := '>'; else s1[r] := s[r]; end; hMem := GlobalAlloc(GHND or GMEM_SHARE, Length(S1) + 1); if hMem <> 0 then begin pMem := GlobalLock(hMem); if pMem <> nil then begin StrPCopy(pMem, S1); GlobalUnlock(hMem); if OpenClipboard(0) then begin EmptyClipboard; SetClipboardData(CF_TEXT, hMem); CloseClipboard; end else GlobalFree(hMem); end else GlobalFree(hMem); end; SendMessage(wnd, wm_paste, 0, 0); // Перерисовать окно. InvalidateRect(Wnd, nil, true); end; end; end; end; // Процедура запуска. procedure RunStopHook(State : Boolean) export; stdcall; begin // Если State = true, то... if State=true then begin // Запускаем ловушку. SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0); end else// Иначе begin // Отключить ловушку. UnhookWindowsHookEx(SysHook); SysHook := 0; end; end; exports RunStopHook index 1; begin end. Если ты выделяешь текст и нажимаешь Ctrl+Shift и кликаешь, то текст транслитеруется. Основной блок заменяет каждый символ на нужный. Это все код dll-ки. Вызвать его из внешнего приложения: 1. Экспортируешь функцию: Код:
procedure RunStopHook(State: Boolean) stdcall; external 'name_of_dll.dll' index 1; Код:
RunStopHook(true); Код:
RunStopHook(false); зы. В HTML не работает, там структура другая. Если что я еще и математик ![]() |