Наложение окна не рисуется правильно при подключении - PullRequest
1 голос
/ 03 июня 2009

Требуется нарисовать мою информацию рядом с окном другого приложения. Чтобы позаботиться о порядке z и т. Д., Перехват WH_GETMESSAGE и отрисовка WM_PAINT кажутся хорошими.

Однако некоторые WM_PAINT предназначены для области окна, которая меня интересует, а другие WM_PAINT для чего-то совершенно другого, например, контекстного меню или кнопки.

Пример Блокнот подключен с наложением «Hello» на экран Блокнота. Это отлично работает. Однако при щелчке правой кнопкой мыши Блокнот контекстное меню перекрывается с Hello. В основном контекстное меню уничтожено.

Есть ли элегантный способ определить, что WM_PAINT является контекстным меню?

LRESULT CALLBACK overlayHook(int code, WPARAM wParam, LPARAM lParam) {
    //Try and be the LAST responder to WM_PAINT messages;
    LRESULT retCode = CallNextHookEx(hhk, code, wParam, lParam);

    //Per GetMsgProc documentation, don't do anything fancy
    if(code < 0) {
        return retCode;
    }

    //Assumes that target application only draws when WM_PAINT message is
    //removed from input queue.
    if(wParam == PM_NOREMOVE) {
        return retCode;
    }

    MSG* message = (MSG*)lParam;
    if(message->message != WM_PAINT) {
        //Ignore everything that isn't a paint request
        return retCode;
    }

    PAINTSTRUCT psPaint;    
    BeginPaint(message->hwnd, &psPaint);
    HDC hdc = psPaint.hdc;
    RECT r = psPaint.rcPaint;           
    TextOut(hdc, 10, 10, "Hello", 4);
    EndPaint(message->hwnd, &psPaint);
    return retCode;
}

Недостаточно протестировать область обновления при рисовании, поскольку контекстное меню может быть где угодно и содержать область моего интереса.

1 Ответ

0 голосов
/ 04 июня 2009

Я не знаю ни одного элегантного способа сделать это, но вы можете использовать GetWindowLong (), чтобы получить стиль окна или GetClassName (), чтобы получить имя его класса, а затем основывать свои решения по фильтрации на этих значениях. *

...