我正在阅读Introduction to 3D Game Programming with DirectX 10以了解一些DirectX,我正在尝试进行拟议的练习(第4章是有关该书的人)。
一项练习要求使用IDXGIFactory::MakeWindowAssociation
禁用Alt + Enter功能(切换全屏模式)。
然而无论如何它都会切换到全屏模式,我无法理解为什么。这是我的代码:
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);
答案 0 :(得分:11)
我认为问题在于此。
由于您自己创建设备(而不是通过工厂),因此对您创建的工厂的任何调用都不会改变任何内容。
所以你要么:
a)提前创建工厂并通过它创建设备
OR
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);
答案 1 :(得分:1)
我有同样的问题,
b)通过以下代码检索实际用于创建设备的工厂。
也没有帮助我,可能因为我有很多Direct3D10窗口,但IDXGIFactory :: MakeWindowAssociation只记得一个。但是,在WM_SETFOCUS或WM_ACTIVATE上调用函数也没有帮助。
所以我发现的一种方法是使用低级键盘钩子:使用WH_KEYBOARD_LL参数查看SetWindowsHookEx。之后您可以通过VK_RETURN虚拟代码捕获Alt + Enter,条件是已按下(VK_LMENU | VK_RMENU | VK_MENU)。在您认识到这种情况后,只需返回1而不是调用CallNextHookEx函数。