7

フルスクリーンで(を使用せずに)タスクバーと重なる可能性のあるフチなしウィンドウを作成しようとしていますが、そのChangeDisplaySettings(&settings, CDS_FULLSCREEN);方法がわかりません。私はほとんどすべての可能なCreateWindowExスタイルの組み合わせを試しましたが、成功しませんでした。

その目的は、opengl / directxを使用してウィンドウ化されたボーダレスアプリケーションでレンダリングすると同時に、バックグラウンドでレンダリングを続行しながらAlt-Tabキーを押すことを許可することです。これは、wowやdota2(windowed fullscreenオプション)などの多くのゲームや、windows7タスクマネージャーなどのアプリケーション(アイデアを証明するためにvmでこれのスクリーンショットを2つ撮りました)によって行われます(windows8にはこの動作がありません)。

タスクマネージャーが集中していない:

焦点を当てたタスクマネージャー:

これは、私が持っていたいくつかのアイデアを簡単にテストするために使用している最小限のコードですが、実際にそれを行ったものはありません。screenwidth-20とscreenheight-20のサイズのフチなしウィンドウのみを作成します。

#include <windows.h>

static bool quit = false;

static LRESULT CALLBACK message_handler(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam)
{
    switch(umsg)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        case WM_CLOSE:
            quit = true;
        break;
    }

    return DefWindowProc(hwnd, umsg, wparam, lparam);
}

int main()
{
    WNDCLASSEX wc;
    HMODULE hInstance;
    HWND hwnd;
    MSG msg;

    ZeroMemory(&msg, sizeof(MSG));
    hInstance = GetModuleHandle(NULL);

    wc.style            = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wc.lpfnWndProc      = message_handler;
    wc.cbClsExtra       = 0;
    wc.cbWndExtra       = 0;
    wc.hInstance        = hInstance;
    wc.hIcon            = LoadIcon(NULL, IDI_WINLOGO);
    wc.hIconSm          = wc.hIcon;
    wc.hCursor          = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground    = (HBRUSH)COLOR_WINDOWFRAME;
    wc.lpszMenuName     = NULL;
    wc.lpszClassName    = "test";
    wc.cbSize           = (unsigned int)sizeof(WNDCLASSEX);

    RegisterClassEx(&wc);

    hwnd = CreateWindowEx(WS_EX_APPWINDOW, "test", "test", WS_OVERLAPPED|WS_POPUP, 10, 10, (int)GetSystemMetrics(SM_CXSCREEN)-20, (int)GetSystemMetrics(SM_CYSCREEN)-20, NULL, NULL, hInstance, NULL);
    //hwnd = CreateWindowEx(WS_EX_APPWINDOW, "test", "test", WS_OVERLAPPED|WS_POPUP, 0, 0, (int)GetSystemMetrics(SM_CXSCREEN), (int)GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, SW_SHOW);
    SetForegroundWindow(hwnd);
    SetFocus(hwnd);

    while (!quit)
    {
        if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    return 0;
}

使用する

CreateWindowEx(WS_EX_APPWINDOW, "test", "test", WS_OVERLAPPED|WS_POPUP, 0, 0, (int)GetSystemMetrics(SM_CXSCREEN), (int)GetSystemMetrics(SM_CYSCREEN), NULL, NULL, hInstance, NULL);

タスクバーとオーバーラップしますが、openglがレンダリングされると奇妙な動作をします(ビデオモードが変更されたときなど、画面が点滅/点滅します。クロスプラットフォームウィンドウを作成するある種のライブラリのこのフォーラムの誰かが同じ効果に遭遇しましたレンダリングやその他のもの。誰かがそのスレッドに、私が達成しようとしていることを正確に示すビデオ(注意深く大音量の音楽)も投稿しました。

そのオープンソースライブラリをダウンロードして、何が行われているのかを理解しようとしましたが、ウィンドウの作成方法について特別なことは何も見つかりませんでした。

g++ (Built by MinGW-builds project) 4.8.0 20121225 (experimental)Windows8での使用。

4

2 に答える 2

9

Raymond Chenは、 SetWindowLong(Ptr)でウィンドウ スタイルを変更し、 SetWindowPlacementを使用してウィンドウのサイズを変更し、SetWindowPosを使用してフレームが再描画されるようにするだけでなく、フル スクリーン モードのオンとオフを切り替える方法を説明しました。

タスク バーは、ウィンドウが全画面表示になろうとしているときにそれを検出し、自動的に邪魔にならないようにします。

于 2013-03-06T18:32:25.350 に答える
4

SetWindowPos関数を使用して、ウィンドウの TOPMOST を設定します。フォーカスを失ったことを示すメッセージが表示されたら、切り替えた別のウィンドウが表示されるように、もう一度非最前面にします。

于 2013-03-06T17:49:58.377 に答える