Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.01.24;
Скачать: CL | DM;

Вниз

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, могу подробнее объяснить




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

Текущий архив: 2002.01.24;
Скачать: CL | DM;

Наверх




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


4-75723
B@Nt
2001-11-23 12:47
2002.01.24
Как через дельфи убрать с рабочего стола иконки


3-75528
Atrem
2001-12-21 12:01
2002.01.24
Tblobstream и TIBQuery


3-75495
Havez
2001-12-19 18:52
2002.01.24
Постоянно портится Autoincrement поле


6-75634
Mihaliu
2001-11-02 11:21
2002.01.24
WEB APACHE USTANOVCA