Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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;


 
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 вся ветка

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

Наверх





Память: 0.45 MB
Время: 0.005 c
3-75537
EternalWonderer
2001-12-19 12:26
2002.01.24
CREATE DOMAIN BOOL AS CHAR(1) DEFAULT N CHECK (VALUE IN ( Y , N ));


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


3-75496
Kirill
2001-12-18 17:32
2002.01.24
ADO и новая запись


3-75525
frostbite
2001-12-21 14:48
2002.01.24
Определение структуры БД


4-75715
Delphi5.01
2001-11-15 17:36
2002.01.24
Очистка папки.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский