Alle Benutzereingaben in einem (nicht von AutoIt erstellten) Fenster sperren

  • Wie kann ich in einem Fenster, das nicht von AutoIt erstellt wurde, alle Benutzereingaben sperren bis auf einige wenige?

    Genauer gesagt: Ich will die Menüleiste disablen, und alle Controls bis auf den OK-Button. WinDisable() ist leider nicht geeignet, man kann nämlich in einem "disabled" Fenster nicht einzelne Controls wieder enablen.

    Ich stelle mir das irgendwie so vor, dass es doch irgendeine Möglichkeit geben müsste, automatisch alle Controls eines Fensters finden zu lassen, schliesslich sind die doch vom Hauptfenster alle irgendwie über Handles und Pointer verlinkt, oder? AutoIt-Funktion habe ich aber bisher keine dafür gefunden.

    Oder geht es doch viel einfacher und ich hab's einfach nicht gesehen?

  • Ich will VirtualDub etwas zweckentfremded dazu benutzen, einfach ein Bild in einem Film anzuzeigen. Der User soll dabei nur den Movie-Slider und den OK-Button anklicken (oder per Tastatur steuern) dürfen.

    Bei Betätigung des OK-Buttons soll das gewählte Bild als BMP gespeichert werden, aber dafür habe ich schon eine Lösung.

    Wenn ich dem User allerdings noch die unendlichen Möglichkeiten dieses Programmes "erlaube" (z.B. noch Filter hinzuzufügen, o.ä.), ist das Ergebnis u.U. nicht mehr so wie es der Rest meines Scriptes braucht.

    Das Universellste wäre eine Automatik, die alle Elemente eines Fensters disabled. Danach kann man gezielt diejenigen wieder aktivieren, die man wirklich zulassen will. Ich denke, so eine Funktion kann man noch woanders brauchen...

    In meiner Anwendung habe ich für die Controls schon eine Lösung, nämlich sie alle mit AU3info herauszufinden, und dann jedes gezielt zu deaktivieren, aber praktisch ist die nicht. Für die Menüleiste hingegen habe ich derzeit noch überhaupt keinen Lösungsansatz.

    Wie war das mit dem "GUI drüberlegen"? Reagiert die Menüleiste dann nicht immer noch, wenn das drunter liegende Fenster (z.B. weil dort der Slider betätigt wird) aktiv ist?

  • Ich würde einfach das komplette Fenster "disablen", dann eine kleine GUI erstellen, die den OK und Screenshot Button sowie eigene Steuer-Controls enthält.

    Dann einfach per ControlSend("VirtualDub", "", birdyPositionControl1, "xxx") die Tastatur-Shortcuts weiterleiten. Da man die Position nicht auslesen kann, wüsste ich jetzt leider nicht, wie man einen eigenen Slider basteln könnte, der dem von VortualDub entspricht, aber mit den Controls ist es immer noch sehr einfach zu steuern.

    //Edit: Ist doch möglich ;)

    Per CTRL+Right ans Ende des Films, dann den "visible Text" auslesen und per RegExp die Anzahl Frames filtern. Jetzt kannst du einen Slider bauen, der genau die Anzahl Frames hat. Musst du mal sehen wie du das mit dem direkten anspringen machst, gibt ja Shortcuts für 50 Frames rechts/links oder aber per Goto.

    Grüße,
    Buffo

    Einmal editiert, zuletzt von Buffo (6. November 2007 um 10:02)

  • Interessanter Gedanke, Buffo =).

    Ist zumindest eine Lösung - wenn auch eine aufwändige, denn mein Script benutzt einige Programme in dieser Art (soll ein Fullfeatured Video-Transcoding-Tool werden).

    Mein Gedanke war, dass die in AutoIt vorhandenen Control...-Funktionen doch sicher genau das machen, was ich brauche. Denn wie anders arbeiten diese Funktionen wohl, als dass sie Fenster solange nach dem gewünschten Control durchsuchen, bis sie es finden und dann das Handle dieses Objekts zurückliefern? Dazu müssen sie doch jedes Control nach seinem Namen "befragen". Von da kann es doch nicht mehr so weit sein, anstatt eines genauen Controlnamens eine Wildcard anzugeben um eine Handle-Liste aller Controls zu bekommen, oder?

    Die kann ich dann benutzen um sie alle per Schleife zu deaktivieren. Danach mache ich gezielt die wieder an, die ich brauche.

    Ich hoffe nur, dass ich dazu nicht anfangen muss, den Quellcode der AutoIt-Control-Funktionen zu studieren 8o, und jemand eine viel bessere Idee hat.

  • Das Problem an der Sache ist, dass die komplette Steuerung unten, also der Slider und alle Steurungsbuttons usw. in eiem Control namens "birdyPositionControl" zusammengefasst sind. Mir ist es nicht bekannt, dass man dort einzelne Controls im Control sperren könnte.

    Gern lass ich mich aber eines besseren belehren ;)

    Grüße,
    Buffo

  • Das muss ich checken. Aber zur Not lass ich die halt alle an, sind schliesslich alle geeignet, den User an ein Zielframe zu führen, somit kann der User dadurch nichts wirklich Unerwünschtes machen.

    Die Menüleiste und die Fenstersteuerungsfelder sind eigentlich die wahren "Dornen im Auge" für die ich keine Lösung habe ausser Deiner.

  • Noch einTipp: Vergiss nicht die Shortcts abzustellen. VirtualDub ist fast gänzlich per Tastatur bedienbar, da nützt auch das verstecken des Menüs nichts ;)

    Ich habe gerade mal nachgesehen, evtl. hilft es ja auch eine andere Software, in der man Framegenau arbeiten und trotzdem alle Buttons einzeln per AutoIt aufrufen kann.

    Eine gute Anlaufstelle ist z. B. hier: http://www.essential-freebies.de/board/viewforum.php?f=7

    Grüße,
    Buffo

  • So wie ich das sehe, ist das "birdyPositionControl" kein "übergeordnetes" Control für die anderen. Ich konnte den Play-Button problemlos deaktivieren.

    Wenn einzelne Menüpunkte ausgegraut sind, dann sind die dahinter steckenden Funktionen auch nicht über Tastatur aktivierbar. Thema ist also nicht, das Menü zu verstecken, sondern es (und evtl. zusätzlich alle Menüunterpunkte) zu deaktivieren.

    Andere Software hilft leider nicht. Den DeLogo-Filter (den ich hier automatisieren will) gibt es halt nur für VirtualDub.

  • Von DeLogo hattest du vorher nichts geschrieben, dann ist VirtualDub natürlich vonnöten ;)

    Sieht ja so aus, als ob du es jetzt hinbekommst. Weiterhin viel Erfolg bei deinem Vorhaben :)

    Grüße,
    Buffo

  • Na ja, "hinkriegen", da gäbe es schon noch Dinge, die an der "GUI drüberlegen" Lösung stören, z.B. dass die Fenster dann nicht mehr verschiebbar sind...

    Auf einen "guten", allgemein gültigen, Lösungsansatz warte ich noch...

  • Wieso nicht verschiebbar? Du meinst, das dann die darübergelegt GUI nichts mehr überdeckt, wenn die Fensterposition geändert wird?

    Einfach per WinGetPos("VirtualDub","") abfragen und dann deine GUI ebenfalls verschieben wäre eine Lösung.

    Grüße,
    Buffo

  • ... nicht wenn mein Script während der Ausführung von VirtualDub nur eine MsgBox() anzeigt...

    Nun gut, man kann ein GUI machen, das eine MsgBox() ersetzt, aber das geht immer so weiter, am Ende muss Gott und die Welt umgebogen werden, nur um etwas zu erreichen, was m.E. auch vieeeel simpler gehen müsste.

    Ich kenne mich lediglich in den Tiefen von Windows nicht so gut aus, dass ich mich schnell mal durch die Pointer-Strukturen von Fenstern hangeln könnte.

  • Ich habe mir das gerade noch Mal genuaer angesehen. Du hast recht, dass man die Steurerungsbuttons individuell ansprechen kann, hatte ich beim kurzen antesten übersehen ;)

    Wie wäre es denn, wenn du das Fenster so verschiebst, dass es größer als der Desktop ist und dann soweit nach oben schiebst, dass Titel und Menüleiste ausgeblendet werden? So hätte sich das mit der Menüleiste erledigt. Evtl. noch mit _IsPressed() die Shortcuts abfangen und gut ist. Wäre das vielleicht eine Lösung?

    Grüße,
    Buffo

  • Wollte nur berichten, dass man mir im englischsprachigen Forum den Tipp gegeben hat, mir ein Package namens "Auto3lib.au3" zu holen. Das hat jede Menge Zusatzfunktionen, u.a. auch alles zum Arbeiten mit Menüleisten. Damit fällt der GUI-Workaround wegen zu hoher Komplexität schon mal so was von aus ;-).

    Schau ma mal, ob jemand auch noch was zum Thema "Liste aller Controls holen" weiss, dann werde ich hier bald eine Funktion präsentieren, die alle Inhalte eines Fenster deaktiviert, ohne das Fenster selbst zu deaktivieren, denn ich denke schon, dass das von allgemeinem Interresse sein könnte (ist doch eigentlich der Regelfall, wenn man externe Applikationen steuern will, dass man nur einige wenige Useraktionen erlauben will, oder?)