|
|
Регистрация | << Правила форума >> | 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
|
||||
|
||||
По идеи хуки в ДЛЛ вешают...
jmp $ ; Happy End! The Cake Is A Lie. |
#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 пиксель, с каждым разом смещающимися в какую-либо сторону. такие области, имхо, лучше группировать (объединять в одну, но по-больше), чтобы количество пакетов уменьшить. хотя...
ЗЫ. и не забываем про остальной десяток сообщений))) Пишу программы за еду. __________________ |