Как очистить HWND, чтобы он показывал все под ним? - PullRequest
0 голосов
/ 11 мая 2019

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

Итак, я думаю, что это будетпрямо вперед, и я могу освежить в памяти некоторые из моих старых навыков WinAPI.Я создаю стандартное приложение Windows для настольных ПК в VS2017 и изменяю функцию InitInstance()

Создание окна:

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
  HWND hWnd = CreateWindowEx(
    WS_EX_COMPOSITED | WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST
    | WS_EX_TOOLWINDOW
    , szWindowClass, szTitle
    , NULL // no style
    , 0, 0, 640, 480 // initial window rect
    , NULL // parent window (desktop)
    , NULL // no menu
    , GetModuleHandle(NULL), 0);

Удаление строки заголовка, ручек и т. Д.

SetWindowLong(hWnd, GWL_STYLE, 0);

Я хочу, чтобы он был непрозрачным, но с прозрачностью с альфа-смешиванием:

SetLayeredWindowAttributes(hWnd, 0, 255, LWA_ALPHA);

Итак, теперь я получаю всплывающее окно белого цвета.У него нет заголовка или меню, он расположен над всеми остальными окнами и игнорируется, когда я нажимаю на него, предоставляя доступ к окнам внизу.Если я установлю непрозрачность ниже 255. Я смогу видеть сквозь окно.

Однако я не могу удержать его от белого.Я просто хочу, чтобы он был пустым, чтобы при рисовании на нем отображалось то, что я рисую, с соответствующими альфа-смешанными атрибутами.

Осмотревшись, я нашел Как "очистить" WinAPIПрозрачное окно , но это для элементов управления окна, а не самого окна.Поэтому я не думаю, что это действительно применимо.Кроме того, я на самом деле не хочу выполнять итерацию по всем окнам и копировать содержимое на DC памяти, а затем копировать это на мой DC окна.Это кажется глупым.Должен быть какой-то способ очистки DC, но как?

Редактировать

Другие вещи, которые я пробовал:

  1. В функции MyRegisterClass(),Я установил WNDCLASSEXW::hbrBackground на (HBRUSH)NULL_BRUSH.
  2. В обработчике сообщений WM_PAINT я установил PAINTSTRUCT::fErase на TRUE перед вызовом EndPaint().

Ничего из этого не помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...