Pseudo Desktop

  • Hallo zsammen,

    ich bin erst vor Kurzem auf Autoit gestossen und möchte es gerne verwenden, um auf Clientrechnern für unsere Schüler eine sehr einfache Oberfläche anzulegen, da ich das nicht mit Gruppenrichtlinien hinbekomme ...

    Auf den Clients - mit unterschiedlicher Bildschirmauflösung! - soll ein Fenster maximiert erstellt werden (das dadurch den Desktop "zudeckt").
    Dieses Fenster soll in vier verschiedenfarbige Rechtecke aufgeteilt werden. Z.B.:
    [rotes Rechteck][gelbes Rechteck]
    [grünes Rechteck][blaues Rechteck]

    In diese Rechtecke möchte ich Icons / Buttons zum Starten einiger weniger Programme ablegen, die thematisch den Farben zugeordnet werden.
    (Das ganze soll so simpel und visuell gut strukturiert sein, da es sich um Schüler mit geistiger Behinderung handelt.)

    Ich habe schon ein bisschen rumexperimentiert, bin aber nicht sicher, wie es am einfachsten / elegantesten geht.
    Bei Group scheint ja der Background nicht einfach so eingefärbt werden zu können.

    Sollte ich 4 Child-Fenster nehmen und kann ich dort all Leisten ausblenden?

    Hat jemand einen grundsätzlichen Lösungsweg?
    Dann könnte ich mich (schneller) in die Definition der notwendigen Objekte und Strukturen einlesen.

    Grüße,
    klaros

    • Offizieller Beitrag

    Hier mal was ganz simples aus der Hüfte:

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $h = @DesktopHeight
    Global $w = @DesktopWidth

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGui = GUICreate('', $w, $h, -1, -1, $WS_POPUP)
    ; das Fenster nach vorn setzen
    WinSetOnTop($hGui, '', 1)
    Global $Kachel_1 = GUICtrlCreateLabel('', 0, 0, $w/2, $h/2)
    Global $Kachel_2 = GUICtrlCreateLabel('', $w/2, 0, $w/2, $h/2)
    Global $Kachel_3 = GUICtrlCreateLabel('', 0, $h/2, $w/2, $h/2)
    Global $Kachel_4 = GUICtrlCreateLabel('', $w/2, $h/2, $w/2, $h/2)
    GUICtrlSetBkColor($Kachel_1, 0xFF0000)
    GUICtrlSetBkColor($Kachel_2, 0x00FF00)
    GUICtrlSetBkColor($Kachel_3, 0x0000FF)
    GUICtrlSetBkColor($Kachel_4, 0xFF00FF)
    ; die Kacheln selbst sollen nicht klickbar sein:
    GUICtrlSetState($Kachel_1, $GUI_DISABLE)
    GUICtrlSetState($Kachel_2, $GUI_DISABLE)
    GUICtrlSetState($Kachel_3, $GUI_DISABLE)
    GUICtrlSetState($Kachel_4, $GUI_DISABLE)

    [/autoit] [autoit][/autoit] [autoit]

    ; nur zum Beenden in dieser Demo:
    Global $bEnd = GUICtrlCreateButton('Ende', 100, 50, 100, 24)

    [/autoit] [autoit][/autoit] [autoit]

    ; genau wie Button lassen sich auch Picture-Ctrl oder Icon verwenden

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Switch GUIGetMsg()
    Case $bEnd
    Exit
    EndSwitch
    WEnd

    [/autoit]
  • Hi BugFix,

    Vielen Dank!
    Das ist ja schon das halbe Programm! :thumbup:

    Mal sehen, ob da noch große Klippen auf mich zukommen ...

    Aufgefallen ist mir, dass das Fenster ungefähr die halbe Taskleiste unter Win 8 noch anzeigt.
    Das passiert aber auch mit dem ISN Autoit Studio Fenster, wenn ich maximiere ...
    Das ist aber Kleinkram.

    Grüße,
    Klaus

    • Offizieller Beitrag

    Aufgefallen ist mir, dass das Fenster ungefähr die halbe Taskleiste unter Win 8 noch anzeigt.


    Blende die Taskleiste einfach aus. Die Makros für Bildschirmgröße arbeiten sowieso nicht korrekt in Bezug auf die Position der Taskbar. Kannst ja die Größe auch fix vorgeben, wenn alle Desktop dieselbe Größe haben.

  • Wenn du die Windows-Oberfläche eh nicht brauchst, kannst du einfach die Explorer.exe schließen.
    Du kannst auch mit einem Registry-Eintrag die Shell-Datei (explorer.exe) abändern... Somit kannst du veranlassen, dass das Windows-UI gar nicht erst geöffnet wird, sondern direkt deine Software.

  • @klaros
    streiche:
    Global $h = @DesktopHeight
    Global $w = @DesktopWidth

    setzen:
    Global $h = @DesktopHeight +25 ; Wert ggf. anpassen
    Global $w = @DesktopWidth +25 ; Wert ggf. anpassen

    Testscript: Exit in dem Du mit der Mouse oben links in die Ecke gehst !!!

    Spoiler anzeigen
    [autoit]


    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $h = @DesktopHeight + 50
    Global $w = @DesktopWidth + 50

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGui = GUICreate('', $w, $h, -1, -1, $WS_POPUP)
    WinSetOnTop($hGui, '', 1)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Local $pos = MouseGetPos()

    [/autoit] [autoit][/autoit] [autoit]

    if $pos[0] <1 And $pos[1] <1 Then
    Exit
    Else
    Sleep(250)
    EndIf
    WEnd

    [/autoit]

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Was ich noch einbauen würde, um das ganze professioneller, dynamischer und universeller zu gestalten:

    Eine Datei (.txt) die eingelesen wird und deinem Programm mitteilt, welche Buttons existieren und welches Icon mit auszuführendem Programm dazu gehört.

    Beispiel:
    Eine Datei wird einglesen mit z.B. folgendem Aufbau:

    Code
    ---Bereich Blau---
    C:\Windows\System32\mspaint.exe | Icon1.jpg
    C:\Windows\System32\calc.exe | Icon2.jpg
    ---Bereich Gruen---
    C:\Windows\System32\cmd.exe | Icon1.jpg
    C:\Windows\System32\msinfo32.exe | Icon4.jpg
    C:\Windows\System32\regedt32.exe | Icon3.jpg
    C:\Windows\System32\mspaint.exe | Icon5.jpg
    ---Bereich Gelb---
    ....


    Je nach entsprechender Berechnung, könnte man z.B. sagen bis zu 9 Schaltflächen passen auf einen Farbbereich.
    Die Datei wird dann reihenweise eineglesen, mithilfe der Bildschirmauflösung wird die entsprechende Größe und der Abstand der Schaltflächen berechnet. Die Schaltflächen bekommen dann die in der Datei festgelegten Icon-Bilder mit dem dazugehörigen auszuführendem Program-Pfad.

    Das gute an der Sache, man kann auch ohne AutoIt, die Schaltflächen jederzeit anpassen.


    Grobe Vorangehensweise für den Code:

    Datei Zeilenweise einlesen...
    Mit Case abfragen welcher Bereich (Rot, Blau Grün..).
    Mit Split "|" den String teilen und die Pfade zuweisen.
    Den Schaltflächen Index mithilfe eines Arrays zuweisen für GUI Msg
    Und die entsprechenden Positionen für die Schaltflächen-Position durch Bildschirmauflösung und entsprechender Additionswerte berechnen und festlegen (Mit ein paar Resets und Abfragen).

    Einmal editiert, zuletzt von KloMeister (21. November 2014 um 21:18)

  • Hui, hier steppt ja der Bär ;)
    Danke für die Anregungen.

    Einen Wert auf DesktopHeight und -Width addieren könnte klappen, da wir seit neuestem zu 99% das gleiche Betriebssystem nutzen (Win7 64Bit).
    Taskleiste verstecken wäre auch interessant, da muss ich mal sehen.
    Explorer.exe austauschen kann "unbequem" werden, wenn man schnell mal was ändern muss ...
    (Es ist einfach unglaublich, was alles so auf dem Desktop "passieren" kann - und repariert werden muss, besonders wenn kreative Schüler am Werk sind. 8) )
    (Außerdem wüsste ich jetzt nicht, ob ich das mit GPOs mal so locker schaffe ...)

    Ich habe jetzt Testweise ein Gif mit Firefoxicon eingebaut (GuiCreatePic() ).
    Bei Mausklick setze ich WinSetOnTop für mein Fenster auf 0
    Dann starte ich Firefox mit ShellexecuteWait
    Das Skript geht dann weiter, indem WinSetOnTop wieder auf 1 gesetzt wird.
    Ist das eine vernünftige Idee?

    Grüße,
    klaros

  • Hi KloMeister (Was für ein Name ... :D ),

    in die Richtung hatte ich auch schon überlegt.
    Dann müsste ich für unterschiedliche Schülergruppen nicht mehrere Pseudo Desktops hardcodieren, sondern könnte das über die Text-Datei (oder ini?) regeln.

    Grüße,
    klaros

  • Zitat von BugFix

    Blende die Taskleiste einfach aus. Die Makros für Bildschirmgröße arbeiten sowieso nicht korrekt in Bezug auf die Position der Taskbar. Kannst ja die Größe auch fix vorgeben, wenn alle Desktop dieselbe Größe haben.

    Das stimmt nicht so ganz. Die Makros funktionieren einwandfrei. Was tatsächlich Probleme macht ist die GUICreate() Funktion selber.
    Diese Verschiebung kommt zur Stande, weil bei den Parameter für die Fensterposition -1 angegeben wurde.
    Die Taskleiste wird bei der Berechnung auch berücksichtigt. Daher wird diese auch nur zur Hälfte überlappt.
    Der andere Teil verschwindet oben aus dem Bildschirmrand.

    Am besten ist es, wenn man direkt die fixen Fensterpositionen (0|0) setzt wenn man mit den Makros @DesktopWidth und @DesktopHeigh arbeitet.
    Dann wird auch die Taskleiste komplett überdeckt.

    LG. Make :)

    • Offizieller Beitrag

    Die Taskleiste wird bei der Berechnung auch berücksichtigt.


    Jein, wenn du die Taskleiste nicht an "Standardposition" also unten hast (ich habe sie links), wird sie kpl. ignoriert. Übrigens auch von fast allen professionellen Programmen. Ich glaube, ich bin der einzige Trottel, der in Software für andere immer eine Abfrage der Taskbarposition und -größe integriert. :D

  • Achso, ich habe meine Taskleiste seit meinem ersten Rechner immer unten. Von daher wusste ich das nicht.

    Zitat von BugFix

    Ich glaube, ich bin der einzige Trottel, der in Software für andere immer eine Abfrage der Taskbarposition und -größe integriert.

    Siehe meine Kernaussage:

    Zitat von Make-Grafik

    Am besten ist es, wenn man direkt die fixen Fensterpositionen (0|0) setzt wenn man mit den Makros @DesktopWidth und @DesktopHeigh arbeitet.Dann wird auch die Taskleiste komplett überdeckt.

    Jetzt weißt du's besser und brauchst die Abfrage für die Taskbarposition nicht mehr! :D

  • ohne die Pluswerte ist es bei mir ca. 2/5 auf der Taskleiste, welche unten horizontal ist.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hallo,

    also, das Programmfenster kriege ich Top / Left = 0 korrekt hin.
    Taskleiste könnte ich auch ausblenden - aaaaber ...

    Nächste dicke Klippe:

    - Ich muss verhindern, dass ein gestartetes Programm zweimal aufgerufen werden kann.
    - Wenn ein Programm den Fokus verliert (Klick auf den "Pseudo Desktop") oder minimiert wird, soll es (durch erneuten Klick auf das Icon) wieder hergestellt / noch vorne geholt werden.

    Punkt zwei wäre so mittel wichtig, da ich ja die Taskleiste dazu verwenden könnte ...

    Meine Spielereien mit WinExist (o.ä.) haben da noch nicht (ausreichend) zum Erfolg geführt.
    Ich mach mich jetzt mal auf die Suche nach brauchbaren Funktionen ^^

    Grüße,
    klarose

  • Also kurze Info zum Thema "keine Taskleiste"

    Hiermit wird die Taskleiste bei mir durch die GUI verdeckt, egal ob sie rechts unten oder sonst wo ist. Auch die Größe der Leiste selbst ist egal. (Windows 7)

    [autoit]


    #include <WindowsConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    GUICreate("GUI ohne Taskleiste",@DesktopWidth,@DesktopHeight,0,0,$WS_POPUP)
    GUISetState(@SW_SHOW)

    [/autoit][autoit][/autoit][autoit]

    While 1
    Sleep(10)
    WEnd

    [/autoit]

    :thumbup:

  • Also Taskleiste ist kein (großes) Problem mehr ...

    Das Starten nur einer Instanz und das wiederherstellen, wenn ein Programmfenster "hinter" den Pseudo Desktop gerät habe ich so gelöst:

    [autoit]

    While 1
    Switch GUIGetMsg()
    Case $bEnd
    ExitLoop
    Case $iconFirefox
    WinSetOnTop($hGui, '', 0)
    If ProcessExists("firefox.exe") = 0 Then
    ; ShellExecute("C:\Program Files (x86)\Mozilla Firefox\firefox.exe")
    ShellExecute("notepad.exe") ;==> Achtung zu Testzwecken geändert
    Else
    ; Beep(880, 200)
    Opt('WINTITLEMATCHMODE', 2)
    WinActivate("Mozilla Firefox") ;==> aktiviert aber nur die letzte aktive Instanz ...
    EndIf
    EndSwitch
    WEnd

    [/autoit]

    Das stellt auch ein minimiertes Fenster wieder her.
    Leider wird dabei nur eine Instanz eines Programmes wieder noch vorne geholt.
    Wenn es also zwei Fenster vom Firefox gibt, dann nur das zuletzt aktive.


    Großes Problem ist, dass ich das Autoit-Programm kompiliert auf den Server geschickt habe.
    Nun kann ich aber als Client keine Programmdatei über das Icon auf dem Pseudo Desktop öffnen.
    Es passiert einfach nix.
    Im Quellcode steht deswegen auch einmal notepad.exe ohne Pfad.
    Es funktioniert mit oder ohne Pfadangabe nichts.
    Im Gegensatz zum Verhalten lokal auf dem Rechner, da geht beides.

    Hat da jemand eine gute Idee?

    Grüße,
    klaros

    • Offizieller Beitrag

    Lass dir alle Prozesse "firefox.exe" auflisten: $aProcList = ProcessList("firefox.exe"). Dann kannst du auf alle Instanzen zugreifen (sofern sie als eigener Prozeß gestartet werden).
    Bei Excel z.B. wirst du meist nur einen Prozeß haben, dann musst du dir alle Fensterhandle dieses Prozesses auslesen (Schau mal die _WinAPI-UDF an).

    Was das Verhalten über das Netzwerk angeht: Wird dein Programm nicht auf den Clients gestartet?

  • mal ne idee zur taskleiste:

    [autoit]

    #include <WinAPI.au3>

    [/autoit][autoit][/autoit][autoit]

    $tray_handle=_WinAPI_FindWindow("Shell_TrayWnd", "")
    _WinAPI_ShowWindow($tray_handle ,0)

    [/autoit][autoit][/autoit][autoit]

    Sleep(10000)

    [/autoit][autoit][/autoit][autoit]

    _WinAPI_ShowWindow($tray_handle ,5)

    [/autoit]

    falls es mal noch benötigt wird. :)