![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
	 | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Суть проблемы в следующем: ловушка на 
		
	
		
		
		
		
		
	
		
		
	
	
	щелчки мыши, встроенная в тело исполняемой пр-мы(не dll), полностью перестает обрабатывать сообщения стоит только отправить машину в ждущий, спящий режимы. То есть она просто остается болтаться в процессах, не выполняя никакой полезной работы. Ошибка в результате внесенных мною в код изменений исключается, т.к. пробовал запускать чистый hook с единственной сигнализацией в виде диалог. сообщения - итог тот же. Можно ли исправить это поведение программы? Если же это принципиально невозможно, то может быть есть способ отслеживать возвращение из спящего, ждущего и прочих режимов и перезапускать процесс самостоятельно(остается надеятся, что это крайний случай). Буду благодарен ответившим.  | 
| 
		 
			 
			#2  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 ловушка application-defined или library-defined? hMod и dwThreadId какие? 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Да, ловушка прописана в exe-шнике 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 hMOD и, насколько я могу судить - идентификатор процесса отсутствуют)) Я полный дилетант в библиотеках, собственно, в первый раз за нее и взялся, и почему-то не нашел им места в своем незамысловатом творении.. Так то все работает прекрасно, но лишь до тех пор, пока не машина не уходит в энергосберегающий режим. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 переделай в dll 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Переделал. Теперь такая оказия: баги начинают плодиться именно на выгрузке, но с условием, что не было закрыто хотя бы одно из чужих окон, куда был произведен правый щелчок мыши. Вот, собственно, сам модуль 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. |