Beiträge von Kanashius

    Ich vermute mal du nutzt SQLite.

    SQLite kann zwar mit mehreren Anwendungen gleichzeitig lesen, aber nur mit einer schreiben.

    SQLite FAQ: Multiple processes can have the same database open at the same time. Multiple processes can be doing a SELECT at the same time. But only one process can be making changes to the database at any moment in time, however.

    In diesem Fall würde ich aber vermuten, dass Windows die Datei lokal cached, solange sie offen ist und erst am Ende auf die Netzwerkdatei schreibt.

    Probier mal aus, ob die Daten da sind, wenn du deine schreibende Anwendung beendest.

    Wenn das der Fall ist: Probier mal mit SQLITE_Close die Datenbank zu schließen und schau ob dann die Daten geschrieben wurden.

    Wäre etwas doof, weils mehr Zeit kostet, wenn du jedesmal die Datenbank öffnen und wieder schließen musst, aber wenn du nur zwischendurch mal was schreibst sollte das gehen.

    Deine Problemstellung hat mich zu dieser Lösung inspiriert :)

    Es geht in Richtung UDF, es fehlen aber noch setter/getter Methoden und die documentation,... . Ich werds vermutlich demnächst dazu machen und das dann auch hier im Forum posten; mir fehlt grad die Zeit.

    Mit der Methode kann ein GridLayout erstellt werden, bei dem dann andere Controls, GridLayouts oder auch einfach Funktionen (mit den passenden Parametern) hinzugefügt werden.


    Dabei wird die Position im Grid mit dem Index für die Reihe/Spalte angegeben und dann wird noch die Höhe der Reihe/Breite der Spalte als Prozent wert von 0 bis 1 angegeben. Es zählt immer der letzte Aufruf, wenn mehrere Einträge in einer Reihe eine Höhe angeben; Default behält die vorherige angabe bei.

    Wenn gar kein Wert angegeben wird, werden von allen angegebenen Reihen/Spalten die Prozent-Werte abgezogen und der übrige Platz wird gleichmäßig auf die übrigen Reihen/Spalten verteilt.

    Das ganze wird dann zu diesem Design:

    Dabei werden die TreeViews als Control in das GridLayout eingefügt, die Buttons in ein weiteres GridLayout, welches dann in das Main GridLayout integriert wird.

    Die Labels werden mithilfe einer Funktion an die richtige Position gebracht. Es kann also auch für "CustomControls",... verwendet werden, man muss sich dann halt selber um das resizing an die gewollte position/größe selbst kümmern.


    Wenn sich die Größe des Fensters ändert wird mit WM_SIZE die position/größe für das MainLayout angepasst.


    Viel Spaß damit :)

    Hi :)

    Dein Problem liegt darin, dass du For...In...Next nutzt und dann auf das Array zugreifst, als ob es eine Zahl wäre.

    Bei For $element In $array wird der Wert, der in dem Array steht in die Variable ($elem) gespeichert, hier also: "1", "2", "3", "4", "{TAB}", "{ALT}". Mich wunderts eher, dass du beim Array-Zugriff keinen Fehler bekommen hast...

    Im Code unten hab ich beide Methoden eingebaut, die Funktionieren: Entweder du arbeitest mit For...To...Next und nutzt die Variable als Zahl, oder du nimmst For...In...Next und verwendest den Wert direkt.

    Achtung: Mit For...In...Next darfst du das Array während des durchlaufens nur auslesen, aber nicht verändern!

    Du kannst Arrays direkt bei der deklaration auch initalisieren => mit den Werten füllen. Spart mehrere Zeilen Code und ist auch schneller, weil jedes _ArrayAdd bei jedem Aufruf das gesamte Array kopiert und dann den neuen Wert einträgt, was ziemlich langsam ist. Wird dir hier nicht auffallen, aber wenn du größere Datenmengen verarbeitest und schon vorher weißt, wie viele es sind: Erstell das Array direkt mit der richtigen Größe und trag nur noch die Werte ein.

    Das spielt keine Rolle, der Code funktioniert trotzdem noch, weil von vorne gelesen wird und die letzte Prüfziffer ignoriert wird, weil sie nicht nur über die ID, sondern den ganzen Ausweis geht (und die Daten haben wir nicht).

    Man könnte ggf. noch die Versionsnummer in die Infos hinzufügen, ich denke aber nicht, dass sie relevant ist...

    Wenn man alle Ausweise (und nicht nur neue) unterstützen will sollte man an dem Code eh noch arbeiten, weil man sich dann nicht mehr auf die Zeichenpositionen (absolut in der ID) alleine verlassen kann.

    Hi, ich hab mich der Sache mal angenommen und das ganze umgesetzt:

    Beispielausgabe:

    Das Alter (und damit auch der legal check) ist leider nur mäßig gut, weils nur bis 100 Jahre funktioniert. In der Ausweis-ID sind nur die letzten beiden Ziffern (z.B. 23), deshalb gibts bei 100+ Jährigen ein falsches Alter aus.


    Viel Spaß,

    Kanashius :)

    Hi, die X-Position funktioniert, bei der Y-Position funktionieren alle bis auf den oberen Bildschirm. Da erscheint das Fenster dann ~mittig auf dem unteren Bildschirm.

    Ich vermute das hängt damit zusammen, dass die Position dort negativ wäre?


    Wenn das Toolbaricon nicht gefunden wird funktioniert es aber noch nicht (vermute, dass hast du noch nicht angepasst; $iMonitorY+X werden garnicht verwendet). Hatte erst den Sourcecode ausgeführt und nicht die EXE, da ist er immer in den oberen Case gegangen, weil die Description natürlich nicht stimmt^^

    "Error getting icon pos in taskbar" taucht jetzt jedesmal auf und das Fenster ist am linken Rand.

    Der obere und untere Bildschirm funktionieren ansonsten.

    Beim linken und rechten läuft noch was schief. Beim linken ist das Fenster nicht sichtbar, beim rechten landet das Fenster auf dem linken Bildschirm. Ich vermute das Problem liegt in den negativen Positionswerten.

    Ich hab gesehen, dass du MouseGetPos nutzt und hab mal die Koordinaten nachgeschaut.... Ich bin sehr verwirrt, was Windows da fabriziert... Ich hab mal ein Bild erstellt mit den Mauskoordinaten an jeder Bildschirmecke:

    Screen 1+2 sind beides 27" 4k (3840x2160) Bildschirme und werden auch mit der Auflösung dargestellt.

    Screen 3+4 sind beides 24" FHD (1920x1080) Bildschirme und werden auch mit der Auflösung dargestellt.



    Das macht auf den ersten Blick alles überhauptkeinen Sinn. Hängt aber mit der DPI zusammen.

    Mir ist grad beim schreiben hier eingefallen, dass ich das Problem schonmal hatte und die Lösung war, dem Process DPI-Awareness zu geben:


    AutoIt
    Global Const $PROCESS_DPI_UNAWARE = 0
    Global Const $PROCESS_SYSTEM_DPI_AWARE = 1
    Global Const $PROCESS_PER_MONITOR_DPI_AWARE = 2
    _WinAPI_SetProcessDpiAwareness($PROCESS_PER_MONITOR_DPI_AWARE)
    
    Func _WinAPI_SetProcessDpiAwareness($DPIAware)
      DllCall("Shcore.dll", "long", "SetProcessDpiAwareness", "int", $DPIAware)
      If @error Then Return SetError(1, 0, 0)
    EndFunc


    Dann sind die Koordinaten von -1920 bis 5760 in der Breite richtig und auch die Höhe passt mit -2160 bis 2160 über alle Bildschirme.


    Das Problem mit dem rechten/linken Bildschirm bleibt aber leider trotzdem, nur dass beim linken Bildschirm mit der DPI-Awareness das Fenster auf dem mittleren Screen angezeigt wird.


    Ich hab auch mal die Zahlen für jeden Klick von Bildschirm 1 bis 4 ausgegeben, vllt. hilft dir das weiter (ConsoleWrite(MouseGetPos(1)&":"&MouseGetPos(2)&" >> "&$px&":"&($iMonitorY + MouseGetPos(1) - $aPos[3] - $iWinTitleSize * $aDPI[1])&" >> "&$aPos[2]&":"&$aPos[3]&@CRLF)) :

    Code
    Added 128 items to the list
    Error getting icon pos in taskbar
    2151:1 >> 0:1122.75 >> 1920:960
    Error getting icon pos in taskbar
    -29:1 >> 0:-1057.25 >> 1920:960
    Error getting icon pos in taskbar
    2140:1 >> -1920:1111.75 >> 1920:960
    Error getting icon pos in taskbar
    2133:1 >> 0:1104.75 >> 1920:960


    Ohne DPI-Awareness kommt übrigens folgendes dabei raus:

    Code
    Added 128 items to the list
    Error getting icon pos in taskbar
    1226:1 >> 0:656 >> 1097:548
    Error getting icon pos in taskbar
    -933:1 >> 0:-1503 >> 1097:548
    Error getting icon pos in taskbar
    2143:1 >> -1097:1573 >> 1097:548
    Error getting icon pos in taskbar
    2141:1 >> 0:1571 >> 1097:548

    Wobei 0:1571 zeigt, warum es beim linken Bildschirm ohne DPI-Awareness nicht sichtbar ist... 1571>1234 => Es landet unter dem primär Bildschirm (Screen 1).



    Ich würde sagen, ich decke mit meinen Bildschirmen die meisten Edgecases ab :rofl:

    Kanashius ich habe eine neue Version hochgeladen. Kannst du bitte nochmals testen, ob das Fenster jetzt auf allen Monitoren angezeigt wird?

    Ne, funktioniert so nicht. Beim rechten+linken Bildschirm wird es garnicht angezeigt (vmtl. außerhalb des Bereichs), beim oberen wird es am unteren (primär Bildschirm) angezeigt.

    Ich geb dir mal meine Bildschirm Infos, vllt. hilft dir das weiter:

    Funktioniert mit WIN10 (v10.0.19045).


    Verbesserungsvorschläge:

    Technisch:

    - Wird immer auf dem Hauptbildschirm eingeblendet. Evtl. anpassen, wenn die Maus auf nem anderen Bildschirm ist.

    - Du ließt die Dateien von @DesktopDir und @DesktopCommonDir. Hat mich etwas verwirrt, weil plötzlich nen haufen Shortcuts von Programmen aufgetaucht sind, die unter Public->Desktop zu finden sind, die ich aber auf meinem schon ewig gelöscht hatte. Keine Ahnung, ob das gewollt ist.

    Optisch:

    - Schrift-/Icongröße könnte man noch an die DPI anpassen. Hab grad in den Quellcode geschaut: Es wird der falsche Monitor gelesen. Es macht ggf. Sinn, mit _WinAPI_GetMonitorInfo den Primären Bildschirm herauszufinden, oder mit _WinAPI_MonitorFromPoint den aktuellen (Mauspositions) Bildschirm wenn du das Fenster auf mehreren Bildschirmen anzeigen lassen willst.

    - Es gibt nen schmalen Spalt zwischen der Taskleiste und dem Fenster (ca. 5px). Keine Ahnung, ob das gewollt ist, oder ob mit WIN11 die Höhe verändert wurde, oder ob es daran liegt, dass sich meine Taskleiste automatisch ausblendet.

    Hi,

    die "Webseite", verwendet gespeicherte Audiodateien, die einfach nur abgespielt werden. Die sind als Base64 in js-Dateien gespeichert.

    Ich würde also ein Script schreiben, dass das ganze extrahiert und wieder als Audiodateien speichert, mit https://www.autoitscript.com/f…encode-decode-extra-fast/

    Danach kannst du selbst den Code schreiben, der die passenden Dateien zur aktuellen Uhrzeit raussucht und mit SoundPlay den Sound abspielen.

    Dann brauchst du keine Browser.

    Nämlich sprechende Namen mit dem Kürzel des Typs davor (var für Variant, str für String, int für Integer, lng für Long, obj für Object etc. pp.). Z.B. $strEditbox1 = für den Inhalt der ersten Textbox.

    Es gibt für AutoIt auch "best coding practices", die vorgeben, wie man am besten benennen sollte: https://www.autoitscript.com/wiki/Best_coding_practices

    Deshalb wirst du in AutoIt eig. nur (v für Variant, s für String, i für Integer, o für Object etc. pp.) finden.

    Ist aber zumindest ähnlich zu VBA.

    Ich mach es so, dann kann man am besten zwischen den Funktionen unterscheiden.

    AutoIt
    GuiCtrlCreateEdit(...) ; AutoIt-Funktion
    __GuiCtrlEdit_Create(...) ; UDF-Funktion (mit AutoIt ausgeliefert)
    _GuiCtrlCreateEdit(...) ; Eigene Funktion (um z.B. ein Edit zu erstellen und schon nen Font,... an einer einheitlichen Stelle zu setzen, wenn man mehrere Controls braucht)
    __ExtendedEdit_GuiCtrlCreateEdit(...) ; Eigene UDF-Funktion (Wenn man selbst eine lib/UDF(user defined function) erstellt)

    Man kann die Funktionen natürlich auch anders benennen, aber mit dieser Notation sieht man auf den ersten Blick, ob es sich um eine Grundfunktion handelt, eine eigene Funktion, oder ob die Funktion aus einer UDF stammt (und auch aus welcher).


    Die UDF Notation nutze ich auch bei globalen Variablen in eine UDF, wenn ich eine erstelle. Z.b. Local $__ExtendedEdit_sEdit = 0. Dann hat man nicht das Problem, dass Konflikte mit den Namen entstehen und wenn man z.B. Konstanten verwendet weiß man auch direkt, aus welcher UDF die kommt.


    Ich finde das z.B. bei den mitgelieferten UDFs teilweise nervig, weil die Konstanten das dort nicht haben und du dann oft erstmal rausfinden musst, aus welcher UDF denn jetzt die blöde Konstante kommt. Oft am schnellsten in dem man nach nem Script Beispiel schaut und dort alle includes nimmt und nacheinander ausprobiert/auskommentiert :/. Die wenigsten wissen direkt, ob z.B. $ES_RIGHT aus GUIConstants.au3, GUIConstantsEx.au3 oder WindowsConstants,... kommt. Aber das ist das Problem, das entsteht, wenn man sich nicht einheitlich Festlegt (man muss es ja nicht vom Compiler erzwingen, sollte es aber als gewollten Stil angeben...). Das selbe Problem gibts auch mit zurückgegebenen Arrays. Manche Funktionen geben beim ersten Index ([0]) die Anzahl der Ergebnisse zurück, andere geben keine Anzahl zurück... Ich persönlich bin der Meinung, dass es dafür Ubound gibt und man Programmierinfos und Daten trennen sollte, aber es wurde halt nie eindeutig definiert, also gibts jetzt nen Wildwuchs von beidem und man hat halt manchmal das Problem, dass komische Fehler auftreten, weil plötzlich son extra Wert immer Array steht, der da nicht hingehört...


    Würde also empfehlen, das so zu handhaben, damit auch andere sich in deinem Code schneller zurechtfinden und direkt wissen, wo eine Funktion und deren Dokumentation denn zu finden ist.

    Okay... ich seh ich hab wesentlich weniger Ahnung als ich gedacht habe^^


    Irgendwie muss da also im Else der Ignore Shift befehlt eingebaut werden....

    In Zeile 51 findest du den Aufruf der Methode Chr(). Wenn du die Hilfe dazu öffnest (anklicken und F1), dann Findest du unter "Remarks" einen Link zur ASCII Character Code table. Da stehen die Zahlen zu allen Zeichen drin.

    Ansonsten kannst du auch einfach nach Zeile 47 ein ConsoleWrite($iKeyCode&@crlf) einfügen. Dann bekommst du die Ausgabe des Zahlencodes, wenn du die Taste drückst und kannst einfach ausprobieren ;)

    In diesem Fall würde ich einfach das Else in Zeile 55 (Zeile 9 in dem Ausschnitt, den du gepostet hast) abändern zu ElseIf $iKeyCode<>0 Then. Damit sollten alle Tasten, die nichts ausgeben (wie SHIFT, ALT,...) keinen Unterschied mehr machen.

    Hi,

    Ich hatte gerade Zeit und fand das ganze interessant, also hab ich das mal mit Pattern-Matching umgesetzt.

    Das Fenster ist optional, ich habs nur zum Anzeigen und Testen drin.

    In der Funktion _barcodeFound kannst du dann mit dem Code machen, was du möchtest. (Also auch dein Programm öffnen,...).


    Ich lese alle 0-9, A-Z und - Zeichen ein und füge sie zum Buffer hinzu. Wird eine andere Taste gedrückt, wird der Buffer zurückgesetzt, oder der Barcode als erkannt gemeldet (je nachdem, ob das Pattern passt oder nicht).

    Das betrifft auch Tasten wie SHIFT. Falls dein Scanner Groß/Klein-schreibung beachtet musst du evtl. den Code für SHIFT ignorieren, um nicht zurückzusetzen (Zeile 55). Dementsprechend ignoriert der Code auch Groß/Klein-Schreibung beim Pattern.

    Der Buffer hat max. 200 Zeichen, das ganze Funktioniert also nur, wenn dein Code weniger als 200 Zeichen hat. Ggf. musst du den Buffer anpassen, bis es für dich passt.


    Ich hab dabei auch festgestellt, dass man nicht einfach den KeyCode zum vergleichen verwenden sollte. Ich nutze eine Tastatur mit US-Layout und das - hat dort den vkCode 189 und nicht 45. Deshalb nutze ich die _WinAPI_MapVirtualKey um den Virtuellen Keycode auf den eigentlichen KeyCode umzuwandeln. Sollte man also immer machen; man weiß ja nie, was für eine Tastatur grad angeschlossen ist.


    Ich hoffe das hilft dir weiter :)


    MfG, Kanashius

    Hi,

    vor nicht allzu langer Zeit hatte jemand eine ähnliche Anfrage. Das wurde dort von Oscar mit einem Keyboardhook gelöst. Der Code kann relativ einfach auf dein Problem umgebaut werden. Einfach das Fenster weglassen und in der _KeyProc die Tasten erfassen. Dabei immer weiter in eine Variable schreiben, bis der Inhalt von dem gewollten Pattern abweicht. Bei einer Abweichung den Anfang wegnehmen, bis zum nächsten möglichen Anfang des Patterns.


    Den Code findest du hier: RE: Barcode in Variable scannen ohne den Inhalt irgendwo anzuzeigen


    Falls du das selbst nicht anpassen kannst, meld dich gerne wieder.


    MfG, Kanashius

    Hi, weil ich im moment so gerne mit Maps programmiere würde ich es so machen:

    Bei der Methode kannst du dir auch aussuchen, ob du alle Menuitems in der Mainloop abarbeiten möchtest, oder ob du eine extra Funktion definieren willst.

    Extra Funktionen haben den Vorteil, dass deine Mainloop nicht groß und unübersichtlich wird und eine Funktionalität ohne Probleme im Menü oder über z.B. einen Button im Fenster ausgelöst werden soll.

    Würdest du z.B. "Save" im Menü "File" haben mit der Methode "_save" kannst du die auch automatisch alle 10min. aufrufen, über extra Buttons,...

    Deshalb arbeite ich gerne mit Funktionen statt sehr großen Mainloops.

    Statt _addMenuEntry($mMenus, "menu1", "Menü 1") solltest du natürlich sinnvolle Namen vergeben, wie z.B. _addMenuEntry($mMenus, "file", "File")

    Hi, ich hab das Script umgeschrieben und Fehlerbehandlung hinzugefügt. Sollte man generell bei allen Scripts machen, um Fehler schneller zu finden.

    Ich hab mehrere Problemstellen gefunden:

    1. Bei InetGet muss der Ordner, in den die Datei heruntergeladen werden soll, bereits existieren => Ich erstell den Parent-Folder vorher.

    2. Bei InetGet muss das Schema der URL passen. Beim auslesen von $INET_DOWNLOADEXTENDED hab ich den Fehler 12006 bekommen. Nachgeschaut auf https://learn.microsoft.com/en…32/wininet/wininet-errors steht der Fehler für ERROR_INTERNET_UNRECOGNIZED_SCHEME. Irgendetwas stimmt also mit der URL nicht. Dabei ist mir aufgefallen, dass http:// am Anfang fehlt und ich habs hinzugefügt. (InetGet fügt das nicht automatisch hinzu, so wie Browser, die annehmen, dass normalerweise eine http anfrage gemeint ist.)


    Jetzt läuft es bei mir (habs aber nicht bis zum Ende laufen lassen; keine Lust auf >100GB download :D)

    Ich hätte noch einen anderen Ansatz, der ggf. komplizierter ist, aber von der Umsetzung einfacher.

    Man könnte mit OBS den Bildschirm aufnehmen und als Kamera zur Verfügungstellen.

    Für Android gibt es bei der Google-Translate-App die Möglichkeit für live Übersetzung.

    Es sollte also theoretisch möglich sein, mit nem Emulator (Windows 11 hat ja auch einen eingebaut, meine ich, hab den aber noch nicht getestet => Nutze Win10) das ganze am PC laufen zu lassen und die OBS Kamera im Emulator zu nutzen.

    Ich habs nicht getestet, sollte aber theoretisch funktionieren.


    MfG, Kanashius.


    PS: Warum gibt es solche Funktionen nur fürs Handy als App und nicht am PC, wo man eh viel mehr Ressourcen hat das lokal laufen zu lassen :Face:

    Hi Alina,

    ich hab das ganze mal umgesetzt, so wie ich es verstanden habe. Am Ende besteht nur das Problem, dass die letzten Werte nicht zugeordnet werden können, da das Positions-Array kein Vielfaches vom Value-Array ist...

    Es geht sich also am Ende nicht aus, oder man hätte leere Zellen. In der Lösung wird das Ende erstmal weggelassen, ggf. kannst du ja klarstellen, was dann passieren soll.


    Außerdem: Position <> Index? Bei mir sind die Einträge einen Wert höher, weil man beim Programmieren mit 0 anfängt, nicht mit 1.


    Ansonsten hier das Script:

    MfG, Kanashius