I'm reading Introduction to 3D Game Programming with DirectX 10 to learn some DirectX, and I was trying to do the proposed exercises (chapter 4 for the ones who have the book).
One exercise asks to disable the Alt+Enter functionality (toggle full screen mode) using IDXGIFactory::MakeWindowAssociation
.
However it toggles full screen mode anyway, and I can't understand why. This is my code:
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);
I think the problem is this.
Since you create the device by yourself (and not through the factory) any calls made to the factory you created won't change anything.
So either you:
a) Create the factory earlier and create the device through it
OR
b) Retrieve the factory actually used to create the device through the code below.
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);
And call the function through that factory (after the SwapChain has been created)
pIDXGIFactory->MakeWindowAssociation(mhMainWnd, DXGI_MWA_NO_ALT_ENTER);
MSDN: IDXGIFactory
I have the same problem, and
b) Retrieve the factory actually used to create the device through the code below.
doesn't help me also, possible because I have many Direct3D10 windows but IDXGIFactory::MakeWindowAssociation remembers it just for one. But invoking the function on WM_SETFOCUS or WM_ACTIVATE also didn't help by unknown reason.
So the one way i found is using low-level keyboard hook: see SetWindowsHookEx with WH_KEYBOARD_LL parameter. Later you can catch Alt+Enter by VK_RETURN virtual code with condition that (VK_LMENU|VK_RMENU|VK_MENU) is already pressed. After you've recognize this situation just return 1 instead of calling CallNextHookEx function.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With