Das klingt fast so, als ob der Controller im USB-Stick einen Cache o.ä. nutzt und deshalb die Datei dort löscht (wie es ein USB-Stick nunmal kann) und dann erst den Löschbefehl an die SD-Karte weitergibt, die den vermutlich einfach ignoriert.
Da entsteht also vmtl. der Unterschied zwischen USB-Stick Cache und SD-Karte.
Wenn du im rechtsklick menü den Explorer aktualisiert könnte es sein, dass es aktualisiert wird, vllt. aber auch nicht. Musst du ausprobieren. Wenn es nicht hilft würde ich auf einen Cache im USB-Stick tippen, was du nicht wirklich ändern kannst.
Beiträge von Kanashius
-
-
Der Vorschlag von Moombas mit Stringsplit macht ja im Grunde nichts anderes als den String des Indexes in 2 Teile zu zerlegen und diese dann zum gleichen Shellexecutebefehl wie oben zusammenzusetzen...Nein, da ist ein großer Unterschied.
ShellExecute ist eine Funktion, die mehrere Parameter nimmt: 1. Den Dateinamen der auszuführenden Datei, 2. Parameter die übergeben werden sollen, 3. Das Arbeitsverzeichnis (der Ordner, von dem alle relativen Pfade im ausgeführten Programm ausgehen),...
Wenn du im Code ShellExecute("eventvwr.exe", "/v:""C:\ProgramData\Microsoft\Event Viewer\Views\View_1.xml""") ausführst ist der 1. Parameter: "eventvwr.exe" und der 2. Parameter: "/v:""C:\ProgramData\Microsoft\Event Viewer\Views\View_1.xml"""
Es wird also die Executable "eventvwr.exe" ausgeführt.
Wenn du aber Shellexecute($aArray[9]) mit $aArray[9]="eventvwr.exe", "/v:""C:\ProgramData\Microsoft\Event Viewer\Views\View_1.xml""" ausführst, entspricht der 1. Parameter: "eventvwr.exe", "/v:""C:\ProgramData\Microsoft\Event Viewer\Views\View_1.xml"""
Es wird also versucht, die Executable "eventvwr.exe", "/v:""C:\ProgramData\Microsoft\Event Viewer\Views\View_1.xml""" auszuführen, aber es gibt natürlich keine Datei mit dem Namen, kann es auch garnicht, weil bestimmte Zeichen gar nicht erlaubt wären.
Nur weil du die Ausgabe als String genauso aussehen lässt, heißt das noch lange nicht, dass der Code auch genauso aussieht und es das Gleiche ist.Du musst also irgendwie aus deinem $aArray[9] zwei Variablen bekommen, damit du eine als executable für Parameter 1 nehmen kannst und die andere für Parameter 2.
Das ist es, was Moombas mit dem StringSplit versucht hat. Wobei das vermutlich nicht funktioniert hat, weil bei "eventvwr.exe" die Anführungszeichen mit geschickt werden.
Aber dafür könnte man sich ja mal mit _ArrayDisplay(StringSplit($aArray[9], ', ', BitOr(1,2))) (benötigt #include <Array.au3>) anschauen, was in dem StringSplit genau rauskommt und ggf. noch die Anführungszeichen entfernen (StringLeft/StringRight/StringMid). -
Auch wenn reguläre Ausdrücke gerade für Anfänger schwerer sind, würde ich sie hier verwenden. Sie sind meiner Meinung nach die beste/einfachste Möglichkeit, sicherzustellen, dass ein Input genauso aussieht, wie man das will und im Zweifel ein Fehler geworfen wird.
AutoIt
Alles anzeigen; #include <Array.au3> Local $arData = ["report_2023_final.txt", "log_2023_backup.zip", "log_2023_final_backup.zip", "log_2023_unknown.zip", "log_2023.zip", "log.zip", "log", "final", "other.txt"] Local $mData[] For $i=0 to UBound($arData)-1 Step 1 ; Array => 0: Full match, 1: type (report/log) (required), 2: year (or empty), 3+: other additions (e.g. final/backup), last: file extension Local $arSplit = StringRegExp($arData[$i], "(?|(report)|(log))(?:_(\d{4}))?(?:_)?((?:(?:_)?[a-zA-Z0-9]+)*)?\.(\S+)", 2) If @error Then ConsoleWrite("Error matching: "&$arData[$i]&@crlf) ContinueLoop EndIf ; _ArrayDisplay($arSplit) Local $mEntry[] $mEntry["path"] = $arSplit[0] $mEntry["type"] = $arSplit[1] If $arSplit[2]<>"" Then $mEntry["year"] = $arSplit[2] If $arSplit[3]<>"" Then Local $arAddSplit = StringSplit($arSplit[3], "_", 1+2) For $j=0 to UBound($arAddSplit)-1 Step 1 Switch $arAddSplit[$j] Case "final" $mEntry["final"] = True Case "backup" $mEntry["backup"] = True Case Else ConsoleWrite("Error with addition: "&$arAddSplit[$j]&" >> found in "&$arData[$i]&@crlf) ContinueLoop 2 EndSwitch Next EndIf $mEntry["ext"] = $arSplit[UBound($arSplit)-1] MapAppend($mData, $mEntry) Next #cs ; Output for debugging For $sKey in MapKeys($mData) Local $mTmp = $mData[$sKey] ConsoleWrite($sKey&": "&$mTmp.path&@crlf) ConsoleWrite(@TAB&"Type: "&$mTmp.type&@crlf) If MapExists($mTmp, "year") Then ConsoleWrite(@TAB&"Year: "&$mTmp.year&@crlf) If MapExists($mTmp, "final") Then ConsoleWrite(@TAB&"Final: "&$mTmp.final&@crlf) If MapExists($mTmp, "backup") Then ConsoleWrite(@TAB&"Backup: "&$mTmp.backup&@crlf) If MapExists($mTmp, "ext") Then ConsoleWrite(@TAB&"Extension: "&$mTmp.ext&@crlf) Next #ce For $sKey in MapKeys($mData) Local $mEntry = $mData[$sKey] Local $sFilenameNew = "" If MapExists($mEntry, "backup") Then $sFilenameNew &= "backup_" $sFilenameNew &= $mEntry.type If MapExists($mEntry, "final") Then $sFilenameNew &= "_final" If MapExists($mEntry, "year") Then $sFilenameNew &= "_"&$mEntry.year $sFilenameNew &= "."&$mEntry.ext ConsoleWrite("Copy: "&$mEntry.path&" >> "&$sFilenameNew&@crlf) ; FileMove($mEntry.path, $sFilenameNew, BitOR(0,8)) ; If @error Then ConsoleWrite("Copy failed: "&$mEntry.path&" >> "&$sFilenameNew&" >> "&@error&":"&@extended&@crlf) Next
Hier bin ich bei dem Ausdruck (?|(report)|(log))(?:_(\d{4}))?(?:_)?((?:(?:_)?[a-zA-Z0-9]+)*)?\.(\S+) davon ausgegangen, dass am Anfang immer der Typ der Datei steht (report/log/...); (optional) gefolgt von einem Jahr; (optional) gefolgt von Zusätzen, wie backup/final/... (mit _ getrennt) und am Ende der Dateiendung.
Wenn irgendetwas anderes auftaucht, wird ein Fehler ausgegeben und die Datei ignoriert (nicht kopiert/verschoben/gelöscht/...).
Gerade bei wichtigen Dateien würde ich aber immer auf einer Kopie arbeiten. Sind es zu viele Dateien um alle zu kopieren würde ich erst mit Teilen davon arbeiten und Testen und sicherstellen, dass alle Möglichkeiten abgedeckt sind.Falls du noch Fragen hast, stell sie gerne
-
-
Da alles "Offline" ist, ist es ja bereits auf deinem PC, du musst nur schauen, wo.
Auf die schnelle konnte ich zum EM Client folgendes finden:
In "C:\Users\<USERNAME>\AppData\Roaming\eM Client" ist eine SQLite Database Datei, die alle Daten beinhaltet. (Ich hab nicht weiter geschaut, aber die Dateien sind dort als BLOB drin, oder vmtl. als extra Dateien irgendwo in dem gleichen Ordner). Ggf. musst du die Dateinamen aus der SQLite Database bekommen. Aber das gibt dir auch die Möglichkeit die PDFs z.B. nach Kontakt,... zu sortieren.
(Während des Zugriff auf die SQLite Database sollte EM Client geschlossen sein)Alternativ: Menu > Tools > Settings > General > Backup
Dort müsste ja vermutlich auch alles drin sein (weiß nicht, wie es mit Anhängen,... aussieht). Kannst ja mal in die dabei generierten Daten schauen.Das dürfte beides deutlich einfacher/schneller/zuverlässiger funktionieren, als die GUI zu automatisieren.
-
Naja... basierend auf diesem Artikel von gestern würde ich sagen: Lass den SmartTV garnicht ans Internet und nutze nur HDMI zuspieler...
Moderne Datenkraken: Smart-TVs tracken sogar HDMI-InhalteSmart-TVs werten sogar dann Bildinhalte aus, wenn ein HDMI-Zuspieler genutzt wird. Die Analysen dienen gezielter Werbung.www.heise.deEcht ne Frechheit, was mittlerweile alles gemacht/überwacht/ausspioniert wird (oft für Werbung),...
-
In Firefox kannst du mit der Tastenkombination CTRL+w ein einzelnes Tab schließen. (Achtung: Das w muss KLEIN sein, ansonsten wird das Fenster geschlossen (CTRL+SHIFT+W)).
Deshalb kannst du mit diesem Code ein einzelnes Tab schließen (Ich hab die Kombination nach 5 Sekunden im Aktiven Fenster gesendet, das kannst du aber an deinen Fenstertitel anpassen):
-
Du wolltest den ToolTip ja auf dem ListItem haben:
Du kannst die Position und Größe des Items mit _GuiCtrlListBox_GetItemRect abfragen.Ich hab mal ein Beispiel erstellt. Dabei werden auch mehrere ToolTips hintereinander angezeigt, ohne dass die GUI blockiert.
Ich hab als alternative zu den Timern mal AdlibRegister genutzt.AutoIt
Alles anzeigen#include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include <ListBoxConstants.au3> #include <GUIListBox.au3> #include <WindowsConstants.au3> Example() Func Example() Local $mGuiData[] Local $sMESSAGE = "||" $mGuiData.hGui = GUICreate("My GUI list") ; will create a dialog box that when displayed is centered $mGuiData.idList = GUICtrlCreateList("", 64, 32, 121, 97, BitOR($WS_VSCROLL, $LBS_USETABSTOPS)) GUICtrlSetLimit(-1, 200) ; to limit horizontal scrolling GUICtrlSetData(-1, "||") GUICtrlSetData(-1, "1. Item") $mGuiData.idButtonClose = GUICtrlCreateButton("my closing button", 64, 160, 175, 25) $mGuiData.idButtonToolTip = GUICtrlCreateButton("show tooltips", 64, 200, 175, 25) GUISetState(@SW_SHOW) _showTooltips($mGuiData) ; Loop until the user exits. While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $mGuiData.idButtonClose MsgBox($MB_SYSTEMMODAL, "", "the closing button has been clicked", 2) Exit Case $mGuiData.idButtonToolTip _showTooltips($mGuiData) EndSwitch WEnd EndFunc ;==>Example Func _showTooltips(ByRef $mGuiData, $bContinue = False) Local Static $iCurrent = 0 Local Static $mData If $mGuiData<>Default Then $mData = $mGuiData If Not $bContinue Then $iCurrent = 0 Switch $iCurrent Case 0 ; first toolbar Local $arPos = _GuiCtrlListBox_GetGlobalItemPos($mData.idList, 1) _showToolTip($arPos[0] + ($arPos[2]*0.2), $arPos[1] + ($arPos[3]*0.9), "Listview item", 5) Case 1 ; second toolbar Local $arPos = _windowGetPos(GUICtrlGetHandle($mData.idButtonClose)) _showToolTip($arPos[0] + ($arPos[2]/2), $arPos[1] + ($arPos[3]/2), "Close button", 3) Case 2 ; ... Case Else ; Done EndSwitch $iCurrent += 1 EndFunc Func _windowGetPos($hGui) Local $tagRect = _WinAPI_GetWindowRect($hGui) Local $arPos = [DllStructGetData($tagRect, 1), DllStructGetData($tagRect, 2), DllStructGetData($tagRect, 3) - DllStructGetData($tagRect, 1), DllStructGetData($tagRect, 4) - DllStructGetData($tagRect, 2)] Return $arPos EndFunc Func _GuiCtrlListBox_GetGlobalItemPos($idList, $iIndex) Local $arCtrlPos = _windowGetPos(GUICtrlGetHandle($idList)) Local $arItemPos = _GUICtrlListBox_GetItemRect($idList, 1) Local $arRes = [$arCtrlPos[0]+$arItemPos[0], $arCtrlPos[1]+$arItemPos[1], $arItemPos[2]-$arItemPos[0], $arItemPos[3]-$arItemPos[1]] Return $arRes EndFunc Func _showToolTip($x, $y, $sMessage, $iTimeS, $sTitle = "INFO", $iIcon = 1, $iOptions = 1) ToolTip($sMessage, $x, $y, $sTitle, $iIcon, $iOptions) AdlibRegister("_hideToolTip", $iTimeS*1000) EndFunc Func _hideToolTip() ToolTip("") AdlibUnRegister("_hideToolTip") Local $oTmp = Default _showTooltips($oTmp, True) EndFunc
-
Duckduckgo: Draw on maps: https://www.scribblemaps.com/create#/lat=51…02&z=7&t=hybrid
Hab ich grad getestet, da kann man recht leicht Kreise mit bestimmter größe zeichnen -
Zitat
Aber zu der Rust-Dll-Geschichte: Eh ich erst einmal selbst wieder auf Recherchejagd gehe: Hast du da vielleicht gleich online Dokus wie man mit Rust entsprechende Dlls erstellt und evtl. sogar in AutoIt per MemCall einbindet?
Ich hab für die QRCode UDF (QRCode UDF) mit Rust einen .dll erstellt. Wenn ich UEZ richtig verstanden habe, dann müsstest du die Base64 encoden und kannst die dann mit MemCall laden?
Was du auf der Rustseite machen musst:
Cargo.toml ([lib] section, damit eine windows .dll erstellt wird; [profile.release] kram ist für das optimizationlevel => kleinere Dateigröße):
Code als C markieren (Damit structs, functions,... wie in C angelegt werden und kompatibel sind) e.g.:
Code#[repr(C)] pub struct QRCode { pub something: u8, // ... } #[no_mangle] pub extern "C" fn EncodeText(input: *const u8, size: u32, ecl: u8, result: *mut QRCode) -> u8 { /* ... */}
Mit target und als release kompilieren (beim erstenmal kann nen fehler kommen, dass du alles fürs build für das target erst installieren musst (je nachdem, auf was für einem system du bist), der command steht da aber auch direkt):
Codex86: cargo build --target=x86_64-pc-windows-msvc --release x64: cargo build --target=i686-pc-windows-msvc --release
Das sollte eigentlich alles sein
-
Hi, ich kenn mich mit Assembler in AutoIt nicht so gut aus, nutze aber im moment Rust gerne und dachte mir, dass die Sprache doch sehr optimiert sein soll.
Mit den passenden Parametern hab ich das ganze auf 8KB (x86) / 9KB (x64) bekommen und die Funktionen sind in Assembly auch deutlich kürzer, als dass was ich bei UEZ bei Freebasic sehe.
Weiß aber leider nicht, wie man das mit AutoIt ausführt und ob der Code so funktioniert
x86:Code
Alles anzeigen; =============== S U B R O U T I N E ======================================= public sum_double sum_double proc near ; DATA XREF: .rdata:off_10002508↓o var_8 = qword ptr -8 arg_0 = dword ptr 8 arg_4 = dword ptr 0Ch push ebp mov ebp, esp and esp, 0FFFFFFF8h sub esp, 8 mov eax, [ebp+arg_4] test eax, eax jz short loc_1000102C mov ecx, [ebp+arg_0] xorpd xmm0, xmm0 mov ecx, [ecx] nop dword ptr [eax+00000000h] loc_10001020: ; CODE XREF: sum_double+28↓j addsd xmm0, qword ptr [ecx] add ecx, 8 dec eax jnz short loc_10001020 jmp short loc_10001030 loc_1000102C: ; CODE XREF: sum_double+E↑j xorpd xmm0, xmm0 loc_10001030: ; CODE XREF: sum_double+2A↑j movsd [esp+8+var_8], xmm0 fld [esp+8+var_8] mov esp, ebp pop ebp retn sum_double endp ; =============== S U B R O U T I N E ======================================= public sum_float sum_float proc near ; DATA XREF: .rdata:off_10002508↓o var_4 = dword ptr -4 arg_0 = dword ptr 4 arg_4 = dword ptr 8 push eax mov eax, [esp+4+arg_4] test eax, eax jz short loc_10001074 mov ecx, [esp+4+arg_0] xorps xmm0, xmm0 mov ecx, [ecx] nop word ptr cs:[eax+eax+00000000h] nop dword ptr [eax+00h] loc_10001060: ; CODE XREF: sum_float+28↓j addss xmm0, dword ptr [ecx] add ecx, 4 dec eax jnz short loc_10001060 movss [esp+4+var_4], xmm0 fld [esp+4+var_4] pop eax retn loc_10001074: ; CODE XREF: sum_float+7↑j xorps xmm0, xmm0 movss [esp+4+var_4], xmm0 fld [esp+4+var_4] pop eax retn sum_float endp
x64:
Code
Alles anzeigen; =============== S U B R O U T I N E ======================================= public sum_double sum_double proc near ; DATA XREF: .rdata:off_1800027D8↓o test edx, edx jz short loc_18000101D mov rcx, [rcx] mov r8d, edx mov eax, r8d and eax, 7 cmp edx, 8 jnb short loc_180001021 xorpd xmm0, xmm0 xor edx, edx jmp short loc_180001068 loc_18000101D: ; CODE XREF: sum_double+2↑j xorps xmm0, xmm0 retn loc_180001021: ; CODE XREF: sum_double+13↑j and r8d, 0FFFFFFF8h xorpd xmm0, xmm0 xor edx, edx nop dword ptr [rax+rax+00h] loc_180001030: ; CODE XREF: sum_double+66↓j addsd xmm0, qword ptr [rcx+rdx*8] addsd xmm0, qword ptr [rcx+rdx*8+8] addsd xmm0, qword ptr [rcx+rdx*8+10h] addsd xmm0, qword ptr [rcx+rdx*8+18h] addsd xmm0, qword ptr [rcx+rdx*8+20h] addsd xmm0, qword ptr [rcx+rdx*8+28h] addsd xmm0, qword ptr [rcx+rdx*8+30h] addsd xmm0, qword ptr [rcx+rdx*8+38h] add rdx, 8 cmp r8, rdx jnz short loc_180001030 loc_180001068: ; CODE XREF: sum_double+1B↑j test rax, rax jz short locret_18000108D lea rcx, [rcx+rdx*8] xor edx, edx db 66h, 66h, 66h, 66h, 2Eh nop word ptr [rax+rax+00000000h] loc_180001080: ; CODE XREF: sum_double+8B↓j addsd xmm0, qword ptr [rcx+rdx*8] inc rdx cmp rax, rdx jnz short loc_180001080 locret_18000108D: ; CODE XREF: sum_double+6B↑j retn sum_double endp ; =============== S U B R O U T I N E ======================================= public sum_float sum_float proc near ; DATA XREF: .rdata:off_1800027D8↓o test edx, edx jz short loc_1800010AC mov rcx, [rcx] mov r8d, edx mov eax, r8d and eax, 7 cmp edx, 8 jnb short loc_1800010B0 xorps xmm0, xmm0 xor edx, edx jmp short loc_1800010F8 loc_1800010AC: ; CODE XREF: sum_float+2↑j xorps xmm0, xmm0 retn loc_1800010B0: ; CODE XREF: sum_float+13↑j and r8d, 0FFFFFFF8h xorps xmm0, xmm0 xor edx, edx nop dword ptr [rax+00000000h] loc_1800010C0: ; CODE XREF: sum_float+66↓j addss xmm0, dword ptr [rcx+rdx*4] addss xmm0, dword ptr [rcx+rdx*4+4] addss xmm0, dword ptr [rcx+rdx*4+8] addss xmm0, dword ptr [rcx+rdx*4+0Ch] addss xmm0, dword ptr [rcx+rdx*4+10h] addss xmm0, dword ptr [rcx+rdx*4+14h] addss xmm0, dword ptr [rcx+rdx*4+18h] addss xmm0, dword ptr [rcx+rdx*4+1Ch] add rdx, 8 cmp r8, rdx jnz short loc_1800010C0 loc_1800010F8: ; CODE XREF: sum_float+1A↑j test rax, rax jz short locret_18000111D lea rcx, [rcx+rdx*4] xor edx, edx db 66h, 66h, 66h, 66h, 2Eh nop word ptr [rax+rax+00000000h] loc_180001110: ; CODE XREF: sum_float+8B↓j addss xmm0, dword ptr [rcx+rdx*4] inc rdx cmp rax, rdx jnz short loc_180001110 locret_18000111D: ; CODE XREF: sum_float+6B↑j retn sum_float endp
Code:
Code
Alles anzeigen#[repr(C)] pub struct Doubles { pub data: *mut f64, } #[repr(C)] pub struct Floats { pub data: *mut f32, } #[no_mangle] pub extern "C" fn sum_double(data: *mut Doubles, size: u32) -> f64 { unsafe { return std::slice::from_raw_parts((*data).data, size as usize).iter().sum(); } } #[no_mangle] pub extern "C" fn sum_float(data: *mut Floats, size: u32) -> f32 { unsafe { return std::slice::from_raw_parts((*data).data, size as usize).iter().sum(); } }
Cargo.toml (für die c-lib und die compiler einstellungen zur optimierung):
Code
Alles anzeigen[package] name = "float_sum" version = "0.1.0" edition = "2021" [lib] crate-type = ["cdylib"] [dependencies] [profile.release] codegen-units = 1 lto = "fat"
Vielleicht hilft euch das ja weiter (und ich hatte etwas Spaß mit den Compileroptionen rumzuspielen :D) -
Hi
Das war nur ein Beispiel, um die Geschwindigkeit der UDF (oft <100ms) zu zeigen.Für deine Frage:
In Zeile 112: Local $sText = "Current date and time: "&@YEAR&"/"&@MON&"/"&@MDAY&" "&@HOUR&":"&@MIN&":"&@SEC&":"&@MSEC das @MSEC am Ende entfernen
Und Zeile 133-139 Zeichnen das Viereck mit dem Sekundenzeiger
Es gibt aber einige Variablen, die dort verwendet werden und woanders deklariert/definiert werden,...
Sollte halt nur als Beispiel dienen, was alles möglich ist.
Steht übrigens auch alles als Kommentar im Code: (; ==> Bottom QRCode / ; draw the white rectangle in the middle of the qrcode / ; draw the line in the rectangle / ...)
MfG Kanashius -
Ich hatte gerade nen Moment und hab das ganze etwas umgeschrieben/verbessert:
- Ich hab die Dateien rausgenommen (bat/ps). Stattdessen werden die Scripte direkt mit RunWait ausgeführt => Kein unnötiges erstellen der Dateien jedesmal (Deine arme Festplatte :P)
- Ich hab alles mit Arrays umgesetzt => Nicht so viel duplizierer Code und neue Optionen für Browser, VPNs und Länder können mit einer Zeile am Anfang des Scripts hinzugefügt werden
(Könnte man theoretisch auch noch so ändern, dass man alles in einer Datei (z.B. Ini) definieren kann ohne jedesmall den Quellcode zu ändern => Zusätzlich: "nordvpn countries" listet alle verfügbaren Länder, "nordvpn status" könnte genutzt werden um auszulesen, welches Land gerade verbunden ist,... kannst mal mit "nordvpn help" schauen was alles geht )
- Das Fenster hat en paar Parameter in Zeile 21 => Breite, Höhe,... kann dort angepasst werden und alle Controls haben automatisch die passende größe
- Countries sind jetzt eine echte Liste, in der man auswählen kann => man sieht die letzte Auswahl nochAutoIt
Alles anzeigen#include <StaticConstants.au3> #include <GuiComboBox.au3> #include <GuiListView.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> Global $sNordVPNPath = "C:\Program Files\NordVPN\nordvpn" ; Browser name, Control id Global $arBrowsers = [["Firefox", 0], ["Opera", 0], ["Edge", 0], ["Chrome", 0], ["Tor", 0]] ; VPN-Name, Function called when changing the country/disconnecting Global $arVPNs = [["NordVPN", "_NordVPNSelectCountry"], ["OtherVPN", "_OtherVPNSelectCountry"]] ; For every Country: Name, command argument nordvpn, command argument othervpn,... Global $arCountries = [ _ ["Off", -1, -1], _ ["Kenya", "Kenya", Default], _ ["GBR", "United Kingdom", Default], _ ["Portugal", "Portugal", "Portugal"], _ ["Norwegen", "Norwegen", Default], _ ["Sweden", "Sweden", Default] _ ] Local $iNumberOfLines = (2+UBound($arBrowsers)+UBound($arCountries))+4 Local $iSpace = 10, $iCtrlHeight = 25, $iWidth = 200, $iHeight = $iSpace*(1+$iNumberOfLines)+$iCtrlHeight*$iNumberOfLines If $iHeight>(@DesktopHeight-50) Then $iHeight = @DesktopHeight-50 Local $hMainGui = GUICreate("VPN Selector", $iWidth, $iHeight) Local $iTop = $iSpace, $iCtrlWidth = $iWidth-$iSpace*2 GUICtrlCreateLabel("Default Browser selection", $iSpace, $iTop, $iCtrlWidth, $iCtrlHeight, $SS_CENTER) GUICtrlSetFont(-1, 10, 800) $iTop+=$iCtrlHeight+$iSpace For $i=0 To UBound($arBrowsers)-1 Step 1 $arBrowsers[$i][1] = GUICtrlCreateButton($arBrowsers[$i][0], $iSpace, $iTop, $iCtrlWidth, $iCtrlHeight) $iTop+=$iCtrlHeight+$iSpace Next GUICtrlCreateLabel("VPN selection", $iSpace, $iTop, $iCtrlWidth, $iCtrlHeight, $SS_CENTER) GUICtrlSetFont(-1, 10, 800) $iTop+=$iCtrlHeight+$iSpace Local $iComboVPNSelection = GUICtrlCreateCombo("", $iSpace, $iTop, $iCtrlWidth, $iCtrlHeight) For $i=0 To UBound($arVPNs)-1 Step 1 _GUICtrlComboBox_AddString(GUICtrlGetHandle($iComboVPNSelection), $arVPNs[$i][0]) Next _GUICtrlComboBox_SetCurSel(GUICtrlGetHandle($iComboVPNSelection), 0) $iTop+=$iCtrlHeight+$iSpace GUICtrlCreateLabel("Country selection", $iSpace, $iTop, $iCtrlWidth, $iCtrlHeight, $SS_CENTER) GUICtrlSetFont(-1, 10, 800) $iTop+=$iCtrlHeight+$iSpace Local $iCountryListView = GUICtrlCreateListView("Index|Country name", $iSpace, $iTop, $iCtrlWidth, $iHeight-$iTop-$iSpace) _GUICtrlListView_SetColumnWidth($iCountryListView, 0, 0) _GUICtrlListView_SetColumnWidth($iCountryListView, 1, $iCtrlWidth-5) _loadCountryList() GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") GUISetState(@SW_SHOW, $hMainGui) Global $iMsg While 1 $iMsg = GUIGetMsg() Switch $iMsg Case -3 Exit Case $iComboVPNSelection Local $iSelIndex = _GUICtrlComboBox_GetCurSel(GUICtrlGetHandle($iComboVPNSelection)) _loadCountryList($iSelIndex) Case $iCountryListView EndSwitch For $i=0 To UBound($arBrowsers)-1 Step 1 If $arBrowsers[$i][1]=$iMsg Then _selectDefaultBrowser($i) EndIf Next WEnd Func _loadCountryList($iIndexVPN = 0) _GUICtrlListView_BeginUpdate($iCountryListView) _GUICtrlListView_DeleteAllItems($iCountryListView) For $i=0 To UBound($arCountries)-1 Step 1 If $arCountries[$i][1+$iIndexVPN]<>Default Then Local $iIndex = _GUICtrlListView_AddItem($iCountryListView, $i) _GUICtrlListView_AddSubItem($iCountryListView, $iIndex, $arCountries[$i][0], 1) EndIf Next _GUICtrlListView_SetItemSelected($iCountryListView, 0) _GUICtrlListView_EndUpdate($iCountryListView) EndFunc Func _NordVPNSelectCountry($iCountryIndex = 0) Local $sCmd = "" If $iCountryIndex = 0 Then $sCmd = $sNordVPNPath&' --disconnect' Else Local $sCountry = $arCountries[$iCountryIndex][1] $sCmd = $sNordVPNPath&' -c -g "'&$sCountry&'"' EndIf ;ConsoleWrite($sCmd&@crlf) RunWait($sCmd, @ScriptDir, @SW_HIDE) If @error Then MsgBox(16, "Error", "Could not execute: "&$sCmd&@CRLF&"Errorcodes: "&@error&" >> "&@extended) EndFunc Func _OtherVPNSelectCountry($iCountryIndex = 0) Local $sCmd = "" If $iCountryIndex = 0 Then $sCmd = "FancyVPN.exe"&' disconnect' Else Local $sCountry = $arCountries[$iCountryIndex][1] $sCmd = "FancyVPN.exe"&' -c -g "'&$sCountry&'"' EndIf ConsoleWrite($sCmd&@crlf) EndFunc Func _selectDefaultBrowser($iBrowserIndex = 0) Local $arCommands = [ _ "if ($env:OS -ne 'Windows_NT') { throw 'This script runs on Windows only' }", _ "Stop-Process -ErrorAction Ignore -Name SystemSettings", _ "Start-Process ms-settings:defaultapps", _ "$ps = Get-Process -ErrorAction Stop SystemSettings", _ "do {", _ "Start-Sleep -Milliseconds 100", _ "$ps.Refresh()", _ "} while ([int] $ps.MainWindowHandle)", _ "Start-Sleep -Milliseconds 200", _ "$shell = New-Object -ComObject WScript.Shell", _ "foreach ($i in 1..4) { $shell.SendKeys('{TAB}'); Start-Sleep -milliseconds 500 }", _ "$shell.SendKeys('" & $arBrowsers[$iBrowserIndex][0] & "'); Start-Sleep -seconds 1", _ "$shell.SendKeys('{TAB}'); Start-Sleep -milliseconds 100", _ "$shell.SendKeys('{ENTER}'); Start-Sleep -milliseconds 100", _ "$shell.SendKeys('{ENTER}'); Start-Sleep -milliseconds 100", _ "$shell.SendKeys('%{F4}')" _ ] Local $sCmd = "" For $i=0 To UBound($arCommands)-1 Step 1 If $sCmd<>"" Then $sCmd&='; ' $sCmd&=$arCommands[$i] Next RunWait('powershell -command "'&$sCmd&'"', @ScriptDir, @SW_HIDE) If @error Then MsgBox(16, "Error", "Could not execute: "&$sCmd&@CRLF&"Errorcodes: "&@error&" >> "&@extended) EndFunc Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam) Local $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) Local $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case GUICtrlGetHandle($iCountryListView) Switch $iCode Case $NM_CLICK ;IDFrom,,Index,SubItem,NewState,OldState,Changed,ActionX,ActionY,lParam,KeyFlags Local $tData = DllStructCreate($tagNMITEMACTIVATE, $lParam) Local $iIndex = DllStructGetData($tData, "Index") If $iIndex<>-1 Then $iIndex = Int(_GUICtrlListView_GetItemText($iCountryListView, $iIndex, 0)) Local $iIndexVPN = _GUICtrlComboBox_GetCurSel(GUICtrlGetHandle($iComboVPNSelection)) Call($arVPNs[$iIndexVPN][1], $iIndex) EndIf EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc
Ich hoffe, das kann dir helfen, das Script noch weiter zu optimieren und zu erweitern
-
Zitat
Aber auch dabei bleiben Fensterrahmen, Scroolleiste, Menü usw. weiß bzw. hellgrau.
Ja, das ist leider normal. SciTe an sich hat keinen Darkmode. Man ändert nur die Darstellung für den Code-Bereich.
-
Wenn du eh nur wissen willst, ob ein WWAN adapter vorhanden willst, würde ich es als Funktion mit Bool-Rückgabe implementieren. Macht das ganze kleiner und übersichtlicher.
Du kannst dabei auch stattdessen das erste gefundene WWAN adapter zurückgeben und damit weiterarbeiten.AutoIt
Alles anzeigenIf Not _CI_HasWWAN() Then MsgBox(0, "Error", "No network adapters found or query failed.") Func _CI_HasWWAN() Local $objWMIService = ObjGet("winmgmts:\\.\root\StandardCimv2") Local $colItems = $objWMIService.ExecQuery("SELECT * FROM MSFT_NetAdapter") If IsObj($colItems) Then For $objItem In $colItems ; InterfaceType 243 ist für WWAN-Adapter If $objItem.InterfaceType = 243 Then Return True ; maybe return $objItem, if you want the object itself Next EndIf Return False EndFunc
-
Ist in AutoIt schon enthalten:
#include <Excel.au3>
Hilfe findest du, wenn du in SciTE z.B. _Excel_BookOpen eingibst, auf die Funktion klickst und F1 drückst.
-
Zum auswählen in der ListBox: _GUICtrlListBox_SetCurSel($idList, 0)
Dabei wird auch automatisch zu dem ausgewähltem Item gescrollt. -
Ich hab das ganze mal so umgebaut, wie ich das Error-Handling eher gestalten würde: Die Funktion gibt True/False zurück, je nach Erfolg, und setzt die entsprechenden Error-Codes, die nach dem Aufruf der Funktion behandelt werden.
AutoIt
Alles anzeigenGlobal $sFolderData = "data\" ; ... Gui code Local $sFilesFolder = @ScriptDir _fillListBox($QrCodeList, $sFilesFolder) If @error Then Local $sTitle = "Fehler beim befüllen der Liste" If @error = 1 Then MsgBox($MB_SYSTEMMODAL, $sTitle, 'Fehler beim auslesen des Ordners "'&$sFilesFolder&'": '&@extended&@crlf) If @error = 2 Then MsgBox($MB_SYSTEMMODAL, $sTitle, 'Fehler beim schreiben der Ini: '&@extended&@crlf) If @error = 4 Then MsgBox($MB_SYSTEMMODAL, $sTitle, '_fillListBox error, contact the developer with the following information: '&@error&">>"&@extended&@crlf) If @error = 3 Then If @extended = 1 Then MsgBox($MB_SYSTEMMODAL, $sTitle, 'Pfad ungültig.'&@crlf) ElseIf @extended = 4 Then MsgBox($MB_SYSTEMMODAL, $sTitle, 'Keine Dateien gefunden.'&@crlf) Else MsgBox(16, $sTitle, 'Die INI-Datei konnte nicht gelesen werden.'&@crlf) EndIf Exit EndIf EndIf ; Errors: ; 1: _FileListToArray failed (@extended contains _FileListToArray error code) ; 2: IniWrite failed (@extended contains IniWrite error code) ; 3: IniReadSection failed (@extended contains IniReadSection error code) ; 4: GUICtrlSetData failed (@extended contains GUICtrlSetData error code) => probably not a control for $idListBox Func _fillListBox($idListBox, $sFilePath, $sIniFile = $sFolderData & "listbox.ini") Local Static $sSection = "items", $sKeyPrefix = "item" ; Update ini with files $aFileList = _FileListToArray($sFilePath, "QR_*") If @error Then Return SetError(1, @error, False) For $i = 1 To UBound($aFileList)-1 IniWrite($sIniFile, $sSection, $sKeyPrefix & $i, $aFileList[$i]) If @error Then Return SetError(2, @error, False) Next ; Read ini and fill listbox Local $arItems = IniReadSection($sIniFile, "items") If @error Then Return SetError(3, @error, False) Sleep(200) ; Why? For $i = 1 To $arItems[0][0] GUICtrlSetData($idListBox, $arItems[$i][1]) If @error Then Return SetError(4, @error, False) Next Return True EndFunc ;==>CreateListBox
Das ganze behebt aber nicht dein eigentliches Problem. Dazu ein paar Anmerkungen/Fragen:
1. Wieso liest du erst die Ini-Datei, dann befüllst du sie mit den aktuellen Dateien (und überschreibst dabei die alten Daten) und schreibst dann die alten Daten in die ListBox? Von dem was ich vom Code/deiner Fragenstellung vermute ergibt das keinen Sinn.
2. MsgBox(16, "Fehler", "Die INI-Datei konnte nicht gelesen werden.") wird ausgegeben, wenn irgendein Fehler bei Sleep(200) aufgetreten ist??? Bedenke: @error wird bei jeglichem Funktionsaufruf auf 0 zurückgesetzt. Die Zeile kann also nie erreicht werden, da Sleep keine Fehlercode geben kann. Ich habe für meine Code-Änderung angenommen, dass sich die ganzen If @error Zeilen auf IniReadSection beziehen.
3. Brauchst du die Ini überhaupt? Wenn ja, wofür? Du kannst eigentlich die Daten mit _FileListToArray einlesen und direkt in die ListBox schreiben.
4. Was für eine Sortierung stellst du dir vor? Weder _FileListToArray noch IniReadSection garantieren, dass irgendeine Reihenfolge der Daten vorliegt. Normalerweise lesen sie von oben nach unten/alphabetisch, aber das kann sich auch aus irgendwelchen Gründen ändern. Vermutlich brauchst du also so oder so ein _ArraySort, oder etwas ähnliches. -
Auf den ersten BLick schaut es für mich richtig aus, du hast ja auch eig. nur bei CloneArea auf $GDIP_PXF32ARGB gewechselt und bei GraphicsClear auf 0x00FFFFFF.
Ich würde auf die schnelle 2 Mögliche Probleme sehen:
1. Unterstützt MPDF 32Bit ARGB Werte (Vielleicht musst du RGBA oder ähnliches verwenden (keine Ahnung ob das mit GDI-Plus geht))
2. Nutzt du eventuell PDF/A (die Archiv Version von PDF)? Dort sind keine Transparenten Bilder erlaubt, da für die Archivierung alles genau definiert sein soll, was für Probleme sorgen könnte. -
Gern
Ja, der DLL Code ist in Rust geschrieben, wobei ich dabei das Interface programmiert habe und mir angeschaut hab, wie man mit Rust eine DLL erstellt.
Der Code zum generieren des QRCodes ist von der oben genannten Library.