GetActiveWindow() for fullscreen 3D mode.
Archives Forums/Blitz3D Bug Reports/GetActiveWindow() for fullscreen 3D mode.| 
 | ||
| There is GetActiveWindow() WinAPI function that return window hWND that is currently in focus. But this function does not work in fullscreen mode. This is a problem. I know that I can use GetAsyncKeyState%(vKey) WinAPI function to catch ALT+Tab and other keypresses and pause my game, disable music, sounds etc. But the game can be interrupted by system messages or something else. So analog of GetActiveWindow() for fullscreen is very neccesary to write commercial games. Can you, please, add this sort of functionality to Blitz3D ? So we can easily know if game is lost focus or minimased, or interrupted (etc) and set it to pause. Sorry for my bad english. BTW,this is request from all Russian comunity :) | 
| 
 | ||
| Did you try this? http://www.blitzbasic.com/codearcs/codearcs.php?code=853 | 
| 
 | ||
| Of course! It does not work in fullscreen mode. | 
| 
 | ||
| I know that I can check time passed since last render, to catch moment when user got focus back after losing it during some time.(I've done this in Master of Defense) But I need to disable music/sounds, freeze timers etc, so I need to know when user lost focus, not when he is recieved it back. I hope you understood what I'm saying :) | 
| 
 | ||
| I've also tryied to catch windows message WM_ACTIVATE. But Blitz3D suspend code execution when focus lost, and I'm recieving this message only when game recieve focus and execution continues. | 
| 
 | ||
| If we will be able to recieve this message before Blitz, do all we need(pause sounds and game etc), and then send this message to Blitz- this will be solution of the problem, I think. | 
| 
 | ||
| Here is a little example, so you can test this bug: 
Graphics3D 800,600,32,1; <- try to switch to window/fullscreen mode 
hWND=SystemProperty("AppHWND")
GlobalTimer=vdCreateTimer()
While Not KeyDown(1)
ActiveWindow=api_GetActiveWindow()
If ActiveWindow<>hWND 
	MainLoopPaused=True
	vdSetAllTimersPause(True)
	Delay 1
Else
	If OldActiveWindow<>hWND
		vdUpdateTimers()
		vdSetAllTimersPause(False)
		MainLoopPaused=False
	EndIf
EndIf
OldActiveWindow=ActiveWindow
	If MainLoopPaused=False
		;Main loop goes here
		vdUpdateTimers()
		UpdateWorld()
		RenderWorld()
		Cls
		Text 10,10,vdGetTimer(GlobalTimer)
		Flip
	EndIf			
Wend
End
Const cTimeTimer=1
Type TimerT
    Field TimerID
    Field TimerTime
    Field TimerFrame
    Field StartTime
    Field CurTime
    Field Paused
    
End Type
Function vdCreateTimer()
	
	this.TimerT		= New TimerT           
	this\TimerID	= Handle(this.TimerT) 
	this\StartTime  = MilliSecs()
	this\CurTime  	= 0
	this\TimerTime	= 0     
	this\Paused		= False
	
	
	Return this\TimerID                       
	
End Function
Function vdGetTimer(TimerID,TypeOfTimer=cTimeTimer)
	
	this.TimerT = Object.TimerT(TimerID)
	
	Return this\TimerTime
	
End Function
Function vdSetAllTimersPause(Pause)
	
	For this.TimerT=Each TimerT
		this\Paused=Pause
	Next
	
End Function
Function vdUpdateTimers()
	Local TimeDiff,NewCurTime
	
	For this.TimerT=Each TimerT
		
		NewCurTime=MilliSecs()-this\StartTime
		TimeDiff=NewCurTime-this\CurTime
		this\CurTime=NewCurTime
		
		If this\Paused=False
			this\TimerTime=this\TimerTime+TimeDiff 
		EndIf
	Next
	
End Function
 |