Отключить alt-enter в приложении Direct3D (DirectX) - PullRequest
8 голосов
/ 01 марта 2010

Я читаю Введение в 3D-программирование игр с DirectX 10 , чтобы изучить некоторые 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);

Ответы [ 2 ]

11 голосов
/ 05 марта 2010

Я думаю, что проблема заключается в следующем.

Поскольку вы создаете устройство самостоятельно (а не через фабрику), любые вызовы, сделанные на фабрику, которую вы создали, ничего не изменят.

Так что либо вы:

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

1 голос
/ 01 апреля 2010

У меня такая же проблема, а

b) Получить фабрику, фактически использованную для создания устройства, с помощью кода ниже.

мне тоже не помогает, возможно, потому что у меня много окон Direct3D10, но IDXGIFactory :: MakeWindowAssociation запоминает его только для одного. Но вызов функции на WM_SETFOCUS или WM_ACTIVATE также не помог по неизвестной причине.

Итак, один из способов, который я нашел, - это использование низкоуровневой клавиатуры: см. SetWindowsHookEx с параметром WH_KEYBOARD_LL. Позже вы можете поймать Alt + Enter с помощью виртуального кода VK_RETURN с условием, что (VK_LMENU | VK_RMENU | VK_MENU) уже нажата. После того, как вы узнаете эту ситуацию, просто верните 1 вместо вызова функции CallNextHookEx.

...