Оверлеи без DirectX
От: x3m  
Дата: 15.08.05 15:59
Оценка:
Привет!
Пытаюсь написать что-то подобное до примера 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);
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.