Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.28;
Скачать: [xml.tar.bz2];




Вниз

Мастера проблема (опять 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]

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




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.28;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.72 MB
Время: 0.016 c
14-91053          dimich                2002-02-14 14:01  2002.03.28  
Проблема с bootMagic


1-90972           ivit61                2002-03-13 10:52  2002.03.28  
Поиск метода по адресу


4-91098           Руслан_               2002-01-27 09:57  2002.03.28  
WIN32 API


1-90918           AlexRaza              2002-03-18 20:39  2002.03.28  
Имя файла при запуске


1-90862           Bonus                 2002-03-13 20:01  2002.03.28  
Как выгрузить массив из памяти ?