Форум: "WinAPI";
Текущий архив: 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;
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.01.24;
Скачать: [xml.tar.bz2];
Память: 0.44 MB
Время: 0.004 c