Цитата:
Сообщение от NumLock
переделай в dll
|
Переделал. Теперь такая оказия:
баги начинают плодиться именно на выгрузке, но с условием, что не было закрыто хотя бы одно из чужих окон, куда был произведен правый щелчок мыши.
Вот, собственно, сам модуль dll. Подсказали, что проблема в финализации, но ума не приложу какая финализация здесь требуется, кроме разве что высвобождения единственного popupmenu..
Код:
library lib2;
uses
forms,
menus,
windows,
dialogs,
messages,
controls,
Unit1 in 'Unit1.pas' {Form1};
type
TFm = class(TForm)
procedure x1Click(Sender: TObject);
end;
var
pt : TPoint;
theHook : THandle;
fm:TFm;
popupmenu1:tpopupmenu;
procedure TFm.x1Click(Sender: TObject);
begin
showmessage('#')
end;
procedure DLLProc_(Reason: Integer);
var i:integer;
begin
if Reason = DLL_PROCESS_DETACH then
{popupmenu1.free}
end;
function MouseHook(nCode, wParam, lParam : integer) : Lresult; stdcall;
Begin
case wParam of
WM_RBUTTONUP :
begin
popupmenu1 := tpopupmenu.create(application);
with popupmenu1.items do add(newitem('click',0,False,True,fm.x1Click,0,'MenuItem1'));
popupmenu1.popup(mouse.cursorpos.x,mouse.cursorpos.y);
end
else
Result := CallNextHookEx(theHook, nCode, wParam, lParam);
end;
End;
procedure Start;
begin
theHook := SetWindowsHookEx(wh_mouse, @mouseHook, hInstance, 0);
if theHook = 0 then
messageBox(0,'Error!','Error!',mb_ok);
end;
procedure Remove;
begin
UnhookWindowsHookEx(theHook);
end;
exports
Start index 1 name 'Start',
Remove index 2 name 'Remove';
begin
DLLProc:= @DLLProc_;
end.