8

我正在阅读使用 DirectX 10 进行 3D 游戏编程的介绍来学习一些 DirectX,并且我正在尝试进行建议的练习(对于拥有这本书的人来说,第 4 章)。

一项练习要求使用 . 禁用 Alt+Enter 功能(切换全屏模式)IDXGIFactory::MakeWindowAssociation

但是无论如何它都会切换全屏模式,我不明白为什么。这是我的代码:

HR(D3D10CreateDevice(
        0,                 //default adapter
        md3dDriverType,
        0,                 // no software device
        createDeviceFlags, 
        D3D10_SDK_VERSION,
        &md3dDevice) );

IDXGIFactory *factory;
HR(CreateDXGIFactory(__uuidof(IDXGIFactory), (void **)&factory));
HR(factory->CreateSwapChain(md3dDevice, &sd, &mSwapChain));
factory->MakeWindowAssociation(mhMainWnd, DXGI_MWA_NO_ALT_ENTER);
ReleaseCOM(factory);
4

2 回答 2

11

我认为问题是这样的。

由于您自己(而不是通过工厂)创建设备,因此对您创建的工厂的任何调用都不会改变任何内容。

所以你要么:

a) 提前创建工厂,通过它创建设备

或者

b) 通过以下代码检索实际用于创建设备的工厂。

IDXGIDevice * pDXGIDevice;
HR( md3dDevice->QueryInterface(__uuidof(IDXGIDevice), (void **)&pDXGIDevice) );

IDXGIAdapter * pDXGIAdapter;
HR( pDXGIDevice->GetParent(__uuidof(IDXGIAdapter), (void **)&pDXGIAdapter) );

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

并通过该工厂调用该函数(在创建 SwapChain 之后)

pIDXGIFactory->MakeWindowAssociation(mhMainWnd, DXGI_MWA_NO_ALT_ENTER);

MSDN:IDXGIFactory

于 2010-03-05T18:17:30.683 回答
1

我有同样的问题,并且

b) 通过以下代码检索实际用于创建设备的工厂。

也对我没有帮助,可能是因为我有很多 Direct3D10 窗口,但 IDXGIFactory::MakeWindowAssociation 只记住一个。但是在 WM_SETFOCUS 或 WM_ACTIVATE 上调用该函数也无济于事,原因不明。

所以我发现的一种方法是使用低级键盘挂钩:请参阅SetWindowsHookEx和 WH_KEYBOARD_LL 参数。稍后您可以在 (VK_LMENU|VK_RMENU|VK_MENU) 已按下的条件下通过 VK_RETURN 虚拟代码捕获 Alt+Enter。在您认识到这种情况后,只需返回 1 而不是调用 CallNextHookEx 函数。

于 2010-04-01T17:02:47.800 回答