原文:Directx11教程(12) 禁止alt+enter全屏窗口

       在D3D11应用程序中,我们按下alt+enter键,会切换到全屏模式。有时候,我们在WM_SIZE中有一些代码,全屏时,会使得程序崩溃,比如之前教程的代码,就是如此。

     下面我们在D3DClass.cpp 中,增加代码,禁止alt+enter键全屏。有两种方法可以做到这个功能,下面我们分别贴出代码:

第一种方法:

    D3DClass.cpp中修改Initialize函数,调用MakeWindowAssociation时候,使用SwapChain的内部接口工厂。

注意:D3D11CreateDeviceAndSwapChain创建设备和交换链时候,内部会使用自己的接口工厂。

具体代码如下:

//Initialize函数包含完成D3D设置的所有代码。
bool D3DClass::Initialize(int screenWidth, int screenHeight, bool vsync, HWND hwnd, bool fullscreen,
    float screenDepth, float screenNear)
    { 
   …

   //在debug模式下,使得创建的设备支持debug.
    UINT createDeviceFlags = 0;
#if defined(DEBUG) || defined(_DEBUG) 
    createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif

    // 创建交换链,设备以及设备上下文.
    result = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL,createDeviceFlags, &featureLevel, 1,
        D3D11_SDK_VERSION, &swapChainDesc, &m_swapChain, &m_device, NULL, &m_deviceContext);
    if(FAILED(result))
        {
        HR(result);
        return false;
        }

    //得到 D3D11CreateDeviceAndSwapChain函数内部使用接口工厂
    IDXGIDevice * pDXGIDevice;
    result = m_device->QueryInterface(__uuidof(IDXGIDevice), (void **)&pDXGIDevice);

    if(FAILED(result))
        {
        HR(result);
        return false;
        }

    IDXGIAdapter * pDXGIAdapter;
    result = pDXGIDevice->GetParent(__uuidof(IDXGIAdapter), (void **)&pDXGIAdapter);
    if(FAILED(result))
        {
        HR(result);
        return false;
        }

    IDXGIFactory * pIDXGIFactory;
    pDXGIAdapter->GetParent(__uuidof(IDXGIFactory), (void **)&pIDXGIFactory);

    //禁止alt+enter全屏
    pIDXGIFactory->MakeWindowAssociation(hwnd,DXGI_MWA_NO_WINDOW_CHANGES|DXGI_MWA_NO_ALT_ENTER  );

   // 得到交换链中的后缓冲指针.
    result = m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBufferPtr);
    if(FAILED(result))
        {
        HR(result);
        return false;
        }

 

    return true;

    }

第二种方法,我们分开创建device和swapchain

代码如下:

//Initialize函数包含完成D3D设置的所有代码。
bool D3DClass::Initialize(int screenWidth, int screenHeight, bool vsync, HWND hwnd, bool fullscreen,
float screenDepth, float screenNear)
{

//不设置标志
swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH ;

// 设置feature level为D3D11
// 如果显卡不支持D3D11,我们能够通过设置这个参数,使用D3D10,或者9.
featureLevel = D3D_FEATURE_LEVEL_11_0;

//在debug模式下,使得创建的设备支持debug.
UINT createDeviceFlags = 0;
#if defined(DEBUG) || defined(_DEBUG)
createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif

//分开创建device和交换链,可以屏蔽dxgi自动的hook alt+enter
//注意的两点:如果用第一个参数用NULL,第二个参数为D3D_DRIVER_TYPE_HARDWARE,则后面创建swapchain
//会fail,如果直接用adapter,不改变第二个参数,则会提示创建设备失败,adapter无效。
result = D3D11CreateDevice(adapter,D3D_DRIVER_TYPE_UNKNOWN, NULL,createDeviceFlags, &featureLevel, 1,
    D3D11_SDK_VERSION, &m_device, NULL, &m_deviceContext );

if(FAILED(result))
    {
    HR(result);
    return false;
    }

//创建交换链
result = factory->CreateSwapChain(m_device,&swapChainDesc, &m_swapChain);
if(FAILED(result))
    {
    HR(result);
    return false;
    }

//禁止DXGI监视消息队列,捕捉ALT+ENTER,在全屏和窗口模式之间切换
factory->MakeWindowAssociation(hwnd,DXGI_MWA_NO_WINDOW_CHANGES|DXGI_MWA_NO_ALT_ENTER  );

// 释放显示模式列表
delete [] displayModeList;
displayModeList = 0;

//释放适配器输出.
adapterOutput->Release();
adapterOutput = 0;

//释放适配器
adapter->Release();
adapter = 0;

// 释放接口工厂.
factory->Release();
factory = 0;

// 得到交换链中的后缓冲指针.
result = m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBufferPtr);
if(FAILED(result))
{
HR(result);
return false;
}

// 用后缓冲创建渲染目标视图.

}

详细代码,请看工程文件myTutorialD3D11_11和myTutorialD3D11_12

代码下载:

http://files.cnblogs.com/mikewolf2002/myTutorialD3D11.zip

