Требуется нарисовать мою информацию рядом с окном другого приложения.
Чтобы позаботиться о порядке 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;
}
Недостаточно протестировать область обновления при рисовании, поскольку контекстное меню может быть где угодно и содержать область моего интереса.