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

Вниз

HOOK на клавиатуру. Интересное свойство.   Найти похожие ветки 

 
Doctor Deejay   (2002-05-17 10:39) [0]

Установил хук на клавиатуру, а оно на каждое нажатие клавиши выводит указанный символ два раза.
Не очень разбираюсь в ловушках, поэтому прошу помочь.
Ставлю ловушку из DLL:

function KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
var
AppWnd: HWND; // дескриптор приложения, в котором произошло нажатие клавиши
begin

if code < 0 then
begin
Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
Exit;
end;

if ( ((lParam and KF_UP)=0) and (wParam>=65) and (wParam<=90) ) OR ( ((lParam and KF_UP)=0) and (wParam=VK_SPACE) ) then
begin
AppWnd:= GetForegroundWindow;
SendMessage(GlobalData^.MyAppWnd, WM_MYKEYHOOK, wParam, AppWnd);
end;

CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
Result:= 0;

end;

{Процедура установки HOOK-а}
procedure hook(switch : Boolean; hMainProg: HWND) export; stdcall;
begin
if switch=true then
begin
{Устанавливаю HOOK, если он не установлен }
GlobalData^.SysHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, HInstance, 0);
GlobalData^.MyAppWnd:= hMainProg;
if GlobalData^.SysHook <> 0 then
MessageBox(0, "KEYBOARD HOOK установлен !", "Message from keyhook.dll", 0)
else
MessageBox(0, "HOOK установить не удалось !", "Message from keyhook.dll", 0);

end
else
begin

{Удаляю функцию-фильтр, если она установлена}
if UnhookWindowsHookEx(GlobalData^.SysHook) then
MessageBox(0, "HOOK снят !", "Message from keyhook.dll", 0)
else
MessageBox(0, "HOOK снять не удалось !", "Message from keyhook.dll", 0);

end;
end;


Затем вызываю из своей программы:

procedure TForm1.Button1Click(Sender: TObject);
var
Hook: procedure (switch : Boolean; hMainProg: HWND) stdcall;
begin
SendMessage(Form1.Handle, WM_MYKEYHOOK, VK_SPACE, Application.MainForm.Handle);
@hook:= nil; // инициализируем переменную hook
hDLL:= LoadLibrary(PChar("keyhook.dll")); { загрузка DLL }
if hDLL > HINSTANCE_ERROR then
begin { если всё без ошибок, то }
@hook:=GetProcAddress(Hdll, "hook"); { получаем указатель на необходимую процедуру}
Button2.Enabled:=True;
Button1.Enabled:=False;
StatusBar1.SimpleText:= "Status: DLL loaded...";
hook(true, Form1.Handle);
StatusBar1.SimpleText:= "Status: loging in progress...";
end
else
begin
ShowMessage("Ошибка при загрузке DLL !");
Exit;
end;

end;


И в результате оно отбражает каждое нажатие клавиши как два.
В чем дело, не знаю, может подскажет кто?
Буду благодарен...


 
Fellomena   (2002-05-17 12:48) [1]

Почему два раза - понятно. Это из-за того, что ловушка срабатывает дважды, один раз при нажатии клавиши, другой - при её отжатии.
Но почему
(lParam and KF_UP)=0
не фильтрует ситуацию, когда клавиша отжата - не понятно.
...хотя должна.


 
Doctor Deejay   (2002-05-17 14:21) [2]

У меня компилятор этот 0 на nil заменил. Как этого избежать?


 
Kozhanov   (2002-05-17 14:28) [3]

http://delphi.mastak.ru/download/HookDLL.zip


 
SerVS   (2002-05-17 18:18) [4]

Fellomena права, причина именно в этом
Я с чего ты взял "(lParam and KF_UP)=0", мне кажется должно быть
"lParam and KF_UP <>0"




 
Doctor Deejay   (2002-05-17 22:29) [5]

> Fellomena права, причина именно в этом
> Я с чего ты взял "(lParam and KF_UP)=0", мне кажется должно
> быть
> "lParam and KF_UP <>0"

НЕ РАБОТАЕТ ТАК ОНО!! ВООБЩЕ НИЧЕГО НЕ ЛОВИТ!!!!!!!!


 
Nazareth   (2002-06-02 11:03) [6]

Попоробуй вместо KF_UP - $80000000


 
Лам   (2002-07-18 20:12) [7]

У меня та же проблема.


 
Юрий Зотов   (2002-07-19 00:59) [8]

KF_UP имеет тип word. Поэтому, если уж сравнивать его, то не со всем LParam, а с его старшим словом. А еще проще сразу проверять 31-й бит LParam - он ведь знаковый:
if LParam < 0 then ... // бит установлен.


 
ION T   (2002-07-19 14:35) [9]

А на кой х.. Борланд поставил ворд для маскировки дворда?!?!


 
Proton   (2002-07-20 00:59) [10]

борланд здесь вообще не причем
тебе вот эта строка
function KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
ни о чем не говорит ?


 
ION T   (2002-07-20 13:07) [11]

Хрена с папуасом:
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
);


Хотя, действительно, Борланд здесь ни при чем: в Winuser.h есть вот такое:
/*
* WM_KEYUP/DOWN/CHAR HIWORD(lParam) flags
*/
#define KF_EXTENDED 0x0100
#define KF_DLGMODE 0x0800
#define KF_MENUMODE 0x1000
#define KF_ALTDOWN 0x2000
#define KF_REPEAT 0x4000
#define KF_UP 0x8000


Всё равно не понятно зачем такое делать (ну хоть в МСДНе бы написали)....



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

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

Наверх




Память: 0.47 MB
Время: 0.008 c
1-35638
SomeQ
2002-09-01 10:08
2002.09.12
FindNext in RichEdit


1-35762
Reals
2002-08-30 18:14
2002.09.12
Поиск компонента подобного TImage


1-35731
muler
2002-08-30 13:17
2002.09.12
создание индекса по нескольким полям


1-35810
Mazenrat
2002-08-31 16:01
2002.09.12
Проблема с Transparent := True;


3-35596
7Up
2002-08-20 10:33
2002.09.12
ODBC для 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
Английский Французский Немецкий Итальянский Португальский Русский Испанский