Und ich dachte schon ICH bin böse.... :schild4:
Beiträge von BugFix
-
-
Vielleicht hilft das:
ZitatStartparameter für den Windows-Explorer
Mit Hilfe von Startparametern können Sie das Startfenster des Explorers individuell anpassen. Klicken Sie dazu auf "Start | Ausführen" und geben Sie in der Befehlszeile den gewünschten Befehl ein. Die Eingabe bestätigen Sie mit "OK". Wollen Sie den Explorer öfter mit bestimmten Parametern starten, empfiehlt es sich, eine Verknüpfung auf dem Desktop anzulegen und deren "Eigenschaften" zu verändern. Die entscheidende Zeile finden Sie im Register "Verknüpfung" unter der Bezeichnung "Ziel".
Die Syntax des Explorer-Aufrufs lautet "Explorer [/e[,Verzeichnis]] [/n] [/root,Objekt] [[/select],Unterobjekt]". Wird kein Parameter angegeben, so startet der Explorer mit einem geteilten Fenster im Hauptverzeichnis "C:\". Der Parameter "/e,[Verzeichnis]" startet den Explorer mit einem geteilten Fenster im angegebenen Verzeichnis, "/n" startet ihn in einem ungeteilten Fenster ohne Baumstruktur.
Der Parameter "/root"Verzeichnis" oder "/root,\\Servername\Verzeichnis" öffnet ein Arbeitsplatz-Fenster für das entsprechende Verzeichnis, wobei das angegebene Verzeichnis die höchste erreichbare Ebene der Verzeichnisstruktur darstellt. Lautet der Aufruf "Explorer /root"" - also ohne Angabe eines Verzeichnisnamens - öffnet sich ein Fenster mit dem Inhalt des Desktops. Der Parameter "/select,[Verzeichnis]" markiert das benannte Verzeichnis in der linken Fensterhälfte des Explorers.
-
@weedhead
Ja Danke, genau danach hatte ich auch gesucht - bloß nicht gefunden.
Werds auch mal ändern und die Datei aktualisieren. -
Na, ist der Kollege immer böse zu euch und braucht dringend mal ein Schockerlebnis?
Sofern er Computermäßig nicht sehr bewandert ist könnt ihr ihm hiermit sicher einen schönen Schreck einjagen.
Nach 2 Stunden Laufzeit meldet sich das Skript erstmal mit buntem Bildschirmgeflacker.
Dann folgt eine "Systemwarnung". Egal, wie der User reagiert - jetzt kommt eine GUI die vorgaukelt, dass Systemdateien gelöscht werden. Dazu ist die Datei "sys_dateien.txt" mit in das Scriptverzeichnis zu kopieren. Dort sind 2225 Dateinamen hinterlegt! Der "Löschvorgang" ist mir, denk ich, grafisch recht gut gelungen.
Es gibt auch keine Möglichkeit, das Script zu beenden (außer natürlich über den Taskmanager).
Momentan sind alle vorhandenen "Sleep( )" und das "#NoTrayIcon" auskommentiert, damit man es mal eben testen (und beenden) kann.Aber denkt dran - es ist zwar ein Scherz, aber er ist ziemlich böse. :rofl_devil:
Seid also in der Nähe, wenn es losgeht um einem Herzinfarkt zuvorzukommen.
(Und natürlich um eure Bosheit zu genießen)Ach ja:
Zu Risiken und Nebenwirkungen fragen sie den Codierer ihres Vertrauens.Spoiler anzeigen
[autoit];~ #NoTrayIcon
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstants.au3>$Form1 = GUICreate("Löschen von Systemdateien . . .", 343, 194, -1, -1, $WS_CAPTION, $WS_EX_TOPMOST)
[/autoit] [autoit][/autoit] [autoit]
$Label1 = GUICtrlCreateLabel("", 80, 124, 250, 17)
$n1=GUICtrlCreateAvi (@SystemDir & "\shell32.dll",162,38,20)
$Label2 = GUICtrlCreateLabel("", 266, 93, 36, 17, $SS_CENTER)$red = 0xFF0000
[/autoit] [autoit][/autoit] [autoit]
$yellow = 0xFFFF00
$green = 0x00FF00
$black = 0x000000
$white = 0xFFFFFF
$blue = 0x000080;~ Sleep(2*3600000) ; Zeit bis Start des Jokes (2 Std.)
[/autoit] [autoit][/autoit] [autoit]$Gui = GUICreate("",Default,Default,-1,-1,BitOR($WS_POPUP,$WS_MAXIMIZE))
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To 5 ; Bildschirmflackern rot-weiß
GUISetBkColor($red, $Gui)
GUISetState(@SW_SHOW, $Gui)
Sleep(100)
GUISetState(@SW_HIDE, $Gui)
GUISetBkColor($white,$Gui)
Sleep(80)
GUISetState(@SW_SHOW, $Gui)
Sleep(120)
GUISetState(@SW_HIDE, $Gui)
Next;~ Sleep(15000)
[/autoit] [autoit][/autoit] [autoit]For $i = 1 To 5 ; Bildschirmflackern gelb-schwarz
[/autoit] [autoit][/autoit] [autoit]
GUISetBkColor($yellow, $Gui)
GUISetState(@SW_SHOW, $Gui)
Sleep(100)
GUISetState(@SW_HIDE, $Gui)
GUISetBkColor($black,$Gui)
Sleep(80)
GUISetState(@SW_SHOW, $Gui)
Sleep(120)
GUISetState(@SW_HIDE, $Gui)
Next;~ Sleep(15000)
[/autoit] [autoit][/autoit] [autoit]For $i = 1 To 5 ; Bildschirmflackern grün-blau
[/autoit] [autoit][/autoit] [autoit]
GUISetBkColor($green, $Gui)
GUISetState(@SW_SHOW, $Gui)
Sleep(100)
GUISetState(@SW_HIDE, $Gui)
GUISetBkColor($blue,$Gui)
Sleep(80)
GUISetState(@SW_SHOW, $Gui)
Sleep(120)
GUISetState(@SW_HIDE, $Gui)
Next;~ Sleep(20000)
[/autoit] [autoit][/autoit] [autoit]GUISetBkColor($black,$Gui) ; Blackscreen
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW, $Gui)
Sleep(4000)
GUISetState(@SW_HIDE, $Gui);~ Sleep(10000)
[/autoit] [autoit][/autoit] [autoit]MsgBox(17, 'Wichtige Systemwarnung !', "Achtung!" & @LF & _
[/autoit] [autoit][/autoit] [autoit]
"Windows hat festgestellt, dass Ihr System seit 2 Stunden fehlerfrei arbeitet."& @LF & _
"Das ist ungewöhnlich für ein Windowssystem. Um etwaigen Hardwarekonflikten"& @LF & _
"vorzubeugen, wird empfohlen, Windows neu zu installieren."& @LF & _
"Die Systemdateien werden jetzt gelöscht.")GUISetState(@SW_SHOW,$Form1) ; Simulation Löschvorgang
[/autoit]
$i = 0
$sys = FileOpen("sys_dateien.txt", 0)
GUICtrlSetState ($n1, 1)
While 1
$i += 1
$line = FileReadLine($sys, $i)
If @error = -1 Then ExitLoop
GUICtrlSetData($Label1, "gelöscht wird: " & StringUpper($line)) ; 2225 Dateinamen *0,08 sec Sleep = 178 sec mind.
GUICtrlSetData($Label2, "( " & $i & " )")
Sleep(80)
Wend
FileClose($sys) -
Zitat
Eben nicht. Ich hab mir mal die Werte ausgeben lassen.
Das ist auch richtig
, es ist ja der Wert des Handles, nicht der Status. Denn bekommst du erst mit GUICtrlRead( )Spoiler anzeigen
[autoit]#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("AForm1", 633, 454, 193, 115)
GUISetOnEvent($GUI_EVENT_CLOSE, "AForm1Close")
$Checkbox1 = GUICtrlCreateCheckbox("ACheckbox1", 144, 216, 97, 17)
GUICtrlSetOnEvent(-1, "ACheckbox1Click")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###While 1
[/autoit] [autoit][/autoit] [autoit]
Sleep(100)
WEnd
Func ACheckbox1Click()
MsgBox(0, '$Checkbox1', '$Checkbox1 = ' & $Checkbox1 & @LF & 'GUICtrlRead($Checkbox1) = '& GUICtrlRead($Checkbox1) )
EndFunc
[/autoit]
Func AForm1Close()
Exit
EndFunc -
Danke erstmal,
dann ist die Geschichte ja doch wesentlich unkomplizierter als ich dachte.
PeerToPeer PC sind Win2K und ich glaub noch 1 Win98.
Der neue wird auch Win2K haben.Damit der neue PC auf die PeerToPeer PC zugreifen darf, muß er doch denselben Usernamen führen bzw. in seiner Userverwaltung muß ein User mit diesem Namen und Paßwort existieren - richtig ?
-
Hier mal (hoffentlich) etwas angepaßt an deine Struktur.
[autoit]
Dein Code verrät nicht allzuviel. Was ich sehe, du arbeitest im OnEvent-Mode und wertest unnütze Ereignisse aus. Eine aktivierte Box wird automatisch 1
; mal als Bsp.
[/autoit][autoit][/autoit][autoit]
; $Box1 für $prog1
; $Box2 für $prog2
; $Box3 für $prog3Dim $ar_Install[3]
[/autoit]
$ar_Install[0] = $prog1
$ar_Install[1] = $prog2
$ar_Install[2] = $prog3
$j = 0
For $i = $Box1 To $Box3
If GUICtrlRead($i) = 1 Then
Run($ar_Install[$j])
Do
Sleep(1000)
Until Not ProcessExists($ar_Install[$j])
EndIf
$j += 1
Next -
Ablauf ist ja in einer Schleife
[autoit]
Vermute die Installprogs, die aufgerufen werden sind in einem Array.
Nicht getestet, aber sollte funktionieren:For $i = 1 To UBound($ar_Install)-1 ; oder ähnlich
[/autoit]
Run($ar_Install[$i])
Do
Sleep(1000)
Until Not ProcessExists($ar_Install[$i])
Next -
Hi,
ich habe folgende Situation:1. Ein PeerToPeer Netz mit 4 PC; IP: 10.10.10.x / Subnet: 255.255.255.0
Das sind Rechner, die Daten von med. Untersuchungen mit entsprechender Diagnostiksoftware aufzeichnen.2. Hausnetz mit -zig Rechnern (Client-Server Struktur); Netzdaten liegen mir noch nicht vor - aber ich denke mal, für das Bsp.ist das sekundär und kann jederzeit angepaßt werden
Über dieses Netz besteht Zugang zu den zentralen Verwaltungsdaten (Aufnahmekartei etc..)3. Neu hinzukommen soll:
PC, der im Hausnetz eingebunden ist UND gleichzeitig Daten von den Rechnern des PeerToPeer Netzes abrufen kann.Mein Ansatz:
Der Rechner unter 3. bekommt 2 NIC. Eine im Adreßbereich des PeerToPeer Netzes, die andere im Adreßbereich des Hausnetzes.Jetzt stellen sich folgende Fragen:
- Ist es günstiger diesen PC primär als Client im Hausnetz zu führen und eine Zugriffsmöglichkeit auf das PeerToPeer Netz zu konfigurieren oder umgekehrt ?- Wie muß diese Konfiguration in beiden Fällen aussehen?
Momentan habe ich nur die Info, dass dieser PC
- Daten aus dem PeerToPeer Netz abruft
- diese auswertet
- die Ergebnisse auf Datenbanken des Hausnetzes ablegtIch gehe aber davon aus, dass früher oder später verlangt wird, dass die PC des PeerToPeer Netzes auf eben jene DB Zugriff erhalten (wär zumindest sinnvoll um Duplizität zu vermeiden).
Die Infos, die ich bisher zu diesem Thema gefunden hab, beschreiben eigtl. immer nut, wie die Routingtabelle aussehen soll.
Ich muß aber erst mal wissen, welche Routen überhaupt erstellt werden müssen.Ich hoffe, ich konnte mein Problem verständlich erklären.
-
SVN-Repository ist effektiv.
Hat den Vorteil, dass man schnell mal eben was bearbeiten kann. Ohne dass wer anders auf einen wartet.
Ich quäle mich grad durch die Übersetzung der Call-Tipps. Wobei es hauptsächlich ein Kopieren ist. Wozu was übersetzen, was schon gemacht wurde
-
Im Allgemeinen popt da ein Fenster auf ungefähr so: "Zur endgültigen Installation ist ein Neustart erforderlich. Soll jetzt neu gestartet werden?" Schaltflächen: "Jetzt neu starten" und "Später neu starten"
Das Fenster hat sicher nen Titel.
Also: WinWaitActive("FensterTitel") und dann ControlSend() auf "später neu starten".
FensterTitel und Control-Name kannst du mit AutoIt Window Info feststellen.Sollte dort nicht die Möglichkeit bestehn, den Neustart abzuwählen, mußt du diese Installation einfach als letzte ausführen.
-
Ich unterstütze Drako ein wenig bei der Umsetzung. Ich denke mal, das fertige Produkt wird er euch nicht vorenthalten.
Habt noch etwas Geduld.
-
Letztlich geht es darum die Versionen abzugleichen mit Versionen einer Installroutine in einem Script und bei Bedarf, dann die neuere Version zu installieren.
Da es allgemeingültig sein soll, kann ich den Ordner Programme eh vergessen. Ich installiere dorthin ausschließlich Systemkomponenten. Programme liegen bei mir auf einer eigenen Partition.
Und ich muß davon ausgehen, dass nicht nur ich eine andere Ordnung wähle.Ich hatte schon überlegt, alle Partitionen rekursiv nach EXE zu durchsuchen und die Version zu checken.
Hat aber auch 2 Nachteile. Zum einen dauert es ewig und zum anderen müssen die gefundenen EXE-dateien nicht zwangsweise installiert sein, sondern können irgendwelche Downloads sein.Also bleibt eigtl. nur die Registry.
Ich werd mir nun doch die Mühe machen und bei allen Programmen, die zur Installation zur Verfügung stehen, nachsehen wo sie sich in der Registry eingraben. Dann kann ich ganz gezielt abfragen.
-
Hi,
ich wollte mal eben die Programmversionen aller installierten Programme ermitteln und habe festgestellt, dass sich da kein Softwarehersteller an feste Regeln hält.
Bei einem Großteil wird die Versionsnummer im Schlüssel "HKLM\ Software\ Microsoft\ Windows\ CurrentVersion\ Uninstall\ SOFTWARENAME\ DisplayVersion" hinterlegt. Das ist prima.
Bei den anderen (Autoit gehört auch dazu
) ist teilweise die Versionsnummer im Namen enthalten oder in einem anderen Registryschlüssel, der von Programm zu Programm variiert, hinterlegt.
Es gibt aber auch Spezialisten, die die Versionsnr. gar nicht in der Registry hinterlegen - da hilft dann nur Pfad suchen und mit FileGetVersion( ) nachsehen.Hat evtl. jemand eine zündende Idee, wie man da eine automatisierte Abfrage hinbekommt?
Hier könnt ihr mal selber schauen, wieviel Progs sich sauber eintragen und wieviele nicht (unbenommen derer, die gar nicht im Uninstall-Schlüssel stehen):
Spoiler anzeigen
[autoit]#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GuiListView.au3>
#include <array.au3>Dim $RegKey = "HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\"
[/autoit] [autoit][/autoit] [autoit]
Dim $Wert, $Fehler=0, $i=0, $str
Dim $ar_SubKeys[1], $ar_Progs[1], $ar_Progs_oVer[1]
$ar_SubKeys[0] = 0
$ar_Progs[0] = 0
$ar_Progs_oVer[0] = 0; == GUI generated with Koda ==
[/autoit] [autoit][/autoit] [autoit]
$Form1 = GUICreate("AForm1", 622, 670, -1, -1)
$List1 = GUICtrlCreateListView("Programm|Version", 24, 30, 577, 300, $LVSCW_AUTOSIZE)
_GUICtrlListViewSetColumnWidth(-1, 0, 320)
_GUICtrlListViewSetColumnWidth(-1, 1, 230)
$List2 = GUICtrlCreateList("", 24, 360, 577, 300)
GUICtrlCreateLabel("Programme mit Reg-Key 'DisplayVersion'", 200, 10)
GUICtrlCreateLabel("Programme ohne Reg-Key 'DisplayVersion'", 200, 340)
GUISetState(@SW_SHOW)_ReadInstalledProg()
[/autoit] [autoit][/autoit] [autoit]; Progs mit Key "DisplayVersion"
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To $ar_Progs[0]
$var = StringSplit($ar_Progs[$i], "\")
_GUICtrlListViewInsertItem($List1, -1, $var[1] & "|" & $var[2])
Next; Progs ohne Key "DisplayVersion"
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To $ar_Progs_oVer[0]
GUICtrlSetData($List2, $ar_Progs_oVer[$i])
NextWhile 1
[/autoit] [autoit][/autoit] [autoit]
$msg = GuiGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case Else
;;;;;;;
EndSelect
WEnd
ExitFunc _ReadInstalledProg()
[/autoit]
Do
$i+=1
$Wert=RegEnumKey($RegKey, $i)
$Fehler=@Error
If $Fehler=0 Then
_ArrayAdd($ar_SubKeys, $Wert)
$ar_SubKeys[0] += 1
EndIf
Until $Fehler<>0
For $i = 1 To $ar_SubKeys[0]
$valName = RegRead($RegKey & $ar_SubKeys[$i], "DisplayName")
$valVer = RegRead($RegKey & $ar_SubKeys[$i], "DisplayVersion")
If $valName <> "" Then
Select
Case $valVer = ""
$str = $valName
_ArrayAdd($ar_Progs_oVer, $str)
$ar_Progs_oVer[0] += 1
Case Else
$str = $valName & "\" & $valVer
_ArrayAdd($ar_Progs, $str)
$ar_Progs[0] += 1
EndSelect
EndIf
Next
EndFunc -
Zitat
ob die programme die zur auswahl stehen, schon installiert sind, und wenn ja hat es die checkbox blockiert, erschien dann nur in grau.
Wenn die Programme mit Installationsroutine installiert wurden hinterlassen sie im Allgemeinen einen Registry-Eintrag. Das läßt sich also problemlos auswerten und zu deinem gewünschten Deaktivieren der entsprechenden Checkbox verwenden.Zitatnoch ne checkbox die alle anderen checkboxen ausfüllt wenn man einfach wünscht alles zu installieren
Das dürfte die einfachste aller Übungen sein.ZitatLeider steht nicht über dem Progress Balken welche anwendung Installiert wird
Dafür werden wir mal einfach noch eine Statusbar einfügen.ZitatEs gibt keine Pausen zwischen den installationen....Er öffnet alle install scripte auf einmal
Nacheinander - klar. Aber auf einmal? Möchtest du nach jeder Installation eine Pause von festgelegter Dauer oder soll der Nutzer den Start der nächsten Installation bestätigen?Sag, wie du es haben möchtest - ich helf dir gern weiter. Falls du ICQ od. Yahoo od. MSN hast, kannst ja mal per PN deine Nr. geben. Dann lassen sich Kleinigkeiten schneller klären.
-
Freut mich, wenn's gefällt.
Ich hatte eigentlich vermutet, dass dieses Problem entweder in einer Autoit-Funktion oder zumindest im engl. Forum bereits behandelt wurde.
Also entweder war ich wirklich der erste, der das durchführen wollte (kann ich mir eigentlich nicht vorstellen) oder es hat einfach noch nie jemand reingestellt.Die Suchfunktion im engl. Forum ist allerdings ziemlich unnütz. Nur eine sehr geringe Trefferquote. Ich hab als Bsp. " 'menu bar item window' " in die Suche eingegeben. Ergebnis: 54 Seiten (limitiert auf 1000 Treffer) und nur 1 !! Beitrag zu diesem Thema - nämlich meiner. :schild4:
Das Problem besteht eigentlich bei jeder Suche dort.
-
Zitat
das dieses MSG fenster aufgeht blockiert etwas den durchlauf
Das war ja auch nur für den Testbetrieb ohne die Installationen zu starten (sonst kannst du ja nicht nachvollziehen ob die richtigen Schritte ausgeführt werden). Für die finale Version sollst du natürlich die MsgBox rausschmeißen. -
Ich weiß, es wird dir kein Trost sein - aber auf meinem Rechner funktioniert keine deiner Varianten.

Dann hab ich's mal am Laptop probiert. Hier funktionierte die Version _IsPressed mit BlockInput() teilweise. Also Endlosschleife mit ständigem Wechsel zwischen den TrayTip's ( 4 to 2 ; 2 to 4 ; 4 to 2 ...).
Im Moment kA warum.EDIT:
[autoit]
Versuchs mal so:While 1
[/autoit]
While _IsPressed("46") = 0 ; Warten auf "F" gedrückt
Sleep(150)
WEnd
_fixieren()
WEndKann es bei mir nicht testen - mein PC läßt kein TrayTip zu (wieso auch immer).
EDIT 2:
Hab jetzt noch mal am Laptop getestet und komme auch zu dem Schluß: Es ist ein Bug.
MIt BlockInput wirds eine Endlosschleife. Das ist echt nicht erklärbar.
Meine letzte getestete Variante war diese:Spoiler anzeigen
[autoit]#include <Misc.au3>
[/autoit] [autoit][/autoit] [autoit]$fixieren = 4
[/autoit] [autoit][/autoit] [autoit]
;HotKeySet("f", "_fixieren")While 1
[/autoit] [autoit][/autoit] [autoit]
While _IsPressed("46") = 0 ; Warten auf "F" gedrückt
Sleep(150)
WEnd
_fixieren()
WEndFunc _fixieren()
[/autoit]
;~ BlockInput(1)
Switch $fixieren
Case 4
$fixieren = 2
TrayTip("Info", "4 to " & $fixieren, 5, 1)
Sleep(1500)
TrayTip("","",1)
Case 2
$fixieren = 4
TrayTip("Info", "2 to " & $fixieren, 5, 1)
Sleep(1500)
TrayTip("","",1)
EndSwitch
;~ BlockInput(0)
EndFunc ;==>_fixieren
Wobei ich nicht verstehe, wozu das BlockInput dienen soll. So, wie ich es jetzt gemacht habe, kann eine Eingabe von "F" erst wieder geprüft werden, wenn die Funktion _fixieren beendet ist. Ein Doppelaufruf ist also ausgeschlossen (ich glaube, das war dein Hintergedanke dabei). -
Hi,
also ich hab das mal etwas abgeändert. Du hattest für jede Checkbox ein Event erzeugt. Damit wäre im Moment des Anklickens sofort die Installation gestartet.
Ich weise deine Checkboxen jetzt einem Array zu und gleichzeitig ordne ich die Installationspfade der entsprechenden Checkbox im Array zu.
Die Progressbar fülle ich in Abhängigkeit von der Anzahl der zu installierenden Programme. Bsp.: Bei 10 Programmen (100% / 10 = 10%) erfolgt nach jedem installierten Programm ein Schritt von 10%.
Also viel Spaß und berichte ob alles geklappt hat.EDIT:
War wohl etwas spät (oder früh?
), hab grad noch 'nen Fehler bei der Progressbar entdeckt und geändert. Die Codezeile für die Installation kommentiere ich mal aus und setze eine MsgBox ein, damit du es auch testen kannst.
#2
Seh grad, du wolltest während der Installation die Eingabe blockieren. Ich setze das mal - aber auskommentiert, sonst kannst du die MsgBox nicht schließen
)Spoiler anzeigen
[autoit]#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#NoTrayIcon
Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=f:\progs\proginstall.kxf
Global $Form1 = GUICreate("Programme Installieren", 562, 274, -1, -1)Dim $ar_CheckBox[24][2], $counter = 0, $progressStep, $bar = 0
[/autoit] [autoit][/autoit] [autoit]GUISetFont(8, 400, 0, "Microsoft Sans Serif")
[/autoit] [autoit][/autoit] [autoit]
GUISetBkColor(0xD8E4F8)
GUISetOnEvent($GUI_EVENT_CLOSE, "AForm1Close")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "AForm1Minimize")
GUISetOnEvent($GUI_EVENT_MAXIMIZE, "AForm1Maximize")
GUISetOnEvent($GUI_EVENT_RESTORE, "AForm1Restore")
Global $RUN = GUICtrlCreateButton("AlleProgsInstallieren", 144, 240, 110, 33, 0)
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetOnEvent(-1, "AButton1Click")
GUICtrlSetState(-1, $GUI_FOCUS)
Global $EXIT = GUICtrlCreateButton("Abbrechen", 320, 240, 110, 33, 0)
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetOnEvent(-1, "EXITClick")
Global $Progress1 = GUICtrlCreateProgress(72, 192, 393, 25)
GUICtrlSetData(-1, 00)
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlSetBkColor(-1, 0x3D95FF)
Global $Group1 = GUICtrlCreateGroup("Programme", 0, 0, 561, 177)
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)$ar_CheckBox[0][0] = GUICtrlCreateCheckbox("Adobe Reader", 8, 16, 97, 17) ; $ar_CheckBox[i] [0] = Handle
[/autoit] [autoit][/autoit] [autoit]
$ar_CheckBox[0][1] = "AdobeReader.exe" ; [1] = Installpfad
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[1][0] = GUICtrlCreateCheckbox("OpenOffice 2.0", 8, 40, 97, 17)
$ar_CheckBox[1][1] = "OpenOfficeInstallGer.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[2][0] = GUICtrlCreateCheckbox("Opera", 8, 64, 97, 17)
$ar_CheckBox[2][1] = "Opera.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[3][0] = GUICtrlCreateCheckbox("Mozilla Firefox 2", 8, 88, 97, 17)
$ar_CheckBox[3][1] = "Firefox2Install.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[4][0] = GUICtrlCreateCheckbox("FlashPlayer", 8, 112, 97, 17)
$ar_CheckBox[4][1] = "flashplayer.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[5][0] = GUICtrlCreateCheckbox("Ahead Nero 7.5", 8, 136, 97, 17)
$ar_CheckBox[5][1] = "Nero.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[6][0] = GUICtrlCreateCheckbox("VLC Player", 144, 16, 97, 17)
$ar_CheckBox[6][1] = "VLC Player 0.8.5.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[7][0] = GUICtrlCreateCheckbox("QuickTime Player", 144, 40, 113, 17)
$ar_CheckBox[7][1] = "QuickTime.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[8][0] = GUICtrlCreateCheckbox("RealPlayer", 144, 64, 97, 17)
$ar_CheckBox[8][1] = "RealPlayer.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[9][0] = GUICtrlCreateCheckbox("WinMedia Player", 144, 88, 105, 17)
$ar_CheckBox[9][1] = "WinMedia11.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[10][0] = GUICtrlCreateCheckbox("NetFramework 2.0", 144, 112, 113, 17)
$ar_CheckBox[10][1] = "Net2.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[11][0] = GUICtrlCreateCheckbox("GoBack", 144, 136, 113, 17)
$ar_CheckBox[11][1] = "GoBack.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[12][0] = GUICtrlCreateCheckbox("ICQ 5.1", 288, 16, 97, 17)
$ar_CheckBox[12][1] = "ICQ.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[13][0] = GUICtrlCreateCheckbox("AOL Messenger", 288, 40, 97, 17)
$ar_CheckBox[13][1] = "AOL Messenger.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[14][0] = GUICtrlCreateCheckbox("YAHOO Messenger", 288, 64, 113, 17)
$ar_CheckBox[14][1] = "Yahoo.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[15][0] = GUICtrlCreateCheckbox("WinLive Messenger", 288, 88, 113, 17)
$ar_CheckBox[15][1] = "MSN.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[16][0] = GUICtrlCreateCheckbox("Skype", 288, 112, 97, 17)
$ar_CheckBox[16][1] = "Skypeinstall.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[17][0] = GUICtrlCreateCheckbox("Trillian 3.1", 288, 136, 97, 17)
$ar_CheckBox[17][1] = "Trillianinstall.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[18][0] = GUICtrlCreateCheckbox("LimeWire 4.12.0", 440, 16, 97, 17)
$ar_CheckBox[18][1] = "LimeWireScript.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[19][0] = GUICtrlCreateCheckbox("Usenext", 440, 40, 97, 17)
$ar_CheckBox[19][1] = "Usenext.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[20][0] = GUICtrlCreateCheckbox("WinRar", 440, 64, 97, 17)
$ar_CheckBox[20][1] = "WinRAR.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[21][0] = GUICtrlCreateCheckbox("TeamSpeak", 440, 88, 97, 17)
$ar_CheckBox[21][1] = "TeamSpeakInstall.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[22][0] = GUICtrlCreateCheckbox("TS Overlay", 440, 112, 97, 17)
$ar_CheckBox[22][1] = "TSO.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
$ar_CheckBox[23][0] = GUICtrlCreateCheckbox("InterCafe Client", 440, 136, 97, 17)
$ar_CheckBox[23][1] = "Intercafe.exe"
GUICtrlSetFont(-1, 8, 400, 0, "Microsoft Sans Serif")
GUICtrlSetBkColor(-1, 0xD8E4F8)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###While 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Sleep(100)
WEnd
Func AButton1Click()
; BlockInput(1) ; Tastatur und Maus blockiert
GUICtrlSetData($Progress1, 2) ; damit der Nutzer sieht, es geht los
For $i = 0 To UBound($ar_CheckBox)-1
If GUICtrlRead($ar_CheckBox[$i][0]) = 1 Then $counter += 1 ; feststellen wieviele markiert
Next
$progressStep = 100/$counter ; wieviele Schritte (z.B. 3 Programme = 3 Schritte a' 33 %)
For $i = 0 To UBound($ar_CheckBox)-1
If GUICtrlRead($ar_CheckBox[$i][0]) = 1 Then
MsgBox(0, '', "Installation " & $ar_CheckBox[$i][1])
; Run($ar_CheckBox[$i][1])
$bar += $progressStep
GUICtrlSetData($Progress1, $bar)
EndIf
Next
GUICtrlSetData($Progress1, 100)
Sleep(1000)
; BlockInput(0) ; Tastatur und Maus wieder frei
Exit
EndFuncFunc AForm1Close()
[/autoit] [autoit][/autoit] [autoit]
Exit
EndFunc
[/autoit] [autoit][/autoit] [autoit]
Func AForm1Maximize()
EndFunc
[/autoit] [autoit][/autoit] [autoit]
Func AForm1Minimize()
EndFunc
[/autoit] [autoit][/autoit] [autoit]
Func AForm1Restore()
EndFunc
[/autoit]
Func EXITClick()
Exit
EndFunc -
Alle gängigen Windowsprogramme haben den Menüpunkt "Fenster" in der Menüleiste um zwischen den geöffneten Fenstern zu switchen.
Habe es bisher in der Form nicht als fertige Funktion bei Autoit entdeckt. Da ich es gerade benötigte, habe ich eine entsprechende Lösung erstellt.
Vielleicht könnt ihr es auch mal brauchen.Spoiler anzeigen
[autoit]#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
Dim $ItemKundenExist = 0, $ItemArtikelExist = 0, $ItemSerienExist = 0
Dim $stat_Kunden, $stat_Artikel, $stat_Serien
Dim $itemKunden, $itemArtikel, $itemSerien$MainGUI = GUICreate("Main", Default, Default, Default, Default, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_MAXIMIZE))
[/autoit] [autoit][/autoit] [autoit]
$menu0 = GUICtrlCreateMenu("Datei")
$m0_item1 = GUICtrlCreateMenuItem("Beenden", $menu0)
$menu1 = GUICtrlCreateMenu("Stammdaten")
$m1_item1 = GUICtrlCreateMenuItem("Kunden Strg+K", $menu1)
$m1_item2 = GUICtrlCreateMenuItem("Artikel Strg+A", $menu1)
$m1_item3 = GUICtrlCreateMenuItem("Seriennummern Strg+S", $menu1)
$menu2 = GUICtrlCreateMenu("Fenster")
$menu3 = GUICtrlCreateMenu("?")
$m2_item1 = GUICtrlCreateMenuItem("Hilfe", $menu3)
$m2_item2 = GUICtrlCreateMenuItem("Über", $menu3)$KundenGUI = GUICreate("Kunden", 867, 551, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)
[/autoit] [autoit][/autoit] [autoit]
$ArtikelGUI = GUICreate("Artikel", 867, 551, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)
$SerienGUI = GUICreate("Serien-Nr", 867, 551, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)GUISetState(@SW_SHOW,$MainGUI)
[/autoit] [autoit][/autoit] [autoit]
HotKeySet("^k", "_StrgK")
HotKeySet("^a", "_StrgA")
HotKeySet("^s", "_StrgS")While 1
[/autoit] [autoit][/autoit] [autoit]
_SetEntryFensterMenu()
$msg = GuiGetMsg(1)
Select
Case $msg[0] = $GUI_EVENT_CLOSE
Select
Case $msg[1] = $MainGUI
ExitLoop
Case $msg[1] = $KundenGUI
GUISetState(@SW_HIDE,$KundenGUI)
Case $msg[1] = $ArtikelGUI
GUISetState(@SW_HIDE,$ArtikelGUI)
Case $msg[1] = $SerienGUI
GUISetState(@SW_HIDE,$SerienGUI)
EndSelect
Case $msg[1] = $MainGUI
Select
Case $msg[0] = $m0_item1
ExitLoop
Case $msg[0] = $m1_item1
GUISetState(@SW_SHOW,$KundenGUI)
Case $msg[0] = $m1_item2
GUISetState(@SW_SHOW,$ArtikelGUI)
Case $msg[0] = $m1_item3
GUISetState(@SW_SHOW,$SerienGUI)
Case $msg[0] = $itemKunden
WinActivate("Kunden")
Case $msg[0] = $itemArtikel
WinActivate("Artikel")
Case $msg[0] = $itemSerien
WinActivate("Serien")
Case $msg[0] = $m2_item1
;~ Hilfe
Case $msg[0] = $m2_item2
;~ Über
EndSelect
EndSelect
WEndFunc _StrgK()
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW,$KundenGUI)
EndFuncFunc _StrgA()
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW,$ArtikelGUI)
EndFuncFunc _StrgS()
[/autoit] [autoit][/autoit] [autoit]
GUISetState(@SW_SHOW,$SerienGUI)
EndFuncFunc _SetEntryFensterMenu()
[/autoit]
$stat_Kunden = WinGetState("Kunden")
If $stat_Kunden = 7 Or $stat_Kunden = 15 Then
If $ItemKundenExist = 0 Then
$itemKunden = GUICtrlCreateMenuItem("Kunden", $menu2)
$ItemKundenExist = 1
EndIf
Else
If $ItemKundenExist = 1 Then
GUICtrlDelete($itemKunden)
$ItemKundenExist = 0
EndIf
EndIf
$stat_Artikel = WinGetState("Artikel")
If $stat_Artikel = 7 Or $stat_Artikel = 15 Then
If $ItemArtikelExist = 0 Then
$itemArtikel = GUICtrlCreateMenuItem("Artikel", $menu2)
$ItemArtikelExist = 1
EndIf
Else
If $ItemArtikelExist = 1 Then
GUICtrlDelete($itemArtikel)
$ItemArtikelExist = 0
EndIf
EndIf
$stat_Serien = WinGetState("Serien")
If $stat_Serien = 7 Or $stat_Serien = 15 Then
If $ItemSerienExist = 0 Then
$itemSerien = GUICtrlCreateMenuItem("Serien", $menu2)
$ItemSerienExist = 1
EndIf
Else
If $ItemSerienExist = 1 Then
GUICtrlDelete($itemSerien)
$ItemSerienExist = 0
EndIf
EndIf
EndFuncEdit 24.11.2008:
Habe eine erweiterte Version erstellt.Edit 29.09.2011
Ich habe mich nach langer Zeit mal wieder an dieses Skript gemacht und aus diesem doch recht umständlich in andere Skripte zu integrierenden Bsp. eine UDF erstellt.
Etwas aufwändig, da ich die WM-Messages "belauschen" muß :D. Letztlich klappt es, wie gewünscht. Nur das automatische Aktivieren des zuletzt genutzten Fensters habe ich noch nicht gemanagt bekommen. Da kommen sich einige Messages in die Quere ;).
Zur Benutzung:
- Includieren der "MenuWindows.au3"
- Das "Fenster"-Menü erstellen mit: _GUICtrlWindowsList_MenuCreate().
- Registrieren der Fenster, die in diesem Menü verwaltet werden sollen mit: _GUICtrlWindowsList_Register.
- Bei Bedarf kann man auch wieder die Registrierung mit: _GUICtrlWindowsList_UnRegister aufheben.Ich habe jedoch in völlig undifferenzierten Zeiträumen den Fall, dass beim Aktivieren oder Schließen eines registrierten Fensters das Hauptfenster "einfriert". Da es jedoch ohne Systematik geschieht, konnte ich den Fehler bisher nicht eingrenzen. Vielleicht kann jemand von euch das nachvollziehen und hat eine zündende Idee.