Directx11教程(12) 禁止alt+enter全屏窗口的更多相关文章

  1. UI: 窗口全屏, 窗口尺寸

    窗口全屏 窗口尺寸 示例1.窗口全屏UI/FullScreen.xaml <Page x:Class="Windows10.UI.FullScreen" xmlns=&quo ...

  2. 背水一战 Windows 10 (3) - UI: 窗口全屏, 窗口尺寸

    [源码下载] 背水一战 Windows 10 (3) - UI: 窗口全屏, 窗口尺寸 作者:webabcd 介绍背水一战 Windows 10 之 UI 窗口全屏 窗口尺寸 示例1.窗口全屏UI/F ...

  3. win32之全屏窗口

    游戏开发中经常使用会让游戏以全屏窗口的状态运行,下面一个例子就是来实现这个效果的. #include <windows.h> void RegisterMyClass(); LRESULT ...

  4. OSG addEventHandler W键显示网格 L键控制光照 F键切换全屏窗口 S键显示统计数据 事件处理器

    #include <osgGA/StateSetManipulator> #include <osgViewer/ViewerEventHandlers> // add the ...

  5. OpenGL 使用GLFW创建全屏窗口

    OpenGL 使用GLFW创建全屏窗口 GLFW库里面的glfwCreateWindow()函数是用来创建窗口的函数. 这样函数的原型是: GLFWwindow* glfwCreateWindow(i ...

  6. ubuntu 12.04 alt+tab无法切换窗口的问题(转载)

    转自:http://www.2cto.com/os/201209/153282.html ubuntu 12.04 alt+tab无法切换窗口的问题   安装cpmpiz配置管理程序.   sudo ...

  7. 虚拟机VMWare安装苹果系统MacOS详细教程(联网设置,全屏插件、文件互传)

    运行环境: VMware® Workstation 12 Pro(自行安装,或者用这个) 推荐(下面以10.11.6版本做的教程,但是安装时推荐使用此版本安装然后升级到10.11.6):MacOS X ...

  8. C#中如何禁止WindowsMediaPlayer双击全屏显示

    问题描述:在项目中使用WindowsMediaPlayer播放视频时,双击会出现视频全屏的效果,而且视频恢复后会暂停,除非再次双击返回后才能正常播放.那么如何禁止WindowsMediaPlayer的 ...

  9. OSG 初始化为非全屏窗口

    OSG默认的窗口时全屏的,调试的时候不方便. 在网上看到一段代码,可以非全屏显示 int _tmain(int argc, _TCHAR* argv[]){ osgViewer::Viewer vie ...

随机推荐

  1. Schedule(Hackerrank Quora Haqathon)

    题目链接 Problem Statement At Quora, we run all our unit tests across many machines in a test cluster on ...

  2. Android SDK上手指南:知识测试

    Android SDK上手指南:知识测试 2014-01-22 10:00 核子可乐 译 51CTO 字号:T | T 在从零开始学习Android开发系列教程当中,我们已经了解了为Android平台 ...

  3. Spring Boot入门样例-001-Java和Maven安装配置

    Spring Boot入门样例-001-Java和Maven安装配置 本文说明Java和Maven在windows下的安装和配置 前言 本Spring Boot入门样例准备工作参考: Spring B ...

  4. 5+App 基于HTML、JS、CSS编写的运行于手机端的App(DCloud开发)

    HTML5 Plus移动App(5+App) 工具: 开发工具HBuilder下载下载地址 开发工具HBuilderX下载下载地址(替代HBuilder) 框架: uni-app :是一个使用 Vue ...

  5. LUOGU P4171 [JSOI2010]满汉全席

    传送门 解题思路 2-SAT 裸题. 代码 #include<iostream> #include<cstdio> #include<cstring> #inclu ...

  6. 原生JS上传,实现预览并且兼容大部分IE

    // 前提条件: ie浏览器模式下,用户要允许ie默认的加载项:以下兼容ie的方法才会生效 // 图片上传预览 IE是用了滤镜 function previewImage(file) { var MA ...

  7. 在vue中使用jq或者第三方插件

    1.安装jQuery npm i jquery -S 2.修改webpack的配置文件 文件目录及名称:build/webpack.base.conf.js 注释代码为修改部分 'use strict ...

  8. [转]js设计模式—发布订阅模式

    发布—订阅模式又叫观察者模式,它定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在javascript开发中,一般用事件模型来替代传统的发布—订阅模式.本文将 ...

  9. CesiumLab V1.2 新功能 倾斜数据处理

    一转眼又是一周的时间,我们的实验室功能又强大了. 照旧我们先放毒,放图,图,太晚了,字都敲不到一起了   lod以及包围盒   大雁塔实例,按楼层单体化   倾斜数据处理参数设置 简单介绍一下 Ces ...

  10. CesiumLab V1.1 新功能 (免费Cesium处理工具集)

    Cesiumlab 自从上周(3月20日)发布之后,赢得小伙伴一致好评. 本周继续推出重大更新: 建筑物矢量数据 转 3dtiles,  建筑物矢量数据 转 3dtiles,  建筑物矢量数据 转 3 ...