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

Вниз

Мастера проблема (опять HOOK), вернее DLL   Найти похожие ветки 

 
Stormick ©   (2002-01-28 23:22) [0]

Уважаемые мастера помогите разобраться с Hook - ом . Уже с недели две страдаю. Как мне передать в свою программу сообщение из DLL.
Делаю так:

library hook_dll;

uses Windows, Messages;

var
SysHook : HHook = 0;
Wnd : Hwnd = 0;

function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
CallNextHookEx(SysHook, Code, wParam, lParam);
if code = HC_ACTION then
begin
if TMsg(Pointer(lParam)^).message = WM_MOUSEMOVE then
begin
Wnd:=FindWindow("TForm1","Form1"); {!!!!!!!!!!!!!!!!!!!!!!!!! Wnd=0 почему ????}
if wnd <> 0 SendMessage(Wnd,WM_USER,0,0);
end;
end;
end;

procedure hook(switch : Boolean) export; stdcall;
begin
if switch=true then
begin
SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0);
end
else
begin
UnhookWindowsHookEx(SysHook);
SysHook := 0;
end;
end;

exports hook;

begin
end.


Сама прога

unit Unit1;

interface

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

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
procedure WMUSER(var T:TMessage);message WM_USER;
end;

var
Form1: TForm1;
Hdll : HWND;
hook: procedure (Switch : Boolean); stdcall;

implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);

begin
Hdll:= LoadLibrary(PChar("hook_dll.dll"));
if Hdll > HINSTANCE_ERROR then @hook:=GetProcAddress(Hdll, "hook")
hook(true);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
hook(false);
FreeLibrary(Hdll);
end;

procedure TForm1.WMUSER(var T:TMessage);
begin
MessageBox(Handle,"WM_USER","Message",MB_OK);
end;
end.

Почему FindWindow находящаяся в DLL не находит моё окно. Помогите очень надо.
Лучше на мыло mailto:stormick@mail.ru


 
Виктор Щербаков ©   (2002-01-29 09:43) [1]

Скорее всего сообщение приходит в другое окно с таким же заголовком и таким же именем класса.
Если ты запускаешь программу из IDE Delphi, то так оно и есть.
Сообщение приходит в окно IDE (твою форму).
Выход: измени заголовок Form1 в runtime и измени параметры FindWindow.


 
star ©   (2002-01-29 10:50) [2]

А почему бы сделать не так. Взять, например, организовать в длл-ке глобальную переменную (с помощью файла отображаемого в память), в которую при запуске приложение запишет дескриптор своего окна. По-моему так будет лучше, тогда все копии длл-ки будут знать твое окно, не надо будет тратить драгоценное для ловушек время на поиски окна и т.п. ...



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

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

Наверх




Память: 0.47 MB
Время: 0.013 c
4-91119
Prog_maker
2002-01-26 17:13
2002.03.28
Программирование COM порта


6-91021
Sregey
2001-11-22 17:49
2002.03.28
Все та же ошибка 10055 при попытке подключения TClientSocket


3-90766
Malder
2002-02-27 16:58
2002.03.28
Создание обзоров


14-91070
dimich
2002-02-16 12:38
2002.03.28
Где можно нарыть инфу по MIDAS(книги, статьи, примеры).


1-90912
Сержжж
2002-03-18 11:25
2002.03.28
Не работает Delpi 5 в XP