Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.12.2007, 17:43
Chaynik Chaynik вне форума
Прохожий
 
Регистрация: 05.12.2007
Сообщения: 1
Репутация: 10
Вопрос Менять нажатые на клавиатуре клавиши

В программировании являю полное соответствие своему логину. Требуется помощь.
Как подменять нажатые на клавиатуре клавиши в другом приложении?

Т.е. имеется следующая ситуация:
пользователь, запустив приложение (неважно какое, в том числе Direct3D или OpenGL) чего-то там чепятает (ну например чат на транслите).
Задача: то, что чепятает пользователь не выводить на экран, а выводить уже замененный текст (причем не обязательно соответствие одной буквы другой, соответствие может быть одной буквы нескольким, как например, русское "Ш можно получить из англицких "S" и "H")

Пример: Пользователь пишет "privet" и нажимает Enter, чтобы послать сообщение, а на экран выводится "привет". В идеале нужно чтобы подмена символов происходила на лету, т.е. при нажатии латинской "p" в строке ввода текста проявлялась уже русская "п"
Если нет возможности менять раскладку (например, не поддерживается приложением), то можно подменять идентификаторы клавиш. В таком случае пользователь может написать в строке ввода "ghbdtn", что автоматически заменится другими клавишами на "npuBeT" (с соответствием нескольких букв одной - "gk.irf"="n/\l-0lllKA")

Все это должно происходить при нажатии горячей клавиши (чтоб оставить возможность писать некоторые слова без изменения)

Другими словами, требуется этакий фоновый транслитератор Сложно ли реализовать вышеописанное?

Последний раз редактировалось Chaynik, 05.12.2007 в 19:31.
Ответить с цитированием
  #2  
Старый 10.04.2008, 23:42
YoYo YoYo вне форума
Прохожий
 
Регистрация: 10.04.2008
Сообщения: 3
Репутация: 10
По умолчанию

Код:
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;
2. Вызываешь:
Код:
RunStopHook(true);
3. Когда надо, выгружаешь:
Код:
RunStopHook(false);
База взята из книги Михаила Фленова 'Програмирование в Delphi глазами хакера'.
зы. В HTML не работает, там структура другая.
__________________
Если что я еще и математик
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:09.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025