Показать сообщение отдельно
  #6  
Старый 01.02.2013, 03:11
Inkognito Inkognito вне форума
Прохожий
 
Регистрация: 29.01.2013
Сообщения: 10
Репутация: выкл
Вопрос

Цитата:
Сообщение от 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.
__________________
Все может быть, быть может все и лишь того не может быть, чего совсем уж быть не может.
Ответить с цитированием