![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#16  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Код: 
	wnd:=GetActiveWindow(); GetUpdateRgn(Wnd, Rgn, true); a:=GetRegionData(RGN, 9999999, nil); showmessage(inttostr(a)); update: немного разобрался, но как же получить нужный мне буффер PRgnData? Последний раз редактировалось strbb, 22.12.2010 в 15:54.  | 
| 
		 
			 
			#17  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 я так делал: 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Код: 
	hCallWndProc:=SetWindowsHookEx(WH_CALLWNDPROC, @CallWndProc, HInstance, 0);
function CallWndProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  if nCode=HC_ACTION then
    HookHandle(PCWPStruct(lParam)^.message, PCWPStruct(lParam)^.hwnd, PCWPStruct(lParam)^.wParam, PCWPStruct(lParam)^.lParam);
  Result:=CallNextHookEx(0, nCode, wParam, lParam);
end;
procedure HookHandle(MessageId: Cardinal; hWnd: HWND; wParam: WPARAM; lParam: LPARAM);
var
  TopLeft: TPoint;
  region: HRGN;
  buffsize: DWORD;
  buff: PRgnData;
begin
  case MessageId of
    WM_PAINT: begin
      region:=CreateRectRgn(0, 0, 0, 0);
      try
        if GetUpdateRgn(hWnd, region, False)<>ERROR then
        begin
          TopLeft.X:=0;
          TopLeft.Y:=0;
          if ClientToScreen(hWnd, TopLeft) then
          begin
            buffsize:=GetRegionData(region, 0, nil);
            if buffsize>0 then
            begin
              buff:=GetMemory(buffsize);
              try
                if GetRegionData(region, buffsize, buff)<>0 then
                begin
//                    TopLeft.X+buff.rdh.rcBound.Left
//                    TopLeft.Y+buff.rdh.rcBound.Top
//                    TopLeft.X+buff.rdh.rcBound.Right
//                    TopLeft.Y+buff.rdh.rcBound.Bottom
                end;
              finally
                FreeMemory(buff);
              end;
            end;
          end;
        end;
      finally
        if region<>0 then DeleteObject(region);
      end;
    end;
  end;
end; | 
| 
		 
			 
			#18  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Странно, после того как скомпилил код и запустил, нагрузка на ЦП выросла до 100% + прога сожрала 2гб озу, в итоге вылетели все окна ) TopLeft.X и TopLeft.Y, как я понимаю это размер окна, но где его координаты?  | 
| 
		 
			 
			#19  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 По идеи хуки в ДЛЛ вешают... 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#20  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Это понятно, но все таки какие в каких переменных будут храниться данные о размерах прямоугольника? 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#21  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 TopLeft.X+buff.rdh.rcBound.Left, TopLeft.Y+buff.rdh.rcBound.Top - координата левого верхнего угла 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	TopLeft.X+buff.rdh.rcBound.Right, TopLeft.Y+buff.rdh.rcBound.Bottom - координата правого нижнего угла (абсолютные координаты) естественно ловушка должна быть обязатально в dll!!!  | 
| 
		 
			 
			#22  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Спасибо большое, завтра попробую ![]()  | 
| 
		 
			 
			#23  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Цитата: 
	
 Код: 
	 TopLeft1.X+buff.rdh.rcBound.Left;
                    TopLeft1.Y:=buff.rdh.rcBound.Top;
                    TopLeft2.X:=buff.rdh.rcBound.Right;
                    TopLeft2.Y:=buff.rdh.rcBound.Bottom;![]()  | 
| 
		 
			 
			#24  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 а при перемещении окна wm_paint не всегда будет. если окно (часть его) не вылезает из под какого-нибудь другого (топмост) окна или из-за пределов десктопа, то его вообще не будет - зачем окну просто так перерисовываться, если оно конечно само не хочет?. а будет например для самого десктопа, часть которого появляется из под перемещаемого окна. причем если окно перемещать достаточно медленно, то получится последовательность сообщений wm_paint, которые будут определять размеры области шириной или высотой 1 пиксель, с каждым разом смещающимися в какую-либо сторону. такие области, имхо, лучше группировать (объединять в одну, но по-больше), чтобы количество пакетов уменьшить. хотя... 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	ЗЫ. и не забываем про остальной десяток сообщений)))  |