Kiosk System

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.
pws32
Beiträge: 52
Registriert: 27.09.2004 12:33

Kiosk System

Beitrag von pws32 »

in diesem Programmbeispiel (PB4.0) wird gezeigt wie man ein Kiosksystem realisieren kann
das Programmbeispiel startet ein neues Desktop ohne Taskbar oder Desktopicons und startet ein externes Programm,
und das beste ist das man den neuen Desktop nicht mit dem Taskmangaer beenden kann sondern nur über das Fenster mit
dem neuen Desktopnamen, viel Spass!

Vielen Dank den Usern die mir hierbei geholfen haben


srod <-- english forum
ts-soft <-- english and german forum
Trond <-- english forum
uweb <-- german forum
friedhelm <-- german forum
falko <-- german forum

Code: Alles auswählen

#WINSTA_ALL  = #WINSTA_ACCESSCLIPBOARD | #WINSTA_ACCESSGLOBALATOMS | #WINSTA_CREATEDESKTOP | #WINSTA_ENUMDESKTOPS | #WINSTA_ENUMERATE | #WINSTA_EXITWINDOWS | #WINSTA_READATTRIBUTES | #WINSTA_READSCREEN | #WINSTA_WRITEATTRIBUTES | #DELETE | #READ_CONTROL | #WRITE_DAC | #WRITE_OWNER 
#DESKTOP_ALL = #DESKTOP_READOBJECTS | #DESKTOP_CREATEWINDOW | #DESKTOP_CREATEMENU | #DESKTOP_HOOKCONTROL | #DESKTOP_JOURNALRECORD | #DESKTOP_JOURNALPLAYBACK | #DESKTOP_ENUMERATE | #DESKTOP_WRITEOBJECTS | #DESKTOP_SWITCHDESKTOP | #STANDARD_RIGHTS_REQUIRED 

#UOI_NAME = $2
Global m_sDesktop.s
m_sDesktop = Space(128)

Global cmdline$
cmdline$="C:\WINDOWS\system32\notepad.exe"

