...
//допустим HWND необходиного окна известен...
g_fnOldProc = GetWindowLong(hWnd,GWL_WNDPROC); // получаем адрес оригинальной функции
SetWindowLong(hWnd,GWL_WNDPROC,(LONG)NewProc); // заменяем на нашу
...
Перехват перерисовки чужого окна
1) Подскажите как мне перехватить сообщение чужому окну
[SIZE=2]WM_PAINT и заменить его обработчик своим.[/SIZE]
[SIZE=2]2) Какой WindowName и ClassName имеет рамка окна или если к ней это не применимо как получить её handle для рисования на ней, опять же.[/SIZE]
Цитата: Mind Maker
У меня собственно два вопроса:
1) Подскажите как мне перехватить сообщение чужому окну
[SIZE=2]WM_PAINT и заменить его обработчик своим.[/SIZE]
[SIZE=2][/SIZE]
1) Подскажите как мне перехватить сообщение чужому окну
[SIZE=2]WM_PAINT и заменить его обработчик своим.[/SIZE]
[SIZE=2][/SIZE]
Хуки? (Если окно принадлежит потоку другого процесса);
Сабклассинг?
Цитата: Mind Maker
[SIZE=2]2) Какой WindowName и ClassName имеет рамка окна или если к ней это не применимо как получить её handle для рисования на ней, опять же.[/SIZE]
Дык рамка окна не является окном. Она относится к неклиентской части окна. Соответственно и обрабатывать надо не WM_PAINT, а WM_NCPAINT.
1) Моя программа, которая должна отлавливать и заменять
функцию перерисовки чужих окон на свою какую то ф-ю;
2) Допусти Notepad - другая программа, ф-ю перерисовки которой
надо подменить (например нарисовать в центре окна кружек, красный).
Если можно, то желательно поближе к коду, нежели абстрактным советам.
Для основной функции:
Код:
Для нашей функции:
Код:
LRESULT CALLBACK NewProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
LRESULT res = g_fnWndProc(hWnd,uMsg,wParam,lParam);
if (uMsg == WM_PAINT) {
// выполняем требуемые действия
}
return (res);
}
LRESULT res = g_fnWndProc(hWnd,uMsg,wParam,lParam);
if (uMsg == WM_PAINT) {
// выполняем требуемые действия
}
return (res);
}
Насчет g_fnWndProc = ... уже не помню, но вроде там (FARPROC) или что-то в этом роде... Поправьте если что).
Подскажите как получить handle рамки окна или к какому классу она относится.
А что ты понимаешь под рамкой?
Есть окно у которого есть клиентская область, в которой распологаются TComboBoxы, TButtonы, etc. Есть у окна рамка на которой две кнопки - Close, Restore/Maximize, Minimize и иконка приложения.
К примеру, обработчик WM_NCPAINT для своего окна может выглядеть так:
Код:
case WM_NCPAINT:
{
DefWindowProc(hWnd, message, wParam, lParam);
//Смотреть также GetDCEx
HDC hDC = GetWindowDC(hWnd);
HBRUSH hBrush = CreateHatchBrush(HS_BDIAGONAL, RGB(0, 0, 0));
RECT rc;
GetWindowRect(hWnd, &rc);
rc.right -= rc.left;
rc.bottom -= rc.top;
rc.left = rc.top = 0;
FrameRect(hDC, &rc, hBrush);
DeleteObject(hBrush);
ReleaseDC(hWnd, hDC);
break;
}
{
DefWindowProc(hWnd, message, wParam, lParam);
//Смотреть также GetDCEx
HDC hDC = GetWindowDC(hWnd);
HBRUSH hBrush = CreateHatchBrush(HS_BDIAGONAL, RGB(0, 0, 0));
RECT rc;
GetWindowRect(hWnd, &rc);
rc.right -= rc.left;
rc.bottom -= rc.top;
rc.left = rc.top = 0;
FrameRect(hDC, &rc, hBrush);
DeleteObject(hBrush);
ReleaseDC(hWnd, hDC);
break;
}