<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[forum.technik-hobby.de - Scripte]]></title>
		<link>https://forum.technik-hobby.de/</link>
		<description><![CDATA[forum.technik-hobby.de - https://forum.technik-hobby.de]]></description>
		<pubDate>Tue, 26 May 2026 18:40:31 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Barcode-Scanner (Tastatur-Emulation) und Tastatur gleichzeitig benutzen]]></title>
			<link>https://forum.technik-hobby.de/thread-105.html</link>
			<pubDate>Sun, 31 Jul 2022 17:21:20 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-105.html</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b">Problem:</span><br />
Wenn man einen Barcode-Scanner besitzt, der eine Tastaureingabe emuliert und man zusätzlich aber auch ein oder mehrere Eingabefelder für andere Daten haben will, so ist es schwierig die Eingabe von Barcode-Scanner nur in dem dafür vorgesehenen Eingabefeld einzutragen. Normalerweise wird der Barcode einfach als Tastatureingabe gesendet und landet somit in dem Eingabefeld, das gerade den Eingabefokus besitzt.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Lösung:</span><br />
Es gibt eine Möglichkeit, die Eingabe vom Barcode-Scanner zu erkennen. Dafür muss man das InputDevice registrieren (der DeviceName dient dabei der Unterscheidung).<br />
Mein Script habe ich ausführlich kommentiert, sodass hoffentlich verständlich wird, wie man sein eigenes Script anpassen muss, um diese Lösung verwenden zu können.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=170" target="_blank" title="">!BarcodeScanner.au3</a> (Größe: 4,73 KB / Downloads: 4)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b">Problem:</span><br />
Wenn man einen Barcode-Scanner besitzt, der eine Tastaureingabe emuliert und man zusätzlich aber auch ein oder mehrere Eingabefelder für andere Daten haben will, so ist es schwierig die Eingabe von Barcode-Scanner nur in dem dafür vorgesehenen Eingabefeld einzutragen. Normalerweise wird der Barcode einfach als Tastatureingabe gesendet und landet somit in dem Eingabefeld, das gerade den Eingabefokus besitzt.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Lösung:</span><br />
Es gibt eine Möglichkeit, die Eingabe vom Barcode-Scanner zu erkennen. Dafür muss man das InputDevice registrieren (der DeviceName dient dabei der Unterscheidung).<br />
Mein Script habe ich ausführlich kommentiert, sodass hoffentlich verständlich wird, wie man sein eigenes Script anpassen muss, um diese Lösung verwenden zu können.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=170" target="_blank" title="">!BarcodeScanner.au3</a> (Größe: 4,73 KB / Downloads: 4)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[_GDIPlus_GraphicsDrawStringRotate]]></title>
			<link>https://forum.technik-hobby.de/thread-100.html</link>
			<pubDate>Tue, 04 Feb 2020 18:31:18 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-100.html</guid>
			<description><![CDATA[Ich habe hier eine Funktion geschrieben, mit der man einen String auf eine GDI+ Graphic zeichnen lassen kann.<br />
Das Besondere daran ist, dass man den String um 90, 180 oder 270 Grad gedreht zeichnen lassen kann. Außerdem kann man Fontname, Schriftgröße, Schriftstil und die Ausrichtung (links, zentriert, rechts) angeben.<br />
Auch mehrzeilige Strings sind möglich.<br />
Im Beispiel habe ich außerdem einen Backbuffer mit eingebaut, um zu zeigen, wie man mit GDI+ auf andere Fenster (überlagernd) reagieren muss.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Edit:</span> Neue Version!</span> Man kann jetzt auch die <span style="color: #ff0000;" class="mycode_color">Schriftfarbe</span> angeben. <img src="https://forum.technik-hobby.de/images/smilies/smile.png" alt="Smile" title="Smile" class="smilie smilie_1" /> <br />
<br />
Screenshot:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=153" target="_blank" title="">Screenshot.png</a> (Größe: 363,44 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=154" target="_blank" title="">_GDIPlus_GraphicsDrawRotateString.au3</a> (Größe: 5,78 KB / Downloads: 12)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Ich habe hier eine Funktion geschrieben, mit der man einen String auf eine GDI+ Graphic zeichnen lassen kann.<br />
Das Besondere daran ist, dass man den String um 90, 180 oder 270 Grad gedreht zeichnen lassen kann. Außerdem kann man Fontname, Schriftgröße, Schriftstil und die Ausrichtung (links, zentriert, rechts) angeben.<br />
Auch mehrzeilige Strings sind möglich.<br />
Im Beispiel habe ich außerdem einen Backbuffer mit eingebaut, um zu zeigen, wie man mit GDI+ auf andere Fenster (überlagernd) reagieren muss.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Edit:</span> Neue Version!</span> Man kann jetzt auch die <span style="color: #ff0000;" class="mycode_color">Schriftfarbe</span> angeben. <img src="https://forum.technik-hobby.de/images/smilies/smile.png" alt="Smile" title="Smile" class="smilie smilie_1" /> <br />
<br />
Screenshot:<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=153" target="_blank" title="">Screenshot.png</a> (Größe: 363,44 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=154" target="_blank" title="">_GDIPlus_GraphicsDrawRotateString.au3</a> (Größe: 5,78 KB / Downloads: 12)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[GIF-Animation mit den neuen AutoIt-Funktionen]]></title>
			<link>https://forum.technik-hobby.de/thread-44.html</link>
			<pubDate>Sun, 06 Jan 2019 15:38:41 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-44.html</guid>
			<description><![CDATA[Seit der AutoIt-Version 3.3.14.3 (glaube ich) gibt es ja ein paar zusätzliche GDI+ Funktionen.<br />
Damit kann man ganz gut GIF-Animationen in eigenen GUIs nutzen. Bei dem Beispielscript (siehe Anhang) habe ich mal das transparente GIF aus dem alten Thread über ein Hintergrundbild gelegt.<br />
Außerdem wird es jetzt mit "_WinAPI_BitBlt" in die GUI geblittet. Das ist noch etwas schneller.<br />
Es gibt auch noch einen Pause-Button und im Pause-Modus dann einen Einzelschrittmodus. Zusätzlich wird die Größe und die Anzahl der GIF-Frames angezeigt, sowie die Durchschnittszeit, die AutoIt braucht, um den Frame anzuzeigen.<br />
Auf meinem Rechner sind das ca. 14ms pro Frame.<br />
Die GIF-Animation und das Hintergrundbild befinden sich BASE64-kodiert am Ende des Scripts.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=114" target="_blank" title="">GIF-Anim.au3</a> (Größe: 688,16 KB / Downloads: 16)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Seit der AutoIt-Version 3.3.14.3 (glaube ich) gibt es ja ein paar zusätzliche GDI+ Funktionen.<br />
Damit kann man ganz gut GIF-Animationen in eigenen GUIs nutzen. Bei dem Beispielscript (siehe Anhang) habe ich mal das transparente GIF aus dem alten Thread über ein Hintergrundbild gelegt.<br />
Außerdem wird es jetzt mit "_WinAPI_BitBlt" in die GUI geblittet. Das ist noch etwas schneller.<br />
Es gibt auch noch einen Pause-Button und im Pause-Modus dann einen Einzelschrittmodus. Zusätzlich wird die Größe und die Anzahl der GIF-Frames angezeigt, sowie die Durchschnittszeit, die AutoIt braucht, um den Frame anzuzeigen.<br />
Auf meinem Rechner sind das ca. 14ms pro Frame.<br />
Die GIF-Animation und das Hintergrundbild befinden sich BASE64-kodiert am Ende des Scripts.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=114" target="_blank" title="">GIF-Anim.au3</a> (Größe: 688,16 KB / Downloads: 16)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Frohe Weihnachten und ein glückliches neues Jahr]]></title>
			<link>https://forum.technik-hobby.de/thread-42.html</link>
			<pubDate>Fri, 28 Dec 2018 13:20:15 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-42.html</guid>
			<description><![CDATA[Ich wünsche euch allen ein frohes Weihnachtsfest (Ja, schon zu spät <img src="https://forum.technik-hobby.de/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /> ) und ein glückliches neues Jahr!<br />
Dafür gibt es von mir ein, ausführlich kommentiertes, AutoIt-Script, damit AutoIt-Anfänger etwas lernen können.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=109" target="_blank" title="">BestWishes_GDI+.au3</a> (Größe: 5,21 KB / Downloads: 8)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Ich wünsche euch allen ein frohes Weihnachtsfest (Ja, schon zu spät <img src="https://forum.technik-hobby.de/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /> ) und ein glückliches neues Jahr!<br />
Dafür gibt es von mir ein, ausführlich kommentiertes, AutoIt-Script, damit AutoIt-Anfänger etwas lernen können.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=109" target="_blank" title="">BestWishes_GDI+.au3</a> (Größe: 5,21 KB / Downloads: 8)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[BitOperations64]]></title>
			<link>https://forum.technik-hobby.de/thread-41.html</link>
			<pubDate>Sun, 23 Dec 2018 19:23:33 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-41.html</guid>
			<description><![CDATA[Diese kleine UDF enthält 8 Funktionen (BitAND, BitOR, BitNOT, BitROL, BitROR, BitSHL, BitSHR, BitXOR) zum bearbeiten von Integerzahlen im 64-Bit-Format.<br />
Das sind 8 Assembler-Funktionen, die da aufgerufen werden. Das AutoIt-Script muss aber im 64-Bit-Modus laufen (siehe Example).<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Edit 26.12.2018: Neue Version</span></span><br />
- Bei AND, OR und XOR können nun bis zu 8 Parameter direkt im Funktionsaufruf übergeben werden. Wer mehr Parameter benötigt, muss sie als Array in Parameter Eins übergeben.<br />
- Es gibt jetzt noch zwei Hilfsfunktionen "_BitRotate64" und "_BitShift64" in Anlehnung an die originalen Funktionen. Allerdings einheitlich (im Gegensatz zu den originalen Funktionen): mit negativen Werten nach links und positiven Werten nach rechts.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Edit 27.12.2018: Neue Version</span></span><br />
- OnAutoItExitRegister erst nach der Deklaration der globalen Variablen<br />
- Die Anforderung des Speichers geschieht jetzt in einer Funktion: "__BitOp64OnStart"<br />
- Fehler behoben bei "_BitRotate64" und "_BitShift64", wenn 0 für Rotate oder Shift übergeben wurde.<br />
- Fehler behoben bei "_BitROx64" und "_BitSHx64". Der Parameter-Aufruf war falsch rum. <br />
- Das Beispiel-Script komplett überarbeitet und aufgeräumt.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=108" target="_blank" title="">BitOperations64_example.au3</a> (Größe: 2,94 KB / Downloads: 6)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=107" target="_blank" title="">BitOperations64.au3</a> (Größe: 11,57 KB / Downloads: 6)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Diese kleine UDF enthält 8 Funktionen (BitAND, BitOR, BitNOT, BitROL, BitROR, BitSHL, BitSHR, BitXOR) zum bearbeiten von Integerzahlen im 64-Bit-Format.<br />
Das sind 8 Assembler-Funktionen, die da aufgerufen werden. Das AutoIt-Script muss aber im 64-Bit-Modus laufen (siehe Example).<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Edit 26.12.2018: Neue Version</span></span><br />
- Bei AND, OR und XOR können nun bis zu 8 Parameter direkt im Funktionsaufruf übergeben werden. Wer mehr Parameter benötigt, muss sie als Array in Parameter Eins übergeben.<br />
- Es gibt jetzt noch zwei Hilfsfunktionen "_BitRotate64" und "_BitShift64" in Anlehnung an die originalen Funktionen. Allerdings einheitlich (im Gegensatz zu den originalen Funktionen): mit negativen Werten nach links und positiven Werten nach rechts.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Edit 27.12.2018: Neue Version</span></span><br />
- OnAutoItExitRegister erst nach der Deklaration der globalen Variablen<br />
- Die Anforderung des Speichers geschieht jetzt in einer Funktion: "__BitOp64OnStart"<br />
- Fehler behoben bei "_BitRotate64" und "_BitShift64", wenn 0 für Rotate oder Shift übergeben wurde.<br />
- Fehler behoben bei "_BitROx64" und "_BitSHx64". Der Parameter-Aufruf war falsch rum. <br />
- Das Beispiel-Script komplett überarbeitet und aufgeräumt.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=108" target="_blank" title="">BitOperations64_example.au3</a> (Größe: 2,94 KB / Downloads: 6)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=107" target="_blank" title="">BitOperations64.au3</a> (Größe: 11,57 KB / Downloads: 6)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Stoppuhr]]></title>
			<link>https://forum.technik-hobby.de/thread-40.html</link>
			<pubDate>Thu, 29 Nov 2018 17:59:37 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-40.html</guid>
			<description><![CDATA[Eine Stoppuhr (Stunden:Minuten:Sekunden Millisekunden), deren Ziffern einzeln angesteuert werden, damit die Anzeige nicht flackert.<br />
Und damit das Ganze etwas schöner aussieht habe ich einen 7-Segment-Font für die Anzeige verwendet.<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Screenshot:</span></span><br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=99" target="_blank" title="">screenshot.png</a> (Größe: 24,37 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=100" target="_blank" title="">Stoppuhr.au3</a> (Größe: 18 KB / Downloads: 14)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Eine Stoppuhr (Stunden:Minuten:Sekunden Millisekunden), deren Ziffern einzeln angesteuert werden, damit die Anzeige nicht flackert.<br />
Und damit das Ganze etwas schöner aussieht habe ich einen 7-Segment-Font für die Anzeige verwendet.<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Screenshot:</span></span><br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=99" target="_blank" title="">screenshot.png</a> (Größe: 24,37 KB / Downloads: 5)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=100" target="_blank" title="">Stoppuhr.au3</a> (Größe: 18 KB / Downloads: 14)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[WindowDocking]]></title>
			<link>https://forum.technik-hobby.de/thread-38.html</link>
			<pubDate>Wed, 11 Jul 2018 18:38:09 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-38.html</guid>
			<description><![CDATA[Eine kleine UDF zum andocken eines (oder mehrerer) Fenster am Bildschirmrand (bzw. an der Taskleiste).<br />
Das funktioniert auch mit mehreren Bildschirmen.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Version 1.1.0.0 (08.07.2018):</span></span><br />
- Auswertung jetzt mit &#36;WM_WINDOWPOSCHANGING statt &#36;WM_WINDOWPOSCHANGED. Kein Flackern mehr! Danke Bitnugger! <br />
- Wegen &#36;WM_WINDOWPOSCHANGING funktioniert jetzt das "weiterziehen" mit der Maus nicht mehr, um auf einen anderen Bildschirm zu kommen.<br />
Deswegen habe ich jetzt einen Hotkey: &lt;CTRL&gt; eingebaut. Wird die CTRL-Taste während des ziehens gedrückt gehalten, so kann man das Fenster auf den anderen Bildschirm ziehen.<br />
- Es gibt jetzt einen "magnetischen Rahmen" (50 Pixel). Wird das Fenster in diesen Bereich bewegt, wird es an den Rand gezogen.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Version 1.2.0.0 (08.07.2018):</span></span><br />
- Die UDF nochmal komplett umgestaltet (auf globales 2D-Array). Da waren ein paar blöde Bugs drin. Danke Bitnugger!<br />
- Eine neue Funktion "_WindowDocking_SetMagneticBorder", mit der man den "MagneticBorder" auf eine beliebige Pixelzahl einstellen kann (siehe Example).<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Version 1.3.0.0 (09.07.2018):</span></span><br />
- Es gab noch einen Fehler, wenn man ein Fenster mit eingeschalteten Docking gelöscht hat (GuiDelete). Dabei wurde die WindowProc nicht wieder auf den alten Wert gesetzt und AutoIt stürzte ab. Behoben!<br />
- Bei der Array-Verwaltung (globales 2D-Array) war noch ein Fehler drin (falsch dimensioniert). Behoben!<br />
- Die "CTRL-Tasten-Methode" zum verschieben auf einen anderen Bildschirm habe ich jetzt doch standardmäßig auf die "Zwei-Maustasten-Methode" umgestellt. Das Fenster nur mit der Maus zu verschieben ist doch benutzerfreundlicher. <br />
- In Version v3.3.14.5 von AutoIt gibt es die Konstanten &#36;SM_CXSIZEFRAME und &#36;SM_CYSIZEFRAME, deshalb ist die zusätzliche Definition überflüssig.<br />
- Das Beispiel öffnet jetzt 3 Fenster und man kann jedes Fenster einzeln konfigurieren.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Version 1.4.0.0 (11.07.2018):</span></span><br />
- Wenn man ein Docking-Fenster auf einen zweiten Bildschirm geschoben hat und das Fenster minimiert und dann wieder restored hat, dann wurde es auf dem Hauptbildschirm "festgehalten". Behoben!<br />
- Es gibt eine neue Funktion "_WindowDocking_SetVisible" (damit wird das Fenster auf dem am naechsten liegenden Bildschirm zentriert, wenn sich das Fenster außerhalb des Desktopbereichs befindet).<br />
- Die Abfrage der rechten Maustaste (zum vorübergehenden ausschalten des Dockings) übernimmt jetzt die Funktion "_RMBpressed()". Im Gegensatz zu "_isPressed" wird damit die virtuelle (statt der physikalischen) rechte Maustaste abgefragt.<br />
- Das Beispielscript "WindowDocking_Example.au3" um ein Beispiel für die neue Funktion erweitert.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=95" target="_blank" title="">WindowDocking.au3</a> (Größe: 12,33 KB / Downloads: 6)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=96" target="_blank" title="">WindowDocking_Example.au3</a> (Größe: 2,68 KB / Downloads: 6)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Eine kleine UDF zum andocken eines (oder mehrerer) Fenster am Bildschirmrand (bzw. an der Taskleiste).<br />
Das funktioniert auch mit mehreren Bildschirmen.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Version 1.1.0.0 (08.07.2018):</span></span><br />
- Auswertung jetzt mit &#36;WM_WINDOWPOSCHANGING statt &#36;WM_WINDOWPOSCHANGED. Kein Flackern mehr! Danke Bitnugger! <br />
- Wegen &#36;WM_WINDOWPOSCHANGING funktioniert jetzt das "weiterziehen" mit der Maus nicht mehr, um auf einen anderen Bildschirm zu kommen.<br />
Deswegen habe ich jetzt einen Hotkey: &lt;CTRL&gt; eingebaut. Wird die CTRL-Taste während des ziehens gedrückt gehalten, so kann man das Fenster auf den anderen Bildschirm ziehen.<br />
- Es gibt jetzt einen "magnetischen Rahmen" (50 Pixel). Wird das Fenster in diesen Bereich bewegt, wird es an den Rand gezogen.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Version 1.2.0.0 (08.07.2018):</span></span><br />
- Die UDF nochmal komplett umgestaltet (auf globales 2D-Array). Da waren ein paar blöde Bugs drin. Danke Bitnugger!<br />
- Eine neue Funktion "_WindowDocking_SetMagneticBorder", mit der man den "MagneticBorder" auf eine beliebige Pixelzahl einstellen kann (siehe Example).<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Version 1.3.0.0 (09.07.2018):</span></span><br />
- Es gab noch einen Fehler, wenn man ein Fenster mit eingeschalteten Docking gelöscht hat (GuiDelete). Dabei wurde die WindowProc nicht wieder auf den alten Wert gesetzt und AutoIt stürzte ab. Behoben!<br />
- Bei der Array-Verwaltung (globales 2D-Array) war noch ein Fehler drin (falsch dimensioniert). Behoben!<br />
- Die "CTRL-Tasten-Methode" zum verschieben auf einen anderen Bildschirm habe ich jetzt doch standardmäßig auf die "Zwei-Maustasten-Methode" umgestellt. Das Fenster nur mit der Maus zu verschieben ist doch benutzerfreundlicher. <br />
- In Version v3.3.14.5 von AutoIt gibt es die Konstanten &#36;SM_CXSIZEFRAME und &#36;SM_CYSIZEFRAME, deshalb ist die zusätzliche Definition überflüssig.<br />
- Das Beispiel öffnet jetzt 3 Fenster und man kann jedes Fenster einzeln konfigurieren.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="text-decoration: underline;" class="mycode_u">Version 1.4.0.0 (11.07.2018):</span></span><br />
- Wenn man ein Docking-Fenster auf einen zweiten Bildschirm geschoben hat und das Fenster minimiert und dann wieder restored hat, dann wurde es auf dem Hauptbildschirm "festgehalten". Behoben!<br />
- Es gibt eine neue Funktion "_WindowDocking_SetVisible" (damit wird das Fenster auf dem am naechsten liegenden Bildschirm zentriert, wenn sich das Fenster außerhalb des Desktopbereichs befindet).<br />
- Die Abfrage der rechten Maustaste (zum vorübergehenden ausschalten des Dockings) übernimmt jetzt die Funktion "_RMBpressed()". Im Gegensatz zu "_isPressed" wird damit die virtuelle (statt der physikalischen) rechte Maustaste abgefragt.<br />
- Das Beispielscript "WindowDocking_Example.au3" um ein Beispiel für die neue Funktion erweitert.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=95" target="_blank" title="">WindowDocking.au3</a> (Größe: 12,33 KB / Downloads: 6)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=96" target="_blank" title="">WindowDocking_Example.au3</a> (Größe: 2,68 KB / Downloads: 6)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[GuiCtrlSetImageEx]]></title>
			<link>https://forum.technik-hobby.de/thread-37.html</link>
			<pubDate>Thu, 21 Jun 2018 09:46:03 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-37.html</guid>
			<description><![CDATA[Mit dieser kleinen Funktion kann man einem PIC-Control (GuiCtrlCreatePic) oder einem Button (GuiCtrlCreateButton) ein beliebiges Bild zuweisen (alle von GDI+ unterstützten Grafikformate).<br />
<br />
- Dabei werden Bilder, die größer als das PIC-Control sind, proportional auf die Größe des PIC-Controls herunterskaliert.<br />
- Die Bilder werden immer horizontal/vertikal zentriert angezeigt.<br />
- Die Grafikdatei kann entweder als GDI+ Bitmap, als Dateiname oder als Binärdaten übergeben werden. So kann man auch den <a href="https://autoit.de/index.php?thread/29541-file-to-base64-string-code-generator-v1-20-build-2015-01-20/&amp;postID=237745#post237745" target="_blank" rel="noopener" class="mycode_url">File to Base64 String Code Generator</a> von UEZ benutzen, um Bilder direkt ins Script einzubinden.<br />
- Man kann mit der Funktion auch Buttons ein Bild oder ein Bild und Text zuweisen.<br />
- Wenn dem Button nur ein Bild zugewiesen wird, dann wird es entsprechend der Höhe proportional skaliert zentriert auf den Button angezeigt.<br />
- Wenn Bild und Text zugewiesen werden, kann man angeben, ob der Text links (&#36;GCSIE_LEFT) oder rechts (&#36;GCSIE_RIGHT) vom Bild angezeigt werden soll (siehe Example.au3).<br />
<br />
In dem Beispiel-Script sind zwei Bilder als Binärdaten enthalten, die mit dem erwähnten Code-Generator erstellt wurden.<br />
Ansonsten sollte das Beispiel und die Kommentare die Anwendungsmöglichkeiten verdeutlichen.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=91" target="_blank" title="">GuiCtrlSetImageEx.au3</a> (Größe: 7,9 KB / Downloads: 8)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=92" target="_blank" title="">Example.au3</a> (Größe: 674,63 KB / Downloads: 10)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Mit dieser kleinen Funktion kann man einem PIC-Control (GuiCtrlCreatePic) oder einem Button (GuiCtrlCreateButton) ein beliebiges Bild zuweisen (alle von GDI+ unterstützten Grafikformate).<br />
<br />
- Dabei werden Bilder, die größer als das PIC-Control sind, proportional auf die Größe des PIC-Controls herunterskaliert.<br />
- Die Bilder werden immer horizontal/vertikal zentriert angezeigt.<br />
- Die Grafikdatei kann entweder als GDI+ Bitmap, als Dateiname oder als Binärdaten übergeben werden. So kann man auch den <a href="https://autoit.de/index.php?thread/29541-file-to-base64-string-code-generator-v1-20-build-2015-01-20/&amp;postID=237745#post237745" target="_blank" rel="noopener" class="mycode_url">File to Base64 String Code Generator</a> von UEZ benutzen, um Bilder direkt ins Script einzubinden.<br />
- Man kann mit der Funktion auch Buttons ein Bild oder ein Bild und Text zuweisen.<br />
- Wenn dem Button nur ein Bild zugewiesen wird, dann wird es entsprechend der Höhe proportional skaliert zentriert auf den Button angezeigt.<br />
- Wenn Bild und Text zugewiesen werden, kann man angeben, ob der Text links (&#36;GCSIE_LEFT) oder rechts (&#36;GCSIE_RIGHT) vom Bild angezeigt werden soll (siehe Example.au3).<br />
<br />
In dem Beispiel-Script sind zwei Bilder als Binärdaten enthalten, die mit dem erwähnten Code-Generator erstellt wurden.<br />
Ansonsten sollte das Beispiel und die Kommentare die Anwendungsmöglichkeiten verdeutlichen.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=91" target="_blank" title="">GuiCtrlSetImageEx.au3</a> (Größe: 7,9 KB / Downloads: 8)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=92" target="_blank" title="">Example.au3</a> (Größe: 674,63 KB / Downloads: 10)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Zeit ändern per MouseWheel]]></title>
			<link>https://forum.technik-hobby.de/thread-36.html</link>
			<pubDate>Thu, 21 Jun 2018 09:00:22 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-36.html</guid>
			<description><![CDATA[Für meine Digitaluhr habe ich ja die Alarmzeit per MouseWheel einstellbar gemacht.<br />
Falls ihr so etwas auch machen wollt, hier mal ein kleines, kommentiertes Minimal-Beispiel:<br />
<pre class="line-numbers"><code class="language-autoit"><br />
#include &lt;GUIConstantsEx.au3&gt;<br />
#include &lt;WinAPIGdi.au3&gt;<br />
#include &lt;WindowsConstants.au3&gt;<br />
<br />
Global &#36;hGui = GUICreate('Zeit ändern per MouseWheel', 350, 200)<br />
Global &#36;aidClock[3]<br />
For &#36;i = 0 To 2<br />
    &#36;aidClock[&#36;i] = GUICtrlCreateLabel('00', 60 + &#36;i * 80, 20, 50, 44)<br />
    GUICtrlSetFont(-1, 32, 800, 0, 'Courier New')<br />
Next<br />
GUICtrlCreateLabel(':', 112, 20, 26, 44)<br />
GUICtrlSetFont(-1, 32, 400, 0, 'Courier New')<br />
GUICtrlCreateLabel(':', 192, 20, 26, 44)<br />
GUICtrlSetFont(-1, 32, 400, 0, 'Courier New')<br />
<br />
GUISetState()<br />
GUIRegisterMsg(&#36;WM_MOUSEWHEEL, '_WM_MOUSEWHEEL')<br />
Do<br />
Until GUIGetMsg() = &#36;GUI_EVENT_CLOSE<br />
<br />
Func _WM_MOUSEWHEEL(&#36;hWnd, &#36;iMsg, &#36;wParam, &#36;lParam)<br />
    Local Const &#36;aMaxVal[3] = [23, 59, 59], &#36;iWheelDelta = 120<br />
    Local &#36;iWheel, &#36;aGuiInfo, &#36;iIndex, &#36;iValue<br />
    &#36;iWheel = _WinAPI_HiWord(&#36;wParam) / &#36;iWheelDelta ; HiWord(wParam) / WheelDelta ergibt down = -1, up = 1<br />
    &#36;aGuiInfo = GUIGetCursorInfo(&#36;hWnd) ; &#36;aGuiInfo[4] enthaelt die Ctrl-ID vom Control unter dem Mauszeiger<br />
    &#36;iIndex = &#36;aGuiInfo[4] - &#36;aidClock[0] ; minus der Ctrl-ID vom ersten Label ergibt 0...2 fuer die Clock-Labels<br />
    If &#36;iIndex &lt; 0 Or &#36;iIndex &gt; 2 Then Return &#36;GUI_RUNDEFMSG ; wenn Mauszeiger ausserhalb, dann Funktion verlassen<br />
    &#36;iValue = GUICtrlRead(&#36;aidClock[&#36;iIndex]) + &#36;iWheel ; Wert auslesen und Wheelwert (-1 oder 1) addieren<br />
    If &#36;iValue &gt; &#36;aMaxVal[&#36;iIndex] Then &#36;iValue = 0 ; wenn neuer Wert groesser als Maximalwert, dann 0<br />
    If &#36;iValue &lt; 0 Then &#36;iValue = &#36;aMaxVal[&#36;iIndex] ; wenn neuer Wert kleiner als 0, dann Maximalwert<br />
    _WinAPI_LockWindowUpdate(&#36;hWnd) ; WindowUpdate blockieren (verhindert das flackern beim aendern der Werte)<br />
    GUICtrlSetData(&#36;aidClock[&#36;iIndex], StringFormat('%02i', &#36;iValue)) ; neuen Wert setzen<br />
    _WinAPI_LockWindowUpdate(0) ; WindowUpdate wieder freigeben<br />
    Return &#36;GUI_RUNDEFMSG<br />
EndFunc   ;==&gt;_WM_MOUSEWHEEL<br />
<br />
</code></pre>]]></description>
			<content:encoded><![CDATA[Für meine Digitaluhr habe ich ja die Alarmzeit per MouseWheel einstellbar gemacht.<br />
Falls ihr so etwas auch machen wollt, hier mal ein kleines, kommentiertes Minimal-Beispiel:<br />
<pre class="line-numbers"><code class="language-autoit"><br />
#include &lt;GUIConstantsEx.au3&gt;<br />
#include &lt;WinAPIGdi.au3&gt;<br />
#include &lt;WindowsConstants.au3&gt;<br />
<br />
Global &#36;hGui = GUICreate('Zeit ändern per MouseWheel', 350, 200)<br />
Global &#36;aidClock[3]<br />
For &#36;i = 0 To 2<br />
    &#36;aidClock[&#36;i] = GUICtrlCreateLabel('00', 60 + &#36;i * 80, 20, 50, 44)<br />
    GUICtrlSetFont(-1, 32, 800, 0, 'Courier New')<br />
Next<br />
GUICtrlCreateLabel(':', 112, 20, 26, 44)<br />
GUICtrlSetFont(-1, 32, 400, 0, 'Courier New')<br />
GUICtrlCreateLabel(':', 192, 20, 26, 44)<br />
GUICtrlSetFont(-1, 32, 400, 0, 'Courier New')<br />
<br />
GUISetState()<br />
GUIRegisterMsg(&#36;WM_MOUSEWHEEL, '_WM_MOUSEWHEEL')<br />
Do<br />
Until GUIGetMsg() = &#36;GUI_EVENT_CLOSE<br />
<br />
Func _WM_MOUSEWHEEL(&#36;hWnd, &#36;iMsg, &#36;wParam, &#36;lParam)<br />
    Local Const &#36;aMaxVal[3] = [23, 59, 59], &#36;iWheelDelta = 120<br />
    Local &#36;iWheel, &#36;aGuiInfo, &#36;iIndex, &#36;iValue<br />
    &#36;iWheel = _WinAPI_HiWord(&#36;wParam) / &#36;iWheelDelta ; HiWord(wParam) / WheelDelta ergibt down = -1, up = 1<br />
    &#36;aGuiInfo = GUIGetCursorInfo(&#36;hWnd) ; &#36;aGuiInfo[4] enthaelt die Ctrl-ID vom Control unter dem Mauszeiger<br />
    &#36;iIndex = &#36;aGuiInfo[4] - &#36;aidClock[0] ; minus der Ctrl-ID vom ersten Label ergibt 0...2 fuer die Clock-Labels<br />
    If &#36;iIndex &lt; 0 Or &#36;iIndex &gt; 2 Then Return &#36;GUI_RUNDEFMSG ; wenn Mauszeiger ausserhalb, dann Funktion verlassen<br />
    &#36;iValue = GUICtrlRead(&#36;aidClock[&#36;iIndex]) + &#36;iWheel ; Wert auslesen und Wheelwert (-1 oder 1) addieren<br />
    If &#36;iValue &gt; &#36;aMaxVal[&#36;iIndex] Then &#36;iValue = 0 ; wenn neuer Wert groesser als Maximalwert, dann 0<br />
    If &#36;iValue &lt; 0 Then &#36;iValue = &#36;aMaxVal[&#36;iIndex] ; wenn neuer Wert kleiner als 0, dann Maximalwert<br />
    _WinAPI_LockWindowUpdate(&#36;hWnd) ; WindowUpdate blockieren (verhindert das flackern beim aendern der Werte)<br />
    GUICtrlSetData(&#36;aidClock[&#36;iIndex], StringFormat('%02i', &#36;iValue)) ; neuen Wert setzen<br />
    _WinAPI_LockWindowUpdate(0) ; WindowUpdate wieder freigeben<br />
    Return &#36;GUI_RUNDEFMSG<br />
EndFunc   ;==&gt;_WM_MOUSEWHEEL<br />
<br />
</code></pre>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[_ProgressEx]]></title>
			<link>https://forum.technik-hobby.de/thread-33.html</link>
			<pubDate>Thu, 08 Mar 2018 12:28:37 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-33.html</guid>
			<description><![CDATA[Ach ja, schon wieder eine Progressbar. <img src="https://forum.technik-hobby.de/images/smilies/smile.png" alt="Smile" title="Smile" class="smilie smilie_1" /> <br />
Ich brauchte etwas Universelleres, als meine bisherigen Progressbars. Vielleicht könnt ihr die UDF ja auch gebrauchen...<br />
Mit dieser UDF kann man:<br />
- die Koordinaten auf der GUI frei wählen<br />
- die Breite und Höhe der Progressbar frei wählen<br />
- die Progressbar horizontal oder vertikal anzeigen lassen<br />
- die Farbe der Progressbar frei wählen<br />
- eine Prozentanzeige anzeigen lassen<br />
- die Prozentanzeige horizontal oder vertikal anzeigen lassen<br />
<br />
<span style="text-decoration: underline;" class="mycode_u"><span style="font-weight: bold;" class="mycode_b">Screenshot:<br />
</span></span><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=81" target="_blank" title="">_ProgressEx_Screenshot.png</a> (Größe: 20,23 KB / Downloads: 6)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=82" target="_blank" title="">_ProgressEx_v1_0.zip</a> (Größe: 3,54 KB / Downloads: 13)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Ach ja, schon wieder eine Progressbar. <img src="https://forum.technik-hobby.de/images/smilies/smile.png" alt="Smile" title="Smile" class="smilie smilie_1" /> <br />
Ich brauchte etwas Universelleres, als meine bisherigen Progressbars. Vielleicht könnt ihr die UDF ja auch gebrauchen...<br />
Mit dieser UDF kann man:<br />
- die Koordinaten auf der GUI frei wählen<br />
- die Breite und Höhe der Progressbar frei wählen<br />
- die Progressbar horizontal oder vertikal anzeigen lassen<br />
- die Farbe der Progressbar frei wählen<br />
- eine Prozentanzeige anzeigen lassen<br />
- die Prozentanzeige horizontal oder vertikal anzeigen lassen<br />
<br />
<span style="text-decoration: underline;" class="mycode_u"><span style="font-weight: bold;" class="mycode_b">Screenshot:<br />
</span></span><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=81" target="_blank" title="">_ProgressEx_Screenshot.png</a> (Größe: 20,23 KB / Downloads: 6)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=82" target="_blank" title="">_ProgressEx_v1_0.zip</a> (Größe: 3,54 KB / Downloads: 13)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[_GDIPlus_ImageGetUniqueColors]]></title>
			<link>https://forum.technik-hobby.de/thread-31.html</link>
			<pubDate>Thu, 23 Nov 2017 08:40:57 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-31.html</guid>
			<description><![CDATA[Man übergibt der Funktion "_GDIPlus_ImageGetUniqueColors" das Handle zu einer GDI+ Bitmap und bekommt die Anzahl der verwendeten Farben zurück.<br />
Weil das Ganze in purem AutoIt zu lange dauern würde, haben wir (Mars, Andy und ich) das zählen der Farben in eine Assemblerroutine ausgelagert. Diese kleine (40 Byte) Routine befindet sich als Binaercode in der UDF und wird direkt vom Speicher aus aufgerufen.<br />
Die UDF sowie ein Beispielscript (mit Beispielbild im Binärformat) befindet sich im ZIP-Archiv im Anhang.<br />
<br />
<div class="spoiler">
		<div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span>Spoiler:</div>
		<div class="spoiler_content" style="display: none;">
<pre class="line-numbers"><code class="language-autoit"><br />
#AutoIt3Wrapper_UseX64=n                          ; 32Bit-Modus!<br />
#Region ;************ Includes ************<br />
#include-once<br />
#include &lt;GDIPlus.au3&gt;<br />
#include &lt;Memory.au3&gt;<br />
#EndRegion ;************ Includes ************<br />
<br />
#Region ASM-Code<br />
#cs _CountUniqueColors                            ;<br />
	Use32                                         ; 32Bit Modus!<br />
	mov esi,dword[esp+4]                          ; Pixelstruct-Pointer holen<br />
	mov ecx,dword[esp+8]                          ; Anzahl der Pixel holen (Pixelcounter)<br />
	mov edi,dword[esp+12]                         ; Colorstruct-Pointer holen<br />
	xor eax,eax                                   ; eax als Farbzaehler (auf null setzen)<br />
	@pixel_count:                                 ; Anfang der Schleife fuer alle Pixel<br />
	mov ebx,[esi]                                 ; Farbwert aus Pixelstruct holen<br />
	and ebx,0xffffff                              ; Alphachannel eliminieren<br />
	cmp byte[edi+ebx],0                           ; Wert aus der Colorstruct = 0?<br />
	jnz @next                                     ; wenn nicht 0, dann wurde die Farbe bereits gezaehlt, weiter -&gt; @next<br />
	inc eax                                       ; den Farbzaehler um eins erhoehen<br />
	mov byte[edi+ebx],1                           ; den Wert in der Colorstruct auf 1 setzen<br />
	@next:<br />
	add esi,4                                     ; den Pixelstruct-Pointer um 4 erhoehen (naechstes DWORD)<br />
	dec ecx                                       ; Pixelcounter um eins verringern<br />
	jnz @pixel_count                              ; wenn Pixelcount nocht nicht 0, dann Schleife wiederholen<br />
	ret                                           ; eax (Farbzaehler) wird zurueckgegeben<br />
#ce<br />
#EndRegion ASM-Code<br />
<br />
; &#36;__IGUC_g_bCode entspricht dem obigen ASM-Code im Binaerformat<br />
Global Const &#36;__IGUC_g_bCode = '0x8B7424048B4C24088B7C240C31C08B1E81E3FFFFFF00803C1F00750540C6041F0183C6044975E7C3'<br />
; Die Speichergroesse fuer den ASM-Code berechnen<br />
Global Const &#36;__IGUC_g_iMemSize = StringLen(&#36;__IGUC_g_bCode) / 2 - 1<br />
; Achtung! Hier unbedingt virtuellen Speicher mit "_MemVirtualAlloc" anfordern, weil sonst<br />
; (bei eingeschalteter Datenausfuehrungsverhinderung = DEP) AutoIt mit einer Fehlermeldung beendet wird.<br />
Global Const &#36;__IGUC_g_pMem = _MemVirtualAlloc(0, &#36;__IGUC_g_iMemSize, &#36;MEM_COMMIT, &#36;PAGE_EXECUTE_READWRITE)<br />
If &#36;__IGUC_g_pMem = 0 Then Exit MsgBox(16, 'Error!', "Can't allocate virtual memory!")<br />
; Struktur fuer den ASM-Code im virtuellen Speicher erstellen<br />
Global &#36;__IGUC_g_tCodeBuffer = DllStructCreate('byte[' &amp; &#36;__IGUC_g_iMemSize &amp; ']', &#36;__IGUC_g_pMem)<br />
; den ASM-Code in den Speicher schreiben (wird unten bei DllCallAddress aufgerufen)<br />
DllStructSetData(&#36;__IGUC_g_tCodeBuffer, 1, &#36;__IGUC_g_bCode)<br />
<br />
OnAutoItExitRegister('__IGUC_Exit')<br />
_GDIPlus_Startup()<br />
<br />
Func __IGUC_Exit()<br />
	_MemVirtualFree(&#36;__IGUC_g_pMem, &#36;__IGUC_g_iMemSize, &#36;MEM_DECOMMIT)<br />
	&#36;__IGUC_g_tCodeBuffer = 0<br />
	_GDIPlus_Shutdown()<br />
EndFunc   ;==&gt;__IGUC_Exit<br />
<br />
Func _GDIPlus_ImageGetUniqueColors(ByRef &#36;hImage)<br />
	Local &#36;aDim, &#36;tBitmapData, &#36;tPixel, &#36;pPixel, &#36;tColors, &#36;pColors, &#36;aRet, &#36;iError = 0<br />
	&#36;aDim =  _GDIPlus_ImageGetDimension(&#36;hImage)<br />
	&#36;tBitmapData = _GDIPlus_BitmapLockBits(&#36;hImage, 0, 0, &#36;aDim[0], &#36;aDim[1], &#36;GDIP_ILMREAD, &#36;GDIP_PXF32PARGB)<br />
	If @error Then Return SetError(@error, 0, -1)<br />
	&#36;tPixel = DllStructCreate('dword[' &amp; &#36;tBitmapData.Width * &#36;tBitmapData.Height &amp; '];', &#36;tBitmapData.Scan0) ; Pixelstruct (dword = 32 Bit pro Pixel)<br />
	If @error Then Return SetError(10 + @error, 0, -1)<br />
	&#36;pPixel = DllStructGetPtr(&#36;tPixel)<br />
	&#36;tColors = DllStructCreate('byte[' &amp; 0xffffff + 1 &amp; '];') ; Colorstruct (1 Byte pro Farbwert)<br />
	If @error Then Return SetError(20 + @error, 0, -1)<br />
	&#36;pColors = DllStructGetPtr(&#36;tColors)<br />
	&#36;aRet = DllCallAddress('uint:cdecl', DllStructGetPtr(&#36;__IGUC_g_tCodeBuffer), 'ptr', &#36;pPixel, 'dword', &#36;tBitmapData.Width * &#36;tBitmapData.Height, 'ptr', &#36;pColors)<br />
	&#36;iError = 30 + @error<br />
	_GDIPlus_BitmapUnlockBits(&#36;hImage, &#36;tBitmapData)<br />
	&#36;tColors = 0<br />
	&#36;tPixel = 0<br />
	&#36;tBitmapData = 0<br />
	Return SetError(&#36;iError, 0, (IsArray(&#36;aRet) ? &#36;aRet[0] : -1))<br />
EndFunc   ;==&gt;_GDIPlus_ImageGetUniqueColors<br />
</code></pre>
</div>
	</div><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=75" target="_blank" title="">_GDIPlus_ImageGetUniqueColors.zip</a> (Größe: 566,61 KB / Downloads: 10)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Man übergibt der Funktion "_GDIPlus_ImageGetUniqueColors" das Handle zu einer GDI+ Bitmap und bekommt die Anzahl der verwendeten Farben zurück.<br />
Weil das Ganze in purem AutoIt zu lange dauern würde, haben wir (Mars, Andy und ich) das zählen der Farben in eine Assemblerroutine ausgelagert. Diese kleine (40 Byte) Routine befindet sich als Binaercode in der UDF und wird direkt vom Speicher aus aufgerufen.<br />
Die UDF sowie ein Beispielscript (mit Beispielbild im Binärformat) befindet sich im ZIP-Archiv im Anhang.<br />
<br />
<div class="spoiler">
		<div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span>Spoiler:</div>
		<div class="spoiler_content" style="display: none;">
<pre class="line-numbers"><code class="language-autoit"><br />
#AutoIt3Wrapper_UseX64=n                          ; 32Bit-Modus!<br />
#Region ;************ Includes ************<br />
#include-once<br />
#include &lt;GDIPlus.au3&gt;<br />
#include &lt;Memory.au3&gt;<br />
#EndRegion ;************ Includes ************<br />
<br />
#Region ASM-Code<br />
#cs _CountUniqueColors                            ;<br />
	Use32                                         ; 32Bit Modus!<br />
	mov esi,dword[esp+4]                          ; Pixelstruct-Pointer holen<br />
	mov ecx,dword[esp+8]                          ; Anzahl der Pixel holen (Pixelcounter)<br />
	mov edi,dword[esp+12]                         ; Colorstruct-Pointer holen<br />
	xor eax,eax                                   ; eax als Farbzaehler (auf null setzen)<br />
	@pixel_count:                                 ; Anfang der Schleife fuer alle Pixel<br />
	mov ebx,[esi]                                 ; Farbwert aus Pixelstruct holen<br />
	and ebx,0xffffff                              ; Alphachannel eliminieren<br />
	cmp byte[edi+ebx],0                           ; Wert aus der Colorstruct = 0?<br />
	jnz @next                                     ; wenn nicht 0, dann wurde die Farbe bereits gezaehlt, weiter -&gt; @next<br />
	inc eax                                       ; den Farbzaehler um eins erhoehen<br />
	mov byte[edi+ebx],1                           ; den Wert in der Colorstruct auf 1 setzen<br />
	@next:<br />
	add esi,4                                     ; den Pixelstruct-Pointer um 4 erhoehen (naechstes DWORD)<br />
	dec ecx                                       ; Pixelcounter um eins verringern<br />
	jnz @pixel_count                              ; wenn Pixelcount nocht nicht 0, dann Schleife wiederholen<br />
	ret                                           ; eax (Farbzaehler) wird zurueckgegeben<br />
#ce<br />
#EndRegion ASM-Code<br />
<br />
; &#36;__IGUC_g_bCode entspricht dem obigen ASM-Code im Binaerformat<br />
Global Const &#36;__IGUC_g_bCode = '0x8B7424048B4C24088B7C240C31C08B1E81E3FFFFFF00803C1F00750540C6041F0183C6044975E7C3'<br />
; Die Speichergroesse fuer den ASM-Code berechnen<br />
Global Const &#36;__IGUC_g_iMemSize = StringLen(&#36;__IGUC_g_bCode) / 2 - 1<br />
; Achtung! Hier unbedingt virtuellen Speicher mit "_MemVirtualAlloc" anfordern, weil sonst<br />
; (bei eingeschalteter Datenausfuehrungsverhinderung = DEP) AutoIt mit einer Fehlermeldung beendet wird.<br />
Global Const &#36;__IGUC_g_pMem = _MemVirtualAlloc(0, &#36;__IGUC_g_iMemSize, &#36;MEM_COMMIT, &#36;PAGE_EXECUTE_READWRITE)<br />
If &#36;__IGUC_g_pMem = 0 Then Exit MsgBox(16, 'Error!', "Can't allocate virtual memory!")<br />
; Struktur fuer den ASM-Code im virtuellen Speicher erstellen<br />
Global &#36;__IGUC_g_tCodeBuffer = DllStructCreate('byte[' &amp; &#36;__IGUC_g_iMemSize &amp; ']', &#36;__IGUC_g_pMem)<br />
; den ASM-Code in den Speicher schreiben (wird unten bei DllCallAddress aufgerufen)<br />
DllStructSetData(&#36;__IGUC_g_tCodeBuffer, 1, &#36;__IGUC_g_bCode)<br />
<br />
OnAutoItExitRegister('__IGUC_Exit')<br />
_GDIPlus_Startup()<br />
<br />
Func __IGUC_Exit()<br />
	_MemVirtualFree(&#36;__IGUC_g_pMem, &#36;__IGUC_g_iMemSize, &#36;MEM_DECOMMIT)<br />
	&#36;__IGUC_g_tCodeBuffer = 0<br />
	_GDIPlus_Shutdown()<br />
EndFunc   ;==&gt;__IGUC_Exit<br />
<br />
Func _GDIPlus_ImageGetUniqueColors(ByRef &#36;hImage)<br />
	Local &#36;aDim, &#36;tBitmapData, &#36;tPixel, &#36;pPixel, &#36;tColors, &#36;pColors, &#36;aRet, &#36;iError = 0<br />
	&#36;aDim =  _GDIPlus_ImageGetDimension(&#36;hImage)<br />
	&#36;tBitmapData = _GDIPlus_BitmapLockBits(&#36;hImage, 0, 0, &#36;aDim[0], &#36;aDim[1], &#36;GDIP_ILMREAD, &#36;GDIP_PXF32PARGB)<br />
	If @error Then Return SetError(@error, 0, -1)<br />
	&#36;tPixel = DllStructCreate('dword[' &amp; &#36;tBitmapData.Width * &#36;tBitmapData.Height &amp; '];', &#36;tBitmapData.Scan0) ; Pixelstruct (dword = 32 Bit pro Pixel)<br />
	If @error Then Return SetError(10 + @error, 0, -1)<br />
	&#36;pPixel = DllStructGetPtr(&#36;tPixel)<br />
	&#36;tColors = DllStructCreate('byte[' &amp; 0xffffff + 1 &amp; '];') ; Colorstruct (1 Byte pro Farbwert)<br />
	If @error Then Return SetError(20 + @error, 0, -1)<br />
	&#36;pColors = DllStructGetPtr(&#36;tColors)<br />
	&#36;aRet = DllCallAddress('uint:cdecl', DllStructGetPtr(&#36;__IGUC_g_tCodeBuffer), 'ptr', &#36;pPixel, 'dword', &#36;tBitmapData.Width * &#36;tBitmapData.Height, 'ptr', &#36;pColors)<br />
	&#36;iError = 30 + @error<br />
	_GDIPlus_BitmapUnlockBits(&#36;hImage, &#36;tBitmapData)<br />
	&#36;tColors = 0<br />
	&#36;tPixel = 0<br />
	&#36;tBitmapData = 0<br />
	Return SetError(&#36;iError, 0, (IsArray(&#36;aRet) ? &#36;aRet[0] : -1))<br />
EndFunc   ;==&gt;_GDIPlus_ImageGetUniqueColors<br />
</code></pre>
</div>
	</div><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=75" target="_blank" title="">_GDIPlus_ImageGetUniqueColors.zip</a> (Größe: 566,61 KB / Downloads: 10)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[_GDIPlus_ImageGetPropertyItems]]></title>
			<link>https://forum.technik-hobby.de/thread-30.html</link>
			<pubDate>Thu, 09 Nov 2017 08:57:28 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-30.html</guid>
			<description><![CDATA[Diese Funktion liest ausgewaehlte (siehe &#36;aDescription in _GDIPlus_ImageGetItemValue) Exifdaten aus der uebergebenen GDI+ Bitmap aus und gibt diese als String in englisch (&#36;iLanguage = 0) oder deutsch (&#36;iLanguage = 1) zurueck.<br />
Es werden zur Zeit 24 Exifdaten ausgelesen (vorausgesetzt diese sind in dem Bild gespeichert).<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=76" target="_blank" title="">_GDIPlus_ImageGetPropertyItems.au3</a> (Größe: 9,94 KB / Downloads: 9)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=77" target="_blank" title="">_GDIPlus_ImageGetPropertyItems_Example.au3</a> (Größe: 1,02 KB / Downloads: 9)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Diese Funktion liest ausgewaehlte (siehe &#36;aDescription in _GDIPlus_ImageGetItemValue) Exifdaten aus der uebergebenen GDI+ Bitmap aus und gibt diese als String in englisch (&#36;iLanguage = 0) oder deutsch (&#36;iLanguage = 1) zurueck.<br />
Es werden zur Zeit 24 Exifdaten ausgelesen (vorausgesetzt diese sind in dem Bild gespeichert).<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=76" target="_blank" title="">_GDIPlus_ImageGetPropertyItems.au3</a> (Größe: 9,94 KB / Downloads: 9)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=77" target="_blank" title="">_GDIPlus_ImageGetPropertyItems_Example.au3</a> (Größe: 1,02 KB / Downloads: 9)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[_GDIPlus_ImageSaveAsJPG]]></title>
			<link>https://forum.technik-hobby.de/thread-29.html</link>
			<pubDate>Wed, 08 Nov 2017 10:07:58 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-29.html</guid>
			<description><![CDATA[Diese Funktion kann eine GDI+ Bitmap als JPG abspeichern.<br />
Das allein ist ja nichts Besonderes, aber meine Funktion bietet an, die Bitmap vorher zu skalieren und zu drehen bzw. zu spiegeln und kann dann trotzdem noch die EXIF-Daten der Ursprungsbitmap übernehmen.<br />
Beim skalieren einer GDI+ Bitmap (mit _GDIPlus_ImageScale) wird nämlich eine neue Bitmap erstellt und wenn man diese abspeichert, gehen die EXIF-Daten verloren. Will man diese beibehalten, muss man die Daten von der "alten" Bitmap rüberkopieren.<br />
Und genau dieses kopieren der EXIF-Daten hat mich den ganzen gestrigen Tag beschäftigt. Ich wollte das unbedingt nur mit AutoIt schaffen (ohne externe Programme verwenden zu müssen).<br />
Heute habe ich dann den Durchbruch geschafft und die Funktion fertig gestellt:<br />
<div class="spoiler">
		<div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span>Spoiler:</div>
		<div class="spoiler_content" style="display: none;">
<br />
<br />
<br />
<pre class="line-numbers"><code class="language-autoit">#include &lt;GDIPlus.au3&gt;<br />
<br />
Global &#36;sImagefile = @ScriptDir &amp; '\test.jpg'<br />
Global &#36;sNewFile = @ScriptDir &amp; '\test_new.jpg'<br />
<br />
_GDIPlus_Startup()<br />
Global &#36;hImage = _GDIPlus_BitmapCreateFromFile(&#36;sImagefile)<br />
<br />
; Bild als JPG speichern mit Uebername der EXIF-Daten, 90% Qualitaet, Breite und Hoehe jeweils 25% und keine Drehung<br />
_GDIPlus_ImageSaveAsJPG(&#36;hImage, &#36;sNewFile, True, 90, 0.25, 0.25, 0)<br />
<br />
_GDIPlus_BitmapDispose(&#36;hImage)<br />
_GDIPlus_Shutdown()<br />
<br />
If FileExists(&#36;sNewFile) Then ShellExecute(&#36;sNewFile)<br />
Exit<br />
<br />
#cs<br />
    &#36;iRotate = Type of rotation and flip:<br />
    0 - No rotation and no flipping (A 180-degree rotation, a horizontal flip and then a vertical flip)<br />
    1 - A 90-degree rotation without flipping (A 270-degree rotation, a horizontal flip and then a vertical flip)<br />
    2 - A 180-degree rotation without flipping (No rotation, a horizontal flip followed by a vertical flip)<br />
    3 - A 270-degree rotation without flipping (A 90-degree rotation, a horizontal flip and then a vertical flip)<br />
    4 - No rotation and a horizontal flip (A 180-degree rotation followed by a vertical flip)<br />
    5 - A 90-degree rotation followed by a horizontal flip (A 270-degree rotation followed by a vertical flip)<br />
    6 - A 180-degree rotation followed by a horizontal flip (No rotation and a vertical flip)<br />
    7 - A 270-degree rotation followed by a horizontal flip (A 90-degree rotation followed by a vertical flip)<br />
#ce<br />
Func _GDIPlus_ImageSaveAsJPG(&#36;hImage, &#36;sSaveFile, &#36;bEXIF = True, &#36;iQuality = 90, &#36;fScaleW = 1.0, &#36;fScaleH = 1.0, &#36;iRotate = 0)<br />
    Local &#36;hScaledBitmap, &#36;sCLSID, &#36;tData, &#36;tParams, &#36;bRet, &#36;iError = 0<br />
    &#36;hScaledBitmap = _GDIPlus_ImageScale(&#36;hImage, &#36;fScaleW, &#36;fScaleH) ; das Bild skalieren (neue Bitmap wird erstellt)<br />
    If &#36;iRotate Then _GDIPlus_ImageRotateFlip(&#36;hScaledBitmap, &#36;iRotate) ; die neue Bitmap drehen bzw. spiegeln (wenn gewuenscht)<br />
    If &#36;bEXIF Then ; die EXIF-Daten in die neue Bitmap kopieren (wenn gewuenscht)<br />
        _GDIPlus_ImageCopyPropertyItems(&#36;hImage, &#36;hScaledBitmap)<br />
        If @error Then Return SetError(@error, @extended, False)<br />
    EndIf<br />
    &#36;sCLSID = _GDIPlus_EncodersGetCLSID('JPG')<br />
    &#36;tParams = _GDIPlus_ParamInit(1)<br />
    &#36;tData = DllStructCreate('int Quality') ; Struktur fuer die JPG-Qualitaet erstellen<br />
    DllStructSetData(&#36;tData, 'Quality', &#36;iQuality) ; JPG-Qualitaet entsprechend setzen (von 0 = schlechteste bis 100 = beste)<br />
    _GDIPlus_ParamAdd(&#36;tParams, &#36;GDIP_EPGQUALITY, 1, &#36;GDIP_EPTLONG, DllStructGetPtr(&#36;tData, 'Quality'))<br />
    &#36;bRet = _GDIPlus_ImageSaveToFileEx(&#36;hScaledBitmap, &#36;sSaveFile, &#36;sCLSID, &#36;tParams)<br />
    If @error Then &#36;iError = 4<br />
    _GDIPlus_BitmapDispose(&#36;hScaledBitmap)<br />
    &#36;tData = 0<br />
    Return SetError(&#36;iError, 0, &#36;bRet)<br />
EndFunc   ;==&gt;_GDIPlus_ImageSaveAsJPG<br />
<br />
Func _GDIPlus_ImageCopyPropertyItems(ByRef &#36;hSourceImage, ByRef &#36;hDestImage)<br />
    Local Const &#36;tagGDIPPROPERTYITEM = 'uint id;uint length;ushort type;ptr value;'<br />
    Local &#36;aRes, &#36;iSize, &#36;iCount, &#36;tBuffer, &#36;pBuffer, &#36;tGDIPPROPERTYITEM<br />
    &#36;aRes = DllCall(&#36;__g_hGDIPDll, 'uint', 'GdipGetPropertySize', 'hwnd', &#36;hSourceImage, 'uint*', 0, 'uint*', 0)<br />
    If @error Then Return SetError(1, @extended, False)<br />
    &#36;iSize = &#36;aRes[2] ; &#36;aRes[2] = Total size in bytes<br />
    &#36;iCount = &#36;aRes[3] ; &#36;aRes[3] = Number of property items<br />
    &#36;tBuffer = DllStructCreate('byte[' &amp; &#36;iSize &amp; ']')<br />
    &#36;pBuffer = DllStructGetPtr(&#36;tBuffer)<br />
    &#36;aRes = DllCall(&#36;__g_hGDIPDll, 'uint', 'GdipGetAllPropertyItems', 'hwnd', &#36;hSourceImage, 'uint', &#36;iSize, 'uint', &#36;iCount, 'ptr', &#36;pBuffer)<br />
    If @error Then Return SetError(2, @extended, False)<br />
    For &#36;i = 0 To &#36;iCount - 1<br />
        &#36;tGDIPPROPERTYITEM = DllStructCreate(&#36;tagGDIPPROPERTYITEM, &#36;pBuffer)<br />
        &#36;aRes = DllCall(&#36;__g_hGDIPDll, 'uint', 'GdipSetPropertyItem', 'hwnd', &#36;hDestImage, 'ptr', &#36;pBuffer)<br />
        If @error Then Return SetError(3, @extended, False)<br />
        &#36;pBuffer += DllStructGetSize(&#36;tGDIPPROPERTYITEM)<br />
        &#36;tGDIPPROPERTYITEM = 0<br />
    Next<br />
    &#36;tBuffer = 0<br />
    Return True<br />
EndFunc   ;==&gt;_GDIPlus_ImageCopyPropertyItems<br />
</code></pre>
<br />
<br />
<br />
</div>
	</div>
<br />
Vielleicht könnt ihr so eine Funktion ja auch gebrauchen...<br />
<br />
P.S.: Als Anhang findet ihr ein Test-JPG (mit EXIF-Daten).<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=72" target="_blank" title="">_GDIPlus_ImageSaveAsJPG.au3</a> (Größe: 3,81 KB / Downloads: 8)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=73" target="_blank" title="">test.jpg</a> (Größe: 167,22 KB / Downloads: 1)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Diese Funktion kann eine GDI+ Bitmap als JPG abspeichern.<br />
Das allein ist ja nichts Besonderes, aber meine Funktion bietet an, die Bitmap vorher zu skalieren und zu drehen bzw. zu spiegeln und kann dann trotzdem noch die EXIF-Daten der Ursprungsbitmap übernehmen.<br />
Beim skalieren einer GDI+ Bitmap (mit _GDIPlus_ImageScale) wird nämlich eine neue Bitmap erstellt und wenn man diese abspeichert, gehen die EXIF-Daten verloren. Will man diese beibehalten, muss man die Daten von der "alten" Bitmap rüberkopieren.<br />
Und genau dieses kopieren der EXIF-Daten hat mich den ganzen gestrigen Tag beschäftigt. Ich wollte das unbedingt nur mit AutoIt schaffen (ohne externe Programme verwenden zu müssen).<br />
Heute habe ich dann den Durchbruch geschafft und die Funktion fertig gestellt:<br />
<div class="spoiler">
		<div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span>Spoiler:</div>
		<div class="spoiler_content" style="display: none;">
<br />
<br />
<br />
<pre class="line-numbers"><code class="language-autoit">#include &lt;GDIPlus.au3&gt;<br />
<br />
Global &#36;sImagefile = @ScriptDir &amp; '\test.jpg'<br />
Global &#36;sNewFile = @ScriptDir &amp; '\test_new.jpg'<br />
<br />
_GDIPlus_Startup()<br />
Global &#36;hImage = _GDIPlus_BitmapCreateFromFile(&#36;sImagefile)<br />
<br />
; Bild als JPG speichern mit Uebername der EXIF-Daten, 90% Qualitaet, Breite und Hoehe jeweils 25% und keine Drehung<br />
_GDIPlus_ImageSaveAsJPG(&#36;hImage, &#36;sNewFile, True, 90, 0.25, 0.25, 0)<br />
<br />
_GDIPlus_BitmapDispose(&#36;hImage)<br />
_GDIPlus_Shutdown()<br />
<br />
If FileExists(&#36;sNewFile) Then ShellExecute(&#36;sNewFile)<br />
Exit<br />
<br />
#cs<br />
    &#36;iRotate = Type of rotation and flip:<br />
    0 - No rotation and no flipping (A 180-degree rotation, a horizontal flip and then a vertical flip)<br />
    1 - A 90-degree rotation without flipping (A 270-degree rotation, a horizontal flip and then a vertical flip)<br />
    2 - A 180-degree rotation without flipping (No rotation, a horizontal flip followed by a vertical flip)<br />
    3 - A 270-degree rotation without flipping (A 90-degree rotation, a horizontal flip and then a vertical flip)<br />
    4 - No rotation and a horizontal flip (A 180-degree rotation followed by a vertical flip)<br />
    5 - A 90-degree rotation followed by a horizontal flip (A 270-degree rotation followed by a vertical flip)<br />
    6 - A 180-degree rotation followed by a horizontal flip (No rotation and a vertical flip)<br />
    7 - A 270-degree rotation followed by a horizontal flip (A 90-degree rotation followed by a vertical flip)<br />
#ce<br />
Func _GDIPlus_ImageSaveAsJPG(&#36;hImage, &#36;sSaveFile, &#36;bEXIF = True, &#36;iQuality = 90, &#36;fScaleW = 1.0, &#36;fScaleH = 1.0, &#36;iRotate = 0)<br />
    Local &#36;hScaledBitmap, &#36;sCLSID, &#36;tData, &#36;tParams, &#36;bRet, &#36;iError = 0<br />
    &#36;hScaledBitmap = _GDIPlus_ImageScale(&#36;hImage, &#36;fScaleW, &#36;fScaleH) ; das Bild skalieren (neue Bitmap wird erstellt)<br />
    If &#36;iRotate Then _GDIPlus_ImageRotateFlip(&#36;hScaledBitmap, &#36;iRotate) ; die neue Bitmap drehen bzw. spiegeln (wenn gewuenscht)<br />
    If &#36;bEXIF Then ; die EXIF-Daten in die neue Bitmap kopieren (wenn gewuenscht)<br />
        _GDIPlus_ImageCopyPropertyItems(&#36;hImage, &#36;hScaledBitmap)<br />
        If @error Then Return SetError(@error, @extended, False)<br />
    EndIf<br />
    &#36;sCLSID = _GDIPlus_EncodersGetCLSID('JPG')<br />
    &#36;tParams = _GDIPlus_ParamInit(1)<br />
    &#36;tData = DllStructCreate('int Quality') ; Struktur fuer die JPG-Qualitaet erstellen<br />
    DllStructSetData(&#36;tData, 'Quality', &#36;iQuality) ; JPG-Qualitaet entsprechend setzen (von 0 = schlechteste bis 100 = beste)<br />
    _GDIPlus_ParamAdd(&#36;tParams, &#36;GDIP_EPGQUALITY, 1, &#36;GDIP_EPTLONG, DllStructGetPtr(&#36;tData, 'Quality'))<br />
    &#36;bRet = _GDIPlus_ImageSaveToFileEx(&#36;hScaledBitmap, &#36;sSaveFile, &#36;sCLSID, &#36;tParams)<br />
    If @error Then &#36;iError = 4<br />
    _GDIPlus_BitmapDispose(&#36;hScaledBitmap)<br />
    &#36;tData = 0<br />
    Return SetError(&#36;iError, 0, &#36;bRet)<br />
EndFunc   ;==&gt;_GDIPlus_ImageSaveAsJPG<br />
<br />
Func _GDIPlus_ImageCopyPropertyItems(ByRef &#36;hSourceImage, ByRef &#36;hDestImage)<br />
    Local Const &#36;tagGDIPPROPERTYITEM = 'uint id;uint length;ushort type;ptr value;'<br />
    Local &#36;aRes, &#36;iSize, &#36;iCount, &#36;tBuffer, &#36;pBuffer, &#36;tGDIPPROPERTYITEM<br />
    &#36;aRes = DllCall(&#36;__g_hGDIPDll, 'uint', 'GdipGetPropertySize', 'hwnd', &#36;hSourceImage, 'uint*', 0, 'uint*', 0)<br />
    If @error Then Return SetError(1, @extended, False)<br />
    &#36;iSize = &#36;aRes[2] ; &#36;aRes[2] = Total size in bytes<br />
    &#36;iCount = &#36;aRes[3] ; &#36;aRes[3] = Number of property items<br />
    &#36;tBuffer = DllStructCreate('byte[' &amp; &#36;iSize &amp; ']')<br />
    &#36;pBuffer = DllStructGetPtr(&#36;tBuffer)<br />
    &#36;aRes = DllCall(&#36;__g_hGDIPDll, 'uint', 'GdipGetAllPropertyItems', 'hwnd', &#36;hSourceImage, 'uint', &#36;iSize, 'uint', &#36;iCount, 'ptr', &#36;pBuffer)<br />
    If @error Then Return SetError(2, @extended, False)<br />
    For &#36;i = 0 To &#36;iCount - 1<br />
        &#36;tGDIPPROPERTYITEM = DllStructCreate(&#36;tagGDIPPROPERTYITEM, &#36;pBuffer)<br />
        &#36;aRes = DllCall(&#36;__g_hGDIPDll, 'uint', 'GdipSetPropertyItem', 'hwnd', &#36;hDestImage, 'ptr', &#36;pBuffer)<br />
        If @error Then Return SetError(3, @extended, False)<br />
        &#36;pBuffer += DllStructGetSize(&#36;tGDIPPROPERTYITEM)<br />
        &#36;tGDIPPROPERTYITEM = 0<br />
    Next<br />
    &#36;tBuffer = 0<br />
    Return True<br />
EndFunc   ;==&gt;_GDIPlus_ImageCopyPropertyItems<br />
</code></pre>
<br />
<br />
<br />
</div>
	</div>
<br />
Vielleicht könnt ihr so eine Funktion ja auch gebrauchen...<br />
<br />
P.S.: Als Anhang findet ihr ein Test-JPG (mit EXIF-Daten).<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=72" target="_blank" title="">_GDIPlus_ImageSaveAsJPG.au3</a> (Größe: 3,81 KB / Downloads: 8)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=73" target="_blank" title="">test.jpg</a> (Größe: 167,22 KB / Downloads: 1)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[_GDIPlus_ImageFixFileExtension]]></title>
			<link>https://forum.technik-hobby.de/thread-27.html</link>
			<pubDate>Fri, 13 Oct 2017 18:01:33 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-27.html</guid>
			<description><![CDATA[Mit dieser Funktion kann man Bilddateien, die eine falsche Dateiendung aufweisen, automatisch umbenennen lassen.<br />
Die Funktion liest das korrekte Bildformat aus und ändert die Dateiendung entsprechend.<br />
<br />
<span style="text-decoration: underline;" class="mycode_u"><span style="font-weight: bold;" class="mycode_b">Die UDF:</span></span><br />
<br />
<div class="spoiler">
		<div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span>Spoiler:</div>
		<div class="spoiler_content" style="display: none;">
<br />
<br />
<pre class="line-numbers"><code class="language-autoit"><br />
#Region ;************ Includes ************<br />
#include-once<br />
#include &lt;GDIPlus.au3&gt;<br />
#EndRegion ;************ Includes ************<br />
<br />
Global &#36;__g_iIFFE_DEBUG = True ; True = Debug-Ausgaben eingeschaltet<br />
<br />
If &#36;__g_hGDIPDll = 0 Then<br />
    _GDIPlus_Startup()<br />
    OnAutoItExitRegister('__IFFE_Exit')<br />
EndIf<br />
Global Const &#36;__g_aGDIPDecoders = _GDIPlus_Decoders()<br />
Global Const &#36;__g_sIFFE_Version = '1.0.0.0'<br />
Global Const &#36;__g_sIFFE_Date = '2017-10-16 12:00:00'<br />
<br />
Func __IFFE_Exit()<br />
    _GDIPlus_Shutdown()<br />
EndFunc   ;==&gt;__IFFE_Exit<br />
<br />
;===============================================================================<br />
; Function Name:   _GDIPlus_ImageFixFileExtension(&#36;sFilename)<br />
; Description:     Diese Funktion korrigiert die Dateiendung einer Bilddatei,<br />
;                  wenn die Bilddatei eine falsche Endung aufweist.<br />
;                  Existiert der neue Dateiname bereits, wird der neue Dateiname<br />
;                  um einen Zaehler " (n)" erweitert.<br />
;                  Wenn die bereits existierende Datei allerdings inhaltsgleich<br />
;                  (gleiche CRC32-Checksumme) ist, mit der neuen Datei,<br />
;                  dann wird die Datei mit der falschen Endung geloescht.<br />
; Parameter(s):    &#36;sFilename = Dateiname und -pfad der Bilddatei<br />
; Requirement(s):  #include &lt;GDIPlus.au3&gt;<br />
; Return Value(s): bei Erfolg = der neue Dateiname<br />
;                     @extended = 0 - die Datei wurde umbenannt<br />
;                     @extended = 1 - die Datei wurde nicht umbenannt<br />
;                     @extended = 2 - die Datei war identisch mit einer<br />
;                                     bereits existierenden Datei<br />
;                  im Fehlerfall wird 0 zurueckgegeben und<br />
;                     @error = 1 wenn FileMove fehlgeschlagen ist<br />
;                     @error = 2 wenn PathYetAnotherMakeUniqueName fehlgeschlagen ist<br />
;                     @error = Rueckgabe von _GDIPlus_ImageGetRawFormat, wenn<br />
;                              Datei nicht vorhanden oder keine Bilddatei<br />
; Author(s):       Oscar &amp; Bitnugger (<a href="http://www.autoit.de" target="_blank" rel="noopener" class="mycode_url">www.autoit.de</a>)<br />
;===============================================================================<br />
Func _GDIPlus_ImageFixFileExtension(&#36;sFilename)<br />
    Local &#36;hImage, &#36;aRet, &#36;iFormat = -1, &#36;iError, &#36;aExt, &#36;sNewFile, &#36;aCrc32[2]<br />
    &#36;hImage = _GDIPlus_ImageLoadFromFile(&#36;sFilename)<br />
    &#36;aRet = _GDIPlus_ImageGetRawFormat(&#36;hImage)<br />
    &#36;iError = @error<br />
    _GDIPlus_ImageDispose(&#36;hImage)<br />
    If &#36;iError Then Return SetError(&#36;iError, 0, 0)<br />
    For &#36;i = 1 To &#36;__g_aGDIPDecoders[0][0]<br />
        If &#36;aRet[1] = &#36;__g_aGDIPDecoders[&#36;i][5] Then<br />
            &#36;iFormat = &#36;i<br />
            ExitLoop<br />
        EndIf<br />
    Next<br />
    If &#36;iFormat = -1 Then Return SetError(30, 0, 0)<br />
    __IFFE_DebugPrint('&gt; _GDIPlus_ImageFixFileExtension(): FileName   = ' &amp; &#36;sFilename &amp; @CRLF)<br />
    __IFFE_DebugPrint('&gt; _GDIPlus_ImageFixFileExtension(): Format     = ' &amp; &#36;__g_aGDIPDecoders[&#36;iFormat][5] &amp; @CRLF)<br />
    __IFFE_DebugPrint('&gt; _GDIPlus_ImageFixFileExtension(): Extensions = ' &amp; &#36;__g_aGDIPDecoders[&#36;iFormat][6] &amp; @CRLF)<br />
    &#36;aExt = StringSplit(StringReplace(StringLower(&#36;__g_aGDIPDecoders[&#36;iFormat][6]), '*', ''), ';', 2)<br />
    For &#36;sExt In &#36;aExt<br />
        If &#36;sExt = StringRegExpReplace(&#36;sFilename, '(?:.+)(\..+)', '&#36;1') Then Return SetError(0, 1, &#36;sFilename)<br />
    Next<br />
    &#36;sNewFile = StringRegExpReplace(&#36;sFilename, '(.+)\..+', '&#36;1') &amp; &#36;aExt[0]<br />
    If FileExists(&#36;sNewFile) Then<br />
        &#36;aCrc32[0] = __IFFE_ComputeCrc32(&#36;sFilename)<br />
        If @error Then Return SetError(40, 0, 0)<br />
        &#36;aCrc32[1] = __IFFE_ComputeCrc32(&#36;sNewFile)<br />
        If @error Then Return SetError(40, 0, 0)<br />
        If &#36;aCrc32[0] = &#36;aCrc32[1] Then<br />
            __IFFE_DebugPrint(StringFormat('! _GDIPlus_ImageFixFileExtension(): Diese Dateien sind identisch:\r' &amp; _<br />
                    '! --&gt; Crc32 = 0x%s  %s\t - Falsche Dateierweiterung  (wird gelöscht)\r' &amp; _<br />
                    '+ --&gt; Crc32 = 0x%s  %s\t - Richtige Dateierweiterung (wird behalten)\r', _<br />
                    &#36;aCrc32[0], &#36;sFilename, &#36;aCrc32[1], &#36;sNewFile))<br />
            FileDelete(&#36;sFilename)<br />
            Return SetError(0, 2, &#36;sNewFile)<br />
        EndIf<br />
    EndIf<br />
    &#36;aRet = DllCall('shell32.dll', 'int', 'PathYetAnotherMakeUniqueName', 'wstr', '', 'wstr', &#36;sNewFile, 'ptr', 0, 'ptr', 0)<br />
    If @error Or Not &#36;aRet[0] Then Return SetError(2, 0, 0)<br />
    &#36;sNewFile = &#36;aRet[1]<br />
    Return FileMove(&#36;sFilename, &#36;sNewFile, 1) ? SetError(0, 0, &#36;sNewFile) : SetError(1, 0, 0)<br />
EndFunc   ;==&gt;_GDIPlus_ImageFixFileExtension<br />
<br />
Func __IFFE_DebugPrint(&#36;sString)<br />
    If &#36;__g_iIFFE_DEBUG Then ConsoleWrite(&#36;sString)<br />
EndFunc   ;==&gt;__IFFE_DebugPrint<br />
<br />
Func __IFFE_ComputeCrc32(&#36;sFilePath)<br />
    Local &#36;hFile, &#36;bData, &#36;iLen, &#36;tData, &#36;aRet<br />
    &#36;hFile = FileOpen(&#36;sFilePath, &#36;FO_BINARY)<br />
    If &#36;hFile = -1 Then Return SetError(1, 0, 0)<br />
    &#36;bData = FileRead(&#36;hFile)<br />
    FileClose(&#36;hFile)<br />
    &#36;iLen = BinaryLen(&#36;bData)<br />
    If &#36;iLen = 0 Then Return SetError(2, 0, 0)<br />
    &#36;tData = DllStructCreate('byte[' &amp; &#36;iLen &amp; ']')<br />
    DllStructSetData(&#36;tData, 1, &#36;bData)<br />
    &#36;aRet = DllCall('ntdll.dll', 'dword', 'RtlComputeCrc32', 'dword', 0, 'struct*', DllStructGetPtr(&#36;tData), 'int', &#36;iLen)<br />
    If @error Or Not &#36;aRet[0] Then Return SetError(@error + 10, @extended, 0)<br />
    Return Hex(&#36;aRet[0], 8)<br />
EndFunc   ;==&gt;__IFFE_ComputeCrc32<br />
<br />
</code></pre>
<br />
<br />
</div>
	</div>
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span><br />
<br />
<pre class="line-numbers"><code class="language-autoit"><br />
#include '_GDIPlus_ImageFixFileExtension.au3'<br />
<br />
&#36;vRet = _GDIPlus_ImageFixFileExtension('d:\test.jpg')<br />
ConsoleWrite('@@ Debug(' &amp; @ScriptLineNumber &amp; ') : &#36;vRet = ' &amp; &#36;vRet &amp; @CRLF &amp; '&gt;Error code: ' &amp; @error &amp; @CRLF &amp; '&gt;Extended code: ' &amp; @extended &amp; @CRLF) ;### Debug Console<br />
</code></pre><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=69" target="_blank" title="">_GDIPlus_ImageFixFileExtension.au3</a> (Größe: 4,92 KB / Downloads: 9)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Mit dieser Funktion kann man Bilddateien, die eine falsche Dateiendung aufweisen, automatisch umbenennen lassen.<br />
Die Funktion liest das korrekte Bildformat aus und ändert die Dateiendung entsprechend.<br />
<br />
<span style="text-decoration: underline;" class="mycode_u"><span style="font-weight: bold;" class="mycode_b">Die UDF:</span></span><br />
<br />
<div class="spoiler">
		<div class="spoiler_title"><span class="spoiler_button float_right" onclick="javascript: if(parentNode.parentNode.getElementsByTagName('div')[1].style.display == 'block'){ parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'none'; this.innerHTML='Show Content'; } else { parentNode.parentNode.getElementsByTagName('div')[1].style.display = 'block'; this.innerHTML='Hide Content'; }">Show Content</span>Spoiler:</div>
		<div class="spoiler_content" style="display: none;">
<br />
<br />
<pre class="line-numbers"><code class="language-autoit"><br />
#Region ;************ Includes ************<br />
#include-once<br />
#include &lt;GDIPlus.au3&gt;<br />
#EndRegion ;************ Includes ************<br />
<br />
Global &#36;__g_iIFFE_DEBUG = True ; True = Debug-Ausgaben eingeschaltet<br />
<br />
If &#36;__g_hGDIPDll = 0 Then<br />
    _GDIPlus_Startup()<br />
    OnAutoItExitRegister('__IFFE_Exit')<br />
EndIf<br />
Global Const &#36;__g_aGDIPDecoders = _GDIPlus_Decoders()<br />
Global Const &#36;__g_sIFFE_Version = '1.0.0.0'<br />
Global Const &#36;__g_sIFFE_Date = '2017-10-16 12:00:00'<br />
<br />
Func __IFFE_Exit()<br />
    _GDIPlus_Shutdown()<br />
EndFunc   ;==&gt;__IFFE_Exit<br />
<br />
;===============================================================================<br />
; Function Name:   _GDIPlus_ImageFixFileExtension(&#36;sFilename)<br />
; Description:     Diese Funktion korrigiert die Dateiendung einer Bilddatei,<br />
;                  wenn die Bilddatei eine falsche Endung aufweist.<br />
;                  Existiert der neue Dateiname bereits, wird der neue Dateiname<br />
;                  um einen Zaehler " (n)" erweitert.<br />
;                  Wenn die bereits existierende Datei allerdings inhaltsgleich<br />
;                  (gleiche CRC32-Checksumme) ist, mit der neuen Datei,<br />
;                  dann wird die Datei mit der falschen Endung geloescht.<br />
; Parameter(s):    &#36;sFilename = Dateiname und -pfad der Bilddatei<br />
; Requirement(s):  #include &lt;GDIPlus.au3&gt;<br />
; Return Value(s): bei Erfolg = der neue Dateiname<br />
;                     @extended = 0 - die Datei wurde umbenannt<br />
;                     @extended = 1 - die Datei wurde nicht umbenannt<br />
;                     @extended = 2 - die Datei war identisch mit einer<br />
;                                     bereits existierenden Datei<br />
;                  im Fehlerfall wird 0 zurueckgegeben und<br />
;                     @error = 1 wenn FileMove fehlgeschlagen ist<br />
;                     @error = 2 wenn PathYetAnotherMakeUniqueName fehlgeschlagen ist<br />
;                     @error = Rueckgabe von _GDIPlus_ImageGetRawFormat, wenn<br />
;                              Datei nicht vorhanden oder keine Bilddatei<br />
; Author(s):       Oscar &amp; Bitnugger (<a href="http://www.autoit.de" target="_blank" rel="noopener" class="mycode_url">www.autoit.de</a>)<br />
;===============================================================================<br />
Func _GDIPlus_ImageFixFileExtension(&#36;sFilename)<br />
    Local &#36;hImage, &#36;aRet, &#36;iFormat = -1, &#36;iError, &#36;aExt, &#36;sNewFile, &#36;aCrc32[2]<br />
    &#36;hImage = _GDIPlus_ImageLoadFromFile(&#36;sFilename)<br />
    &#36;aRet = _GDIPlus_ImageGetRawFormat(&#36;hImage)<br />
    &#36;iError = @error<br />
    _GDIPlus_ImageDispose(&#36;hImage)<br />
    If &#36;iError Then Return SetError(&#36;iError, 0, 0)<br />
    For &#36;i = 1 To &#36;__g_aGDIPDecoders[0][0]<br />
        If &#36;aRet[1] = &#36;__g_aGDIPDecoders[&#36;i][5] Then<br />
            &#36;iFormat = &#36;i<br />
            ExitLoop<br />
        EndIf<br />
    Next<br />
    If &#36;iFormat = -1 Then Return SetError(30, 0, 0)<br />
    __IFFE_DebugPrint('&gt; _GDIPlus_ImageFixFileExtension(): FileName   = ' &amp; &#36;sFilename &amp; @CRLF)<br />
    __IFFE_DebugPrint('&gt; _GDIPlus_ImageFixFileExtension(): Format     = ' &amp; &#36;__g_aGDIPDecoders[&#36;iFormat][5] &amp; @CRLF)<br />
    __IFFE_DebugPrint('&gt; _GDIPlus_ImageFixFileExtension(): Extensions = ' &amp; &#36;__g_aGDIPDecoders[&#36;iFormat][6] &amp; @CRLF)<br />
    &#36;aExt = StringSplit(StringReplace(StringLower(&#36;__g_aGDIPDecoders[&#36;iFormat][6]), '*', ''), ';', 2)<br />
    For &#36;sExt In &#36;aExt<br />
        If &#36;sExt = StringRegExpReplace(&#36;sFilename, '(?:.+)(\..+)', '&#36;1') Then Return SetError(0, 1, &#36;sFilename)<br />
    Next<br />
    &#36;sNewFile = StringRegExpReplace(&#36;sFilename, '(.+)\..+', '&#36;1') &amp; &#36;aExt[0]<br />
    If FileExists(&#36;sNewFile) Then<br />
        &#36;aCrc32[0] = __IFFE_ComputeCrc32(&#36;sFilename)<br />
        If @error Then Return SetError(40, 0, 0)<br />
        &#36;aCrc32[1] = __IFFE_ComputeCrc32(&#36;sNewFile)<br />
        If @error Then Return SetError(40, 0, 0)<br />
        If &#36;aCrc32[0] = &#36;aCrc32[1] Then<br />
            __IFFE_DebugPrint(StringFormat('! _GDIPlus_ImageFixFileExtension(): Diese Dateien sind identisch:\r' &amp; _<br />
                    '! --&gt; Crc32 = 0x%s  %s\t - Falsche Dateierweiterung  (wird gelöscht)\r' &amp; _<br />
                    '+ --&gt; Crc32 = 0x%s  %s\t - Richtige Dateierweiterung (wird behalten)\r', _<br />
                    &#36;aCrc32[0], &#36;sFilename, &#36;aCrc32[1], &#36;sNewFile))<br />
            FileDelete(&#36;sFilename)<br />
            Return SetError(0, 2, &#36;sNewFile)<br />
        EndIf<br />
    EndIf<br />
    &#36;aRet = DllCall('shell32.dll', 'int', 'PathYetAnotherMakeUniqueName', 'wstr', '', 'wstr', &#36;sNewFile, 'ptr', 0, 'ptr', 0)<br />
    If @error Or Not &#36;aRet[0] Then Return SetError(2, 0, 0)<br />
    &#36;sNewFile = &#36;aRet[1]<br />
    Return FileMove(&#36;sFilename, &#36;sNewFile, 1) ? SetError(0, 0, &#36;sNewFile) : SetError(1, 0, 0)<br />
EndFunc   ;==&gt;_GDIPlus_ImageFixFileExtension<br />
<br />
Func __IFFE_DebugPrint(&#36;sString)<br />
    If &#36;__g_iIFFE_DEBUG Then ConsoleWrite(&#36;sString)<br />
EndFunc   ;==&gt;__IFFE_DebugPrint<br />
<br />
Func __IFFE_ComputeCrc32(&#36;sFilePath)<br />
    Local &#36;hFile, &#36;bData, &#36;iLen, &#36;tData, &#36;aRet<br />
    &#36;hFile = FileOpen(&#36;sFilePath, &#36;FO_BINARY)<br />
    If &#36;hFile = -1 Then Return SetError(1, 0, 0)<br />
    &#36;bData = FileRead(&#36;hFile)<br />
    FileClose(&#36;hFile)<br />
    &#36;iLen = BinaryLen(&#36;bData)<br />
    If &#36;iLen = 0 Then Return SetError(2, 0, 0)<br />
    &#36;tData = DllStructCreate('byte[' &amp; &#36;iLen &amp; ']')<br />
    DllStructSetData(&#36;tData, 1, &#36;bData)<br />
    &#36;aRet = DllCall('ntdll.dll', 'dword', 'RtlComputeCrc32', 'dword', 0, 'struct*', DllStructGetPtr(&#36;tData), 'int', &#36;iLen)<br />
    If @error Or Not &#36;aRet[0] Then Return SetError(@error + 10, @extended, 0)<br />
    Return Hex(&#36;aRet[0], 8)<br />
EndFunc   ;==&gt;__IFFE_ComputeCrc32<br />
<br />
</code></pre>
<br />
<br />
</div>
	</div>
<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel:</span><br />
<br />
<pre class="line-numbers"><code class="language-autoit"><br />
#include '_GDIPlus_ImageFixFileExtension.au3'<br />
<br />
&#36;vRet = _GDIPlus_ImageFixFileExtension('d:\test.jpg')<br />
ConsoleWrite('@@ Debug(' &amp; @ScriptLineNumber &amp; ') : &#36;vRet = ' &amp; &#36;vRet &amp; @CRLF &amp; '&gt;Error code: ' &amp; @error &amp; @CRLF &amp; '&gt;Extended code: ' &amp; @extended &amp; @CRLF) ;### Debug Console<br />
</code></pre><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/txt.png" title=".au3" border="0" alt=".au3" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=69" target="_blank" title="">_GDIPlus_ImageFixFileExtension.au3</a> (Größe: 4,92 KB / Downloads: 9)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[GuiCtrlCalendar]]></title>
			<link>https://forum.technik-hobby.de/thread-22.html</link>
			<pubDate>Mon, 10 Jul 2017 18:43:29 +0200</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.technik-hobby.de/member.php?action=profile&uid=2">Gorathan</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.technik-hobby.de/thread-22.html</guid>
			<description><![CDATA[Bei dieser UDF handelt es sich um einen Kalender, den man auf der eigenen GUI anzeigen lassen kann. Die Abmessungen des Kalenders sind (Breite x Hoehe = 460 x 380 px).<br />
Man kann auch mehrere Kalender auf der GUI erstellen lassen. Im Beispiel-Script habe ich zwei Kalender benutzt.<br />
Die Samstage und Sonntage haben standardmäßig bereits eine andere Farbe als die anderen Wochentage.<br />
Außerdem kann man einzelne Tage im Kalender markieren (fett, kursiv, unterstrichen, durchgestrichen, Vorder- und Hintergrundfarbe aendern), um Geburtstage, Urlaub, Feiertage, etc. besonders darzustellen.<br />
<br />
<br />
<span style="text-decoration: underline;" class="mycode_u"><span style="font-weight: bold;" class="mycode_b">Screenshot:</span></span><br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=51" target="_blank" title="">GuiCtrlCalendar_Screenshot.png</a> (Größe: 51,58 KB / Downloads: 8)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=52" target="_blank" title="">GUICtrlCalendar.zip</a> (Größe: 5,85 KB / Downloads: 14)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Bei dieser UDF handelt es sich um einen Kalender, den man auf der eigenen GUI anzeigen lassen kann. Die Abmessungen des Kalenders sind (Breite x Hoehe = 460 x 380 px).<br />
Man kann auch mehrere Kalender auf der GUI erstellen lassen. Im Beispiel-Script habe ich zwei Kalender benutzt.<br />
Die Samstage und Sonntage haben standardmäßig bereits eine andere Farbe als die anderen Wochentage.<br />
Außerdem kann man einzelne Tage im Kalender markieren (fett, kursiv, unterstrichen, durchgestrichen, Vorder- und Hintergrundfarbe aendern), um Geburtstage, Urlaub, Feiertage, etc. besonders darzustellen.<br />
<br />
<br />
<span style="text-decoration: underline;" class="mycode_u"><span style="font-weight: bold;" class="mycode_b">Screenshot:</span></span><br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=51" target="_blank" title="">GuiCtrlCalendar_Screenshot.png</a> (Größe: 51,58 KB / Downloads: 8)
<!-- end: postbit_attachments_attachment --><br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.technik-hobby.de/images/attachtypes/zip.png" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=52" target="_blank" title="">GUICtrlCalendar.zip</a> (Größe: 5,85 KB / Downloads: 14)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
	</channel>
</rss>