Hallo,
ich habe folgendes Problem:
Ich habe eine Gui geschrieben mit 2 Buttons (Erstellen & Abbrechen).
Wenn ich auf minimieren oder schliessen oder auf den Abbrechen-Button gehe dann wird die Gui in den System-Tray minimiert.
Durch einen Klick auf das System-Tray-Icon wird das Fenster wieder hergestellt.
Hiernach funktionieren (reagieren) jedoch die beiden Buttons nicht mehr. Diese habe ich per GuiCtrlSetOnEvent mit einer Funktion verbunden.
Spoiler anzeigen
Der Aufruf der Buttons funktioniert auch solange ich das Fenster noch nicht minimiert habe.
Wer das Skript mal testen möchte:
Spoiler anzeigen
#cs ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]AutoIt Version: 3.2.2.0
Author: Michael Mangelsdorff
Script Function:
Verbindet Netzlaufwerke.
#ce ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]; Script Start - Add your code below here
[/autoit] [autoit][/autoit] [autoit]#Include <Constants.au3>
#include <GUIConstants.au3>
#Include<Array.au3>
; Change to OnEvent mode
Opt("GUIOnEventMode", 1)
Opt("GUIResizeMode", 1)
Opt("TrayOnEventMode",1)
Opt("TrayAutoPause",0)
Opt("TrayMenuMode",1)
Opt("OnExitFunc", "endscript")
[/autoit] [autoit][/autoit] [autoit];*********************************************************************************
;*** Beginn: Modus (Test oder kein Test) aus ini.Datei lesen
;*********************************************************************************
dim $modus
if FileExists(@ScriptDir & "\Netzlaufwerke.ini") Then
if (IniRead(@ScriptDir & "\Netzlaufwerke.ini", "StartParameter", "testmodus", "false")) then
$modus = 0 ; TEST
Else
$modus = 1 ; kein Test
EndIf
Else
$modus = 1 ; kein Test
;$modus = 0 ; Test
EndIf
;*********************************************************************************
;*** Ende: Modus (Test oder kein Test) aus ini.Datei lesen
;*********************************************************************************
;*********************************************************************************
;*** Beginn: Test ob korrekter PC-Name und User
;*********************************************************************************
;MsgBox(0, "Computername", "ComputerName: " & @ComputerName)
if not (StringTrimLeft(@ComputerName, 11) = "CompName") Then
MsgBox(0, "Falscher Computer", "Falscher Computer. Programm wird beendet.")
if $modus = 1 then Exit
EndIf
;MsgBox(0, "Username", "Username: " & @Username)
if not (StringTrimLeft(@UserName, = "UserName") Then
MsgBox(0, "Falscher User", "Falscher User. Programm wird beendet.")
if $modus = 1 then Exit
EndIf
;*********************************************************************************
;*** Ende: Test ob korrekter PC-Name und User
;*********************************************************************************
;*********************************************************************************
;*** Beginn: persistent-modus aus ini.Datei lesen
;*********************************************************************************
dim $persistentModus
if FileExists(@ScriptDir & "\Netzlaufwerke.ini") Then
if (IniRead(@ScriptDir & "\Netzlaufwerke.ini", "StartParameter", "persistent", "false")) = "true" then
$persistentModus = 1 ; sichtbar
Else
$persistentModus = 0 ; nicht sichtbar
EndIf
Else
$persistentModus = 0 ; nicht sichtbar
EndIf
;*********************************************************************************
;*** Ende: persistent-modus aus ini.Datei lesen
;*********************************************************************************
;*********************************************************************************************************************************************
;********* System Tray Management <<ANFANG>>
;*********************************************************************************************************************************************
TraySetIcon("Main.ico")
TraySetClick(8) ; nur bei Rechtsklick wird das Menü angezeigt
TraySetOnEvent(-7, "guiAnzeigen") ; bei Linksklick wird die Gui gezeigt
$tmGUI1 = TrayCreateMenu("Menü: Grafische Oberfläche (GUI)")
$tmg1 = TrayCreateItem("GUI Anzeigen", $tmGUI1)
TrayItemSetOnEvent($tmg1, "guiAnzeigen")
TrayCreateItem("")
$tmGUI2 = TrayCreateMenu("Menü: Programm beenden")
$tmg2 = TrayCreateItem("Programm beenden", $tmGUI2)
TrayItemSetOnEvent($tmg2, "programExit")
;*********************************************************************************************************************************************
;********* System Tray Management <<ENDE>>
;*********************************************************************************************************************************************
;*********************************************************************************
;*** Beginn: Erstellung der GUI
;*********************************************************************************
$err = 0
;GUICreate("Netzlaufwerk", 400, 250, 192, 125)
dim $mainGUI
$mainGUI = GUICreate("Netzlaufwerk", 600, 250)
GUISetIcon ("Main.ico")
GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents", $mainGUI)
GUISetOnEvent($GUI_EVENT_MINIMIZE, "SpecialEvents", $mainGUI)
GUISetOnEvent($GUI_EVENT_RESTORE, "SpecialEvents", $mainGUI)
;WinSetTrans("Netzlaufwerk", "", 220)
;WinSetOnTop("Netzlaufwerk", "", 1)
;Menü erstellen
$menuHilfe = GUICtrlCreateMenu ("?")
$menuHilfeAbout = GUICtrlCreateMenuitem("Über diese Software", $menuHilfe)
GUICtrlSetOnEvent($menuHilfeAbout, "about")
$erstellen = GUICtrlCreateButton("&Erstellen", 10, 200, 75, 25, 0)
GUICtrlSetOnEvent($erstellen, "LwVerbinden")
;$trennen = GUICtrlCreateButton("&Trennen", 90, 200, 75, 25, 0)
[/autoit] [autoit][/autoit] [autoit]$abbruch = GUICtrlCreateButton("&Abbruch", 170, 200, 75, 25, 0)
GUICtrlSetOnEvent($abbruch, "guiVerstecken")
$pfad = GUICtrlCreateCombo("", 110, 14, 450, 120)
[/autoit] [autoit][/autoit] [autoit]dim $mappingArray[1]
;*********************************************************************************
;*** Beginn: Einlesen der Netzlaufwerke aus .ini-Datei und Standard-Pfade
;*********************************************************************************
if FileExists(@ScriptDir & "\Netzlaufwerke.ini") Then
dim $sectionNetzlaufwerke
$sectionNetzlaufwerke = IniReadSection(@ScriptDir & "\Netzlaufwerke.ini", "Netzlaufwerke")
for $i = 1 to ($sectionNetzlaufwerke[0][0]) ; in $sectionNetzlaufwerke[0][0] ist die größe des Arrays gespeichert
;MsgBox(0, "Map", "Map: " & $sectionNetzlaufwerke[$i][1])
;GUICtrlSetData($pfad, $sectionNetzlaufwerke[$i][1])
_ArrayAdd ($mappingArray, $sectionNetzlaufwerke[$i][1])
Next
EndIf
; --> Standard-Pfade -->
_ArrayAdd ($mappingArray, "\\Server\FG_01")
_ArrayAdd ($mappingArray, "\\Server\FG_02")
_ArrayAdd ($mappingArray, "\\Server\FG_03")
_ArrayAdd ($mappingArray, "\\Server\FG_04")
_ArrayAdd ($mappingArray, "\\Server\FG_05")
_ArrayAdd ($mappingArray, "\\Server\PublicStore")
_ArrayAdd ($mappingArray, "\\Server\Austausch1")
_ArrayAdd ($mappingArray, "\\Server\Projekte1")
_ArrayAdd ($mappingArray, "\\Server\Projekte2")
_ArrayAdd ($mappingArray, "\\Server\Austausch2")
_ArrayDelete($mappingArray, 0)
[/autoit] [autoit][/autoit] [autoit]_ArraySort($mappingArray)
;_ArrayDisplay($mappingArray, "Array")
for $i = 0 to UBound($mappingArray, 1) -1
GUICtrlSetData($pfad, $mappingArray[$i])
Next
;*********************************************************************************
;*** Ende: Einlesen der Netzlaufwerke aus .ini-Datei und Standard-Pfade
;*********************************************************************************
$lwname = GUICtrlCreateCombo("", 110, 44, 75, 120)
LaufwerksComboBoxFuellen()
$persistent = GUICtrlCreateCheckbox("fest", 195, 44)
if $persistentModus = 1 Then
GUICtrlSetState($persistent, $GUI_SHOW)
Else
GUICtrlSetState($persistent, $GUI_HIDE)
EndIf
$domain = GUICtrlCreateInput("DEEUSEW", 110, 74, 131, 21)
GUICtrlSetState($domain, $GUI_DISABLE)
$benutzer = GUICtrlCreateInput("User-ID", 110, 104, 131, 21)
$pwd = GUICtrlCreateInput("Passwort", 110, 134, 131, 21, $ES_PASSWORD)
GUICtrlCreateLabel("Pfad zur Freigabe:", 10, 14, 90, 13)
GUICtrlCreateLabel("Netzlaufwerkname:", 10, 44, 90, 13)
GUICtrlCreateLabel("Domainname:", 10, 74, 90, 13)
GUICtrlCreateLabel("Benutzername:", 10, 104, 90, 13)
GUICtrlCreateLabel("Passwort:", 10, 134, 90, 13)
;*********************************************************************************
;*** Beginn: persistent-default aus ini.Datei lesen
;*********************************************************************************
dim $driveMapMode
if FileExists(@ScriptDir & "\Netzlaufwerke.ini") Then
if (IniRead(@ScriptDir & "\Netzlaufwerke.ini", "StartParameter", "persistentdefault", "false") = "true") then
$driveMapMode = 1 ; persistent
GUICtrlSetState($persistent, $GUI_CHECKED)
Else
$driveMapMode = 0 ; non-persistent
GUICtrlSetState($persistent, $GUI_UNCHECKED)
EndIf
Else
$persistentModus = 0 ; non-persistent
GUICtrlSetState($persistent, $GUI_UNCHECKED)
EndIf
;*********************************************************************************
;*** Ende: persistent-default aus ini.Datei lesen
;*********************************************************************************
GUISetState()
[/autoit] [autoit][/autoit] [autoit];*********************************************************************************
;*** Ende: Erstellung der GUI
;*********************************************************************************
While 1
Sleep(10)
WEnd
;*********************************************************************************
;*** Beginn: Funktionen
;*********************************************************************************
Func LwVerbinden()
if GUICtrlRead($lwname) = "" Then
MsgBox(0, "Kein Laufwerksname angegeben !", "Bitte geben Sie einen Laufwerksnamen an !")
Return 0
EndIf
if GUICtrlRead($benutzer) = "" or GUICtrlRead($benutzer) = "User-ID" Then
MsgBox(0, "Kein Benutzer angegeben !", "Bitte geben Sie einen Benutzernamen (User-ID) an !")
Return 0
EndIf
if GUICtrlRead($domain) = "" Then
MsgBox(0, "Keine Domäne angegeben !", "Bitte geben Sie eine Domäne (DEEUSEW) an !")
Return 0
EndIf
if GUICtrlRead($pwd) = "" or GUICtrlRead($pwd) = "Passwort" Then
MsgBox(0, "Kein Passwort angegeben !", "Bitte geben Sie ein Passwort an !")
Return 0
EndIf
SplashTextOn("","Bitte Warten...",120,20,-1,-1,1)
if $persistentModus = 1 Then
dim $chkboxState = GUICtrlRead($persistent)
if BitAND(GUICtrlRead($persistent), $GUI_CHECKED) Then
$driveMapMode = 1 ;persistent
ElseIf BitAND(GUICtrlRead($persistent), $GUI_UNCHECKED) Then
$driveMapMode = 0 ;non-persistent
Else
MsgBox(0, "Fehler bei CheckBox-Auswertung", "Fehler bei CheckBox-Auswertung, bitte IT2.1 informieren")
EndIf
Else
$driveMapMode = 0 ;non-persistent
EndIf
;Test der Korrektheit des Pfades prüfen (z.B. vorne 2x "\\")
if not (StringInStr(GUICtrlRead($pfad), "\\") = 1) Then
SplashOff()
MsgBox(0, "Falscher Netzwerkpfad", "Der Netzwerkpfad << " & GUICtrlRead($pfad) & " >> ist Fehlerhaft. Er muss mit \\ beginnen.")
Return
EndIf
$map = DriveMapAdd(GUICtrlRead($lwname), GUICtrlRead($pfad),$driveMapMode,GUICtrlRead($domain)&"\"&GUICtrlRead($benutzer), GUICtrlRead($pwd))
If @error Then $err = @error
Sleep(1000)
If $err <> 0 Then
Switch $err
case 1
; $err leeren
$err = ""
SetError (0)
; Versuch das Laufwerk über IP-Adresse anzusprechen
dim $doubleSlash = ""
dim $serverPath = GUICtrlRead($pfad)
$doubleSlash = StringInStr($serverPath, "\\")
;MsgBox(0, "DoubleSlashPosition", $doubleSlash)
if $doubleSlash = 1 Then
dim $slash = ""
dim $ip = ""
$slash = StringInStr($serverPath, "\", 0 , 3)
$server = StringMid($serverPath, 3, $slash-3)
;MsgBox(0, "Servername", $server)
TCPStartup()
$ip = TCPNameToIP($server)
TCPShutdown()
if $ip = "" Then
SplashOff()
MsgBox(0, "Server existiert nicht", "Der Server " & $server & " existiert nicht oder ist nicht zu erreichen.")
Return
EndIf
;MsgBox(0, "Server-IP", $ip)
$serverPath = StringReplace($serverPath, $server, $ip)
;MsgBox(0, "IP-String", $serverPath)
$map = DriveMapAdd(GUICtrlRead($lwname), $serverPath,$driveMapMode,GUICtrlRead($domain)&"\"&GUICtrlRead($benutzer), GUICtrlRead($pwd))
If @error Then
$err = @error
SplashOff()
MsgBox(16,"","Undefiniert / anderer Fehler." & @CRLF & "Fehler: " & @extended)
Else
SplashOff()
MsgBox(0,"Netzlaufwerk", GUICtrlRead($lwname) & " wurde erfolgreich mit " & DriveMapGet(GUICtrlRead($lwname)) & " verbunden.")
EndIf
EndIf
case 2
SplashOff()
MsgBox(16,"","Zugriff zum Remote Share verweigert.")
case 3
SplashOff()
MsgBox(16,"","Das Gerät wurde bereits zugewiesen.")
case 4
SplashOff()
MsgBox(16,"","Ungültiger Gerätename.")
case 5
SplashOff()
MsgBox(16,"","Ungültiger Remote Share.")
case 6
SplashOff()
MsgBox(16,"","Ungültiges Passwort.")
case else
SplashOff()
MsgBox(16,"","Unbekannter Fehler.")
EndSwitch
Else
MsgBox(0,"Netzlaufwerk", GUICtrlRead($lwname) & " wurde erfolgreich mit " & DriveMapGet(GUICtrlRead($lwname)) & " verbunden.")
EndIf
;Laufwerks-Combobox neu füllen
LaufwerksComboBoxFuellen()
EndFunc
Func LaufwerksComboBoxFuellen()
;Liste leeren
GUICtrlSetData($lwname, "")
;Laufwerksbuchstaben holen
dim $alleBenutztenLaufwerke
dim $anzLaufwerke
dim $i = 0
dim $moeglicheLaufwerke[26]
$moeglicheLaufwerke[0] = "a:"
$moeglicheLaufwerke[1] = "b:"
$moeglicheLaufwerke[2] = "c:"
$moeglicheLaufwerke[3] = "d:"
$moeglicheLaufwerke[4] = "e:"
$moeglicheLaufwerke[5] = "f:"
$moeglicheLaufwerke[6] = "g:"
$moeglicheLaufwerke[7] = "h:"
$moeglicheLaufwerke[8] = "i:"
$moeglicheLaufwerke[9] = "j:"
$moeglicheLaufwerke[10] = "k:"
$moeglicheLaufwerke[11] = "l:"
$moeglicheLaufwerke[12] = "m:"
$moeglicheLaufwerke[13] = "n:"
$moeglicheLaufwerke[14] = "o:"
$moeglicheLaufwerke[15] = "p:"
$moeglicheLaufwerke[16] = "q:"
$moeglicheLaufwerke[17] = "r:"
$moeglicheLaufwerke[18] = "s:"
$moeglicheLaufwerke[19] = "t:"
$moeglicheLaufwerke[20] = "u:"
$moeglicheLaufwerke[21] = "v:"
$moeglicheLaufwerke[22] = "w:"
$moeglicheLaufwerke[23] = "x:"
$moeglicheLaufwerke[24] = "y:"
$moeglicheLaufwerke[25] = "z:"
$alleBenutztenLaufwerke = DriveGetDrive("ALL")
[/autoit] [autoit][/autoit] [autoit]for $i = 0 to 25
if _ArraySearch($alleBenutztenLaufwerke, $moeglicheLaufwerke[$i]) < 0 Then
GUICtrlSetData($lwname, $moeglicheLaufwerke[$i])
EndIf
next
EndFunc
Func guiAnzeigen()
;WinSetState($mainGui, "", @SW_RESTORE)
WinSetState($mainGui, "", @SW_Show)
WinActivate($mainGui, "")
EndFunc
Func guiVerstecken()
;GUISetState(@SW_HIDE, $mainGui)
WinSetState($mainGui, "", @SW_HIDE)
EndFunc
Func SpecialEvents()
;MsgBox(0, "SpecialEvents", @GUI_CTRLID)
Select
Case @GUI_CTRLID = $GUI_EVENT_CLOSE
;MsgBox(0, "Close Pressed", "ID=" & @GUI_CTRLID & " WinHandle=" & @GUI_WINHANDLE)
guiVerstecken()
Case @GUI_CTRLID = $GUI_EVENT_MINIMIZE
;MsgBox(0, "Window Minimized", "ID=" & @GUI_CTRLID & " WinHandle=" & @GUI_WINHANDLE)
guiVerstecken()
Case @GUI_CTRLID = $GUI_EVENT_RESTORE
;MsgBox(0, "Window Restored", "ID=" & @GUI_CTRLID & " WinHandle=" & @GUI_WINHANDLE)
EndSelect
EndFunc
Func endscript()
Switch @exitMethod
Case 0
;WriteLog("Script beendet durch <<" & "Natural Closing>>")
Case 1
;WriteLog("Script beendet durch <<" & "Close by Exit function>>")
Case 2
;WriteLog("Script beendet durch <<" & "Close by clicking on exit of the systray>>")
Case 3
;WriteLog("Script beendet durch <<" & "Close by user logoff>>")
Case 4
;WriteLog("Script beendet durch <<" & "Close by Windows shutdown>>")
EndSwitch
EndFunc
Func programExit()
;WriteLog("Beginn programExit()")
exit
EndFunc
Func about()
MsgBox(0, "About", "Programmiert von Michael Mangelsdorff, IT2.1")
EndFunc
;*********************************************************************************
;*** Ende: Funktionen
;*********************************************************************************
Damit der Test läuft müßt ihr noch eine (Netzlaufwerke.ini) ini-Datei anlegen wie folgt:
Spoiler anzeigen
Hat jemand Ähnliche Erfahrungen oder bereits ein Programm was in SystemTray minimiert und anschliessend wiederhergestellt wird ?
Und bitte möglichst per SetOnEvent ... weil diese Programmierart am nähesten an den meisten Programmiersprachen liegt (also keine Schleife programmieren wo Msg abgefragt wird, sondern Event-Trigger).
Vielen Dank (auch wenn ich nicht glaube das mir jemand helfen kann