Seite 1 von 1

Lock-Window : Fenster sperrt den Bildschirm

Verfasst: 29.06.2006 12:48
von Olaf
<)
Das Fenster in diesem Code kommt automatisch nach jedem WindowEvent
in den Vordergrund und überdeckt somit auch den evtl. aufgerufenen Taskmanager :twisted: .
Weil es dazu aber den Befehl StickyWindow(#Window,State) verwendet,
ist es nur ab Version 4.00 lauffähig.

Das Fenster schließt sich erst, wenn die darin vorkommenden Regler auf die
RGB-Farbe RGB(111,81,45) eingestellt sind. Chancen: immerhin 1:16777216

Der Code ist jedoch überwiegend als Gerüst gedacht und sowohl Gadgets
als auch Schließbedingungen sollten nach eigenem Bedarf geändert werden.

WICHTIG: Das Fenster muss immer als Vollbild aufgerufen werden.

Code: Alles auswählen

OpenWindow(0,0,0,1024,768,"",#PB_Window_BorderLess|#PB_Window_Maximize)
	CreateGadgetList(WindowID(0))
		SpinGadget(1,WindowWidth(0)/2-128,30,256,20,0,255,#PB_Spin_Numeric)
		SetGadgetColor(1,#PB_Gadget_BackColor,RGB(255,0,0)):SetGadgetColor(1,#PB_Gadget_FrontColor,RGB(255,255,255))
		SpinGadget(2,WindowWidth(0)/2-128,50,256,20,0,255,#PB_Spin_Numeric)
		SetGadgetColor(2,#PB_Gadget_BackColor,RGB(0,255,0)):SetGadgetColor(2,#PB_Gadget_FrontColor,RGB(255,255,255))
		SpinGadget(3,WindowWidth(0)/2-128,70,256,20,0,255,#PB_Spin_Numeric)
		SetGadgetColor(3,#PB_Gadget_BackColor,RGB(0,0,255)):SetGadgetColor(3,#PB_Gadget_FrontColor,RGB(255,255,255))
		TextGadget(4,WindowWidth(0)/2-128,90,256,100,"Das Programm wird nur bei einer bestimmten Farbe geschlossen!"+Chr(10)+"INFO : es gibt "+Str(256*256*256)+" mögliche Farben.")
StickyWindow(0,1)
SetWindowColor(0,RGB(0,0,0))
SetGadgetColor(4,#PB_Gadget_BackColor,RGB(0,0,0)):SetGadgetColor(4,#PB_Gadget_FrontColor,RGB(255,255,255))
Repeat
event=WaitWindowEvent()
StickyWindow(0,1)
	Select event
		Case #PB_Event_Gadget
			Select EventGadget()
				Case 1
					r=GetGadgetState(1)
					SetGadgetColor(1,#PB_Gadget_BackColor,RGB(r,0,0))
					SetGadgetColor(4,#PB_Gadget_BackColor,RGB(r,g,b)):SetGadgetColor(4,#PB_Gadget_FrontColor,RGB(255,255,255))
					SetWindowColor(0,RGB(r,g,b))
				Case 2
					g=GetGadgetState(2)
					SetGadgetColor(2,#PB_Gadget_BackColor,RGB(0,g,0))
					SetGadgetColor(4,#PB_Gadget_BackColor,RGB(r,g,b)):SetGadgetColor(4,#PB_Gadget_FrontColor,RGB(255,255,255))
					SetWindowColor(0,RGB(r,g,b))
				Case 3
					b=GetGadgetState(3)
					SetGadgetColor(3,#PB_Gadget_BackColor,RGB(0,0,b))
					SetGadgetColor(4,#PB_Gadget_BackColor,RGB(r,g,b)):SetGadgetColor(4,#PB_Gadget_FrontColor,RGB(255,255,255))
					SetWindowColor(0,RGB(r,g,b))
			EndSelect
	EndSelect
Until GetWindowColor(0)=RGB(111,81,45)

Verfasst: 29.06.2006 15:06
von PMV
hm ... das geht aber auch ohne maximiertes Fenster :D ... hab mal Code rausgekramt den ich früher geschrieben hatte

PB 3.94:

Code: Alles auswählen

;erstellt das Fenster und setzt es auf "immer im Fordergrund"
Window = OpenWindow(0, 0, 0, 300, 120, #PB_Window_ScreenCentered | #PB_Window_BorderLess, "Lock-Window")
CreateGadgetList(Window)
  ContainerGadget(#PB_Any, -1, -1, 301, 121, #PB_Container_Raised)
  Font = LoadFont(#PB_Any, "Times New Roman", 17, #PB_Font_Bold)
  SetGadgetFont(TextGadget(#PB_Any, 10, 5, 280, 60, "Beispiel zum sperren des Bildschirms", #PB_Text_Center), UseFont(Font))
  TextGadget = TextGadget(#PB_Any, 0, 70, 300, 20, "", #PB_Text_Center)
  ButtonGadget = ButtonGadget(#PB_Any, 70, 90, 160, 20, "entsperren")
  DisableGadget(ButtonGadget, #True)
While WindowEvent() : Wend
MakeStayOnTop(Window, #True)


Sperren = #True
Time = ElapsedMilliseconds() 
Repeat
  ;aktiviert das Fenster wenn es nicht mehr im Fordergrund steht
  If GetForegroundWindow_() <> Window
    SetForegroundWindow_(Window)
    Beep_(1000,100)
    BringWindowToTop_(Window)
  EndIf
  
  
  If Sperren = #Ture
    If Time + 10000 <= ElapsedMilliseconds() 
      DisableGadget(ButtonGadget, #False)
      Sperren = #False
      SetGadgetText(TextGadget, "Bildschirm entsperrbar!")
    Else
      SetGadgetText(TextGadget, "Bildschirm noch "+Str((10000 - ElapsedMilliseconds() + Time)/1000)+" Sekunden gesperrt!")
    EndIf
    ;Events abarbeiten
    WindowEvent()
    Delay(10)
  Else
    ;wenn ButtonGadget gedrückt wird, beenden
    If WaitWindowEvent() = #PB_Event_Gadget
      End
    EndIf
  EndIf
ForEver

Verfasst: 03.07.2006 19:01
von Michael Vogel
Hey, nette Idee...

anbei meine Variante (das compilierte Exe mit Images unter http://sudokuprogram.googlepages.com/lockme.exe), mit folgenden Adaptionen:

- zweites Fenster, damit man nichts mehr anklicken und aktivieren kann
- bißerl Graphik und Sound (alles handgestrickt, ist also nicht perfekt)
- weniger Kombinationen (der voreingestellte "Code" ist 1234)

Noch (mindestens) einen Haken hat's auch noch: Alt-Tab sollte man irgendwie abschalten, denn das schaut gar nicht nett aus...

Michael


Code: Alles auswählen

; Define
	EnableExplicit

	Enumeration
		#SafeWin
		#GlassWin
		#SpriteBack
		#SpriteFore
		#SoundClick
		#SoundRot
	EndEnumeration

	Global code.s=""
	Global secret.s="1234"

	Global WinSafe,WinGlass
	Global WinX=128
	Global WinY=128

	Global dummy
	Global rot,x,y,mx,my
	Global active,wasactive

	DataSection
		IconBack:		IncludeBinary "Data\Safe_Back.png"
		IconFore:		IncludeBinary "Data\Safe_Front.png"
		SoundClick:	IncludeBinary "Data\Click.wav"
		SoundRot:		IncludeBinary "Data\Rotate.wav"
	EndDataSection

; EndDefine
Procedure.l Absolute(a,b,c,m)
	Protected z
	If c>m
		z=-1
	Else
		z=1
	EndIf

	If a-b=0
		ProcedureReturn 0
	Else
		ProcedureReturn z*(a-b);>>1
	EndIf
EndProcedure
Procedure Init()

	InitSprite() : InitSprite3D() : InitMouse() : InitSound()
	
	CatchSound(#SoundClick,?SoundClick)
	CatchSound(#SoundRot,?SoundRot)

	WinGlass=OpenWindow(#Glasswin,0,0,GetSystemMetrics_(#SM_CXSCREEN),GetSystemMetrics_(#SM_CYSCREEN),"-",#PB_Window_BorderLess|#PB_Window_Invisible)
	SetWindowLong_(WinGlass,#GWL_EXSTYLE,GetWindowLong_(WinGlass,#GWL_EXSTYLE)|#WS_EX_LAYERED|#WS_EX_TOOLWINDOW)
	SetLayeredWindowAttributes_(WinGlass,0,0,#LWA_ALPHA)
	StickyWindow(#Glasswin,1)
	HideWindow(#Glasswin,0)

	WinSafe=OpenWindow(#SafeWin,0,0,256,256,"Safer Ex.",#PB_Window_ScreenCentered|#PB_Window_BorderLess|#PB_Window_Invisible)
	SetWindowLong_(WinSafe,#GWL_EXSTYLE,GetWindowLong_(WinSafe,#GWL_EXSTYLE)|#WS_EX_TOOLWINDOW)
	
	Dummy=CreateEllipticRgn_(4,4,255,254)
	SetWindowRgn_(WinSafe,Dummy,#True)
	DeleteObject_(Dummy)

	OpenWindowedScreen(WinSafe,0,0,256,256,0,0,0)

	UsePNGImageDecoder()
	CatchSprite(#SpriteBack,?IconBack,#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)
	CatchSprite(#SpriteFore,?IconFore,#PB_Sprite_Texture|#PB_Sprite_AlphaBlending)

	CreateSprite3D(#SpriteBack,#SpriteBack)
	CreateSprite3D(#SpriteFore,#SpriteFore)
	Sprite3DQuality(1)

	For dummy=0 To 224 Step 16
	SetLayeredWindowAttributes_(WinGlass,0,dummy,#LWA_ALPHA)
	Next dummy

	StickyWindow(#SafeWin,1)
	HideWindow(#SafeWin,0)

EndProcedure
Procedure Main()

	rot=36
	Repeat
		x=WindowMouseX(#SafeWin)
		y=WindowMouseY(#SafeWin)
		If GetAsyncKeyState_(#VK_LBUTTON)&$8000
			If active
				rot+Absolute(x,mx,y,128)
				rot+Absolute(my,y,x,128)
			Else
				active=#True
				wasactive=#True
				PlaySound(#SoundRot,1)
			EndIf
			mx=x
			my=y
		Else
			StopSound(#SoundRot)
			active=#False
			rot=rot%360
			If rot<0
				rot+360
			EndIf

			dummy=rot%36
			If dummy<8
				rot/36
				rot*36
			ElseIf dummy>28
				rot/36
				rot+1
				rot*36
			EndIf

			If (wasactive) And (rot%36=0)
				PlaySound(#SoundClick,0)
				code+Str((11-rot/36)%10)
				wasactive=#False
			EndIf

		EndIf

		Select WaitWindowEvent(100)
		Case #WM_CHAR
			Select EventwParam()
			Case '0',' ',#ESC
				code=""
				PlaySound(#SoundClick,0)
			Case '!'; Remove that!
				code=secret
			EndSelect
		EndSelect

		SetForegroundWindow_(WinSafe)
		BringWindowToTop_(WinSafe)

		;DisplaySprite(#SpriteBack,0,0)
		ClearScreen($a0a0a0)
		Start3D()
		DisplaySprite3D(#SpriteBack,0,0)
		RotateSprite3D(#SpriteFore,rot,0)
		DisplaySprite3D(#SpriteFore,0,0)
		Stop3D()

		;StartDrawing(ScreenOutput())
		;DrawText(0,0,code)
		;StopDrawing()

		FlipBuffers()

	Until code=secret
	
	;CloseWindow(WinSafe)
	;CloseWindow(WinGlass)
	
EndProcedure

Init()
Main()

Verfasst: 03.07.2006 19:26
von hardfalcon
Michael Vogel hat geschrieben:Noch (mindestens) einen Haken hat's auch noch: Alt-Tab sollte man irgendwie abschalten, denn das schaut gar nicht nett aus...
Wie man die Tastatur hookt, steht im Codearchiv.