Beiträge von alpines

    So, hab Windows 10 kurzerhand auf dem Zweitrechner installiert und das einzige was meinem Skript gefehlt hatte war SetProcessDPIAware.

    Das verhindert, dass die GUI einfach hochskaliert wird mit Informationsverlust (als ob man ein 200x200px Bild auf 800x800px zieht).

    Mit meinem Verfahren danach kann ich problemlos hochskalieren und habe keine Unschärfe, sondern alles skaliert so wie es soll.



    Per-Monitor-DPI hab ich mir noch nicht angeschaut, dafür muss ich erstmal einen alten Bildschirm vom Dachboden runter holen.

    Aber ich denke das bekomme ich auch hin.


    Kanashius ich liebäugle auch schon mit dem Ryzen und einer neuer GPU (besonders interessant ist die RX 5700 XT) damit ich meinen Zweitrechner (i7 960/abgerauchte 660 Ti) durch meinen i7 4790/970 OC austauschen kann.

    Genau, so sollte es aussehen. Wenn der Monitor z.B. auf 125% gestellt wurde, sollte die GUI auf dem Monitor genauso aussehen, wie bei 100%. Ohne die Funktion wird die GUI größer und unschärfer.

    Moment, steh ich grad auf dem Schlauch?


    Wieso soll die GUI so aussehen wie bei 100%? Wozu stelle ich denn die DPI überhaupt auf 125%, 150%, 200%?

    Ich setz die DPI doch absichtlich hoch, damit die Texte größer werden und einfacher zu lesen sind.


    Mit der Funktion die du gepostet hast anti-scale ich doch alles, wo ist denn der Sinn dahinter?


    Ich bin der Meinung, wenn ich sage DPI = 200% soll alles um 200% größer gemacht werden. Windows scheint auch der Meinung zu sein, sonst würden die Buttons und Labels ja nicht alle größer werden.

    "Meine Methode" macht ja genau das, das Fenster wird so skaliert als ob alles 200% größer wäre und es bleibt bombastisch scharf.


    Oder sieht das ganze auf Windows 10 anders aus? Ich hab leider nur Win7.

    Da ich grad PassIt2 DPI-skalierbar gestalte (ist schon fertig, werds auch heute/die nächsten Tage hochladen) wollte ich euch mal zeigen wie man GUIs nahezu perfekt DPI-skalierbar bauen kann.

    Viele wissen ja nicht wo sie ansetzen sollen oder anti-scalen einfach (also skalieren die von Windows skalierten Elemente wieder runter). Hier mal wie ich das ganze gelöst habe.


    Es gibt leider Bugs bei dem Verfahren, hauptsächlich durch UpDowns (, Icons und anderen Controls - dann muss man das Erzeugen einiger Controls direkt mit der Skalierung erstellen), dazu habe ich in den Beispiel/Funktionen aber was dazu geschrieben.

    Und bei ungeraden Prozentwerden rundet Windows einfach die Werte komisch, so dass ein Pixel zu viel oder zu wenig auftauchen kann.


    Realisiert wird das ganze mit dem Resizing welches von AutoIt angeboten wird.

    Hier mal ein paar Einblicke von der Implementation in PassIt2 (links 100% - rechts 150% DPI). Einfach anklicken:


    Nur um das ganze klarzustellen, das skalierte Fenster ist im TeamViewer-Fenster enthalten und wurde von meinem Laptop generiert, das normale Fenster ist auf meinem PC erzeugt.


    So einfach kanns sein :)


    Wie man das ganze anstellt findet ihr im angehängten Skript heraus.

    Man kann das ganze noch weiter verfeiern, indem man Icongrößen wechselt etc. aber das Nötigste ist im Skript enthalten.


    Ist sowas als eigenständige UDF gewünscht?

    Bin mir ziemlich sicher, dass er prüft welche Beschreibung die Festplatte hat. VM-Platten haben meistens den Namen des VM-Programms irgendwie eingebaut, aber das trifft ja nicht zu wenn man klont.

    Das einzige was funktionieren könnte, wäre auf Infos zuzugreifen die die VM stellt, also BIOS-Infos und ähnliches. Die sind nämlich nicht in einem HDD-Image enthalten.

    Es gibt noch so einige Sachen die ich noch nicht verändert hab aber die noch kommen, werden. Mit der Code-Struktur bin ich ansich noch nicht ganz zufrieden (in einigen Teilen, der Rest gefällt mir bisher gut).

    Das Abfragen der Pfadlänge und ob der Pfad überhaupt beschreibbar ist werde ich zusammenlegen, das gefällt mir nicht, das sind zwei fast identische Code-Blöcke.


    Bei dem Beispiel was du aufgezählt hast hätte ich auch alle betreffende Controls inkl. Limitierungen in ein Array packen können, dann hätte ich mir dadurch auch Code gespart.

    Aber der Teil ist noch nicht ganz fertig (siehe weiter unten).


    Bei jedem Case fragst du mit _WinAPI_HiWord($wParam) = 0x200... ($iCode) warum nicht vorher einmalig abfragen und den Switch nur ausführen, wenn $iCode = 0x200?

    Wenn du genauer hinsiehst, dann siehst du, dass der Switch (oder besser die Zeilen) nicht nur ausgeführt wird wenn das Control verlassen wird, also HiWord von wParam 0x200 ist (habs mal auf $EN_KILLFOCUS umgeschrieben, hatte den Wert 0x200 einfach aus der Konsole).

    Die Zeile dadrunter bpsw. If StringRegExp($sPort, "[^\d]") Then GUICtrlSetData($hSettingsGUI_ConnectionPage_Port, StringRegExpReplace($sPort, "[^\d]", "")) sort dafür, dass man außer Zahlen nichts eintippen kann.


    Das Eingabefeld akzeptiert nur Zahlen und lässt man es frei, wird es erst resettet wenn man es verlässt. Ich möchte nicht, dass man in einem Portfeld Buchstaben oder sonst was eintragen kann.

    Das Löschen muss direkt passieren und nicht erst im Nachhinein, es soll halt wie eine Inputmask funktionieren.


    $ES_NUMBER hatte ich bereits in Betracht gezogen, aber mich störte dort der Tausenderseparator und statt die Hälfte der Arbeit von dort zu übernehmen, und die andere Hälfte selber zu schreiben wollte ich da noch Balloontooltips anzeigen lassen damit man sieht, was man dort eintragen darf.


    Entferne doch bitte noch den Filter für den Port, denn letztlich sollte der User entscheiden dürfen, welche Ports er verwenden will - ich will z.B. welche aus dem Bereich 50000-65000 nehmen, möglich sollten aber alle sein, also Port 0-65535.

    Das werde ich auch machen, letztlich ist es die Entscheidung des Users welchen Port er verwenden möchte.

    Eine Warnung werde ich vermutlich trotzdem hinzufügen, sonst sucht man sich dort die Finger wund wenn man ein spezielles Setup am Laufen hat.


    Für die Kleinigkeiten werde ich vorerst kein Update pushen, compile dir am besten einfach den Source neu (oder setz den Port in der configuration.ini. Der Worker überprüft das ja nicht :rolleyes_:).


    Was momentan in der Pipeline ist:

    • Balloontooltips für Inputmasks
    • Überprüfung der Dateipfadlänge und Beschreibbarkeit sinnvoll zusammenlegen (ist doch blöd wenn ich einen Pfad auswähle und er dann sagt "ist nicht beschreibbar")
    • Relative Pfade zulassen (ebenfalls wichtig für Punkt2, dass die Pfade dann erweitert werden für die Überprüfung) um das Programm portabel zu machen.
    • DPI-Skalierung


    Danke dir für das Feedback :thumbsup:

    Updatealarm! 1.0.1 ist nun verfügbar, und im Startpost ist nun ein Changelog einsehbar.

    Ich habe das Hauptprogramm spaßeshalber mal auf einem alten Zweitmonitor laufen lassen (1280 x 1024) - da wird dann noch einiges mehr abgeschnitten (auch in anderen Fenstern). Stellt sich allerdings die Frage, ob Monitore mit dieser geringen Auflösung berücksichtigt werden sollten.

    DPI-Skalierung lässt grüßen. Wollte ich auch implementieren (hab sogar vollständig skalierbare GUI mit dynamisch angepasster Schriftgröße gebastelt) aber es fürs erste aufs Eis gelegt, weil mir das nicht wichtig genug erschien.

    Ich setze es auf die ToDo-Liste.


    Stellt sich allerdings die Frage, ob Monitore mit dieser geringen Auflösung berücksichtigt werden sollten.

    Dass es abgeschnitten wird liegt aber nicht an der Auflösung. Das Fenster werd ich mitskalieren lassen wenn DPI gesetzt ist, oder ich bin so böse und berechne die Ursprungsgröße und anti-dpi-skaliere haha.

    Lösche ich den Inhalt des Inputfeldes mit der Backspace-Taste, wird automatisch wieder der vorherige, gespeicherte Wert eingetragen. Das ist definitiv falsch/unerwünscht, denn ich will ja einen anderen Port eintragen!

    Das passiert nur wenn man das Feld komplett löscht, das hatte ich so implementiert, damit man keine leeren Ports abspeichert (dann muss ich das nicht beim Speichern handlen).

    Aber ich verstehe schon was du meinst, ich werd das fixen. Man solls komplett löschen können aber wenn das Feld den Fokus verliert wirds resettet.


    Für die Angabe des Ports werden in dem Inputfeld nur 4 Ziffern akzeptiert - es müssen aber 5 Ziffern sein (1-65535)! (Bei mir hatte ich in der Beta 60201 als Port eingestellt)

    Das stimmt so nicht, es sind Ports von 1 bis 49000 erlaubt. Da ab 49152 (oder in der Nähe) dynamische Ports anfangen und ich das nicht da reinlaufen lassen wollte hab ich die Grenze bis 49k gewählt.

    Siehe hier: https://stackoverflow.com/ques…number-allowable-for-ipv4

    Ich könnte das ja so basteln, dass dann (sobald man über den höchsten Port hinaus schießt) den größten Port eingetragen bekommt.


    Hier würde ich die Reihenfolge ändern: General (macht man immer zuerst!), dann Connection, User, Storage, Apperance, Help und About & Updates.

    Ja stimmt schon, die Einstellungen werden sowieso noch überarbeitet werden wenn ich bald Regeln für Duplikate implementiere (hab ich noch nicht, weil das zeitlich nicht zu schaffen ist).


    Es erscheint eine Meldung, dass die Firewallregeln geändert werden müssen und der User den nächsten Prompt mit Ja bestätigen soll, damit diese geändert werden können... dieser Promt erscheint allerdings nur, wenn die UAC aktiviert ist - ist dies nicht der Fall, ist die Meldung sehr verwirrend, da der Prompt dann nicht erscheint.

    Wer ist denn so fahrlässig und schraubt sein UAC so weit runter :rolleyes_: Spaß beiseite, stimmt natürlich. Wird gefixt.


    Enable Active Transfer Mode in context men - hier fehlt das u hinter men

    Hab wohl beim hin- und her schieben die Größen irgendwie vergessen. Das Label war zu kurz, jetzt ist es lang genug.


    Add users to context menu entry "Send to" - das würde ich noch bei Users als zusätzliche Spalte einbauen, denn dann kann man für jeden User separat entscheiden, ob er im Send to Menu angezeigt werden soll.

    Weiß ich ehrlich gesagt nicht. Das "Senden an" Menü ist eigentlich ziemlich versteckt, also kann das niemanden stören.

    Wenn ich das bei jedem User individuell mache, dann muss ich die Checkbox für das Anzeigen der User im Kontextmenü entfernen, weil das ja keinen Sinn macht.


    Nicht gestestet, aber ich vermute mal stark, das du beim Empfang von Dateien die Länge des Zielpfades nicht überprüfst, denn der darf normalerweise ja nicht länger als 259 Zeichen sein.

    Guter Einwand, es wird geprüft ob der Shellaufruf 8k Zeichen lang ist um ggf. auf Dateien auszuweichen aber das hab ich wohl vergessen (wie soll man sich auch alles merken).


    Für deine nächsten Projekte... du solltest die Versionsnummer der Beta nicht gleich der finalen Version machen.

    :rofl: lol, du solltest mal meine "Versionsverwaltung" sehen. Da existieren 31 Ordner durchnummeriert von "bak1" bis "bak31".

    Die Versionsnummer der Beta war sowieso nur als Platzhalter gedacht, ich hätte da auch sonst was hinschreiben können.


    Ab jetzt wird richtig versioniert (gibts das Wort überhaupt?), das Schema das ich nutze ist: x.y.z

    x = Hauptversion (wenn kein Rewrite oder extrem große Änderung stattfindet bleibt die gleich)

    y = Featureversion (gibts neue Features? Bspw. Regeln für Duplikate implementiert)

    z = Bugfixversion (musste was kleines gefixt werden? Bspw. 256 Zeichen für die Pfadlänge implementiert & Settingsreihenfolge geändert ~> um 1 erhöhen)


    Danke für die ganzen Funde, ich werd mich da ransetzen und es möglichst bald fixen.

    Ich war mir schon totsicher, dass mir Sachen entgangen sind (sonst wäre ich nie zum Release gekommen), alleine was beim Betatest schon rumgekommen ist.