Seite 1 von 1

Kiosk System

Verfasst: 12.10.2006 00:16
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)

Verfasst: 12.10.2006 00:30
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:

Verfasst: 12.10.2006 00:33
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

Verfasst: 12.10.2006 00:43
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

Verfasst: 12.10.2006 10:05
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?

Verfasst: 12.10.2006 10:07
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

Verfasst: 12.10.2006 14:40
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.

Verfasst: 12.10.2006 15:14
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!

Verfasst: 12.10.2006 19:14
von winduff
sehr schön, super ;)