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
|