Global FontID1 
FontID1 = LoadFont(1, "Arial", 22, #PB_Font_Bold) 

Global startupinfo.STARTUPINFO
startupinfo\cb=SizeOf(STARTUPINFO)
startupinfo\lpReserved=#NUL
startupinfo\lpDesktop=#NUL
startupinfo\lpTitle=#NUL
startupinfo\dwX=#NUL
startupinfo\dwY=#NUL
startupinfo\dwXSize=#NUL
startupinfo\dwYSize=#NUL
startupinfo\dwXCountChars=#NUL
startupinfo\dwYCountChars=#NUL
startupinfo\dwFillAttribute=#NUL
startupinfo\dwFlags=#STARTF_USESHOWWINDOW
startupinfo\wShowWindow=#SW_SHOW
startupinfo\cbReserved2=#NUL
startupinfo\lpReserved2=#NUL
startupinfo\hStdInput=#NUL
startupinfo\hStdOutput=#NUL
startupinfo\hStdError=#NUL

Global process_information.PROCESS_INFORMATION
process_information\hProcess=#NUL
process_information\hThread=#NUL
process_information\dwProcessId=#NUL
process_information\dwThreadId=#NUL

;Global tSi.STARTUPINFO


;Show an error 
Procedure Abort(s.s) 
  MessageRequester("", "Error: "+s.s) 
  Debug "Error: "+s.s 
  End 
EndProcedure 



Procedure.s GetDesktopName()
  Protected hDesktop, lR, lSize, sBuff.s, iPos
  hDesktop = OpenInputDesktop_(0, #False, #DESKTOP_READOBJECTS)
  If hDesktop
    lSize = (Len(m_sDesktop) + 1) * 2
    sBuff=Space(lSize+1)
    lR = GetUserObjectInformation_(hDesktop, #UOI_NAME, @sBuff, lSize, @lSize)
    CloseHandle_(hDesktop)  ; Should this be CloseDesktop_() ?
  EndIf
  ProcedureReturn sBuff
EndProcedure 

;Check a result and ev. abort 
Procedure Chk(a.l, s.s) 
  
  ;If a is false, abort. 
  ;If a is false and s contains an error message, show it before abort. 
  If Not(a) 
    If s.s 
      Abort(s.s) 
    Else 
      End 
    EndIf 
  EndIf 
EndProcedure 

hWinSta = OpenWindowStation_("WinSta0", 0, #WINSTA_ALL) 
Chk( SetProcessWindowStation_(hWinSta) , "Failed to set window station") 

hDefaultDesk = OpenDesktop_("Default", #DF_ALLOWOTHERACCOUNTHOOK, 0, #DESKTOP_SWITCHDESKTOP) 
Chk(hDefaultDesk, "Failed to open default desktop") 

hDesk = CreateDesktop_("My Desktop 2", 0, 0, #DF_ALLOWOTHERACCOUNTHOOK, #DESKTOP_ALL, 0) 
Chk( hDesk, "Failed to create desktop") 

SetThreadDesktop_(hDesk)  ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 

Chk( SwitchDesktop_(hDesk), "Failed to switch desktop") 



If OpenWindow(1, 216, 0, 255, 165, "Test",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar ) 
  If CreateGadgetList(WindowID(1)) 
    TextGadget(1, 20, 70, 210, 30, "Test", #PB_Text_Center) 
    SetGadgetFont(1, FontID1) 
  EndIf 
EndIf 

m_sDesktop = GetDesktopName()
SetGadgetText(1,m_sDesktop)

tSi.STARTUPINFO
tSi\lpTitle = @m_sDesktop
tSi\lpDesktop = @m_sDesktop

tPi.PROCESS_INFORMATION

ret=createprocess_(#NUL,@cmdline$,#NUL,#NUL,#False,0,#NUL,#NUL,@tSi,@tPi)

Repeat 
  Event = WaitWindowEvent() 
  WindowID = EventWindow() 
  GadgetID = EventGadget() 
  EventType = EventType() 
  If Event = #PB_Event_Gadget 
  EndIf 
Until Event = #PB_Event_CloseWindow 

;Delay(2000) 

Chk( SwitchDesktop_(hDefaultDesk), "Failed to switch desktop") 
SetThreadDesktop_(hDefaultDesk)  ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 

CloseDesktop_(hDesk) 
CloseDesktop_(hDefaultDesk) 
CloseWindowStation_(hWinSta)
ich weis das ich nix weis
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@pws32
Ich habe es getestet und ich finde es gut. Du könntest doch einen Virtual-Desktop programmieren.
Und das man mehrere Desktops hat und dabei hin und her wechseln kann.
Ist doch eine Idee? :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Schöne Sache :allright:

Kleines Problem bleibt. Wenn Du den Desktop schließt, ohne Notepad zu
beenden, hat man beim nächsten Start 2 Notepads usw.

Es fehlt also noch ein vollständiges beenden.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
pws32
Beiträge: 52
Registriert: 27.09.2004 12:33

Beitrag von pws32 »

nunja ist ja auch nur ein Beispiel, hätte naturlich auch einen Button mit "start Editor bauen können (ich war nur zu faul), das das Programm nicht beendet wird empfinde ich als Feature ist fast so wie bei Terminalsrvices wenn man nur trennt
ich weis das ich nix weis
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Hab mir noch ein paar Konstanten sammeln müssen, aber jetzt funktioniert
es. Super Arbeit! :allright:

Könnte man das auch dazu verwenden den Computer zu sperren?
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

> Könnte man das auch dazu verwenden den Computer zu sperren?

wenn Du es schaffst, den Affengriff zu unterdrücken, dann ja ;-)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

Ich find es eine Super Idee.

INFO:
Ich hab bei mir Vista RC1 und wenn ich STRG-ALT-ENTF drücke komme ich trozdem an den Tastmanager. Ich weis, da ich XP bei mir drauf hab, das dies bei XP nicht der fall ist. Die Taskleiste wird bei Vista auch nicht angezeigt.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Vielen Dank für den Code! Kann man sicher gut gebrachen!
Ich hoffe, dass der Code noch verbessert wird, wie TS-Soft bereits angesprochen hat!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
winduff
Beiträge: 879
Registriert: 10.02.2006 21:05
Wohnort: Gießen
Kontaktdaten:

Beitrag von winduff »

sehr schön, super ;)
Bild
AND51 hat geschrieben:...und ich würde dein Programm aus Wut zwei mal installieren, um eines genüsslicher löschen zu können, als das andere...
Antworten