Привет!
Пытаюсь написать что-то подобное до примера mosquito в МСДН
(MSDN\Samples\VC98\sdk\graphics\directx\mosquito) но без использования
DirectX. Не знаю как отслеживать изминения на екране. Дело в том, ято я вывожу прямо
на десктоп (HWND == NULL), затирая эго часть, предварительно скопировав, что б потом востановить,
оригинальный вид. Но если какое-то окно под моим рисунком
измениться (например эго просто закроют) то моя копия уже не подходит.
Нужно востановить десктоп, перед тем как какое-то окно измениться.
И опять скопировать часть екрана, с заменой на мой рисунок, после изменения вида окна.
Но вот как отслеживать ВСЕ изменения на екране я не знаю. Пробовал установить
хуки на WM_PAINT но оно почему-то не работает.
Помогите плз.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
hook_before_paint = SetWindowsHookEx( WH_CALLWNDPROC, HookProcBeforePaint, NULL, GetCurrentThreadId());
hook_after_paint = SetWindowsHookEx( WH_CALLWNDPROCRET, HookProcAfterPaint, NULL, GetCurrentThreadId());
break;
case WM_DESTROY:
UnhookWindowsHookEx(hook_before_paint);
UnhookWindowsHookEx(hook_after_paint);
// ..............
}
}
LRESULT CALLBACK HookProcBeforePaint(int nCode, WPARAM wp, LPARAM lp)
{
if(nCode == HC_ACTION){
if( wp == 0 ){
LPCWPSTRUCT cwp = (LPCWPSTRUCT)lp;
if( cwp->hwnd == NULL && cwp->message == WM_PAINT){
RestoreDesktop();
}
}
return CallNextHookEx(hook_before_paint, nCode, wp, lp);
} else {
return CallNextHookEx(hook_before_paint, nCode, wp, lp);
}
}
LRESULT CALLBACK HookProcAfterPaint(int nCode, WPARAM wp, LPARAM lp)
{
if(nCode == HC_ACTION){
if( wp == 0 ){
LPCWPSTRUCT cwp = (LPCWPSTRUCT)lp;
if( cwp->hwnd == NULL && cwp->message == WM_PAINT){
CopyDesktop();
DrawMyImage();
}
}
return CallNextHookEx(hook_before_paint, nCode, wp, lp);
} else {
return CallNextHookEx(hook_before_paint, nCode, wp, lp);
}
}