![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 пиксель, с каждым разом смещающимися в какую-либо сторону. такие области, имхо, лучше группировать (объединять в одну, но по-больше), чтобы количество пакетов уменьшить. хотя...
ЗЫ. и не забываем про остальной десяток сообщений))) |