Gibt es einen Nachteil beim verwenden des Dummy-Control zu der anderen Methode
Solange Du nicht wissen willst, welche Taste gedrückt wurde, gibt es keinen Nachteil.
Gibt es einen Nachteil beim verwenden des Dummy-Control zu der anderen Methode
Solange Du nicht wissen willst, welche Taste gedrückt wurde, gibt es keinen Nachteil.
Wenn Dir das mit dem Dummy-Control besser gefällt, dann erledige die Auswertung gleich in der Dummy-Funktion:
#Region ;************ Includes ************
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <GUIConstantsEx.au3>
#EndRegion ;************ Includes ************
Opt("GUIOnEventMode", 1)
Global $hGui = GUICreate("Test", 300, 300)
;Liste mit Updates
Global $idListview_schnell = GUICtrlCreateListView("Test", 50, 50, 150, 150, -1, $WS_EX_CLIENTEDGE)
_GUICtrlListView_SetExtendedListViewStyle($idListview_schnell, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))
GUICtrlCreateListViewItem("Zeile 1", $idListview_schnell)
GUICtrlCreateListViewItem("Zeile 2", $idListview_schnell)
GUICtrlCreateListViewItem("Zeile 3", $idListview_schnell)
Global $idCheckbox_test = GUICtrlCreateCheckbox("Test", 10, 10)
GUICtrlSetState($idCheckbox_test, $GUI_DISABLE)
Global $idDummy = GUICtrlCreateDummy()
GUICtrlSetOnEvent($idDummy, "_dummy")
GUIRegisterMsg($WM_NOTIFY, "WM_Notify")
GUISetOnEvent($GUI_EVENT_CLOSE, "_beenden")
GUISetState()
Func _dummy()
Local $iCount = ControlListView($hGui, '', $idListview_schnell, 'GetSelectedCount')
Local $iIndex = ControlListView($hGui, '', $idListview_schnell, 'GetSelected')
ConsoleWrite(StringFormat('iCount: %i iIndex: %i\r\n', $iCount, $iIndex))
If $iCount > 0 Then
If BitAND(GUICtrlGetState($idCheckbox_test), $GUI_DISABLE) Then
GUICtrlSetState($idCheckbox_test, $GUI_ENABLE)
ConsoleWrite("aktivieren" & @CRLF)
EndIf
Else
If BitAND(GUICtrlGetState($idCheckbox_test), $GUI_ENABLE) Then
GUICtrlSetState($idCheckbox_test, $GUI_DISABLE)
ConsoleWrite("deaktivieren" & @CRLF)
EndIf
EndIf
EndFunc
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $wParam
Local $tNMHDR, $iIDFrom, $iCode
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $iIDFrom
Case $idListview_schnell
Switch $iCode
Case $LVN_KEYDOWN, $NM_CLICK
GUICtrlSendToDummy($idDummy)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Func _beenden()
Exit
EndFunc ;==>_beenden
While 1
Sleep(10)
WEnd
Alles anzeigen
Aber wenn ich die Items mit den Pfeilstasten auswählen funktioniert es dann nicht mehr. Gibt es da auch eine Lösung?
Du kannst $LVN_KEYDOWN mit auswerten, dann ist das zwar nicht der Index, aber es funktioniert trotzdem, weil "ungleich -1":
#Region ;************ Includes ************
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <GUIConstantsEx.au3>
#EndRegion ;************ Includes ************
Global $iListView_markiert_merken
Opt("GUIOnEventMode", 1)
GUICreate("Test", 300, 300)
;Liste mit Updates
Global $idListview_schnell = GUICtrlCreateListView("Test", 50, 50, 150, 150, -1, $WS_EX_CLIENTEDGE)
_GUICtrlListView_SetExtendedListViewStyle($idListview_schnell, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))
GUICtrlCreateListViewItem("Zeile 1", $idListview_schnell)
GUICtrlCreateListViewItem("Zeile 2", $idListview_schnell)
GUICtrlCreateListViewItem("Zeile 3", $idListview_schnell)
Global $idCheckbox_test = GUICtrlCreateCheckbox("Test", 10, 10)
GUICtrlSetState($idCheckbox_test, $GUI_DISABLE)
GUIRegisterMsg($WM_NOTIFY, "WM_Notify")
GUISetOnEvent($GUI_EVENT_CLOSE, "_beenden")
GUISetState()
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $wParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
Local $hWndListView2
$hWndListView2 = $idListview_schnell
If Not IsHWnd($idListview_schnell) Then $hWndListView2 = GUICtrlGetHandle($idListview_schnell)
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Select
Case $hWndFrom = $hWndListView2
Switch $iCode
Case $LVN_KEYDOWN, $NM_CLICK
Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
Local $iIndex = DllStructGetData($tInfo, "Index") ; bei $LVN_KEYDOWN ist das nicht der Index
ConsoleWrite(StringFormat('%i iIndex: %i\r\n', @MSEC, $iIndex))
If $iIndex > -1 Then
If BitAND(GUICtrlGetState($idCheckbox_test), $GUI_DISABLE) Then
GUICtrlSetState($idCheckbox_test, $GUI_ENABLE)
ConsoleWrite("aktivieren" & @CRLF)
EndIf
Else
If BitAND(GUICtrlGetState($idCheckbox_test), $GUI_ENABLE) Then
GUICtrlSetState($idCheckbox_test, $GUI_DISABLE)
ConsoleWrite("deaktivieren" & @CRLF)
EndIf
EndIf
EndSwitch
EndSelect
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Func _beenden()
Exit
EndFunc ;==>_beenden
While 1
Sleep(10)
WEnd
Alles anzeigen
sofern Oscar recht hat und das Event immer genau zweimal triggert
Nein, es sind nicht immer genau zwei Trigger. Manchmal auch drei oder (beim deaktivieren) nur einer.
Das Problem ist, dass bei einem "Select-change" von einem Listview-Item zum nächsten, immer erst ein deselect des alten Items ausgelöst wird und dann wird das neue Item selected.
Das deselect passiert aber auch, wenn man in einen leeren Bereich klickt (also kein Item selektiert ist). Und in dem Fall soll ja die Checkbox deaktiviert sein.
Deswegen ist $LVN_ITEMCHANGED nicht geeignet, um das abzufragen oder man muss das kurzzeitige deaktivieren der Checkbox in Kauf nehmen.
Wie kann ich dies verhindern?
Das Problem tritt auf, weil Du auf ItemChanged prüfst. Dabei werden aber zwei Nachrichten an das Fenster gesendet.
Lösen kann man das, indem man auf NM_CLICK prüft:
#Region ;************ Includes ************
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <GUIConstantsEx.au3>
#EndRegion ;************ Includes ************
Global $iListView_markiert_merken
Opt("GUIOnEventMode", 1)
GUICreate("Test", 300, 300)
;Liste mit Updates
Global $idListview_schnell = GUICtrlCreateListView("Test", 50, 50, 150, 150, -1, $WS_EX_CLIENTEDGE)
_GUICtrlListView_SetExtendedListViewStyle($idListview_schnell, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER))
GUICtrlCreateListViewItem("Zeile 1", $idListview_schnell)
GUICtrlCreateListViewItem("Zeile 2", $idListview_schnell)
GUICtrlCreateListViewItem("Zeile 3", $idListview_schnell)
Global $idCheckbox_test = GUICtrlCreateCheckbox("Test", 10, 10)
GUICtrlSetState($idCheckbox_test, $GUI_DISABLE)
GUIRegisterMsg($WM_NOTIFY, "WM_Notify")
GUISetOnEvent($GUI_EVENT_CLOSE, "_beenden")
GUISetState()
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $wParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
Local $hWndListView2
$hWndListView2 = $idListview_schnell
If Not IsHWnd($idListview_schnell) Then $hWndListView2 = GUICtrlGetHandle($idListview_schnell)
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Select
Case $hWndFrom = $hWndListView2
Select
Case $iCode = $NM_CLICK
Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
Local $iIndex = DllStructGetData($tInfo, "Index")
If $iIndex > -1 Then
If BitAND(GUICtrlGetState($idCheckbox_test), $GUI_DISABLE) Then
GUICtrlSetState($idCheckbox_test, $GUI_ENABLE)
ConsoleWrite("aktivieren" & @CRLF)
EndIf
Else
If BitAND(GUICtrlGetState($idCheckbox_test), $GUI_ENABLE) Then
GUICtrlSetState($idCheckbox_test, $GUI_DISABLE)
ConsoleWrite("deaktivieren" & @CRLF)
EndIf
EndIf
EndSelect
EndSelect
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Func _beenden()
Exit
EndFunc ;==>_beenden
While 1
Sleep(10)
WEnd
Alles anzeigen
Hast Du eine Erfahrung wie das in Sachen Tempo und Stabilität mit einer TCP/UDP Lösung aussieht?
Ich habe mir bisher nie die Mühe gemacht, das mit TCP/UDP auszuprobieren. Die Variante mit dem HTTP-Server ist sauschnell, wenn er denn erreichbar ist. ![]()
Ich habe mal nur den Autoit-Quelltext laufen lassen. Das dauert etwas bis das in der Konsole ausgegeben wird.
Das AutoIt-Script funktioniert nur, wenn auch das Programm auf dem ESP läuft und sich der ESP im selben Netzwerk befindet.
Und "?vol=42" ist lediglich ein Beispiel dafür, wie man einen Parameter an den ESP übergeben kann. "vol" ist der Parametername (siehe ESP-Programm) und der Wert hinter dem Gleichzeichen entspricht dann dem Wert, der übergeben wird.
kann mir jemand sagen, wie ich vom Tablet (Autoit) aus auf einen ESP8266 (D1 mini Pro) über WiFi Daten austausche?
Ich gehe jetzt mal von einer Kommunikation im lokalen Netzwerk aus.
Am einfachsten ist es dann, einen Webserver auf dem ESP laufen zu lassen. So kommt man bei AutoIt mit InetRead aus und der Aufwand beim ESP hält sich auch in Grenzen.
Hinweis: Falls Du keine FritzBox besitzt musst Du mal schauen, wie Dein Router den Hostnamen adressiert.
Script in AutoIt:
Global $dData = InetRead("http://meinServer.fritz.box/?vol=42")
Global $sData = BinaryToString($dData)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sData = ' & $sData & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
Und das Programm auf dem ESP:
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
const char* ssid = "meineSSID"; // <- anpassen
const char* password = "meinPasswort"; // <- anpassen
const char* hostname = "meinServer"; // unter dieser Adresse ist der ESP im lokalen Netz erreichbar, z.B.: http://meinServer.fritz.box
ESP8266WebServer server(80);
char buf[256];
void handleNotFound() { // hier wird eine "Page not found"-Meldung generiert
server.sendHeader("Connection", "close");
server.send(404, "text/plain", "Page not found.");
}
void handleRoot() {
if (server.args() > 0) { // wenn Parameter uebergeben wurden
if (server.arg("vol") == "") {
sprintf(buf, "Parameter not found.\r\n");
} else {
int vol = server.arg("vol").toInt();
Serial.println(vol);
sprintf(buf, "Volume changed.\r\n");
}
} else { // keine Parameter, dann nur eine "Server ready."-Meldung zurueckgeben
sprintf(buf, "Server ready.\r\n");
}
server.sendHeader("Cache-Control", "no-cache"); // Anweisung an den Browser (kein Cache benutzen)
server.sendHeader("Connection", "close"); // nach der Uebertragung die Verbindung schliessen
server.send(200, "text/plain", buf); // den Buffer senden
}
void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, 0);
Serial.println();
Serial.println();
Serial.print(F("Connecting to "));
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(F("."));
}
Serial.println();
Serial.println(F("WiFi connected"));
WiFi.hostname(hostname);
server.on("/", handleRoot);
server.onNotFound(handleNotFound);
server.begin();
Serial.println(F("Server started"));
Serial.println(WiFi.localIP());
}
void loop() {
server.handleClient(); // die Client-Behandlung aufrufen
}
Alles anzeigen
Die ganzen "Serial"-Befehle kannst Du auch weglassen, die dienen nur dem debugging.
Ist eigentlich nur für Einsteiger gedacht als kleine Hilfe wie man mit
GUI's (Label, Inputs, Comboboxen), Hotkeys und weiteren nützlichen Funktionen, sich das Leben etwas einfacher machen kann.
Das wäre eher ein Beispiel wie man es auf gar keinen Fall machen sollte.
Ich habe Dein Script aus Deinem Beitrag gelöscht, weil Du dort Deine EMail-Zugangsdaten drinstehen hast. Sowas macht man schonmal gar nicht!
Ändere Dein EMail-Passwort umgehend! Das Script haben schon mehrere Leute heruntergeladen.
Dein Script war aber auch sonst total fehleranfällig und sicher kein Beispiel für Anfänger. So sollte man einen Launcher ganz sicher nicht schreiben:
- Absolute Pfadangaben (die nur bei Deinem Rechner zutreffen)
- Send und MouseMove/-Click (letztere auch noch mit absoluten Koordinaten)
- Sleep mit Werten, die vielleicht bei Dir funktionieren (auf Deinem Rechner mit Deiner Internetverbindung)
- Einbiinden von Grafiken und Icons ohne die Grafiken/Icons mit zu posten
- EMail-Zugangsdaten (hardcodiert im Script)
- Die Flash-Funktionen mit (geschätzt) 50 GUICtrlSetColor und ebensovielen Sleep-Befehlen (schonmal etwas von Schleifen und Arrays gehört?)
Was ist der einfachste Weg mit AutoIt?
Es gibt zwar "_StringTitleCase", aber dort wird einfach bei jedem Wort der erste Buchstabe groß geschrieben.
Das was Dir vorstrebt würde ein Wörterbuch (pro erkannter Sprache) erfordern. Ich denke, das dürfte mit AutoIt nur schwer zu realisieren sein.
Ich hab bei Steam 16€ bezahlt, early access, bisher noch keinen einzigen Bug erlebt! Volle Empfehlung!
Das spiele ich zur Zeit auch (im Solomodus, nur da funktionieren die Cheats).
Ok, ich nutze ein paar Cheats, weil man in den "Ebenen" sonst keine Chance gegen die Kobolde hat. Und es macht einfach mehr Spaß mit dem großen Vikingerboot über den Ozean zu segeln, als mit dem kleinen Floß.
Aber die Spielwelt ist derart riesig, dass es trotz der kleinen Schummeleien noch sehr viel Spaß macht.
Und die 16€ ist es auf jeden Fall wert. Absturz hatte ich auch noch keinen.
Manchmal hakt es etwas, wenn man sich sehr schnell dreht. Wobei ich nicht weiß, ob das vielleicht an meinem Rechner liegt (habe jetzt nicht den HiEnd-Rechner).
Meist läuft es aber total flüssig und auf jeden Fall spielbar. Da habe ich schon "fertige" Spiele gehabt, die deutlich schlechter waren, als dieses "early access"-Game.
beendet und startet das Interface WLAN.
Und wenn ich gar kein WLAN-Interface am PC habe?
Mein PC hängt per Netzwerkkabel am Router. Die ESPs per WLAN.
Ich habe jedoch das Problem, daß ein abgeschalteter oder entfernter AP erst nach ca. 2,5 Minuten erkannt wird. Das ist mir zu lang. Ursache scheint zu sein, daß Windows (10 professional in meinem Fall) die Liste der verfügbaren WLAN-Netze nur alles 2-3 Minuten auffrischt.
Ich habe ein ähnliches Problem beim "Over the air"-Update meiner ESP8266-Module von der Arduino-IDE.
Dort werden die Netzwerk-Schnittstellen auch oft nicht (gleich) erkannt.
Meine "Lösung" dafür mutet etwas kurios an, aber sie funktioniert bei mir immer:
Ich habe auf meinem Smartphone (Android) die App "Fing" installiert. Mein Smartphone ist im gleichen WLAN eingeloggt, wie die ESP-Module.
Dann mache ich mit Fing einen WLAN-Scan und schon erscheinen alle ESP-Schnittstellen in der Arduino-IDE (auf dem PC).
Ich kann nicht sagen, woran das liegt oder was genau Fing da ausführt, aber es funktioniert. ![]()
Ich schau mir das am Montag an und werde berichten.
Du solltest lieber erstmal etwas dazu sagen, ob die Dateien wirklich gleich lang sind (Zeilenanzahl).
Wenn das nämlich nicht gegeben ist, dann brauchst Du eine andere Lösung.
Vorausgesetzt, dass beide Dateien gleich viele Zeilen besitzen, kann man das ganz einfach so lösen:
#include <File.au3>
Global $aFile1, $aFile2, $aOut
_FileReadToArray(@ScriptDir & '\datei1.csv.txt', $aFile1, $FRTA_NOCOUNT + $FRTA_ENTIRESPLIT, ',')
;~ _ArrayDisplay($aFile1)
_FileReadToArray(@ScriptDir & '\datei2.csv.txt', $aFile2, $FRTA_NOCOUNT + $FRTA_ENTIRESPLIT, ',')
;~ _ArrayDisplay($aFile2)
Global $sOut = ''
For $i = 0 To UBound($aFile1, $UBOUND_ROWS) - 1
For $j = 0 To UBound($aFile1, $UBOUND_COLUMNS) - 1
$sOut &= $aFile1[$i][$j] & ','
Next
For $j = 0 To UBound($aFile2, $UBOUND_COLUMNS) - 1
$sOut &= $aFile2[$i][$j] & ','
Next
$sOut = StringTrimRight($sOut, 1) & @CRLF
Next
Global $hFile = FileOpen(@ScriptDir & '\zusammen.csv.txt', 2)
If $hFile <> -1 Then
FileWrite($hFile, $sOut)
FileClose($hFile)
EndIf
Alles anzeigen
Ich habe eine inidatei, die mit neuen Daten gefüllt wird, wird dieser Inhalt geändert, soll der Inhalt ausgegeben werden
Ja, das ist möglich:
#include <APIShellExConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <MsgBoxConstants.au3>
#include <WinAPI.au3>
#include <WinAPIShellEx.au3>
#cs Moegliche Werte bei den Events von _WinAPI_ShellChangeNotify()
Global Const $SHCNE_ALLEVENTS = 0x7FFFFFFF
Global Const $SHCNE_ASSOCCHANGED = 0x8000000
Global Const $SHCNE_ATTRIBUTES = 0x00000800
Global Const $SHCNE_CREATE = 0x00000002
Global Const $SHCNE_DELETE = 0x00000004
Global Const $SHCNE_DRIVEADD = 0x00000100
Global Const $SHCNE_DRIVEADDGUI = 0x00010000
Global Const $SHCNE_DRIVEREMOVED = 0x00000080
Global Const $SHCNE_EXTENDED_EVENT = 0x04000000
Global Const $SHCNE_FREESPACE = 0x00040000
Global Const $SHCNE_MEDIAINSERTED = 0x00000020
Global Const $SHCNE_MEDIAREMOVED = 0x00000040
Global Const $SHCNE_MKDIR = 0x00000008
Global Const $SHCNE_NETSHARE = 0x00000200
Global Const $SHCNE_NETUNSHARE = 0x00000400
Global Const $SHCNE_RENAMEFOLDER = 0x00020000
Global Const $SHCNE_RENAMEITEM = 0x00000001
Global Const $SHCNE_RMDIR = 0x00000010
Global Const $SHCNE_SERVERDISCONNECT = 0x00004000
Global Const $SHCNE_UPDATEDIR = 0x00001000
Global Const $SHCNE_UPDATEIMAGE = 0x00008000
Global Const $SHCNE_UPDATEITEM = 0x00002000
Global Const $SHCNE_DISKEVENTS = 0x0002381F
Global Const $SHCNE_GLOBALEVENTS = 0x0C0581E0
Global Const $SHCNE_INTERRUPT = 0x80000000
#ce
OnAutoItExitRegister('OnAutoItExit')
Opt('GUIOnEventMode', 1)
Global $sNotifyDir = @ScriptDir ; das zu ueberwachende Verzeichnis
If StringRight($sNotifyDir, 1) <> '\' Then $sNotifyDir &= '\'
Global $bRecursive = False ; True = mit Unterverzeichnisse, False = ohne Unterverzeichnisse
Global $sIniFile = 'test.ini' ; die zu ueberwachende Inidatei (im obigen Verzeichnis)
Global $hGui = GUICreate('Test', 800, 400)
GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseGui') ; Funktion die beim schließen des Fensters aufgerufen wird
Global $idEdit = GUICtrlCreateEdit('', 10, 10, 780, 380)
Global $iNotifyMsg = _WinAPI_RegisterWindowMessage('SHELLCHANGENOTIFY') ; die Message bei Windows registrieren
GUIRegisterMsg($iNotifyMsg, 'WM_SHELLCHANGENOTIFY') ; das Fenster für den Empfang der Message registrieren
Global $iID = _WinAPI_ShellChangeNotifyRegister($hGui, $iNotifyMsg, $SHCNE_UPDATEITEM, BitOR($SHCNRF_INTERRUPTLEVEL, $SHCNRF_SHELLLEVEL, $SHCNRF_RECURSIVEINTERRUPT), $sNotifyDir, $bRecursive) ; Windows mitteilen welches Verzeichnis überwacht werden soll
If @error Then ; wenn das fehlschlägt, dann...
MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Fehler', '"ShellChangeNotifyRegister" ist fehlgeschlagen.')
Exit ; Programm mit Fehlermeldung beenden
EndIf
GUISetState()
WinWaitClose($hGui) ; warten bis das Fenster geschlossen wird
Func _CloseGui()
Exit
EndFunc ;==>_CloseGui
Func OnAutoItExit()
If $iID Then _WinAPI_ShellChangeNotifyDeregister($iID)
EndFunc ;==>OnAutoItExit
Func WM_SHELLCHANGENOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg
Local $sPath = _WinAPI_ShellGetPathFromIDList(DllStructGetData(DllStructCreate('dword Item1; dword Item2', $wParam), 'Item1'))
If $sPath = $sNotifyDir & $sIniFile Then
GUICtrlSetData($idEdit, FileRead($sNotifyDir & $sIniFile))
EndIf
EndFunc ;==>WM_SHELLCHANGENOTIFY
Alles anzeigen
warum wird die geänderte datei 2mal hintereinander angezeigt
Sie wird 2 mal angezeigt, weil ein reinkopieren in das Verzeichnis eben 2 Events auslöst (Create und Update).
Wenn Du die Datei nur einmal in dem Listview haben willst, musst Du Dich für ein Event entscheiden (If-Abfrage mit Event in lParam).
Je nachdem, was Du vorhast, aber wenn das mit einem Arduino/ESP8266 machbar ist, könnte ich Dir weiterhelfen.
Wenn Du bei ControlFocus das Child korrekt setzt: ControlFocus($hEdit, '', $hListView), dann geht ControlGetPos auch mit Leerstrings: ControlGetPos($hListView, '', '').
Nicht als UDF, aber mittels Timer eingebunden (asynchron): GIF-Animation mit den neuen AutoIt-Funktionen