![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Уважаемые профи, помогите исправить ошибку.... [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