This is possible by passing the WS_EX_NOREDIRECTIONBITMAP1 extended window style to a call to CreateWindowEx. This prevents the system from allocating a render surface for the window's client area, leaving the client area completely transparent.
Note, that this does not make the window transparent to mouse clicks. Hit testing is still governed by the window, even if it doesn't have a visible client area.
The following code provides a minimal code sample that showcases the use:
#define UNICODE
#include <Windows.h>
#pragma comment(lib, "user32.lib")
int CALLBACK wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR, int) {
WNDCLASSW wc{};
wc.hCursor = ::LoadCursorW(nullptr, IDC_ARROW);
wc.hInstance = hInstance;
wc.lpszClassName = L"TransparentWindow";
wc.lpfnWndProc = [](HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -> LRESULT
{
switch (message) {
case WM_DESTROY:
::PostQuitMessage(0);
return 0;
default:
return ::DefWindowProcW(hWnd, message, wParam, lParam);
}
};
::RegisterClassW(&wc);
::CreateWindowExW(WS_EX_NOREDIRECTIONBITMAP, wc.lpszClassName, L"Transparent window",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
nullptr, nullptr, hInstance, nullptr);
MSG msg{};
while (::GetMessageW(&msg, nullptr, 0, 0) > 0) {
::DispatchMessageW(&msg);
}
return msg.wParam;
}
This produces output similar to the following screenshot:
More information on the internals, as well as a common use case can be found in Kenny Kerr's excellent June 2014 MSDN Magazine article Windows with C++ : High-Performance Window Layering Using the Windows Composition Engine.
1 This requires desktop composition to be enabled. Desktop composition is available in all supported versions of Windows, but can be disabled by the user/system administrator prior to Windows 8.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…