Screensavers: intercept screen shutdown events

Blitz3D Forums/Blitz3D Programming/Screensavers: intercept screen shutdown events

alain(Posted 2008) [#1]
I'm doing some screensavers in blitz3D.

Everything is working well, but I have one last issue to solve:

Let's say the computer has the following settings:
- Start screensaver after 5 minutes.
- Shutdown screen after 15 minutes.

So my screensaver runs after 5 minutes, then I wait 10 minutes more and the screen goes off.

If I go back to my computer and move the mouse or press a key, the screen turns on and I have my Blitz screensaver still running minimized on the taskbar.

How can I receive this "screen shutdown" event on my Blitz program?

I tried the code from Code Archive (screensaver code: http://www.blitzbasic.com/codearcs/codearcs.php?code=2093 )

in particular the event handler:
			Select w_message\message
				Case WM_DESTROY:
					api_PostQuitMessage(0)
				Case WM_CLOSE:
					ExitScreensaver()
				Case WM_MOUSEMOVE:
					pt.POINT = New POINT
					api_GetCursorPos(pt)
					If Abs(pt\x-orig_pt\x)>10 Or Abs(pt\y-orig_pt\y)>10 Then 
						api_PostMessage(w_message\hwnd,WM_CLOSE,0,0)
					EndIf
				Case WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN, WM_KEYDOWN, WM_SYSKEYDOWN:
					api_PostMessage(w_message\hwnd,WM_CLOSE,0,0) 
				Default:
					api_DefWindowProc(w_message\hwnd,w_message\message,w_message\lParam,w_message\wParam)						
			End Select	



but it seems it is not working well on my Vista and XP box.

Any advice of the screensavers gurus out there?

thanks


alain(Posted 2008) [#2]
Well, I have a more concrete example:

Const WM_LBUTTONDOWN            = $0201

Global w_message.MSG = New MSG

Type MSG
	Field hwnd
	Field message
	Field wParam
	Field lParam
	Field time$
	Field pt.POINT
End Type

Type POINT
	Field x
	Field y
End Type

While Not KeyDown(1) 
	While api_PeekMessage(w_message,0,0,0,1)
		Select w_message\message
			Case WM_LBUTTONDOWN:
				Print("WM_LBUTTONDOWN")
			Default:
				api_DefWindowProc(w_message\hwnd,w_message\message,w_message\lParam,w_message\wParam)						
		End Select	
	Wend
Wend
End


With the following user decl:

.lib "user32.dll"

api_PeekMessage% (lpMsg*, hwnd%, wMsgFilterMin%, wMsgFilterMax%, wRemoveMsg%) : "PeekMessageA"
api_DefWindowProc% (hwnd%, wMsg%, wParam%, lParam%) : "DefWindowProcA"


When I run this program, I have to click 5 or 6 times on the left mouse button before receiving a bulk of 5-6 events....

How can I "flush" the events, so exactly each time I press on the mouse button, I receive the event?