2013-03-06 3 views
7

私は、タスクバーをオーバースクリーンする可能性がある全画面で(ChangeDisplaySettings(&settings, CDS_FULLSCREEN);を使用せずに)境界線のないウィンドウを作成しようとしています。私はかなり成功した可能性のあるすべてのCreateWindowExスタイルの組み合わせを試しました。win32(フルスクリーン)ボーダーレスウィンドウオーバーラップタスクバー

OpenGL/directxを使用してウィンドウの境界線のないアプリケーションでレンダリングされ、バックグラウンドでレンダリングを続けながらalt-tabbingが可能です。これは、wowやdota2(windowed fullscreenオプション)のような多くのゲームと、windows7タスクマネージャー(Windowsのタスクマネージャー)(Windows8にはこのような動作がありません)という2つのスクリーンショットをVM内で実行しました。

タスクマネージャが集中:

タスクマネージャは集中しない

これは、私は簡単に私が持っていたいくつかのアイデアをテストするために使用しているいくつかの最小限のコードですが、どれも本当にかなりそれをしました。これは、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はそれをレンダリングするとき、それはいくつかの奇妙な行動を持っているが(点滅は/そのような時にビデオモードの変更に応じて画面を点滅します。同じ効果が誰かによって発生しましたon this forumは、レンダリングなどのためのクロスプラットフォームウィンドウを作成するライブラリの一種です。誰かがそのスレッドに投稿しました。a video (careful, loud music)は、私が達成しようとしているものを正確に示しています。

私はそのオープンソースライブラリをダウンロードして何をしているのかを試しましたが、ウィンドウを作成する方法について特別なものは見つかりませんでした。

Windows8でg++ (Built by MinGW-builds project) 4.8.0 20121225 (experimental)を使用してください。

+0

あなたの回答を編集しようとしているのを見ました。あなたがしようとしていたことに感謝します。最終的にうまくいったことを示すための通常の方法は、あなたの質問にそれを編集することです。 –

+0

@ MarkRansom私はそれを知らせてくれてありがとう、私は参照してください。私はすべてのことをやっている間に、新しい答えが現れました。私は何を使うのかを決める前に、 'SetWindowPlacement'アイデアを少し演奏するつもりです。 –

+0

あなたが選択した回答を変更する必要があると感じたら、私は個人的にそれを取ることはありません。 –

答えて

3

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

+0

Mark、どのメッセージがフォーカスを失ったと言っているかをコメントできますか?ありがとう! (私はちょうどこの同じ問題に遭遇しました) – bodacydo

+0

@bodacydo ['WM_KILLFOCUS'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms646282(v=vs.85).aspx )。 –

9

レイモンド・チェンexplained how to switch in and out of full screen modeではなく、単純にウィンドウのサイズを変更する、とSetWindowPosフレームが再描画を確認するSetWindowPlacementを使用して、SetWindowLong(Ptr)でウィンドウスタイルを変更することもできます。

タスクバーは、ウィンドウがフルスクリーン表示になっていることを検出し、自動的に途切れることを検出します。

+0

タスクバーの動作についておもしろいことに、私はあなたがその上に乗るために一番上にいなければならないと思った。 –