Я пытаюсь создать приложение, которое будет затенять все окна, кроме тех, которые имеют фокус.Я видел один там, но он ожидает, что тот, у которого фокус, выше всех остальных, что не так (использование фокуса следует за режимом мыши).
Итак, я думаю, что это будетпрямо вперед, и я могу освежить в памяти некоторые из моих старых навыков 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, но как?
Редактировать
Другие вещи, которые я пробовал:
- В функции
MyRegisterClass()
,Я установил WNDCLASSEXW::hbrBackground
на (HBRUSH)NULL_BRUSH
. - В обработчике сообщений
WM_PAINT
я установил PAINTSTRUCT::fErase
на TRUE
перед вызовом EndPaint()
.
Ничего из этого не помогло.