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




Вниз

SetWindowsHookEx (WH_Keyboard....) - срабатывает два раза(вместо одного).... 


manumba   (2001-09-24 21:50) [0]

Нужно, чтобы при нажатии клавиши (в моем случае INSERT)происходило какое-то действие (у меня запись одной строки в файл для одного нажатия клавиши). Так вот, оно происходит 2 раза вместо одного. Думаю, это из-за того, что установленная мной ловушка срабатывает на сообщения KeyUp и KeyDown.
Вопрос:
-если это так, то как реагировать только на одно из этих сообщений
-иначе, что делать?

Примечание: ловушка устанавливается в процедуре (см. Текст проги)
procedure TMainForm.btnAddRemoveHookClick(Sender: TObject);

ТЕКСТ ПРОГИ:

---- ГЛАВНЫЙ МОДУЛЬ -----
var
MainForm: TMainForm;
GlobalHookID: HHook;//идентификатор глобальной ловушки
GHookInstalled: boolean;//флаг, показывает установлена или нет глобольная ловушка

//процедура передает в HookDll.dll идентификатор ловушки
procedure SetHookHandle(HookHandle: HHOOK); far; external "HookDll.dll";

implementation
{$R *.DFM}
procedure TMainForm.FormCreate(Sender: TObject);
begin
GHookInstalled:=false;//показываем, что ловушка не установлена
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
//Если ловушка установлена, то убираем ее
if GHookInstalled then UnhookWindowsHookEx(GlobalHookID);
end;

procedure TMainForm.btnAddRemoveHookClick(Sender: TObject);
var
hinstDLL: HINST;
hkprcKeyboard: TFNHookProc;
begin
if not GHookInstalled then begin
hinstDLL := LoadLibrary("HookDll.dll");
hkprcKeyboard := GetProcAddress(hinstDLL, "GlobalKeyBoardHook");
//Устанавливаем ловушку и ее идентификатор в GlobalHookID
GlobalHookID:=SetWindowsHookEx(WH_KEYBOARD, hkprcKeyboard, hinstDLL, 0);
//Передаем в dll идентификатор ловушки
SetHookHandle(GlobalHookID);
//Показываем, что ловушка инсталлирована
GHookInstalled:=true;
end
else
UnhookWindowsHookEx(GlobalHookID);
end;

------ HookDLL.dll ------

var
CurrentHook: HHook;
F: TextFile;
function GlobalKeyBoardHook(code: integer; Paramw: wParam; Paraml: lParam): longword; stdcall;
begin
if code<0 then begin
Result:=CallNextHookEx(CurrentHook,code,Paramw,Paraml);
Exit;
end;
if( ( (Paraml and KF_UP)=0 ) and (Paramw=VK_INSERT) ) then begin
(* Если нажата клавиша INSERT *)
AssignFile(F,"e:\log.txt");
if FileExists("e:\log.txt") then Append(F) else Rewrite(F);
Writeln(F,"Insert");
CloseFile(F);
end;
CallNextHookEx(CurrentHook,code,Paramw,Paraml);
Result:=0;
Exit;
end;

procedure SetHookHandle(HookHandle: HHook); stdcall;
begin
CurrentHook:=HookHandle;
end;

exports
GlobalKeyBoardHook index 1,
SetHookHandle index 2;



Raptor   (2001-09-24 22:28) [1]

Привет!

Посмотрите в хелпе описание значения битов параметра lPatram сообщения. Вам нужен 30-ый бит. Он принимает разные значения в зависимости от того в каком состоянии была клавиша до этого сообщения. Более подробную информацию о значениях битов параметра lParam сообщения читайте в хелпе по индексу Keystroke Message Flags.

Raptor.



lionheart   (2001-11-24 11:25) [2]

... не знаю, подойдет тебе ответ или нет, но :
1)
попробуй ввести boolean(типа HookBol) переменную, и
if HookBol then {делаем hook}...
после хука : HookBol := not HookBol;

2)
проверь KF_Up ...



NetBreaker666   (2001-11-24 14:38) [3]

HiWord от LParam (HiWord(Lparam)) - Скан код клавиши.
Его старший бит - состояние: 0- клавиша нажата, 1- клавиша отжата.
Для отловления нажатий юзай: If (HiWord(LParam) and $8000)=0 then
Begin
//Все, че надо
End;
Пиши на meil, могу подробнее объяснить




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




Наверх





Память: 0.73 MB
Время: 0.023 c
1-75586           RealGrey              2002-01-05 16:36  2002.01.24  
Не могу понять ощибку.


7-75694           aleXXoft              2001-10-11 12:54  2002.01.24  
PC-speaker & SoundBlaster


1-75595           Eraser                2002-01-04 23:51  2002.01.24  
HELP как-нибудь


1-75598           Masa                  2002-01-06 23:09  2002.01.24  
Помогите написать алгоритм вычисления простых чисел из множества !!!


1-75574           hacker                2002-01-01 21:40  2002.01.24  
Проблема с передачей параметрой из DLL