Форум: "WinAPI";
Текущий архив: 2003.12.19;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.12.19;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c