MenuWindows (v0.2)
[autoit]#Region - TimeStamp
[/autoit] [autoit][/autoit] [autoit]
; 2011-09-29 19:08:13 v 0.2
#EndRegion - TimeStamp;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Script Name......: MenuWindows
; Description......: Erstellen eines Menüs "Fenster" um im Main-Window aktivierte Fenster zu verwalten
; AutoIt version...: 3.3.6.1
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;
; Funktionen
; _GUICtrlWindowsList_MenuCreate Erstellen des Menüs "Fenster" und Registrierung des Main-Windows
; _GUICtrlWindowsList_Register Registrieren der Fenster, die im Menü Fenster verwaltet werden sollen
; Bis zu 20 Fenster können in einem Aufruf registriert werden
; _GUICtrlWindowsList_UnRegister Fenster von der Registration entfernen
;===============================================================================#include-once
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <MenuConstants.au3>
#include <StructureConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>OnAutoItExitRegister('__GUICtrlWindowsList_ShutDown')
[/autoit] [autoit][/autoit] [autoit]Global Const $MAXNUMBER_WINDOWS = 256 ; == inkl. Hauptfenster (Main immer an Index 0)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global $Buffer_Empty = ''
For $i = 1 To 256
$Buffer_Empty &= ' '
Next
Global $DefMenuTitle = 'Windows'
If StringInStr("0407 0807 0c07 1007 1407", @OSLang) Then $DefMenuTitle = 'Fenster'Global $hProc_MnuWnd = DllCallbackRegister('__WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
[/autoit] [autoit][/autoit] [autoit]
Global $aWndCollection[$MAXNUMBER_WINDOWS][3] ; <== [[hWnd, $hHook, Mnu-ID]]
Global $hWnd_Main, $hHook_Main, $ID_MainMenu;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: _GUICtrlWindowsList_MenuCreate
; Description......: Erstellen des Menüs "Fenster" und Registrierung des Main-Windows
; Parameter(s).....: $hGui Handle des Fensters,in dem das Menü erstellt wird
; optional $sTitle Menütitel, Standard: 'Fenster'
; Return Value(s)..: ID des erstellten Menüs
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _GUICtrlWindowsList_MenuCreate($hGui, $sTitle='') ; == Menü "Fenster" erstellen und Main-Window registrieren
Switch $sTitle
Case Default, -1, ''
$sTitle = $DefMenuTitle
EndSwitch
$hHook_Main = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, DllCallbackGetPtr($hProc_MnuWnd))
$hWnd_Main = $hGui
$aWndCollection[0][0] = $hWnd_Main
$aWndCollection[0][1] = $hHook_Main
$ID_MainMenu = GUICtrlCreateMenu($sTitle)
Return $ID_MainMenu
EndFunc ;==>_GUICtrlWindowsList_MenuCreate;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: _GUICtrlWindowsList_Register
; Description......: Registrieren der Fenster, die im Menü Fenster verwaltet werden sollen
; Parameter(s).....: $hGui_1 Fensterhandle das registriert werden soll
; optional $hGui_2 ..20 weitere Fensterhandle (bis zu 20 gesamt pro Aufruf)
; Requirement(s)...: Ein mit _GUICtrlWindowsList_MenuCreate() erstelltes Menü
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _GUICtrlWindowsList_Register($hGui_1, $hGui_2=0, $hGui_3=0, $hGui_4=0, $hGui_5=0, $hGui_6=0, $hGui_7=0, $hGui_8=0, $hGui_9=0, $hGui_10=0, _
$hGui_11=0, $hGui_12=0, $hGui_13=0, $hGui_14=0, $hGui_15=0, $hGui_16=0, $hGui_17=0, $hGui_18=0, $hGui_19=0, $hGui_20=0)
Local $aParam[2], $tmpHwnd
For $i = 1 To 20
$tmpHwnd = Eval('hGui_' & $i)
If $tmpHwnd = 0 Then ExitLoop
$aParam[0] = $tmpHwnd
$aParam[1] = _WinAPI_SetWindowLong($tmpHwnd, $GWL_WNDPROC, DllCallbackGetPtr($hProc_MnuWnd))
__GUICtrlWindowsList_Manage('add', $aParam)
Next
EndFunc ;==>_GUICtrlWindowsList_Register;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: _GUICtrlWindowsList_UnRegister
; Description......: Fenster von der Registration entfernen
; Parameter(s).....: $hGui_1 erstes Fensterhandle das entfernt werden soll
; optional $hGui_2 ..20 weitere Fensterhandle (bis zu 20 gesamt pro Aufruf)
; Requirement(s)...: Ein mit _GUICtrlWindowsList_MenuCreate() erstelltes Menü
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _GUICtrlWindowsList_UnRegister($hGui_1, $hGui_2=0, $hGui_3=0, $hGui_4=0, $hGui_5=0, $hGui_6=0, $hGui_7=0, $hGui_8=0, $hGui_9=0, $hGui_10=0, _
$hGui_11=0, $hGui_12=0, $hGui_13=0, $hGui_14=0, $hGui_15=0, $hGui_16=0, $hGui_17=0, $hGui_18=0, $hGui_19=0, $hGui_20=0)
Local $aParam[2], $tmpHwnd
For $i = 1 To 20
$tmpHwnd = Eval('hGui_' & $i)
If $tmpHwnd = 0 Then ExitLoop
$aParam[0] = $tmpHwnd
$aParam[1] = _WinAPI_SetWindowLong($tmpHwnd, $GWL_WNDPROC, DllCallbackGetPtr($hProc_MnuWnd))
__GUICtrlWindowsList_Manage('del', $aParam)
Next
EndFunc ;==>_GUICtrlWindowsList_UnRegister#region - Helperfunktionen
[/autoit] [autoit][/autoit] [autoit]
;===============================================================================
; Function Name....: __GUICtrlWindowsList_ShutDown
; Description......: für alle Fenster __GUICtrlWindowsList_Clear() aufrufen
;===============================================================================
Func __GUICtrlWindowsList_ShutDown()
For $i = __GUICtrlWindowsList_Manage('getCount') To 0 Step -1
__GUICtrlWindowsList_Clear($aWndCollection[$i][0], $aWndCollection[$i][1])
Next
EndFunc ;==>__GUICtrlWindowsList_ShutDown;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: __GUICtrlWindowsList_Clear
; Description......: original WinProc für das Fenster wiederherstellen
;===============================================================================
Func __GUICtrlWindowsList_Clear($hGui, $hHook)
_WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, $hHook)
EndFunc ;==>__GUICtrlWindowsList_Clear;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: __GUICtrlWindowsList_Manage
; Description......: Verwaltung
; - Registrieren /Lösche Registrierung der Fenster
; - Item Erstellen /Löschen
; - Anzahl registrierter Fenster zurückgeben
;===============================================================================
Func __GUICtrlWindowsList_Manage($sCommand, $vParam='')
Local Static $iCountWnd = 0
Switch $sCommand
Case 'add' ; == neues Fenster zur Menüverwaltung "Fenster" hinzufügen (bei Fensterregistrierung) [Parameterarray: hWnd, hHook]
If $iCountWnd = $MAXNUMBER_WINDOWS Then Return SetError(1,0,$MAXNUMBER_WINDOWS)
$iCountWnd += 1
$aWndCollection[$iCountWnd][0] = $vParam[0] ; hWnd
$aWndCollection[$iCountWnd][1] = $vParam[1] ; hHook
$aWndCollection[$iCountWnd][2] = '' ; ID MenüItemCase 'del' ; == Fenster von Menüverwaltung "Fenster" entfernen [Parameter: Fensterhandle]
[/autoit] [autoit][/autoit] [autoit]
Local $index = _ArraySearch($aWndCollection, $vParam)
If @error Then Return
__GUICtrlWindowsList_Clear($vParam, $aWndCollection[$index][1])
_ArrayDelete($aWndCollection, $index)
ReDim $aWndCollection[$MAXNUMBER_WINDOWS][3]
$iCountWnd -= 1Case 'item_make' ; == Menüeintrag erstellen [Parameter: ArrayIndex]
[/autoit] [autoit][/autoit] [autoit]
$aWndCollection[$vParam][2] = GUICtrlCreateMenuItem(WinGetTitle($aWndCollection[$vParam][0]), $ID_MainMenu, Default, 1)
Return $aWndCollection[$vParam][2]Case 'item_del' ; == Menüeintrag entfernen [Parameter: Fensterhandle]
[/autoit] [autoit][/autoit] [autoit]
Local $index = _ArraySearch($aWndCollection, $vParam, 1)
If @error Then Return
GUICtrlDelete($aWndCollection[$index][2])
$aWndCollection[$index][2] = ''Case 'getCount' ; == Anzahl registrierter Fenster [Parameter: OHNE]
[/autoit] [autoit][/autoit] [autoit]
Return $iCountWndEndSwitch
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>__GUICtrlWindowsList_Manage;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: __setChecked
; Description......: Menüeintrag für aktives Fenster markieren
;===============================================================================
Func __setChecked($iIndex)
For $i = 1 To __GUICtrlWindowsList_Manage('getCount')
If $i = $iIndex Then
GUICtrlSetState($aWndCollection[$i][2], $GUI_CHECKED)
Else
If BitAND(GUICtrlRead($aWndCollection[$i][2]), $GUI_CHECKED) Then GUICtrlSetState($aWndCollection[$i][2], $GUI_UNCHECKED)
EndIf
Next
EndFunc ;==>__setChecked;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name....: __WinProc
; Description......: Callbackfunktion, Messageverwaltung
;===============================================================================
Func __WinProc($hWnd, $iMsg, $iwParam, $ilParam)
Local Static $iLastMenuID = -1, $sLastMenuTxt = '', $tMENUITEMINFO = DllStructCreate($tagMENUITEMINFO)
Local $index = _ArraySearch($aWndCollection, $hWnd)
Local $currHook = $aWndCollection[$index][1], $menuID, $iLast
If $index = -1 Then Return _WinAPI_CallWindowProc($currHook, $hWnd, $iMsg, $iwParam, $ilParam) ; == nicht Main oder registriertes FensterSwitch $iMsg
[/autoit] [autoit][/autoit] [autoit]
Case $WM_ACTIVATE ; == wenn Item nicht existiert ==> Erstellen
Local $iIndexMatch = -1
For $i = 1 To __GUICtrlWindowsList_Manage('getCount')
If $aWndCollection[$i][0] = $hWnd Then
$iIndexMatch = $i
ExitLoop
EndIf
Next
If $iIndexMatch = -1 Then Return _WinAPI_CallWindowProc($currHook, $hWnd, $iMsg, $iwParam, $ilParam)
If $aWndCollection[$iIndexMatch][2] = '' Then ; == MenüItem existiert noch nicht
$menuID = __GUICtrlWindowsList_Manage('item_make', $iIndexMatch)
__setChecked($iIndexMatch)
EndIfCase $WM_SETFOCUS ; == Fenster hat Fokus ==> Checked setzen
[/autoit] [autoit][/autoit] [autoit]
Local $index = _ArraySearch($aWndCollection, $hWnd, 1)
If $index <> -1 Then __setChecked($index)Case $WM_KILLFOCUS ; == Fenster verliert Fokus (wurde geschlossen oder HIDE gesetzt)
[/autoit] [autoit][/autoit] [autoit]
Local $index = _ArraySearch($aWndCollection, $hWnd, 1)
If $index <> -1 Then
Local $iState = WinGetState($hWnd)
If $iState = 5 Then ; == Fenster geschlossen (@SW_HIDE gesetzt)
__GUICtrlWindowsList_Manage('item_del', $hWnd)
EndIf
EndIfCase $WM_MENUSELECT
[/autoit] [autoit][/autoit] [autoit]
Local $ID_Menu = BitAND($iwParam, 0xFFFF) ; == ID des Menüeintrags
Local $aRet = DllCall('User32.dll', 'int', 'GetMenu', 'hwnd', $hWnd)
Local $hWndMenu = $aRet[0] ; == Handle des Menüs
; $tMENUITEMINFO: 'Size','Mask','Type','State','ID','SubMenu','BmpChecked','BmpUnchecked','ItemData','ptr TypeData','CCH','BmpItem'
Local $TypeData = DllStructCreate('char[256]')
DllStructSetData($TypeData, 1, $Buffer_Empty & Chr(0))
Local $fMask = BitOR($MIIM_ID,$MIIM_DATA,$MIIM_TYPE,$MIIM_SUBMENU)
DllStructSetData($tMENUITEMINFO, 1, DllStructGetSize($tMENUITEMINFO)) ; == Size
DllStructSetData($tMENUITEMINFO, 2, $fMask) ; == Mask
DllStructSetData($tMENUITEMINFO, 3, $MF_STRING) ; == Type
DllStructSetData($tMENUITEMINFO, 4, $MFS_DEFAULT) ; == State
DllStructSetData($tMENUITEMINFO,10, DllStructGetPtr($TypeData)) ; == TypeData
DllStructSetData($tMENUITEMINFO,11, 256) ; == CCH
$aRet = DllCall('User32.dll', 'int', 'GetMenuItemInfo', 'hwnd', $hWndMenu, 'uint', $ID_Menu, 'bool', 0, 'ptr', DllStructGetPtr($tMENUITEMINFO))
If $aRet[0] = 1 Then
$iLastMenuID = $ID_Menu ; == ID speichern falls Item angeklickt wird (Event: WM_UNINITMENUPOPUP)
$sLastMenuTxt = DllStructGetData($TypeData, 1)
EndIfCase $WM_UNINITMENUPOPUP ; == MenüItem wurde angeklickt
[/autoit] [autoit][/autoit] [autoit]
Local $index = _ArraySearch($aWndCollection, $iLastMenuID, 1, 0, 0, 0, 1, 2)
If $index <> -1 Then
WinActivate($aWndCollection[$index][0])
__setChecked($index)
EndIfCase Else
[/autoit]
Return _WinAPI_CallWindowProc($currHook, $hWnd, $iMsg, $iwParam, $ilParam)
EndSwitch
Return _WinAPI_CallWindowProc($currHook, $hWnd, $iMsg, $iwParam, $ilParam)
EndFunc ;==>_WinProc
#endregion - HelperfunktionenUnd hier ein Bsp.:
Bsp_MenuWindows
[autoit]#Region - TimeStamp
[/autoit] [autoit][/autoit] [autoit]
; 2011-09-29 19:08:02 v 0.1
#EndRegion - TimeStamp#include-once
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include 'MenuWindows.au3'Opt('GUIOnEventmode', 1)
[/autoit] [autoit][/autoit] [autoit]
Opt("GUIEventOptions",1); Deklaration der Sub-GUI
[/autoit] [autoit][/autoit] [autoit]
Global $hWnd_Kunden = GUICreate("Kunden" , 867, 551, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)
Global $hWnd_Artikel = GUICreate("Artikel" , 867, 551, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)
Global $hWnd_Serien = GUICreate("SerienNr", 867, 551, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_TOPMOST)
GUISetOnEvent($GUI_EVENT_CLOSE, '_closeWnd', $hWnd_Kunden)
GUISetOnEvent($GUI_EVENT_CLOSE, '_closeWnd', $hWnd_Artikel)
GUISetOnEvent($GUI_EVENT_CLOSE, '_closeWnd', $hWnd_Serien)
_GUICtrlWindowsList_Register($hWnd_Kunden, $hWnd_Artikel, $hWnd_Serien) ; == Alle Subwindows für das "Fenster"-Menü registrieren; Deklaration der Main-GUI
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$MainGUI = GUICreate("Main", -1, -1, -1, -1, BitOr($WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_MAXIMIZE))
GUISetOnEvent($GUI_EVENT_CLOSE, '_closeMain')
$menu0 = GUICtrlCreateMenu("Menü")
$m0_item1 = GUICtrlCreateMenuItem("Ende", $menu0)
GUICtrlSetOnEvent(-1, '_closeMain')
$menu1 = GUICtrlCreateMenu("Stammdaten")
$m1_item1 = GUICtrlCreateMenuItem("Kunden Strg+K", $menu1)
GUICtrlSetOnEvent(-1, '_StrgK')
$m1_item2 = GUICtrlCreateMenuItem("Artikel Strg+A", $menu1)
GUICtrlSetOnEvent(-1, '_StrgA')
$m1_item3 = GUICtrlCreateMenuItem("SerienNr Strg+S", $menu1)
GUICtrlSetOnEvent(-1, '_StrgS')
$menu2 = _GUICtrlWindowsList_MenuCreate($MainGUI) ; == registriert Main-GUI und erstellt Menü: "Fenster"
$menu3 = GUICtrlCreateMenu("?")
$m2_item1 = GUICtrlCreateMenuItem("Hilfe", $menu3)
$m2_item2 = GUICtrlCreateMenuItem("Über", $menu3)
GUISetState(@SW_SHOW, $MainGUI)While 1
[/autoit] [autoit][/autoit] [autoit]
Sleep(100)
WEnd; Hauptfenster schließen
[/autoit] [autoit][/autoit] [autoit]
Func _closeMain()
Exit
EndFunc; Unterfenster schließen
[/autoit] [autoit][/autoit] [autoit]
Func _closeWnd()
GUISetState(@SW_HIDE, @GUI_WinHandle)
EndFunc#region - Shortcut Funktionen
[/autoit] [autoit][/autoit] [autoit]
Func _StrgK()
_RunShortcuts($hWnd_Kunden)
EndFuncFunc _StrgA()
[/autoit] [autoit][/autoit] [autoit]
_RunShortcuts($hWnd_Artikel)
EndFuncFunc _StrgS()
[/autoit]
_RunShortcuts($hWnd_Serien)
EndFunc
; per Shortcut gewähltes Fenster einblenden und aktivieren
Func _RunShortcuts($hWnd)
GUISetState(@SW_SHOW, $hWnd)
WinActivate($hWnd)
EndFunc
#endregion - Shortcut Funktionen