检测全屏 Direct3D 应用程序

4

有没有办法通过Direct3D API检测全屏模式下运行的Direct3D应用程序?

SHQueryUserNotificationState可以指示此类应用程序,但仅支持Vista及以上版本。它仅在Explorer shell运行时才有效。

2个回答

2
我发现如何检测全屏的Direct3D和OpenGL(例如Minecraft)应用程序。
调用IDirectDraw7 :: TestCooperativeLevel()。如果活动全屏Direct3D应用程序正在运行或用户会话未激活(Win + L,Alt + Ctrl + Del,快速用户切换等),此函数将返回DDERR_EXCLUSIVEMODEALREADYSET
注意:使用DDCREATE_EMULATIONONLY调用DirectDrawCreateEx。这将通过IDirectDraw7显著减少资源使用。
我只在Windows 7 SP1 x64上的1个显示器中测试过这种方法。
顺便说一下,SHQueryUserNotificationState()返回QUNS_BUSY而不是QUNS_RUNNING_D3D_FULL_SCREEN用于全屏游戏。奇怪...

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

0
尝试使用“IDirect3DDevice9 :: GetDisplayMode”:

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

HRESULT GetDisplayMode(
  UINT  iSwapChain,
  D3DDISPLAYMODE * pMode
);

参数:

iSwapChain [输入]

An unsigned integer specifying the swap chain. 

pMode [输出]

Pointer to a D3DDISPLAYMODE structure containing data about the

适配器的显示模式。与设备的显示模式相反,如果设备没有全屏模式,则该模式可能不处于活动状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接