Форум: "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.026 c
1-75558           Tolik2002             2002-01-05 11:29  2002.01.24  
Ресурсы


14-75656          Lexus                 2001-11-28 17:31  2002.01.24  
Сохранение строк в текстовом файле и считывание их при последующем открытии программы?


14-75680          Anonymus              2001-11-25 12:05  2002.01.24  
Чистяков


7-75696           Алексей Саньков       2001-10-05 21:55  2002.01.24  
Как сделать в Винде 256 цветов 640х480 на видюхе Acumos


3-75502           Boo                   2001-12-17 10:26  2002.01.24  
Забавный глюк... (наверно у меня...)