![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Oops! Проблемка!!! [D5, Win95/98]
XM-AD © (2002-01-23 13:29:00)Ставлю хук на отлов нажатия клавиши, и у меня пропадает повтор, т.е. если я нажал и держу, например клавишу "а" то у меня выводится только один раз "а"! Как избежать этого?
Виктор Щербаков (2002-01-25 13:46:00) [1]Разберись с Keystroke Message Flags.
Нужно исправить строку:
if (Code >= 0) and (lParam and $40000000 = 0)
XM-AD (2002-01-25 10:08:00) [2]
library SendKey;
uses SysUtils, Classes, Windows, Messages;
const
{пользовательские сообщения}
wm_FormHide_Event = wm_User + 137;
{handle для ловушки}
HookHandle: hHook = 0;
var
SaveExitProc : Pointer;
{собственно ловушка}
function Key_Hook(Code: integer; wParam: word; lParam: Longint): Longint;stdcall; export;
var H: HWND;
begin
{если Code>=0, то ловушка может обработать событие}
if (Code >= 0) and (lParam and $40000000 = 0)
then begin
{ищем окно по имени класса и по заголовку }
H := FindWindow("TForm1", "SpyClient");
{это те клавиши?}
Case wParam of
VK_SCROLL: SendMessage(H, wm_FormHide_Event, 0, 0);
end;
{если 0, то система должна дальше обработать это событие}
{если 1 - нет}
Result:=0;
end
else if Code<0 {если Code<0, то нужно вызвать следующую ловушку}
then Result := CallNextHookEx(HookHandle,Code, wParam, lParam);
end;
{при выгрузке DLL надо снять ловушку}
procedure LocalExitProc; far;
begin
if HookHandle<>0
then begin
UnhookWindowsHookEx(HookHandle);
ExitProc := SaveExitProc;
end;
end;
exports Key_Hook;
{инициализация DLL при загрузке ее в память}
begin
{устанавливаем ловушку}
HookHandle := SetWindowsHookEx(wh_Keyboard, @Key_Hook,
hInstance, 0);
if HookHandle = 0
then MessageBox(0, "Unable to set hook!", "Error", mb_Ok)
else begin
SaveExitProc := ExitProc;
ExitProc := @LocalExitProc;
end;
end.
В программе:
////////////////////////////
private
{ Private declarations }
procedure WM_HideFormMSG (Var M : TMessage); message wm_FormHide_Event;
////////////////////////////
var
Form1: TForm1;
PDll:Pointer;
////////////////////////////
//Загрузка DLL
function Key_Hook(Code: integer; wParam: word; lParam: Longint) : Longint; stdcall; external "SendKey" name "Key_Hook";
////////////////////////////
procedure TForm1.WM_HideFormMSG (Var M : TMessage);
begin
MessageBox(Application.Handle,"Нажата клавиша ScrollLock","SpyClient",mb_OK);
end;
////////////////////////////
procedure TForm1.FormCreate(Sender: TObject);
begin
PDll:=@Key_Hook;
end;
XM-AD (2002-01-23 16:34:00) [3]Лежит в факах или статьях. Юнит SendKey, тот что отлавливает нажите на клавиши управления курсором...
Виктор Щербаков (2002-01-23 15:08:00) [4]Код хука?