1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. klaros

Beiträge von klaros

  • Pseudo Desktop: Performance schwach

    • klaros
    • 26. November 2014 um 20:51

    Hallo zusammen,

    so langsam bastele ich mich durch mein/meinen Schüler-Menü / Startbildschirm / "Pseudo Desktop" ...
    Da sind noch einige Dinge zu optimieren, aber was mich gerade am meisten interessiert ist die Reaktionsgeschwindigkeit.
    Bislang hatte ich in eine Switch-Geschichte 2 GUIGetMsg() abzuarbeiten.
    (Firfox starten / Programm beenden)
    Das ging soweit ganz gut.

    Jetzt habe ich das auf (vorwiegend) auf eine For-Schleife umgestellt, da ich die anzuzeigenden Programm-Icons mit GUICtrlCreatePic() aus einer INI-Datei hole.
    Nun ist es auf einmal so, dass die Programme nicht beim ersten Mausklick starten.
    Auch der Beenden-Button muss manchmal mehrfach gedrückt werden.
    Dabei habe ich gerade erst 2 Programme in der INI definiert. (Es sollen nicht mehr als 6 - MAX 12 werden ...)
    Wieso ist diese Vorgehensweis so langsam?

    Ich habe hier mal nur die While-Schleife hinkopiert.

    Aus der Funktion, die die INI ausliest kommen:
    $aProgName[] - Da stehen die Programmnamen / Fensternamen drin
    $aProgPicID[] - wird von GUICtrlCreatePic() übergeben
    $aProgPath[] - halt der Pfadname+Programmname

    [autoit]


    Opt('WINTITLEMATCHMODE', 2) ;==> Fuzzysuche bei Programmnamen für Fenster für WinExists() und WinActivate()

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

    While 1
    If GUIGetMsg() = $bEnd Then
    Exit; ==> Bleibt in der Form noch drin, bis alles funktioniert
    EndIf
    For $i = 1 TO UBound($aProgPicID)-1 ;==> ich arbeite mit _arrayAdd() und kann [0] nicht füllen - bin ich zu doof für
    If GUIGetMsg() = $aProgPicID[$i] Then ;==> In der INI stehen aktuell nur 2 Programme - Schleife muss max 2x durch ...
    If WinExists($aProgName[$i]) = 0 Then
    WinSetOnTop($hGui, '', 0)
    ShellExecute($aProgPath[$i])
    ExitLoop
    Else
    WinActivate($aProgName[$i]) ;==> aktiviert aber nur die letzte aktive Instanz ...
    ExitLoop
    EndIf
    EndIf
    Next
    WEnd

    [/autoit]
  • Pseudo Desktop

    • klaros
    • 23. November 2014 um 21:44

    Hurra :D

    Das Problem mit dem Server ist - zumindest teilweise - gelöst.
    Auf dem Server laufen von (nicht korrekt abgemeldeten) Usern Prozesse einfach weiter - das kann ich im Taskmanager sehen: Prozess und zugehöriger User.

    Die Funktion ProcessExists() findet einen solchen Prozess, schaut aber nicht, ob der aktuelle Benutzer der Besitzer diese Prozesses ist.
    Deswegen geht "if ProcessExists(firefox.exe) = 0 then 'blabla'" nicht, da irgendein doofer firefox-Prozess halt schon läuft.

    Mit WinExists() und ...Matchmode 2 funktioniert es aber. :rock:

    Grüße,
    klaros

  • Pseudo Desktop

    • klaros
    • 23. November 2014 um 20:57

    Hallo zusammen,

    aus PID ein Fensterhandle machen hatte ich schon probiert - war aber gar nicht so einfach.
    Hab' das mit 2 Funktionen ausprobiert - aber nicht die oben genannten (glaub ich).

    Blöd ist aber im Moment, dass ich, wenn ich mich auf dem Server einlogge und dort meine Exe für den 'Pseudo Desktop' starte, die Oberfläche erscheint aber es kann kein Programm (Firefox oder Notepad) gestartet werden ...

    Ich habe jetzt schon mal Autoit und ISN Autoit Studio auf den Server kopiert und nutze die Programme im mobilen Modus (ohne Installation)
    Auch so kann ich meine Oberfläche aufrufen (F5) aber kein Programm starten.

    Nebenbei fällt mir auf, dass das Gif-Bild vom Firefox auf dem Server keinen transparenten Hintergrund mehr hat ...

    Serverbetriebssystem ist Win 2008 R2

    Vielleich hat ja jemand eine gute Idee.

    Grüße,
    klaros

  • Pseudo Desktop

    • klaros
    • 22. November 2014 um 18:55
    Zitat von BugFix

    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?

    Hi BugFix,

    Wie kann ich denn über PIDs ein Fenster aktivieren?
    Ich hatte vor WinActivate einiges ausprobiert, hatte aber keinen Erfolg.

    Zur Netzwerkfrage:
    Ich melde mich doch mit dem Clientrechner auf dem Server an.
    Dort soll dann (später mal automatisch) der Pseudo Desktop gestartet werden - also muss doch das Programm auf dem Server liegen.
    Wenn ich das als Admin in einem öffentlichen Ordner mache - also Rechte müsste ich satt haben - startet die kompilierte autoit-Datei.
    Die vier Farbfelder sind da. Das Icon (genau genommen ein GIF) für den Firefox ist auch da.
    Es ist aber nicht anklickbar bzw. es tut sich nichts.
    Nur der Beenden-Button funktioniert - das ist ja schon mal was ... ;)

    Hab schon überlegt, ob ich den Programmpfade als Netzwerkdingsbums (mir fällt der Name nicht ein) schreiben muss; als \\Servername\Pfad zum Programm
    Dazu habe ich aber im Netz noch nichts gefunden.

    Grüße,
    Klaus

  • Pseudo Desktop

    • klaros
    • 22. November 2014 um 18:14

    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

  • Pseudo Desktop

    • klaros
    • 22. November 2014 um 11:59

    ProzessExist() sieht schon mal gut aus ... :)

  • Pseudo Desktop

    • klaros
    • 22. November 2014 um 11:50

    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

  • Pseudo Desktop

    • klaros
    • 21. November 2014 um 21:23

    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

  • Pseudo Desktop

    • klaros
    • 21. November 2014 um 21:16

    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

  • Pseudo Desktop

    • klaros
    • 21. November 2014 um 17:53

    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

  • Pseudo Desktop

    • klaros
    • 21. November 2014 um 12:36

    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

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™