2010-02-28 16 views
7

Sto leggendo Introduction to 3D Game Programming with DirectX 10 per imparare alcune DirectX, e stavo cercando di fare gli esercizi proposti (capitolo 4 per quelli che hanno il libro).Disabilita alt-entra in un'applicazione Direct3D (DirectX)

Un esercizio richiede di disattivare la funzionalità Alt + Invio (attiva la modalità a schermo intero) utilizzando IDXGIFactory::MakeWindowAssociation.

Tuttavia, attiva comunque la modalità a schermo intero e non riesco a capire perché. Questo è il mio codice:

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

MakeWindowAssociation restituisce un HRESULT, quindi avvolge HR() attorno a quella chiamata per vedere se fallisce per qualche motivo. (Solo una nota a margine, non credo che stia davvero fallendo) –

+0

@Danial: già provato, senza fortuna. Sto per iniziare una taglia solo per il gusto di farlo però. –

risposta

9

Penso che il problema sia questo.

Poiché si crea il dispositivo da solo (e non attraverso la fabbrica) tutte le chiamate effettuate alla fabbrica creata non cambieranno nulla.

Quindi, o:

a) Creare la fabbrica in precedenza e creare il dispositivo attraverso di essa

O

b) Recuperare l'fabbrica effettivamente utilizzato per creare il dispositivo attraverso il codice qui sotto.

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); 

E chiamare la funzione attraverso quella fabbrica (dopo la SwapChain è stata creata)

pIDXGIFactory->MakeWindowAssociation(mhMainWnd, DXGI_MWA_NO_ALT_ENTER); 

MSDN: IDXGIFactory

+0

Ho già provato questo (sono stato googling per un po '); sfortunatamente non funziona. Tutte le chiamate hanno successo, ma la tab alt massimizza ancora la finestra. –

+0

Strano, ho provato il tuo codice e, quando ho utilizzato la fabbrica che è stata utilizzata per creare il dispositivo, ha funzionato per me. Ecco il tuo codice riscritto, nel caso in cui qualcosa non fosse chiaro nella mia risposta: http://pastebin.com/sz2YzdZf –

+0

Utilizzando lo stesso esatto codice che hai postato su pastebin alt-enter, ingrandisci ancora la finestra. Questo è il codice esatto che ho usato: http://koper.wowpanda.net/directx-code.rar –

1

Ho lo stesso problema, e

b) Retrieve la fabbrica effettivamente utilizzata per creare il dispositivo tramite il codice sottostante.

non mi aiuta anche, possibile perché ho molte finestre Direct3D10 ma IDXGIFactory :: MakeWindowAssociation lo ricorda solo per uno. Ma il richiamo della funzione su WM_SETFOCUS o WM_ACTIVATE non è stato d'aiuto per motivi sconosciuti.

Quindi il modo in cui ho trovato è l'utilizzo del gancio della tastiera di basso livello: vedere SetWindowsHookEx con il parametro WH_KEYBOARD_LL. Più tardi puoi prendere Alt + Invio dal codice virtuale VK_RETURN con condizione che (VK_LMENU | VK_RMENU | VK_MENU) sia già stato premuto. Dopo aver riconosciuto questa situazione, è sufficiente restituire 1 anziché chiamare la funzione CallNextHookEx.

+0

E non dimenticare di farlo solo per la tua finestra, perché per impostazione predefinita verrà installato il gancio per l'intero sistema. 1. Ad esempio, è possibile installare il gancio quando il processo diventa attivo e disinstallarlo quando si disattiva (vedere il messaggio WM_ACTIVATEAPP). 2. O è possibile controllare il hook se la finestra in primo piano è la propria finestra (vedere Funzione WinAPI GetForegroundWindow) –

+0

Non chiamare MakeWindowAssociation() ogni volta che viene creato un nuovo dispositivo? O creare un IDXGIFactory per ciascuno? –