Главная страница
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.01 c
3-75480
vasilly
2001-12-20 09:12
2002.01.24
Как из дельфи изменить хранимую процедуру для IB6??? То что написано ниже не работает, хотя из консоли проходит при добавлении TERM


1-75624
avr555
2002-01-08 16:44
2002.01.24
IDataObject


3-75531
Kilavit
2001-12-20 22:50
2002.01.24
Индексация


1-75540
ctapik-net
2002-01-05 09:28
2002.01.24
Создание нестандартного компонента


3-75487
Котелок
2001-12-20 06:08
2002.01.24
И снова BDE -((