• Advertisement

Archived

This topic is now archived and is closed to further replies.

ALT - Tabbing in DirectX

This topic is 6548 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I have a lil'' question: I am running a program in Fullscreen-exclusive mode... But I can''t alt-tab out of it...is there a possibility to fix this? - Sleepwalker

Share this post


Link to post
Share on other sites
Advertisement
I''m not completely sure, but I don''t think that you can. And if you can, you probably have to set it up some way while creating your window.

Share this post


Link to post
Share on other sites
Sorry, just adding on to what I had sayd before, if there is a way to CTR-ALT-DEL out of DirectX files (which there is, just set the flag), then there must be a way to ALT-TAB out. Try looking up under help or try contacting microsoft.

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
I''m not sure but try that set cooperative level stuff in your program i think that''s the thingy that lets you alt tab.

Kings Revenge

Share this post


Link to post
Share on other sites
I messed around with it a little...

Setting other cooperative settings doesn''t work,
but I actually found a way to get out by using
GetMessage(),TranslateMessage(),DispatchMessage() -
Trouble is I can''t get back in...sorta locked myself out...that is, I do get back in but the screens all black (Er...did someone blow the fuse ?)

Well anyway, if you have any idea concerning that tell me...

- Sleepwalker

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
If you use createwindowex, with WS_EX_TOPMOST flag enabled this will prevent you from alt-tabbing. Only answer I can think of.

Share this post


Link to post
Share on other sites
basically to handle Alt+Tab controls should be quite simple. When you detect that key combination (you must do it if for instance you are using direct Input in ex mode) minimize the app window and set a paused flag in your loop, so you don''t waste system resources rendering to nothing. Then when you receive the WM_ACTIVATE message, you need to RESTORE your surfaces...ie back buffers/z buffers etc...
All surfaces created in vid memory WILL need to be restored, so if you have textyures in video memory you will need to first restore them then reload the texture. If the surface is in system memory, then no reload/restore is needed.

Hope that helps, and as far as I know it''s correct.

Share this post


Link to post
Share on other sites
Here's another method to prevent someone from using the dreaded ALT_TAB or CTRL_ALT_DEL, put this line of code right before your main event loop:

SystemParametersInfo(SPI_SCREENSAVERRUNNING, TRUE, NULL, 0);  


Then after the loop to restore the old config:
SystemParametersInfo(SPI_SCREENSAVERRUNNING, FALSE, NULL, 0);  


But I wouldn't recommend using that because some users want to ALT-TAB to look stuff up while playing your game, which makes everything a pain in the ass. First you have to force the game to pause by checking with the WM_ACTIVEAPP message, then when the user tries to go back to the game you'll have to restore all the surfaces. I do it like this:
// restore surfaces if necessary
if(lpdd)
{
if(lpddsprimary->IsLost()) // check if primary surface is lost
lpdd->RestoreAllSurfaces(); // restore all surfaces
}

lpdd is the DirectDraw object and lpddsprimary is my primary surface.

And if you have any little offscreen surfaces (like sprites) in video memory, you'll probably to have to reload them all, so you should have a function that loads all your graphics. Look up the message on this board called something like 'Restoring surfaces' for more info on that.

Good luck,
Al

Edited by - Bigshot on 2/15/00 5:11:21 PM

Share this post


Link to post
Share on other sites
Don't you specify what type of window you want / how it interacts with others when you create it with the CreateWindow or CreateWindowEx command.

You might find what you are after if you read the DirectInput Mouse tutorials (part of the DirectX SDK) which details both Exclusive and Non-Exclusive mode.

CooperativeLevel comes into it too, because you can specify this for the mouse and keyboard. You also have to make sure your window is handling messages either with Translate/Dispatch or in a WindowProc message handler.

Paulcoz.

Edited by - paulcoz on 2/16/00 2:30:34 AM

Share this post


Link to post
Share on other sites
Just handle WM_ACTIVATE messages in your WndProc. Set a flag for your rendering function to check before it renders each frame, telling it whether to draw or not. If your window''s minimized, you don''t draw. Finally, restore the surfaces in your WM_ACTIVATE handler when your window becomes active again. The Windows SDK docs have more information on WM_ACTIVATE.

Conceptually, you''re linking DirectDraw to your main window with that code.

And you''ll probably have to take extra steps for DirectInput, DirectSound, etc.

Good Luck!


- null_pointer

Share this post


Link to post
Share on other sites
Phew...I fixed it (finally) Runs nicely now...
tab-out, tab-in - I could to this for hours, seriously

So thanks to everyone here foir helping me out.

- Sleepwalker

Share this post


Link to post
Share on other sites

  • Advertisement