检测全屏 Direct3D 应用程序

Posted

技术标签:

【中文标题】检测全屏 Direct3D 应用程序【英文标题】:Detecting full-screen Direct3D applications 【发布时间】:2010-11-16 05:00:23 【问题描述】:

有什么方法可以通过 Direct3D API 检测以全屏模式运行的 Direct3D 应用程序吗?

SHQueryUserNotificationState,可以indicate这样的应用程序,只支持Vista及以上。它也仅在 Explorer shell 运行时才有效。

【问题讨论】:

【参考方案1】:

我发现了如何检测全屏 Direct3D 和 OpenGL(例如 Minecraft)应用程序。

致电IDirectDraw7::TestCooperativeLevel()。如果活动的全屏 Direct3D 应用程序正在运行或用户会话未活动(Win+L、Alt+Ctrl+Del、快速用户切换等),则此函数返回 DDERR_EXCLUSIVEMODEALREADYSET

注意:使用DDCREATE_EMULATIONONLY 致电DirectDrawCreateEx。这大大减少了 IDirectDraw7 的资源使用量。

我仅在带有 1 个显示器的 Windows 7 SP1 x64 中测试了此方法。


顺便说一句,SHQueryUserNotificationState() 返回QUNS_BUSY 而不是QUNS_RUNNING_D3D_FULL_SCREEN 用于全屏游戏。奇怪……

【讨论】:

.net 3.5 之后应该用CheckDeviceState 代替吗?即这个方法替换了 IDirect3DDevice9::TestCooperativeLevel,它在 Direct3D 9Ex 应用程序中总是返回 S_OK。 SHQueryUserNotificationState() 在以下情况下仅返回 3 (QUNS_RUNNING_D3D_FULL_SCREEN): a) 窗口位于桌面屏幕/主屏幕上,是一个 direct3d 窗口,已最大化且任务栏不可见。当任务栏可见时,它返回 2 (QUNS_BUSY),因为尽管它是全屏/最大化的,但由于任务栏,它不会使用整个屏幕。当普通窗口/视频在主屏幕上最大化时,它也会返回 2 (QUNS_BUSY)。 DirectX 窗口开始总是在主屏幕上最大化,所以如果函数返回 3,它总是在那里。当在另一个屏幕上时,它会返回 5。【参考方案2】:

尝试“IDirect3DDevice9::GetDisplayMode”:

http://msdn.microsoft.com/en-us/library/bb174387%28VS.85%29.aspx

HRESULT GetDisplayMode(
  UINT  iSwapChain,
  D3DDISPLAYMODE * pMode
);

参数:

iSwapChain[in]

An unsigned integer specifying the swap chain. 

pMode[out]

Pointer to a D3DDISPLAYMODE structure containing data about the

适配器的显示模式。作为 与显示模式相反 设备,如果 设备没有全屏模式。

【讨论】:

以上是关于检测全屏 Direct3D 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

C ++如何使用处理程序检测窗口状态是不是在全屏?

window.navigator.standalone 检测iOS WebApp是否运行在全屏模式

检测 webview 视频何时在 ios8 上变为全屏

Python检查应用程序是不是全屏

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记5——Direct3D编程基础

如何确定安装了哪个版本的 Direct3D?