Текущий архив: 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.45 MB
Время: 0.006 c