Lock-Window : Fenster sperrt den Bildschirm

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Olaf
Beiträge: 117
Registriert: 20.04.2006 14:51
Wohnort: 66606 St.Wendel (Niederlinxweiler, Dr.Albert-Schweitzer-Str.9)
Kontaktdaten:

Lock-Window : Fenster sperrt den Bildschirm

Beitrag 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)
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Michael Vogel
Beiträge: 72
Registriert: 16.03.2006 11:20

Beitrag 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()
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag 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.
Antworten