Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

WH_KEYBOARD   Найти похожие ветки 

 
Wiz@rd ©   (2004-04-04 19:13) [0]

Как правильно использовать этот хук, чтобы отслеживать и русские, и латинские символы - с учётом регистра?


 
DVM ©   (2004-04-04 19:27) [1]

Этим хуком отслеживаются нажатия клавиш. А символ надо получить самому, узнав текущую раскладку клавиатуры и состояние клавиш Shift и CapsLock


 
Wiz@rd ©   (2004-04-04 19:30) [2]

Тогда посмотрите что неправильно (у меня тока русские символы показываются, хотя делаю GetKeyboardLayout):

procedure OnKeyHook(var Msg: TMsg);
var
 S: String;
 c: char;
 ClassName: array [0..255] of char;
 f: textfile;
 Buffer: array [0..50] of Char;
 Flags : Word;
 ks: TKeyboardState;
 kl: HKL;
 shift: Boolean;

begin
 if Msg.Message = WMHook then
 begin
   GetKeyboardState (ks);
   kl := GetKeyboardLayout (GetWindowThreadProcessId (GetFocus));
   ToAsciiEx (Msg.wParam, MapVirtualKey(Msg.wParam, 3), ks, @c, 0, KL);
   shift := GetKeyState (VK_SHIFT) <> 0;
   if (Ord (c) in [Ord("A")..Ord("Z")]) or (Ord (c) in [Ord("a")..Ord("z")]) or
   (Ord (c) in [Ord("А")..Ord("Я")]) or (Ord (c) in [Ord("а")..Ord("я")]) then
   begin
     S := c;
     if Shift then
       c := char(Ord(c) + 32);
   end
   else
   if (Ord(c) in [32..64, 91..96, 123..191]) then
   begin
     s := c;
   end;
   {if (Ord (c) in [33..47]) then
   begin
     S := c;
     if Shift then
       c := char(Ord(c) + 15);
   end;}

     {32: s := " ";
     33..47:
     begin
        if  shift then
          c := char(Ord(c) + 15);
        S := c;
     end;}
   {else                                    
     s := "[" + Buffer + "]";}
   Flags := Msg.lParam shr 16;
   if (Flags and KF_UP) <> 0 then
   begin
     //S := S + " down"
   end
   else
   if (Flags and KF_REPEAT) <> 0 then
   begin
     //S := S + " repeat"
   end
   else
   begin
     //S := S + " up";
     NeedLog := True;
     //Beep(500, 100);
   end;

 //s - результат

end;


 
sir John ©   (2004-04-04 19:52) [3]

To Wiz@rd:
Нам не надо использовать WH_KEYBOARD так как в данномслучае эта функция для нас бесполезна, ибо она только позволяет приложению отслеживать сообщения WM_KEYDOWN и WM_KEYUP. Нам же надо перехватить конкретное нажатие клавиш. В данном случае распознать русские ли буквы нажаты или английские. Для этого необходимо использовать перехват сообщения WM_CHAR. Ниже приведен пример, который отслеживате только нажатие русских или английских букв:

private
   Procedure HookAppChar(var msg: TWMCHAR); message WM_CHAR;

Это заголовок процедуры, который помещен в секцию private.


procedure TForm1.HookAppChar(var msg: TWMCHAR);
begin
if (msg.CharCode in [65..122]) then
 ShowMessage ("English Key Pressed! Char is: " + Chr(msg.CharCode) + " Code: "+ IntToStr(msg.CharCode));
if (msg.CharCode in [192..255]) then
 ShowMessage ("Russian Key Pressed! Char is: " + Chr(msg.CharCode) + " Code: "+ IntToStr(msg.CharCode));
end;

Это тело процедуры. При нажатии на клавиатуру, в случае, если это анг. или русская буква, Вам будет выдано сообщение с именем буквы и ее кодом. Надеюсь Вам этот пример поможет. Удачи!


 
DVM ©   (2004-04-04 20:02) [4]


> Для этого необходимо использовать перехват сообщения WM_CHAR.

Тогда это уже другой хук WH_GETMESSAGE


 
sir John ©   (2004-04-04 20:07) [5]

To DVM:
а на кой он нам тут? :) Может я чего не так понял из описания Wiz@rd?


 
DVM ©   (2004-04-04 20:13) [6]


> а на кой он нам тут? :)

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


 
sir John ©   (2004-04-04 20:17) [7]

надо дождаться вопрошающего, однако... :) А вообще дело клавиатурным шпионом попахивает :) Может быть я и ошибаюсь :)


 
Wiz@rd ©   (2004-04-04 22:24) [8]

Да всё правильно работает  - оказывается - просто я тестил на FAR"е - а он почему всегда показывает русскую раскладку.

А вообще дело клавиатурным шпионом попахивает :)

Тут не только клавиатурный шпион - тут целый мега троян :)


 
Игорь Шевченко ©   (2004-04-04 23:05) [9]

Wiz@rd ©   (04.04.04 22:24)


> Тут не только клавиатурный шпион - тут целый мега троян
> :)


Не на этом сайте.


 
xamlo   (2004-04-05 01:44) [10]

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

// текст библиотеки, т.е. полное содержимое файла KeyHook.dpr
library KeyHook;

uses
 shellapi,
 windows;

var
g_hhk: HHOOK;

function KeyboardProc(nCode: Integer; wParam: wParam; lParam: lParam ): LParam; stdcall;
var
f:textfile;
begin
MessageBeep(0);
assignfile(f, "c:\hook.txt");
try
 append(f);
except
 rewrite(f);
end;
writeln(f, nCode,",",wParam,",",lParam);
close(f);
end;

exports
KeyboardProc;
begin
end.

// Пример установки WindowsHook
procedure TForm1.Button1Click(Sender: TObject);
var
 hinstDLL: HINST;
 hkprcKeyboard: TFNHookProc;
 msg: TMsg;
begin
 hinstDLL := LoadLibrary("KeyHook.dll");
 hkprcKeyboard := GetProcAddress(hinstDLL, "KeyboardProc");
 SetWindowsHookEx(WH_KEYBOARD, hkprcKeyboard, hinstDLL, 0);
end;
end.



 
rimd ©   (2004-04-05 08:31) [11]

CallNextHookEx в конце KeyBoardProc! Но вообще по мойму ты написал чушь! И это работать не будет! Каким образом ты устанавливаешь глобальный Хук из своего приложения? Это должно быть в твоей DLL. А вот эта штука GetProcAddress(hinstDLL, "KeyboardProc") должна возращать адрес типа SetHook, который должен находиться в твоей dll. Иначе, по-мойму, это не имеет смысла


 
xamlo   (2004-04-06 01:13) [12]

ты не очень внимательно прочел, там вообще-то и дллка и ехешка.
тама просто все в куче. но вообще, тебе большое спасибо :)



Страницы: 1 вся ветка

Текущий архив: 2004.05.23;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
7-1082224554
ЧупаЧупс
2004-04-17 21:55
2004.05.23
Частота обновления


1-1083748602
Романов Р.В.
2004-05-05 13:16
2004.05.23
Организация вывода сообщения об ошибке


1-1083839939
ary
2004-05-06 14:38
2004.05.23
Векторный шрифт


3-1083020634
rosl
2004-04-27 03:03
2004.05.23
запрос SQL


4-1080972102
Namiq
2004-04-03 10:01
2004.05.23
Java + Delphi