Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.035 c
3-1083054346
Strateg2300
2004-04-27 12:25
2004.05.23
Как получить данные из ADODataSet?


3-1083242996
BPK
2004-04-29 16:49
2004.05.23
Сложный динамический SQL-запрос


11-1070887951
Phantom
2003-12-08 15:52
2004.05.23
KOL&amp;MCK выкидывают мой код... Что делать ?


3-1083138832
Viktor
2004-04-28 11:53
2004.05.23
pack table


1-1084260941
Mameluke
2004-05-11 11:35
2004.05.23
Управление работой MS Word из Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский