フルスクリーンで(を使用せずに)タスクバーと重なる可能性のあるフチなしウィンドウを作成しようとしていますが、その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での使用。