Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Уважаемые профи, помогите исправить ошибку.... [D5, Win95/98]


Slavik99 ©   (2002-12-06 20:53:00) 

Ни как не могу понять почему в моей DLL"ке происходит ошибка при возвращении результата функции.
Вот код моей DLL"ки:

library SysHook;

uses SysUtils, Classes, WinTypes, WinProcs, Messages;

const
{пользовательские сообщения}
wm_MyMouseEvent = wm_User + 1;

var
SaveExitProc : Pointer;
{handle для ловушки}
HookHandle: hHook = 0;

function Mouse_Hook(Code: Integer; wParam: Word; lParam: Longint): longint;
var H: HWND;
begin
if wParam=wm_RButtonDown then
begin
{ищем окно по имени класса и по заголовку}
H := FindWindow("TForm1", "xxx");
SendMessage(H, wm_MyMouseEvent, 0, 0);
Result:=0;
end;
{На следующей строке происходит ошибка, система либо виснет
или перегружается, если мышь находится за пределами формы
загрузившей эту DLL"ку}
Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
end;

procedure LocalExitProc;
begin
if HookHandle<>0 then
begin
UnhookWindowsHookEx(HookHandle);
ExitProc := SaveExitProc;
end;
end;

exports Mouse_Hook;

begin
HookHandle:=SetWindowsHookEx(WH_SHELL, @Mouse_Hook, hInstance, 0);
if HookHandle = 0 then
MessageBox(0, "Невозможно создать ловушку!!!", "Ошибка", mb_Ok)
else
begin
SaveExitProc := ExitProc;
ExitProc := @LocalExitProc;
end;
end.


Вот код моей программы, которая вызывает DLL"ку:

unit Unit1;

interface

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

const
wm_MyMouseEvent = wm_User + 1;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure WMMyMouseEvent(var M: TMessage); message wm_MyMouseEvent;
{ Public declarations }
end;

var
Form1: TForm1;
P: Pointer;

implementation

{$R *.dfm}

function Mouse_Hook(Code: Integer; wParam: Word; lParam: Longint) : Longint; stdcall; external "SysHook";

procedure TForm1.WMMyMouseEvent(var M: TMessage);
begin
Beep;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
P:=@Mouse_Hook;
end;

end.


Ксли кто знает как ставить Hook, пришлите пожалуйста работующий (проверенный) код.


Юрий Зотов   (2002-12-08 11:08:00) [1]

Читайте статью Алексея Павлова на этом сайте.


Slavik99   (2002-12-08 00:58:00) [2]

stdcall при объявлении function Mouse_Hook не помогает...


apay   (2002-12-07 21:27:00) [3]

Или я че то не понимаю, но вроде при объявлении function Mouse_Hook... должно быть stdcall, а оно у тебя fastcall (по умолчанию)


Morfein   (2002-12-07 00:02:00) [4]

Замени HookHandle в CallNextHookEx(HookHandle, Code, wParam, lParam) на WH_SHELL


Наверх

Титульная страница Поиск, карта сайта Написать письмо