Beiträge von Bitnugger
-
-
Danke, jetzt fehlt mir noch eine Idee, wie ich bei einer GUI unterscheiden kann, ob der User Esc oder das X oben rechts gedrückt hat, da $GUI_EVENT_CLOSE bei beiden = True ist.
ESC kannst du evtl. mit @HotKeyPressed oder mit Execute('@HotKeyPressed') ermitteln.
Wenn oben rechts das X gedrückt wurde, bekommst du die Message $GUI_EVENT_CLOSE, und dann kommt es darauf an, wie du darauf reagierst:
- ExitLoop ? dann ist der Exit-Mode = $EXITCLOSE_NORMAL
- Exit ? dann ist der Exit-Mode = $EXITCLOSE_BYEXIT
glaube ich zumindest...
-
Heißes Teil! Funktioniert soweit. Mal sehen, wie es sich Performance-mäßig schlägt.
Ja, ist in der Tat ein heißes Teil... könnte man ja noch etwas perverser... so dass alle Keywords von AutoIt...
Wenn du mit den vielen RegExen fertig bist, kannst du dann eine Art "Sammlung von RegExen zum parsen von AutoIt" veröffentlichen?
Das kann man sicher für irgendetwas gebrauchen
Ja, gute Idee... und evtl. auch alle in einem Pack als Zip-Archiv.
-
Da ich aber sowohl bei normalem Beenden wie auch bei Logoff in die gleiche Terminate-Funktion springe und dort @exitMethod abfrage, bekomme ich bei "normalem" Ende einen Fehler wegen der nicht existierenden @exitMethod (genau verstanden habe ich das allerdings nicht).
Das Makro @exitMethod in der Terminate-Funktion ist nur dann verfügbar, wenn die Funktion von OnAutoItExitRegister aufgerufen wird und dies passiert nur dann, wenn eine der Exit-Mode-Bedingungen erfüllt ist.
Springst du von anderer Stelle in diese Funktion, dann gibt es das Makro nicht, weil dann keine der Exit-Mode-Bedingungen erfüllt ist. Anstatt also die Terminate-Funktion direkt aufzurufen, könntest du einfach ein Exit machen, wodurch die Funktion dann auch aufgerufen wird und dann auch das Makro verfügbar ist.
Testen ob das Makro existiert könnte man z.B. so:
AutoIt
Alles anzeigenOnAutoItExitRegister('_Exit') _Exit() Exit Func _Exit() Local $vExit = Execute('@exitMethod') ConsoleWrite('- $vExit = "' & $vExit & '"' & @CRLF) Select Case $vExit == '' ConsoleWrite('! Das Makro @exitMethod existiert nicht!' & @CRLF) Case $vExit = $EXITCLOSE_NORMAL ConsoleWrite('> @exitMethod = $EXITCLOSE_NORMAL' & @CRLF) Case $vExit = $EXITCLOSE_BYEXIT ConsoleWrite('> @exitMethod = $EXITCLOSE_BYEXIT' & @CRLF) Case $vExit = $EXITCLOSE_BYCLICK ConsoleWrite('> @exitMethod = $EXITCLOSE_BYCLICK' & @CRLF) Case $vExit = $EXITCLOSE_BYLOGOFF ConsoleWrite('> @exitMethod = $EXITCLOSE_BYLOGOFF' & @CRLF) Case $vExit = $EXITCLOSE_BYSHUTDOWN ConsoleWrite('> @exitMethod = $EXITCLOSE_BYSHUTDOWN' & @CRLF) EndSelect EndFunc
Das ist mbMn. aber kein guter Programmierstil...
-
Was du suchst nennt sich AppBar.
Hier ein kleines Example:
AutoIt
Alles anzeigen;-- TIME_STAMP 2020-06-29 19:51:01 v 0.1 #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> Opt("MustDeclareVars", 1) Global Const $ABE_RIGHT = 2, $ABM_NEW = 0, $ABM_REMOVE = 1, $ABM_SETPOS = 3 Global $hWnd, $tAppBarData _Main() Func _Main() ; Create the GUI Local $title = StringTrimRight(@ScriptName, 4) Local $toolbarWidth = 40 Local $height = @DesktopHeight-40 Local $left = @DesktopWidth-$toolbarWidth Local $top = 0 Local $right = @DesktopWidth Local $bottom = $height $hWnd = GUICreate($title, $toolbarWidth, $height, $left, $top, $WS_POPUPWINDOW, $WS_EX_TOOLWINDOW) Local $idBtn_1 = GUICtrlCreateButton('Test', 0, 0, 40, 25) Local $idBtn_2 = GUICtrlCreateButton('Exit', 0, 25, 40, 25) GUISetState() ; Register the AppBar $tAppBarData = DllStructCreate("dword;int;uint;uint;int;int;int;int;int") DllStructSetData($tAppBarData, 1, DllStructGetSize($tAppBarData)) DllStructSetData($tAppBarData, 2, $hWnd) DllStructSetData($tAppBarData, 4, $ABE_RIGHT) DllStructSetData($tAppBarData, 5, $left) DllStructSetData($tAppBarData, 6, $top) DllStructSetData($tAppBarData, 7, $right) DllStructSetData($tAppBarData, 8, $bottom) _SHAppBarMessage($ABM_NEW, $tAppBarData) _SHAppBarMessage($ABM_SETPOS, $tAppbarData) OnAutoItExitRegister('_Exit') ; Idle around While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE, $idBtn_2 Exit Case $idBtn_1 GUISetBkColor(Random(0, 0xFFFFFF, 1), $hWnd) EndSwitch WEnd EndFunc Func _ShAppBarMessage($dwMessage, ByRef $tAppBarData) DllCall("shell32.dll", "int", "SHAppBarMessage", "int", $dwMessage, "ptr", DllStructGetPtr($tAppBarData)) EndFunc Func _Exit() ; Unregister the AppBar _SHAppBarMessage($ABM_REMOVE, $tAppBarData) ; Delete the GUI GUIDelete($hWnd) EndFunc
-
Das kannst du mit OnAutoItExitRegister machen.
-
-
Da ich mein SciTE auf UTF-8 umgestellt habe, rufe ich via Ownhotkeys ein Script auf, dass mir das Script, das in SciTE im aktuellen Tab angezeigt wird, nach UTF-8 konvertiert.
Gestern ist mir aufgefallen, dass die shell.dll (File/Product version : 1.5.0.0 / 1.5.0.0), die ich zum Starten des Scripts benutze, das Script nicht findet, wenn der Pfadname länger als 141 Zeichen ist, bzw. die Gesamtlänge der Befehlszeile > 270 Zeichen ist.
sCmd = "C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /AutoIt3ExecuteScript "f:\AutoIt\AutoIt3_Tools\_ConvertFileToUTF8.au3" "M:\Temp\Test_01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234.au3"
shell.exec(sCmd) -- funktioniert nicht, weil sCmd > 270 Zeichen!
sCmd = "C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /AutoIt3ExecuteScript "f:\AutoIt\AutoIt3_Tools\_ConvertFileToUTF8.au3" "M:\Temp\Test_0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123.au3"
shell.exec(sCmd) -- funktioniert, weil sCmd <= 270 Zeichen!
Ich habe zwei Versionen der shell.dll, die allerdings beide File/Product version : 1.5.0.0 / 1.5.0.0 haben:
shell_1.zip 133.120 KB
shell_2.zip 35.328 KB
Leider ist der Link zur shell.dll und auch zum Quellcode nicht mehr aktuell... und hier wird auch nur die Version 1.2 angezeigt: https://scite-ru.bitbucket.io/pack/tools/LuaLib/shell.html
Hat evtl. jemand den Quellcode der shell.dll?
-
Ich habe hier zwei Scripts für euch...
ScanArpCache.au3 - ist von mir und erfordert erhöhte Rechte für das Löschen des Arp-Cache!
Examples:
ScanArpCache.exe <MAC-Address>|<HostName>|<IP-Address> [<Wait>]
ScanArpCache.exe <SubNet> [<Start>] [<End>] [<Wait>]
arpscan.au3 - erste Version ist von SoulA, hier aber die von mir geänderte Version von dexto und diese erfordert keine erhöhten Rechte!
Zusätzlich benötigt wird (ist aber alles im Archiv arpscan.zip enthalten):
winpcapau3.zip - Hiervon wird die winpcap.au3 von arpscan.au3 als include geladen.
npcap-0.9994.exe - Packet capture library for Windows - um (ARP-)Pakete mitlesen zu können, muss installiert werden, damit arpscan.au3 funktioniert.
Alle nötigen Links sind in arpscan.au3 enthalten.
PS: Habe winpcap.au3 entpackt und ein paar Zeilen geändert, das Archiv winpcapau3.zip ist aber original.
Examples:
arpscan.exe 192.168.1.1
arpscan.exe 192.168.1.1-192.168.1.10
Und so ne Schleife über alle IPs ist auch in AutoIt schnell gebastelt - nur halt unheimlich langsam.
In ScanArpCache.au3 habe ich das so gelöst:
AutoIt; Sorgt dafür, dass die angepingten IPs inkl. MAC im ARP-Cache landen, wenn das Gerät erreichbar ist. Func _PingSubNet($sSubNet, $iStart = 1, $iEnd = 254, $iWait = 0) RunWait(@ComSpec & StringFormat(' /C FOR /L %%L IN (%i,1,%i) DO @ping >nul -4 -n 1 -w %i %s.%%L', $iStart, $iEnd, $iWait, $sSubNet), '', @SW_HIDE) EndFunc ;==>_PingSubNet
-
Bist du sicher?
Ziemlich...
arp -a Zeigt aktuelle ARP-Einträge durch Abfrage der Protokoll-Daten an.
Arp-Cache löschen: arp -d
arp -d funktioniert nicht ohne einen zweiten Parameter.
So...
arp -d Inet-Adr.
oder so...
arp -d *
Aktuelle Einträge (arp -a) zu löschen macht wenig Sinn, da sich diese bei der nächsten Abfrage mit arp -a (ohne vorheriges Ping) wieder im Cache befinden.Ein Ping auf die Broadcast-Adresse des Subnetzes
Das wäre natürlich sehr bequem, doch leider mit hoher Wahrscheinlichkeit nicht erfolgreich... ein Ping an jeden Host im Subnetz zu senden, ist sicherer.
-
Ich hatte ja das Gefühl, dass "_WD_Loadwait($sSession)" nicht funktioniert...
Kontrolliere doch einfach, was _WD_Loadwait zurückgibt:
AutoItLocal $hTimer = TimerInit() Local $iLoadWait = _WD_Loadwait($sSession) ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & " var: $iLoadWait --> " & $iLoadWait & @LF & "!@ " & @TAB & "#Error: " & @error & @LF) ; 1 (Success) ConsoleWrite('! ********************************************************* DiffTime --> ' & TimerDiff($hTimer) & @CRLF) ; 16.6406 ms
-
Ob And aber (in AutoIt) eine höhere Priorität als Or besitzt, da bin ich mir nicht so sicher.
Laut Operatoren liegen sie auf der gleichen Prioritätsebene.
Code
Alles anzeigenWenn mehr als ein Operator in einem Ausdruck verwendet werden, bestimmt die Operatorpriorität die Reihenfolge der Verwendung. Die Priorität, die in AutoIt verwendet wird, ist weiter unten aufgelistet. Wenn zwei Operatoren die gleiche Priorität besitzen, wird der Ausdruck von links nach rechts ausgewertet. Von der höchsten zur niedrigsten Priorität: NOT ^ * / + - & < > <= >= = <> == And Or
And und Or haben also dieselbe Priorität...
ist es also zu betrachten wie in der Mathematik Punkt vor Strich Klammer zuerst? In diesem Fall And vor Or Klammer zuerst?
Ja, genau wie in der Mathematik... nur musst du in AutoIt die Regeln beachten, die für die Operatoren festgelegt wurden und mit runden Klammern kannst du erzwingen, dass die darin enthaltenen Ausdrücke vorrangig ausgewertet werden.
-
Und proc GetProcessByPID wird nicht verwendet...
Sehr schön!
-
Mein akteuelles Problem dabei ist, das ich gerade nicht wirklich weis, wie ich auf die Buttons auf der Seite: spreadshirt.de/designs klicken soll, da mir die "Element untersuchen" keinen Namen oder keine ID ausgibt.
Dann solltest du dir evtl. mal das web developer addon für Firefox oder Chrome installieren..
-
Local $iRc = Run( $javarun )
Versuche es mal so:
AutoIt
Alles anzeigenLocal $Bildchen = 'Bildchen.jpg' Local $Gesamt = 'Gesamt.txt' Local $javarun $javarun = "java -jar \\nas2\bs\Netzteam\RSASofttoken\TokenConverter.jar \\nas2\bs\Netzteam\RSASofttoken\SDTID\" & $Gesamt & " -ios -qr -o \\nas2\bs\Netzteam\RSASofttoken\QRCode\" & $Bildchen ConsoleWrite("$javarun --> " & $javarun & @LF) ; $javarun --> java -jar \\nas2\bs\Netzteam\RSASofttoken\TokenConverter.jar \\nas2\bs\Netzteam\RSASofttoken\SDTID\Gesamt.txt -ios -qr -o \\nas2\bs\Netzteam\RSASofttoken\QRCode\Bildchen.jpg ; Bei sehr langen Befehlszeilen mache ich es auch gerne so... Local $TokenConverter = '\\nas2\bs\Netzteam\RSASofttoken\TokenConverter.jar' Local $SDTID = '\\nas2\bs\Netzteam\RSASofttoken\SDTID\' & $Gesamt Local $QRCode = '\\nas2\bs\Netzteam\RSASofttoken\QRCode\' & $Bildchen $javarun = StringFormat('java -jar "%s" "%s" -ios -qr -o "%s"', $TokenConverter, $SDTID, $QRCode) ConsoleWrite("$javarun --> " & $javarun & @LF) ; $javarun --> java -jar "\\nas2\bs\Netzteam\RSASofttoken\TokenConverter.jar" "\\nas2\bs\Netzteam\RSASofttoken\SDTID\Gesamt.txt" -ios -qr -o "\\nas2\bs\Netzteam\RSASofttoken\QRCode\Bildchen.jpg" ; Local $iPID = Run(@ComSpec & " /c " & $javarun) ; /C Führt den Befehl in der Zeichenfolge aus und endet dann. Local $iPID = Run(@ComSpec & " /k " & $javarun) ; /K Führt den Befehl in der Zeichenfolge aus und endet dann nicht.
-
Und obwohl es quasi der gleiche Datentyp ist, musst Du immer hin- und her casten.
Und wenn du dann eine Kleinigkeit am Script änderst, noch ein include oder import machst, kannst du dann evtl. auch wieder an zig Stellen Hand anlegen...hatte ich bei deinem BassTest.
Musste QWORD zu bass.QWORD ändern, weil die Bezeichnung nicht mehr eindeutig war.
Also das mit der Benutzung der Farben hier mit dem Forumseditor ist ja mega-ätzend... wieso behält der die zuletzt gewählte Farbe krampfhaft bei, obwohl ich sie im Menü abgewählt habe?
-
So geht's:
Guter Mann!
-
Passiert das bei euch ebenso?
Jeep... bei mir auch.
Code
Alles anzeigeninclude winim/[inc\winuser] var h = GetForegroundWindow() lpr: LPRECT h = sEnumWnd[29].hwnd echo "type(h) = ", type(h) echo "type(lpr) = ", type(lpr) if IsWindow(h) == windef.TRUE: echo "Is Window! -> ", h if GetWindowRect(h, lpr) == windef.TRUE: echo "Success RECT!" else: echo "Failure RECT!" if GetLastError() == 1400: echo "ERROR_INVALID_WINDOW_HANDLE" else: echo "Is not a Window!"
-
-
Hier mal meine Variante mit EnumDesktopWindows() - aber ich vertraue den Werten nicht.
So bekommst du nur die Windows vom primären Desktop/Monitor. Veschiebe ich Notepad++ auf einen anderen Monitor, taucht es nicht mehr in der Liste auf.
Womöglich sind die Windows von Firefox aber auch Marke Eigenbau...