Windows 10 でウィンドウの背景を半透明ボカシにする

window_blur
Windows 10でスタートメニューやネットワーク選択画面などで半透明ボカシのかかったウィンドウが使われているが、現在公式に公開されている API はないようだ。

Web で調べてみると少し裏ワザチックだが、user32.dll に “SetWindowCompositionAttribute” という関数が含まれていて GetProcAddress でこの関数をロードして使うと、ウィンドウを半透明ボカシにすることが可能ということが分かった。

参考にしたサイト

背景色などを設定する方法がまだわからないので、明るい背景になるときはウィンドウがとても見えずらくなる。このあたりは引数など、さらなる研究が必要だ。

#include <windows.h>
 
TCHAR szClassName[] = TEXT("Window");
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            const HDC hdc = BeginPaint(hWnd, &ps);
            SetTextColor(hdc, RGB(255, 255, 255));
            SetBkMode(hdc, TRANSPARENT);
            TextOut(hdc, 10, 10, TEXT("Hello, world!"), 13);
            EndPaint(hWnd, &ps);
        }
        break;
    case WM_NCHITTEST:
        wParam = DefWindowProc(hWnd, msg, wParam, lParam);
        if (wParam == HTCLIENT)
            return HTCAPTION;
        else
            return wParam;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return 0;
}
 
void SetWindowBlur(HWND hWnd)
{
    const HINSTANCE hModule = LoadLibrary(TEXT("user32.dll"));
    if (hModule)
    {
        struct ACCENTPOLICY
        {
            int nAccentState;
            int nFlags;
            int nColor;
            int nAnimationId;
        };
        struct WINCOMPATTRDATA
        {
            int nAttribute;
            PVOID pData;
            ULONG ulDataSize;
        };
        typedef BOOL(WINAPI*pSetWindowCompositionAttribute)(HWND, WINCOMPATTRDATA*);
        const pSetWindowCompositionAttribute SetWindowCompositionAttribute = (pSetWindowCompositionAttribute)GetProcAddress(hModule, "SetWindowCompositionAttribute");
        if (SetWindowCompositionAttribute)
        {
            ACCENTPOLICY policy = { 3, 0, 0, 0 };
            WINCOMPATTRDATA data = { 19, &policy, sizeof(ACCENTPOLICY) };
            SetWindowCompositionAttribute(hWnd, &data);
        }
        FreeLibrary(hModule);
    }
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, LPSTR pCmdLine, int nCmdShow)
{
    MSG msg;
    WNDCLASS wndclass = {
        0,
        WndProc,
        0,
        0,
        hInstance,
        0,
        LoadCursor(0, IDC_ARROW),
        (HBRUSH)GetStockObject(BLACK_BRUSH),
        0,
        szClassName
    };
    RegisterClass(&wndclass);
    HWND hWnd = CreateWindow(
        szClassName,
        TEXT("Window"),
        WS_POPUPWINDOW,
        0,
        0,
        500,
        500,
        0,
        0,
        hInstance,
        0
        );
    SetWindowBlur(hWnd);
    ShowWindow(hWnd, SW_SHOWDEFAULT);
    UpdateWindow(hWnd);
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

スポンサーリンク
広告1
広告1

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
広告1