windows - 我的 OpenGL 游戏关闭了 Aero DWM Glass

标签 windows opengl aero aero-glass dwm

几年前我写了一个免费游戏:http://www.walkover.org .对于大厅和菜单,它使用像 win32 这样的普通对话框。当实际游戏开始时,它使用 OpenGL。

现在,在 Windows 7 上,当实际游戏开始时,它会关闭 windows aero glass,并在游戏结束时将其重新打开。

我能做些什么来防止这种情况发生吗?一些特殊的标志可以让玻璃保持开启状态? (对于较新的版本,我一直在使用 DirectX 而这不会在那里发生。)也许我必须在某处指定一些(新的)标志?

我正在使用这个像素格式描述符:

    static PIXELFORMATDESCRIPTOR pfd =
    {
        sizeof(PIXELFORMATDESCRIPTOR),  // size of this pfd
        1,                              // version number
        PFD_DRAW_TO_WINDOW |            // support window
          PFD_SUPPORT_OPENGL |          // support OpenGL
          PFD_DOUBLEBUFFER,             // double buffered
        PFD_TYPE_RGBA,                  // RGBA type
        32,                             // 24-bit color depth
        0, 0, 0, 0, 0, 0,               // color bits ignored
        0,                              // no alpha buffer
        0,                              // shift bit ignored
        0,                              // no accumulation buffer
        0, 0, 0, 0,                     // accum bits ignored
        0,                              // 32-bit z-buffer
        0,                              // no stencil buffer
        0,                              // no auxiliary buffer
        PFD_MAIN_PLANE,                 // main layer
        0,                              // reserved
        0, 0, 0                         // layer masks ignored
    };

最佳答案

此问题是由以下所有原因引起的:

  • Windows 7
  • OpenGL
  • 创建一个与您的屏幕矩形完全匹配的窗口(全屏)
  • 第二次调用交换缓冲区
  • 旧显卡驱动

我有同样的问题,我测试了 2 个使用 OpenGL 的 AAA 游戏引擎,可以确认它们都有同样的问题。 DirectX 似乎不受影响。

这意味着您的窗口创建没有问题,这不是代码问题。

我建议您更新显卡驱动程序以解决问题。

我发现的一个短期解决方法是创建一个比屏幕分辨率大 1 个像素的窗口(宽度或高度)

这会诱使 Windows 检测不到您已进入全屏模式并且不会触发问题。

关于windows - 我的 OpenGL 游戏关闭了 Aero DWM Glass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2671424/

相关文章:

c++ - 大面积钻石方形地形生成

c++ - OpenGL 用鼠标移动画圆

windows - 为什么我的 MDI 子窗体不显示阴影?

c# - 在后面的 C# 代码中设置网格列或网格行

c++ - 类错误 : argument of type 'DWORD (windows_thread::)(void*)' does not match 'DWORD (*)(void*)' ? 中的 CreateThread

windows - 在编译时获取 NSIS 中的文件夹名称

c++ - 闭合贝塞尔曲线

c++ - FFmpeg 在我的应用程序中禁用 Window 桌面管理器

c# - 为什么我不能点击我的表格?

c# - Process.Start() 和手动运行有什么区别?