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

Вниз

WH_KEYBOARD   Найти похожие ветки 

 
Andriy Tysh ©   (2003-10-22 18:41) [0]

Написал маленький ХУК, а он не работает.
Тоесть,
1.Выдается ошибка "Runtime error 204" при АнХуке
2.При нажатии F2 сообщения окну передаются дважды.

Уважаемые мастера, помогите найти ошибку!

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
btnSetHook: TButton;
btnRemoveHook: TButton;
procedure btnSetHookClick(Sender: TObject);
procedure btnRemoveHookClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
HLibre: THandle;
SwitchHook: procedure(AON: Boolean); stdcall;

implementation

{$R *.dfm}

procedure TForm1.btnSetHookClick(Sender: TObject);
begin
@SwitchHook:=nil;
HLibre:=LoadLibrary(PChar("HookCtrlPoint"));
if HLibre > HINSTANCE_ERROR then
begin
@SwitchHook:=GetProcAddress(HLibre, "SwitchHook");
SwitchHook(True);
btnRemoveHook.Enabled:=not btnRemoveHook.Enabled;
btnSetHook.Enabled:=not btnSetHook.Enabled;
ShowMessage("Hook!");
end
else
begin
ShowMessage("ERROR IN LOAD DLL");
Exit;
end;
end;

procedure TForm1.btnRemoveHookClick(Sender: TObject);
begin
if HLibre > HINSTANCE_ERROR then
try
if @SwitchHook <> nil then
SwitchHook(False);
ShowMessage("UnHook!");
if FreeLibrary(HLibre) then
begin
ShowMessage(DLL Good!");
btnRemoveHook.Enabled:=not btnRemoveHook.Enabled;
btnSetHook.Enabled:=not btnSetHook.Enabled;
end
else
begin
ShowMessage("ERROR IN UNLOAD DLL!");
Exit;
end;
except
ShowMessage("ERROR UNHOOK!");
Exit;
end;
@SwitchHook:=nil;
end;
end.


library HookCtrlPoint;

uses
SysUtils,
ShareMem,
Classes,
windows,
Messages;

var CurrentHook: HHook;

function GlobalKeyBoardHook(code: integer; wParam: word; lParam: longword): longword; stdcall;
var Wnd: HWND;
begin
if code<0 then
begin
Result:=CallNextHookEx(CurrentHook,code,wParam,lparam);
Exit;
end;

if (wParam = VK_F2) and((LPARAM and KF_UP) = 0)then
begin
Wnd:=GetForegroundWindow;
SendMessage(Wnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
SendMessage(Wnd, WM_SYSCOMMAND, SC_RESTORE, 0);
Result:=1;
end else Result:=0;
CallNextHookEx(CurrentHook,code,wParam,lparam); //call the next hook proc if there is one
end;

procedure SwitchHook(AOn: Boolean); stdcall;
begin
if AOn then
CurrentHook:=SetWindowsHookEx(WH_KEYBOARD, @GlobalKeyBoardHook, HInstance, 0);
else
UnhookWindowsHookEx(CurrentHook);
end;

exports SwitchHook name "SwitchHook";
begin
end.


 
Andriy Tysh ©   (2003-10-22 20:30) [1]

А ведь я всё делал в соответсвии с примерами на этом сайте.
В чём я прощитался. Может кто на своей машине попробует этот безобидный код, иль стыкался кто с таким.
Посылка сообщения окну-это только, что-бы я видел, что и как работает. А так, то яхочу попробовать выводить подсказочные окна.
Но надо сначала найти ошибку!!!


 
zapped   (2003-10-22 22:13) [2]

library HookCtrlPoint;

uses
SysUtils,
ShareMem, Classes,
windows,
Messages;

зачем и где этот модуль нужен (если не знаешь) читай в комменте при создании DLL-ки...
а в данном случае он не нужен, но из-за него все траблы, посему - удалить...


 
Andriy Tysh ©   (2003-10-23 11:01) [3]


> zapped (22.10.03 22:13) [2]

Спасибо, проблема №1 действительно в этом.
А почему же происходит удвоенная реакция на нажатие кнопки-
сообщение посылается дважды окну, в котором я жму F2?!
Что я не то проверяю?
Наперёд спасибо.


 
Andriy Tysh ©   (2003-10-23 19:11) [4]

Хоть попробовал бы кто-то!
Ведь действительно два раза посылается сообщение, тогда, когда я ожидао одно.


 
zapped   (2003-10-23 20:35) [5]

посылается-то их два, так и надо: нажал-отжал,
только я вот не пойму, почему lparam and KF_UP = 0 в обоих случаях (на практике)...
кстати, параметры функции хука
function GlobalKeyBoardHook(code: integer; wParam: word; lParam: longword): longword; stdcall;
word - неправильно
правильно так:
The KeyboardProc hook procedure is an application-defined or library-defined callback function
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
);

то бишь
function GlobalKeyBoardHook(code, wParam, lParam: integer): lresult; stdcall;


 
zapped   (2003-10-23 22:01) [6]

ха-ха-ха!!!

LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
);

Parameters

lParam

Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag. This parameter can be a combination of the following values:

Value Description
...
31 Specifies the transition state. The value is 0 if the key is being pressed and 1 if it is being released.

смотрим чему равен KF_UP, модуль Windows:

{$EXTERNALSYM KF_UP}
KF_UP = $8000;

а надо $80000000
вот вам и borland, мать их...


 
Andriy Tysh ©   (2003-10-24 10:20) [7]

Как я понял надо KF_UP = $80000000;
? Правильно иль нет?


 
zapped   (2003-10-24 12:28) [8]

нее, это константа, её не изменишь,
надо просто проверять так
if (wParam = VK_F2) and((LPARAM and $80000000 {KF_UP} ) = 0)then
begin
Wnd:=GetForegroundWindow;
...


 
Andriy Tysh ©   (2003-10-25 10:28) [9]

Действительно работает. Странно, что никто этого не заприметил, ведь я делал хук по примеру. А как же тогда все остальные проверяют на отжатие кнопки?



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

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

Наверх




Память: 0.49 MB
Время: 0.013 c
1-62152
Deedlit
2003-12-07 07:57
2003.12.19
Признак главной формы - как поменять?


14-62206
TriX
2003-11-26 18:13
2003.12.19
HELP ME !!!!!!!!!!!!!


1-62002
Юлиана
2003-12-06 03:04
2003.12.19
Как нарисовать форму?


8-62162
shark
2003-08-22 12:27
2003.12.19
OpenGl


4-62314
plyaznik
2003-10-25 00:49
2003.12.19
Как удалить папку?