如何在FSE上显示另一个窗口(FullScreen Exclusive)

Roy Li - MSFT 32,731 信誉分 Microsoft 供应商
2024-07-11T03:10:06.5466667+00:00

我们正在开发一个具有全屏独占 (FSE) 屏幕的应用程序。

Forefront Security for Exchange Server 实现调用 SetFullscreenState(TRUE, nullptr)。

我想在 FSE 上使用 CreateWindowEx() 来显示不同的窗口,这可能吗?

https://learn.microsoft.com/en-us/windows/win32/direct3ddxgi/dxgi-1-4-improvements

它是这样写的,可以尽可能地阅读。

SetFullscreenState 不再独占拥有显示功能,因此用户启动的操作系统元素可以无缝显示在应用程序输出的前面。 音量设置就是一个例子。

我们看到的是,如果您传递给 CreateWindowEx() 的样式包含WS_OVERLAPPED,则它不再是 FSE。

WS_CHILD已经确认,可以在保留 FSE 的同时创建一个窗口。

如果可能的话,我想具体说明WS_OVERLAPPED,但这可能吗?

除了传递 FSE 之外,有没有其他方法可以显示带有 FSE 的窗口WS_CHILD?

此问题由:[https://learn.microsoft.com/en-us/answers/questions/1662445/how-to-show-another-window-on-fse(fullscreen-exclu](https://learn.microsoft.com/en-us/answers/questions/1662445/how-to-show-another-window-on-fse(fullscreen-exclu) 总结而来

Windows API - Win32
Windows API - Win32
一组适用于桌面和服务器应用程序的核心 Windows 应用程序编程接口 (API)。 以前称为 Win32 API。
70 个问题
0 个注释 无注释
{count} 票

1 个答案

排序依据: 非常有帮助
  1. Tong Xu - MSFT 2,201 信誉分 Microsoft 供应商
    2024-07-12T03:24:31.6833333+00:00

    你好,

    欢迎来到 Microsoft Q&A!

    我想在 FSE 上使用 CreateWindowEx() 来显示不同的窗口,这可能吗?

    你可以测试我的代码。它应该是可能的并且有效。

    // include the basic windows header files and the Direct3D header files
    #include <windows.h>
    #include <windowsx.h>
    #include <d3d11.h>
    #include <dxgi.h>
    #include<d3d10.h>
    #include<directxmath.h>
    // include the Direct3D Library file
    #pragma comment (lib, "d3d11.lib")
    #pragma comment(lib,"DXGI.lib")
    #pragma comment(lib,"D3D10.lib")
    // define the screen resolution
    #define SCREEN_WIDTH  800
    #define SCREEN_HEIGHT 600
    // global declarations
    IDXGISwapChain* swapchain;     
    // the pointer to the swap chain interface
    ID3D11Device* dev;                     // the pointer to our Direct3D device interface
    ID3D11DeviceContext* devcon;           // the pointer to our Direct3D device context
    ID3D11RenderTargetView* backbuffer;    // the pointer to our back buffer
    HWND hWnd;
    // function prototypes
    void InitD3D(HWND hWnd);    // sets up and initializes Direct3D
    void RenderFrame(void);     // renders a single frame
    void CleanD3D(void);        // closes Direct3D and releases memory
    // the WindowProc function prototype
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    // the entry point for any Windows program
    int WINAPI WinMain(HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        LPSTR lpCmdLine,
        int nCmdShow)
    {
       ;
        WNDCLASSEX wc;
        ZeroMemory(&wc, sizeof(WNDCLASSEX));
        wc.cbSize = sizeof(WNDCLASSEX);
        wc.style = CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc = WindowProc;
        wc.hInstance = hInstance;
        wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        // wc.hbrBackground = (HBRUSH)COLOR_WINDOW;    // 不在需要
        wc.lpszClassName = L"WindowClass";
        RegisterClassEx(&wc);
        RECT wr = { 0, 0, NULL, NULL };
        //AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE);
         hWnd = CreateWindowEx(NULL,
            L"WindowClass",
            L"Our First Direct3D Program",
            NULL,
            300,
            300,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            NULL,
            NULL,
            hInstance,
            NULL);
        if (hWnd == NULL)
        {
            return 0;
        }
        ShowWindow(hWnd, nCmdShow);
       
        // set up and initialize Direct3D
        InitD3D(hWnd);
        CleanD3D();
        // enter the main loop:
     
        MSG msg;
        while (TRUE)
        {
            if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
                if (msg.message == WM_QUIT)
                    break;
            }
          
            
        }
      
        // clean up DirectX and COM
        return msg.wParam;
    }
    // this is the main message handler for the program
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
        case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        } break;
        }
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    // this function initializes and prepares Direct3D for use
    void InitD3D(HWND hWnd)
    {
        // create a struct to hold information about the swap chain
        DXGI_SWAP_CHAIN_DESC scd;
        // clear out the struct for use
        ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));
        // fill the swap chain description struct
        scd.BufferCount = 1;                                    // one back buffer
        scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;     // use 32-bit color
        scd.BufferDesc.Width = NULL;                    // set the back buffer width
        scd.BufferDesc.Height = NULL;                  // set the back buffer height
        scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;      // how swap chain is to be used
        scd.OutputWindow = hWnd;                                // the window to be used
        scd.SampleDesc.Count = 4;                               // how many multisamples
        scd.Windowed = TRUE;                                    // windowed/full-screen mode
        scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;     // allow full-screen switching
        // create a device, device context and swap chain using the information in the scd struct
        D3D11CreateDeviceAndSwapChain(NULL,
            D3D_DRIVER_TYPE_HARDWARE,
            NULL,
            NULL,
            NULL,
            NULL,
            D3D11_SDK_VERSION,
            &scd,
            &swapchain,
            &dev,
            NULL,
            &devcon);
        // get the address of the back buffer
        ID3D11Texture2D* pBackBuffer;
        swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);
        // use the back buffer address to create the render target
        dev->CreateRenderTargetView(pBackBuffer, NULL, &backbuffer);
        pBackBuffer->Release();
        // set the render target as the back buffer
        devcon->OMSetRenderTargets(1, &backbuffer, NULL);
        // Set the viewport
        D3D11_VIEWPORT viewport;
        ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));
        viewport.TopLeftX = 0;
        viewport.TopLeftY = 0;
        viewport.Width = NULL;
        viewport.Height = NULL;
        devcon->RSSetViewports(1, &viewport);
    }
    // this is the function used to render a single frame
    void RenderFrame(void)
    {
        float clearColor[4] = { 0.0f, 1.0f, 0.2f, 1.0f };
        // clear the back buffer to a deep blue
        devcon->ClearRenderTargetView(backbuffer, clearColor);
        // do 3D rendering on the back buffer here
        // switch the back buffer and the front buffer
        swapchain->Present(0, 0);
    }
    // this is the function that cleans up Direct3D and COM
    void CleanD3D(void)
    {
        ID3D11Texture2D* pTex = NULL;
        swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)pTex);
        HRESULT ree= swapchain->SetFullscreenState(TRUE, nullptr);    // switch to windowed mode
        if (ree != S_OK)
        {
            MessageBoxW(hWnd,L"error",L"error",NULL);
        }
        // close and release all existing COM objects
        swapchain->Release();
        backbuffer->Release();
        dev->Release();
        devcon->Release();
    }
    

    因为我在终端服务器上工作,所以我无法验证它是否工作:

    DXGI_ERROR_NOT_CURRENTLY_AVAILABLE操作是否失败。返回此错误时,应用程序可以继续在窗口模式下运行,并稍后尝试切换到全屏模式。窗口模式交换链无法切换到全屏模式的原因有很多。以下是一些示例。

    应用程序正在终端服务器上运行。

    输出窗口被遮挡。

    输出窗口没有键盘焦点。

    另一个应用程序已处于全屏模式。

    如果可能的话,我想指定WS_OVERLAPPED,但这可能吗?

    不,您肯定了解窗口和全屏的定义。使用WS_OVERLAPPEDWINDOW是矛盾的。


    如果答案是正确的解决方案,请单击“接受答案”并请投赞成票。如果您对此答案有其他疑问,请点击“评论”。

    注意:如果您想接收此线程的相关电子邮件通知,请按照我们文档中的步骤启用电子邮件通知

    0 个注释 无注释