Announcement

Collapse
No announcement yet.

Formular aber nicht Computernutzung gestatten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Formular aber nicht Computernutzung gestatten

    Hallo Forum,
    Frohe Weihnachten! ;-)

    Ich bin verzweifelt auf der Suche nach einer Möglichkeit die Nutzung des Clientrechners einzuschränken.

    Ich möchte in meinem Lokal ein Programm/Formular auf einem, meiner Gäste zugänglichen, öffentlichem Terminal anbieten.
    Die User sollen da in ein Formular eingaben machen können. Aber keinen Unsinn mit dem Computer. Also es muss die Taskleiste verschwinden, das Formular muss immer maximiert sein, darf nicht geschlossen werden können. Die WIN taste darf nicht funktionieren, ebensoweinig die F tasten und natürlich auch SRG ALT ENTF nicht.
    Gibt es da eine "globale" Lösung, oder muss ich alle Eventualitäten einzeln berücksichtigen und coden?
    Tips???

    Vielen Dank,

    Alex
    Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
    Entwicklungsumgebung: Visual Basic 2008 Pro

  • #2
    Auch hallo,

    also einige Einstellungen gehen mehr über das Betriebssystem (z.B. die Taskleiste und Rechte angemeldeter Nutzer) und einige über die Eigenschaften des Fensters und lassen sich in der IDE einstellen. Aber was das Verhindern des Schliessen-Buttons angeht: http://www.codeproject.com/KB/cs/DisableClose.aspx (C#, sollte aber analog mit VB funktionieren)
    MfG
    Cheat-Sheets for Developers / Programming Quotes

    Comment


    • #3
      Hallo Markus,

      danke für die schnelle Antwort.

      Den Kleinkram habe ich schon hinbekommen: CloseButton, maximieren usw.

      Was mir richtig große Schwierigkeiten bereitet ist das Unterbinden des Taskmanageraufrufes, das Unterdrücken von ALT+F4 und ALT+TAB.

      Da taugen die (zahlreichen) Googletreffer auch nix...
      Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
      Entwicklungsumgebung: Visual Basic 2008 Pro

      Comment


      • #4
        Sowas nennt man den Kiosk-Modus. Ist aber keine so einfache Sache.

        bye,
        Helmut

        Comment


        • #5
          das Unterdrücken von ALT+F4 und ALT+TAB.
          Da könnte der Kiosk-Modus tatsächlich ein besseres Schlagwort sein: http://www.codeproject.com/KB/cs/Kiosk_CS.aspx
          MfG
          Cheat-Sheets for Developers / Programming Quotes

          Comment


          • #6
            Wir haben in der Arbeit ein Programm, da kann man Windows komplett beschneiden. Soweit bis der Nutzer z.B. bloß mehr ein Verknüpfung auf dem Desktop öffnen. Nicht mal mehr Strg + alt + entf geht dann mehr.
            Ich müsste allerdings nachschauen wie das heisst.

            Comment


            • #7
              Hallo,

              vielen Dank für die zahlreichen Antworten! ;-)

              Ich habe mittlerweile einige Lösungen - naja, sie tun was sie sollen. Zum Teil ist mir nicht einmal klar warum überhaupt... ;-) und ich habe es bißher nur auf meiner (Entwickler-)Platform getestet... Aber selbst als Hobby-Code-Snippets-Zusammenkopierer ;-) ist mir klar, dass es wohl nicht so die geschickte oder gar professionelle Lösung ist.

              Werde den Code die nächsten Tage mal bereinigen und hier als Erste-Hilfe-Lösung und auch zur Diskussion reinstellen.

              @ fanderlf: Das würde mich sehr interessieren. Auch wenn es eine kommerzielle Lösung ist. Ich habe grundsätzlich keine Scheu vor zu bezahlenden Teillösungen, wenn sie es (mir) denn dann wert sind...

              Gruß und schönes Restwochenende,
              Alex
              Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
              Entwicklungsumgebung: Visual Basic 2008 Pro

              Comment


              • #8
                Hallo Alex,

                Ich glaub die Lösung die wir in der Arbeit haben ist schon kommerziell. Aber ich kanns Dir jetzt leider nicht direkt sagen wie das hieß. Ich habs nur eingerichtet

                Ab dem 04.01.2010 bin ich wieder in der Arbeit. Dann schreibst mich am Besten nochmal... mein Hirn lässt bei sowas immer zu wünschen übrig. Dann kann ichs Dir sagen wie das Teil hieß.

                Comment


                • #9
                  Eine Lösung:

                  Hallo,

                  wie versprochen hier meine (vorläufige) Lösung:

                  Aufgabenstellung:

                  Es soll via VB.Net eine Windowsform im "Kioskmodus" dargestellt werden. Der User soll das Form nicht mittels

                  1) "Schließenkreuz"
                  2) Taskleiste
                  3) ALT + TAB
                  4) ALT + F4
                  5) STRG + ESC
                  6) ALT + ESC
                  7) Windowstaste
                  8) Taskmanager

                  beenden können.

                  Formular:
                  Code:
                  Public Class Form1
                  
                      'für modulKioskmodus -> Taskmanager
                      Public _status As Int32
                  
                      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
                          SichererModus(True)
                      End Sub
                  
                      Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
                          SichererModus(False)
                      End Sub
                  
                  End Class
                  Das Modul:
                  Code:
                  Imports System.Runtime.InteropServices
                  Imports System.Reflection
                  Imports System.Drawing
                  Imports System.Threading
                  Imports System
                  Imports Microsoft.Win32
                  
                  Module modulKioskmodus
                  
                      'Sicherer Modus Ein/Aus
                  
                      Public Sub SichererModus(ByVal Status As Boolean)
                  
                          If Status = True Then
                              VollbildStarten()
                              TaskbarSichtbar(False)
                              HookKeyboard()
                              TaskmanagerAus()
                          Else
                              TaskmanagerEin()
                              UnhookKeyboard()
                              TaskbarSichtbar(True)
                              formularERFASSUNG.Close()
                          End If
                  
                      End Sub
                  
                      'Vollbildmodus starten
                  
                      Public Sub VollbildStarten()
                          Form1.FormBorderStyle = Windows.Forms.FormBorderStyle.None
                          Form1.WindowState = FormWindowState.Maximized
                      End Sub
                  
                      'Tasten sperren
                  
                      Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Integer) As Integer
                      Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As KeyboardHookDelegate, ByVal hmod As Integer, ByVal dwThreadId As Integer) As Integer
                      Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Integer
                      Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Integer, ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As KBDLLHOOKSTRUCT) As Integer
                  
                      Public Structure KBDLLHOOKSTRUCT
                          Public vkCode As Integer
                          Public scanCode As Integer
                          Public flags As Integer
                          Public time As Integer
                          Public dwExtraInfo As Integer
                      End Structure
                  
                      ' Low-Level Keyboard Constants
                      Private Const HC_ACTION As Integer = 0
                      Private Const LLKHF_EXTENDED As Integer = &H1
                      Private Const LLKHF_INJECTED As Integer = &H10
                      Private Const LLKHF_ALTDOWN As Integer = &H20
                      Private Const LLKHF_UP As Integer = &H80
                  
                      ' Virtual Keys
                      Public Const VK_TAB As Integer = &H9
                      Public Const VK_CONTROL As Integer = &H11
                      Public Const VK_ESCAPE As Integer = &H1B
                      Public Const VK_DELETE As Integer = &H2E
                      Public Const VK_WINRIGHT As Integer = &H5C
                      Public Const VK_WINLEFT As Integer = &H5B
                      Public Const VK_F4 As Integer = &H73
                  
                      Private Const WH_KEYBOARD_LL As Integer = 13&
                      Public KeyboardHandle As Integer
                  
                      Public Function IsHooked(ByRef Hookstruct As KBDLLHOOKSTRUCT) As Boolean
                  
                          Debug.WriteLine("Hookstruct.vkCode: " & Hookstruct.vkCode)
                          Debug.WriteLine(Hookstruct.vkCode = VK_ESCAPE)
                          Debug.WriteLine(Hookstruct.vkCode = VK_TAB)
                          Debug.WriteLine(Hookstruct.vkCode = VK_WINRIGHT)
                          Debug.WriteLine(Hookstruct.vkCode = VK_WINLEFT)
                  
                          If (Hookstruct.vkCode = VK_ESCAPE) And _
                            CBool(GetAsyncKeyState(VK_CONTROL) _
                            And &H8000) Then
                  
                              Call HookedState("Ctrl + Esc blocked")
                              Return True
                          End If
                  
                          If (Hookstruct.vkCode = VK_TAB) And _
                            CBool(Hookstruct.flags And _
                            LLKHF_ALTDOWN) Then
                  
                              Call HookedState("Alt + Tab blockd")
                              Return True
                          End If
                  
                          If (Hookstruct.vkCode = VK_ESCAPE) And _
                            CBool(Hookstruct.flags And _
                              LLKHF_ALTDOWN) Then
                  
                              Call HookedState("Alt + Escape blocked")
                              Return True
                          End If
                  
                          If (Hookstruct.vkCode = VK_WINRIGHT) Then
                  
                              Call HookedState("Windows right blocked")
                              Return True
                          End If
                  
                          If (Hookstruct.vkCode = VK_WINLEFT) Then
                  
                              Call HookedState("Windows left blocked")
                              Return True
                          End If
                  
                          If (Hookstruct.vkCode = VK_F4) And _
                            CBool(Hookstruct.flags And _
                            LLKHF_ALTDOWN) Then
                  
                              Call HookedState("Alt + F4 blocked")
                              Return True
                          End If
                  
                          Return False
                      End Function
                  
                      Private Sub HookedState(ByVal Text As String)
                          Debug.WriteLine(Text)
                      End Sub
                  
                      Public Function KeyboardCallback(ByVal Code As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer
                  
                          If (Code = HC_ACTION) Then
                              Debug.WriteLine("Calling IsHooked")
                  
                              If (IsHooked(lParam)) Then
                                  Return 1
                              End If
                  
                          End If
                  
                          Return CallNextHookEx(KeyboardHandle, Code, wParam, lParam)
                  
                      End Function
                  
                  
                      Public Delegate Function KeyboardHookDelegate(ByVal Code As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer
                  
                      <MarshalAs(UnmanagedType.FunctionPtr)> Private callback As KeyboardHookDelegate
                  
                      Public Sub HookKeyboard()
                          callback = New KeyboardHookDelegate(AddressOf KeyboardCallback)
                  
                          KeyboardHandle = SetWindowsHookEx(WH_KEYBOARD_LL, callback, Marshal.GetHINSTANCE([Assembly].GetExecutingAssembly.GetModules()(0)).ToInt32, 0)
                  
                          Call CheckHooked()
                      End Sub
                  
                      Public Sub CheckHooked()
                          If CBool((Hooked())) Then
                              Debug.WriteLine("Keyboard hooked")
                          Else
                              Debug.WriteLine("Keyboard hook failed: " & Err.LastDllError)
                          End If
                      End Sub
                  
                      Private Function Hooked() As Boolean
                          Hooked = KeyboardHandle <> 0
                      End Function
                  
                      Public Sub UnhookKeyboard()
                          If CBool((Hooked())) Then
                              Call UnhookWindowsHookEx(KeyboardHandle)
                          End If
                      End Sub
                  
                      'Taskbar ausschalten
                  
                      Private Declare Auto Function FindWindow Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
                      Private Declare Auto Sub SetWindowPos Lib "User32" (ByVal hWnd As Integer, ByVal hWndInsertAfter As Integer, ByVal X As Integer, ByVal Y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal wFlags As Integer)
                  
                      Public Sub TaskbarSichtbar(ByVal Visible As Boolean)
                          Dim Handle As Integer = FindWindow("Shell_TrayWnd", "")
                  
                          If Visible = True Then
                              SetWindowPos(Handle, 0, 0, 0, 0, 0, 64)
                          Else
                              SetWindowPos(Handle, 0, 0, 0, 0, 0, 128)
                          End If
                      End Sub
                  
                      'Taskmanager deaktivieren
                  
                      Public Sub TaskmanagerAus()
                  
                          Dim value As Int32
                          Registry.GetValue("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system", "DisableTaskMgr", value)
                          Form1._status = CInt(value)
                  
                          If IsNothing(value) Then
                              Registry.SetValue("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system", "DisableTaskMgr", 1)
                          ElseIf value = 0 Then
                              Registry.SetValue("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system", "DisableTaskMgr", 1)
                          End If
                  
                      End Sub
                  
                      'Taskmanager aktivieren
                  
                      Public Sub TaskmanagerEin()
                  
                          Dim value As Int32
                          Registry.GetValue("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system", "DisableTaskMgr", value)
                  
                          If IsNothing(value) Then
                          ElseIf CInt(value) <> Form1._status Then
                              Registry.SetValue("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system", "DisableTaskMgr", Form1._status)
                          End If
                  
                          Registry.SetValue("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system", "DisableTaskMgr", 0)
                  
                      End Sub
                  
                  End Module
                  Credit: Der Code für das Tastensperren stammt von: http://www.developer.com/net/net/art...-in-VB-NET.htm

                  So, also ich würde sagen des geht (unter XP).

                  Weitere Fragen:

                  1) Läuft das auch unter Vista oder Win7? Kann's leider nicht testen.
                  2) Fällt Euch noch irgend ein Unsinn ein, welchen User versuchen könnten um aus dem Formular zu kommen?
                  3) Wie ist es möglich nun auch noch die MsgBox abzusschalten wenn der User STRG + Alt + Entf drückt. (Der Taskmanager erscheint zwar nicht, es kommt jedoch eine MsgBox "Der Administrator hat den Taskmanager deaktiviert."
                  4) Könnte es Probleme auf manchen Systemen geben (Userrechte), wegen der "Rumpfuscherei" in der Registry?

                  Würde mich über Antworten, Kommentare oder Verbesserungsvorschläge freuen! ;-)
                  Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
                  Entwicklungsumgebung: Visual Basic 2008 Pro

                  Comment


                  • #10
                    Originally posted by AlexMuc View Post
                    1) Läuft das auch unter Vista oder Win7? Kann's leider nicht testen.
                    Und wieso nicht? Im Bereich professoneller SW-Entwicklung ist das Testen mit VM's schon seit Jahren gang und gebe und auch Preislich sehr günstig zu realisieren).

                    Comment


                    • #11
                      Originally posted by Bernhard Geyer View Post
                      Und wieso nicht? Im Bereich professoneller SW-Entwicklung ist das Testen mit VM's schon seit Jahren gang und gebe und auch Preislich sehr günstig zu realisieren).
                      Eigentlich weil mir diese Betriebssysteme nicht zur Verfügung stehen, aber auch weil ich (offensichtlich!) kein professioneller SW-Entwickler bin. (-> hast Du als "Forenheld" bestimmt bemerkt...) Für was steht "VM"?
                      Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
                      Entwicklungsumgebung: Visual Basic 2008 Pro

                      Comment


                      • #12
                        Originally posted by AlexMuc View Post
                        Für was steht "VM"?
                        In diesem Zusammenhang für Virtuelle Maschine

                        Gruß Jürgen

                        Comment


                        • #13
                          Gutes neues alle zusammen Also ich habs jetzt mal nachgeschaut und wir haben dieses Teil hier:

                          Access Manager von SoftStack

                          Hoffe es hilft euch weiter

                          Gruß
                          Florian

                          Comment


                          • #14
                            Hallo,
                            1) Läuft das auch unter Vista oder Win7?
                            Kurz getestet mit Vista Home Premium und Win7 als normaler Nutzer: Verhalten ist in beiden Fällen dasselbe. Resultat: Vollbild, Tasten gesperrt, Fehlermeldung wg. fehlender Zugriffsrechte auf die Registry, nach Programmende ist die Taskleiste weg
                            MfG
                            Cheat-Sheets for Developers / Programming Quotes

                            Comment

                            Working...
                            X