Lass die zeit mal bis 0 laufen ....danach kommt 49812378812s ....komisch
Jetzt nicht mehr
- Habe eine Änderung drin, dass ab 0 das Feld nicht mehr abgefragt wird.
Lass die zeit mal bis 0 laufen ....danach kommt 49812378812s ....komisch
Jetzt nicht mehr
- Habe eine Änderung drin, dass ab 0 das Feld nicht mehr abgefragt wird.
aber er beendet das program nicht wenn die zeit läuft
Kann ich nicht nachvollziehen, ich kann jederzeit beenden.
Wenn die Zeit auf 0:00 ist .... Soll ein sounds kommen
Habs mal etwas geändert und den Sound eingebaut:
#include <guiconstants.au3>
#include <Date.au3>
Global $arIn[4][3], $arCounter[4][2]
GUICreate('test')
$bt1 = GUICtrlCreateButton('set Time', 10,10,60,20)
$arIn[0][0] = GUICtrlCreateInput('', 80, 10, 40, 20)
$arCounter[0][0] = GUICtrlCreateLabel('', 140, 13, 80, 17)
$bt2 = GUICtrlCreateButton('set Time', 10,40,60,20)
$arIn[1][0] = GUICtrlCreateInput('', 80, 40, 40, 20)
$arCounter[1][0] = GUICtrlCreateLabel('', 140, 43, 80, 17)
$bt3 = GUICtrlCreateButton('set Time', 10,70,60,20)
$arIn[2][0] = GUICtrlCreateInput('', 80, 70, 40, 20)
$arCounter[2][0] = GUICtrlCreateLabel('', 140, 73, 80, 17)
$bt4 = GUICtrlCreateButton('set Time', 10,100,60,20)
$arIn[3][0] = GUICtrlCreateInput('', 80, 100, 40, 20)
$arCounter[3][0] = GUICtrlCreateLabel('', 140, 103, 80, 17)
GUISetState()
While True
$msg = GUIGetMsg()
_SetCounter()
Switch $msg
Case $bt1
$arCounter[0][1] = 1
$arIn[0][1] = GUICtrlRead($arIn[0][0]) * 60
$arIn[0][2] = _NowCalc()
GUICtrlSetState($bt1, $GUI_DISABLE)
Case $bt2
$arCounter[1][1] = 1
$arIn[1][1] = GUICtrlRead($arIn[1][0]) * 60
$arIn[1][2] = _NowCalc()
GUICtrlSetState($bt2, $GUI_DISABLE)
Case $bt3
$arCounter[2][1] = 1
$arIn[2][1] = GUICtrlRead($arIn[2][0]) * 60
$arIn[2][2] = _NowCalc()
GUICtrlSetState($bt3, $GUI_DISABLE)
Case $bt4
$arCounter[3][1] = 1
$arIn[3][1] = GUICtrlRead($arIn[3][0]) * 60
$arIn[3][2] = _NowCalc()
GUICtrlSetState($bt4, $GUI_DISABLE)
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func _SetCounter()
Local $sec
For $i = 0 To UBound($arCounter) -1
If $arCounter[$i][1] <> 1 Then ContinueLoop
If $arIn[$i][1] = 0 Then ContinueLoop
$sec = $arIn[$i][1] - _DateDiff("s", $arIn[$i][2], _NowCalc())
Select
Case $sec < 60
GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', $sec) & ' s')
Case $sec < 60*60
GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', Floor($sec/60)) & ':' & _
StringFormat('%02u', Mod($sec,60)) & ' min')
EndSelect
If $sec = 0 Then
SoundPlay(@WindowsDir & '\Media\tada.wav')
$arCounter[$i][1] = 0
EndIf
Next
EndFunc
Ich hab dir mal ein Muster für 4 Eingaben gemacht. Kannst es dann erweitern.
#include <guiconstants.au3>
#include <Date.au3>
Global $arIn[4][3], $arCounter[4][2]
GUICreate('test')
$bt1 = GUICtrlCreateButton('set Time', 10,10,60,20)
$arIn[0][0] = GUICtrlCreateInput('', 80, 10, 40, 20)
$arCounter[0][0] = GUICtrlCreateLabel('', 140, 13, 80, 17)
$bt2 = GUICtrlCreateButton('set Time', 10,40,60,20)
$arIn[1][0] = GUICtrlCreateInput('', 80, 40, 40, 20)
$arCounter[1][0] = GUICtrlCreateLabel('', 140, 43, 80, 17)
$bt3 = GUICtrlCreateButton('set Time', 10,70,60,20)
$arIn[2][0] = GUICtrlCreateInput('', 80, 70, 40, 20)
$arCounter[2][0] = GUICtrlCreateLabel('', 140, 73, 80, 17)
$bt4 = GUICtrlCreateButton('set Time', 10,100,60,20)
$arIn[3][0] = GUICtrlCreateInput('', 80, 100, 40, 20)
$arCounter[3][0] = GUICtrlCreateLabel('', 140, 103, 80, 17)
GUISetState()
While True
$msg = GUIGetMsg()
For $i = 0 To UBound($arCounter) -1
If $arCounter[$i][1] = 1 Then _SetCounter()
Next
Switch $msg
Case $bt1
$arCounter[0][1] = 1
$arIn[0][1] = GUICtrlRead($arIn[0][0]) * 60
$arIn[0][2] = _NowCalc()
GUICtrlSetState($bt1, $GUI_DISABLE)
Case $bt2
$arCounter[1][1] = 1
$arIn[1][1] = GUICtrlRead($arIn[1][0]) * 60
$arIn[1][2] = _NowCalc()
GUICtrlSetState($bt2, $GUI_DISABLE)
Case $bt3
$arCounter[2][1] = 1
$arIn[2][1] = GUICtrlRead($arIn[2][0]) * 60
$arIn[2][2] = _NowCalc()
GUICtrlSetState($bt3, $GUI_DISABLE)
Case $bt4
$arCounter[3][1] = 1
$arIn[3][1] = GUICtrlRead($arIn[3][0]) * 60
$arIn[3][2] = _NowCalc()
GUICtrlSetState($bt4, $GUI_DISABLE)
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func _SetCounter()
Local $sec
For $i = 0 To UBound($arCounter) -1
If $arIn[$i][1] = 0 Then ContinueLoop
$sec = $arIn[$i][1] - _DateDiff("s", $arIn[$i][2], _NowCalc())
Select
Case $sec < 60
GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', $sec) & ' s')
Case $sec < 60*60
GUICtrlSetData($arCounter[$i][0], StringFormat('%02u', Floor($sec/60)) & ':' & _
StringFormat('%02u', Mod($sec,60)) & ' min')
EndSelect
Next
EndFunc
Dann so:
#include<guiconstants.au3>
GUICreate('test')
$bt = GUICtrlCreateButton('set Time', 10,10,60,20)
$in = GUICtrlCreateInput('', 80, 10, 40, 20)
$lbl = GUICtrlCreateLabel('', 140, 13, 80, 17)
GUISetState()
AdlibEnable('ende', 100)
While True
$msg = GUIGetMsg()
Switch $msg
Case $bt
_CountDown(0, GUICtrlRead($in), 0, 0, True, $lbl)
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func ende() ; damit kann beendet werden, auch wenn der Timer läuft ==> hat kleine Verzögerung
If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
EndFunc
;----------------------------------------------------------------------------------------------------------------------
; Funktion _CountDown($SEC [, $MIN=0 [, $HOUR=0 [, $DAY=0 [, $VISIBLEDOWN=True [, $ALTERNATECTRL='TT']]]]])
;
; Beschreibung zählt vorgegebene Zeitspanne (Tage, Stunden, Minuten, Sekunden) herunter mit Anzeige Tooltip (Standard)
; oder Ausgabe in GUI-Ctrl; wahlweise Anzeige von Restzeit (Standard) oder abgelaufener Zeit
;
; Parameter $SEC: Sekunden
; optional $MIN: Minuten
; optional $HOUR: Stunden
; optional $DAY: Tage
; optional $VISIBLEDOWN: Ansicht (herunterzählen/heraufzählen)
; optional $ALTERNATECTRL: GUI-Ctrl in das die Ausgabe mittels GUICtrlSetData() ausgegeben wird
;
; Erfordernisse #include <Date.au3>
;
; Autor BugFix ([email='bugfix@autoit.de'][/email])
;----------------------------------------------------------------------------------------------------------------------
#include <Date.au3>
Func _CountDown($SEC, $MIN=0, $HOUR=0, $DAY=0, $VISIBLEDOWN=True, $ALTERNATECTRL='TT')
$Sekunden = $SEC + $MIN*60 + $HOUR*3600 + $DAY*86400
$end = _DateAdd('s', $Sekunden, _NowCalc())
Local $message
Do
Sleep(100)
$sec = _DateDiff('s', _NowCalc(), $end)
If Not $VISIBLEDOWN Then
$secShow = $Sekunden - $sec
Else
$secShow = $sec
EndIf
Select
Case $secShow < 60
If $ALTERNATECTRL = 'TT' Then
ToolTip(StringFormat('%02u', $secShow) & ' s')
Else
GUICtrlSetData($ALTERNATECTRL, StringFormat('%02u', $secShow) & ' s')
EndIf
Case $secShow < 60*60
$message = StringFormat('%02u', Floor($secShow/60)) & ':' & _
StringFormat('%02u', Mod($secShow,60)) & ' min'
If $ALTERNATECTRL = 'TT' Then
ToolTip($message)
Else
GUICtrlSetData($ALTERNATECTRL, $message)
EndIf
Case $secShow < 60*60*24
$message = StringFormat('%02u', Floor($secShow/3600)) & ':' & _
StringFormat('%02u', Floor(Mod($secShow,3600)/60)) & ':' & _
StringFormat('%02u', Mod(Mod($secShow,3600),60)) & ' h'
If $ALTERNATECTRL = 'TT' Then
ToolTip($message)
Else
GUICtrlSetData($ALTERNATECTRL, $message)
EndIf
Case Else
$message = Floor($secShow/86400) & ' d / ' & _
StringFormat('%02u', Floor(Mod($secShow,86400)/3600)) & ':' & _
StringFormat('%02u', Floor(Mod(Mod($secShow,86400),3600)/60)) & ':' & _
StringFormat('%02u', Mod(Mod(Mod($secShow,86400),3600),60)) & ' h'
If $ALTERNATECTRL = 'TT' Then
ToolTip($message)
Else
GUICtrlSetData($ALTERNATECTRL, $message)
EndIf
EndSelect
Until $sec = 0
EndFunc ;==>_CountDown
Hiermit kannst du alle Tastendrücke zählen (Maus zählt auch als Taste). Wenn du bestimmte Werte nicht prüfen willst, mußt du deren Hexwert aus der Prüfung in der Schleife rauslassen.
HotKeySet("{ESC}", "ende")
Global $dll = DllOpen("user32.dll")
While _SomeKeyPressed() ; Tastaturpuffer leeren
WEnd
$count = 0
While 1
Sleep(100)
If _SomeKeyPressed() Then
$count += 1
ConsoleWrite("Eine Taste wurde gedrückt (" & $count & ")" & @LF)
EndIf
WEnd
Func ende()
DllClose($dll)
Exit
EndFunc
Func _SomeKeyPressed()
Local $ret
For $i = 1 To 256
$ret = DllCall($dll, "int", "GetAsyncKeyState", "int", "0x" & Hex($i, 2))
If $ret[0] <> 0 Then Return 1
Next
Return 0
EndFunc
Meinst du sowas:
[autoit]#include<guiconstants.au3>
GUICreate('test')
$bt = GUICtrlCreateButton('set Time', 10,10,60,20)
$lbl = GUICtrlCreateLabel('', 100, 13, 80, 17)
GUISetState()
While True
$msg = GUIGetMsg()
Switch $msg
Case $bt
GUICtrlSetData($lbl, @HOUR & ':' & @MIN & ':' & @SEC)
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Wird sowas auch mal in AutoIt Core gamcht?
Hätte ich nichts dagegen, aber ob Jos das auf seiner Liste hat...
Wie sagte Asterix so schön: Die sind komisch, die Briten. ![]()
(OK, er sagte 'spinnen' - aber ich wollte nicht so böse sein
)
Ich finds nur schade das es in Autoit keine Assoziatives Arrays gibt
Gibt es zwar nicht als reine AutoIt-Komponente, aber per Objektanbindung: UDF-Sammlung Array Alternativen
Hab mal kurz drüber geschaut, handwerklich sauber
.
Ich bevorzuge beim Iterieren durch Arrays die Angabe der Obergrenze mit UBound($array) -1 anstelle eines evtl. vorhandenen Zählers in $array[0].
Hintergrund ist, dass zum Einen sofort ersichtlich ist, dass bis zur Obergrenze durchlaufen wird und zum Anderen ist diese Angabe in jedem Fall korrekt.
Du kannst aber ein anderes Trennzeichen an die Funktion _ArrayDisplay() übergeben. Dann sollte das Problem behoben sein.
Zeig mal den Ausgangsstring und sage, was du selektieren möchtest.
UDF in der aktuellen Prod.
_PathSplit
--------------------------------------------------------------------------------
Splits a path into the drive, directory, file name and file extension parts. An empty string is set if a part is missing.
#Include <File.au3>
_PathSplit($szPath, ByRef $szDrive, ByRef $szDir, ByRef $szFName, ByRef $szExt)
Parameters
$szPath The path to be split (Can contain a UNC server or drive letter)
$szDrive String to hold the drive
$szDir String to hold the directory
$szFName String to hold the file name
$szExt String to hold the file extension
Alles anzeigen
Edit: Oder ohne UDF:
[autoit]$path = "Dateipfad"
$objFSO = ObjCreate("Scripting.FileSystemObject")
$objFile = $objFSO.GetFile($path)
MsgBox(0, 'Parent Folder', $objFSO.GetParentFolderName($objFile) )
Oder meine Func: [ offen ] Dateinamen und Dateiendung voneinander trennen? nehmen.
Dann schau doch mal in diesen Schlüssel:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
Ja BugFix wir sollten uns zusammentun und mein Nicinfo mal überarbeiten und deinen Quellcode mit einfügen.
Oder du gibst mir die Erlaubnis deinen Quelltext zu verwenden.
Ist mir beides Recht. Vielleicht hast du die Möglichkeit bei vieeeelen Produkten (hab nur 2 Adapter
) zu testen ob evtl. einheitlich über WMI abgefragt werden kann. WMI hatte ich hier: Konfiguration Netzwerkadapter verwendet.
Hi,
in ähnlicher Form hatte ich das schon mal. Hier werden alle Adapter, so wie sie auch unter <Systemsteuerung> <Netzwerkverbindungen> aufgelistet sind ermittelt, inklusive der derzeitigen Konfiguration. Die Rückgabewerte sind aus dem Funktionskopf ersichtlich.
#include<Array.au3>
$ar = _GetAllNetworkAdapter()
_ArrayDisplay($ar)
;===============================================================================
; Function Name: _GetAllNetworkAdapter()
; Description:: Auslesen aller vorhandenen Netzwerkadapter und deren Konfiguration
; Parameter(s): keine
; Requirement(s): keine
; Return Value(s): Erfolg Array[n][0] Adapter Name (wie in Systemsteuerung ==> Netzwerkverbindungen)
; Array[n][1] Adapter Beschreibung
; Array[n][2] IP-Adresse
; Array[n][3] SubNetMask
; Array[n][4] DHCP-Enabled (0/1)
; Array[n][5] DHCP IP-Adresse
; Array[n][6] DHCP SubNetMask
; Array[n][7] DHCP Default Gateway
; Array[n][8] DHCP Server
; Fehler Array[0][0] Leerstring (kein Adapter vorhanden)
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _GetAllNetworkAdapter()
Local $arOut[1][9] = [['']], $arrSubKeys, $arrSubKeys2, $strValue, $sub, $sub2, $sub3, $val
Local $oReg = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
$oReg.EnumKey (0x80000002, "SYSTEM\CurrentControlSet\Control\Network", $arrSubKeys)
For $sub In $arrSubKeys
If RegRead('HKLM\SYSTEM\CurrentControlSet\Control\Network\' & $sub, 'Class') = 'Net' Then ExitLoop
Next
$oReg.EnumKey (0x80000002, "SYSTEM\CurrentControlSet\Control\Network\" & $sub, $arrSubKeys)
$oReg.EnumKey (0x80000002, "SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}", $arrSubKeys2)
If IsArray($arrSubKeys) Then
For $sub2 In $arrSubKeys
$val = RegRead('HKLM\SYSTEM\CurrentControlSet\Control\Network\' & $sub & '\' & $sub2 & '\' & 'Connection', 'Name')
If Not @error Then
If $arOut[UBound($arOut)-1][0] <> '' Then ReDim $arOut[UBound($arOut)+1][9]
$arOut[UBound($arOut)-1][0] = $val
For $sub3 In $arrSubKeys2
If RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\" & $sub3, 'NetCfgInstanceId') = $sub2 Then
$arOut[UBound($arOut)-1][1] = _
RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\" & $sub3, 'DriverDesc')
ExitLoop
EndIf
Next
$arOut[UBound($arOut)-1][2] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $sub2 & '\Parameters\Tcpip', 'IPAddress')
$arOut[UBound($arOut)-1][3] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $sub2 & '\Parameters\Tcpip', 'SubnetMask')
$arOut[UBound($arOut)-1][4] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $sub2 & '\Parameters\Tcpip', 'EnableDHCP')
$arOut[UBound($arOut)-1][5] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $sub2 & '\Parameters\Tcpip', 'DhcpIPAddress')
$arOut[UBound($arOut)-1][6] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $sub2 & '\Parameters\Tcpip', 'DhcpSubnetMask')
$arOut[UBound($arOut)-1][7] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $sub2 & '\Parameters\Tcpip', 'DhcpDefaultGateway')
$arOut[UBound($arOut)-1][8] = RegRead('HKLM\SYSTEM\CurrentControlSet\Services\' & $sub2 & '\Parameters\Tcpip', 'DhcpServer')
EndIf
Next
EndIf
Return $arOut
EndFunc ;==>_GetAllNetworkAdapter
Edit: Im Download ist der Funktionskopf falsch mit den Arrayangaben. Hier im Post habe ich es korrigiert
ob das Muster was dort angebegeben ist z.B. von der IP 192.168.1.205 einem vorgebebenen Muster enspricht.
Also das einzige was ich jetzt dazu gefunden habe ist StringRegExp. Geht das damit?
Ja, StringRegExp ist das einzig sinnvolle. _StringBetween wäre auch möglich, bzw. andere Stringoperationen, allerdings nicht so komplex, wie SRE.
Wie soll denn deine Vorgabe sein? Ein bestimmter IP-Range oder Gültigkeit als IP-Adresse allgemein?
So, das Flackern habe ich jetzt fast wegbekommen :).
Das ist entstanden, weil du alle 100 ms den Tooltipp gesetzt hast, auch wenn noch keine Sekunde rum war.
Global $begin = TimerInit(), $diff, $diff_alt = 0, $sec
Global $Countdown = 10
Global $head = 'test'
ToolTip("in " & ($Countdown - $sec) & " Seconds" & @CRLF & @CRLF & "Press END to Exit", 0, 0, $head)
WinSetTrans("[CLASS:tooltips_class32]", "", 150)
Do
$diff = TimerDiff($begin)
$sec = Floor($diff/1000)
If $sec > $diff_alt Then
$diff_alt = $sec
ToolTip("in " & ($Countdown - $sec) & " Seconds" & @CRLF & @CRLF & "Press END to Exit", 0, 0, $head)
WinSetTrans("[CLASS:tooltips_class32]", "", 150)
EndIf
Sleep(100)
Until $diff >= $Countdown * 1000
Ich denke mal, transparent und durchklickbar ==> das Tooltip-Element mußt du dir selber bauen. Standard Tooltipps weisen diese Eigenschaften nicht auf (s. hier).
ich habe 2 fenster mit gleichem titel aber anderen classes.
Verstehe nicht, was du damit meinst?
- Control-Class oder
- Window-Class
Welche Aktion möchtest du in dem Fenster ausführen?
Bei unterschiedlichen Windows-Classes gehts doch so (Bsp. SciTE):
[autoit]ControlSend("", "", "[CLASS:SciTEWindow]", "Irgendwelcher Text")
[/autoit]Es scheint den LDAP Service einzubinden, und dan einen neuen Benutzer anzulegen, oder wird da ein bestehenden Account kopiert???
Im ersten Schritt werden die Attribute eines bestehenden Kontos abgefragt. Im Folgenden wird dann ein neues Konto erstellt und die Attribute werden zugewiesen.
Hab das aus meiner wsh-Skript Sammlung mal in AutoIt umgesetzt. Hier mal das Original, ist aber nicht allgemein, sondern mit Bsp.-Daten:
Set objCompt = _
GetObject("LDAP://cn=Computers,dc=NA,dc=fabrikam,dc=com")
Set objComptCopy = objCompt.Create("computer", "cn=SEA-SQL-01")
objComptCopy.Put "sAMAccountName", "sea-sql-01"
objComptCopy.SetInfo
Set objComptTemplate = GetObject _
("LDAP://cn=SEA-PM-01,cn=Computers,dc=NA,dc=fabrikam,dc=com")
arrAttributes = Array("description", "location")
For Each strAttrib in arrAttributes
strValue = objComptTemplate.Get(strAttrib)
objComptCopy.Put strAttrib, strValue
Next
objComptCopy.SetInfo
Alles anzeigen