Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-62081
AlexG
2003-12-09 08:24
2003.12.19
Формат даты


7-62290
RET
2003-10-12 16:46
2003.12.19
WinXP & LPT


1-62112
Psi-factor
2003-12-08 10:22
2003.12.19
Webbrowser открыть страницу во фрейме


14-62224
Jack
2003-11-26 12:45
2003.12.19
IIS и Jakarta-Tomkat


3-61954
TATIANA
2003-11-26 17:10
2003.12.19
Поиск по дате - DateTimePicker





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский