Das Shutdown-Tool kann verschiedene Aktionen ('Abmelden', 'Herunterfahren', 'Neu starten', 'Standby', 'Ruhezustand') zu einer einstellbaren Uhrzeit ausführen.
Wenn die letzten 30 Sekunden laufen erscheint ein Warn-Tooltip, dass auf die eingestellte Aktion hinweist. So kann man die Aktion immer noch abbrechen.
Zusätzlich ertönt in den letzten 30 Sekunden noch ein "Pling" in jeder Sekunde, sodass man auch akustisch auf die Aktion hingewiesen wird.
Die "Installation" des Tools ist einfach: Das ZIP-Archiv aus dem Anhang irgendwohin entpacken und die Exe starten.
Man übergibt der Funktion "_GDIPlus_ImageGetUniqueColors" das Handle zu einer GDI+ Bitmap und bekommt die Anzahl der verwendeten Farben zurück.
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.
Die UDF sowie ein Beispielscript (mit Beispielbild im Binärformat) befindet sich im ZIP-Archiv im Anhang.
Show ContentSpoiler:
#AutoIt3Wrapper_UseX64=n ; 32Bit-Modus!
#Region ;************ Includes ************
#include-once
#include <GDIPlus.au3>
#include <Memory.au3>
#EndRegion ;************ Includes ************
#Region ASM-Code
#cs _CountUniqueColors ;
Use32 ; 32Bit Modus!
mov esi,dword[esp+4] ; Pixelstruct-Pointer holen
mov ecx,dword[esp+8] ; Anzahl der Pixel holen (Pixelcounter)
mov edi,dword[esp+12] ; Colorstruct-Pointer holen
xor eax,eax ; eax als Farbzaehler (auf null setzen)
@pixel_count: ; Anfang der Schleife fuer alle Pixel
mov ebx,[esi] ; Farbwert aus Pixelstruct holen
and ebx,0xffffff ; Alphachannel eliminieren
cmp byte[edi+ebx],0 ; Wert aus der Colorstruct = 0?
jnz @next ; wenn nicht 0, dann wurde die Farbe bereits gezaehlt, weiter -> @next
inc eax ; den Farbzaehler um eins erhoehen
mov byte[edi+ebx],1 ; den Wert in der Colorstruct auf 1 setzen
@next:
add esi,4 ; den Pixelstruct-Pointer um 4 erhoehen (naechstes DWORD)
dec ecx ; Pixelcounter um eins verringern
jnz @pixel_count ; wenn Pixelcount nocht nicht 0, dann Schleife wiederholen
ret ; eax (Farbzaehler) wird zurueckgegeben
#ce
#EndRegion ASM-Code
; $__IGUC_g_bCode entspricht dem obigen ASM-Code im Binaerformat
Global Const $__IGUC_g_bCode = '0x8B7424048B4C24088B7C240C31C08B1E81E3FFFFFF00803C1F00750540C6041F0183C6044975E7C3'
; Die Speichergroesse fuer den ASM-Code berechnen
Global Const $__IGUC_g_iMemSize = StringLen($__IGUC_g_bCode) / 2 - 1
; Achtung! Hier unbedingt virtuellen Speicher mit "_MemVirtualAlloc" anfordern, weil sonst
; (bei eingeschalteter Datenausfuehrungsverhinderung = DEP) AutoIt mit einer Fehlermeldung beendet wird.
Global Const $__IGUC_g_pMem = _MemVirtualAlloc(0, $__IGUC_g_iMemSize, $MEM_COMMIT, $PAGE_EXECUTE_READWRITE)
If $__IGUC_g_pMem = 0 Then Exit MsgBox(16, 'Error!', "Can't allocate virtual memory!")
; Struktur fuer den ASM-Code im virtuellen Speicher erstellen
Global $__IGUC_g_tCodeBuffer = DllStructCreate('byte[' & $__IGUC_g_iMemSize & ']', $__IGUC_g_pMem)
; den ASM-Code in den Speicher schreiben (wird unten bei DllCallAddress aufgerufen)
DllStructSetData($__IGUC_g_tCodeBuffer, 1, $__IGUC_g_bCode)
Diese Funktion liest ausgewaehlte (siehe $aDescription in _GDIPlus_ImageGetItemValue) Exifdaten aus der uebergebenen GDI+ Bitmap aus und gibt diese als String in englisch ($iLanguage = 0) oder deutsch ($iLanguage = 1) zurueck.
Es werden zur Zeit 24 Exifdaten ausgelesen (vorausgesetzt diese sind in dem Bild gespeichert).
Diese Funktion kann eine GDI+ Bitmap als JPG abspeichern.
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.
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.
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).
Heute habe ich dann den Durchbruch geschafft und die Funktion fertig gestellt:
Show ContentSpoiler:
#include <GDIPlus.au3>
Global $sImagefile = @ScriptDir & '\test.jpg'
Global $sNewFile = @ScriptDir & '\test_new.jpg'
_GDIPlus_Startup()
Global $hImage = _GDIPlus_BitmapCreateFromFile($sImagefile)
; Bild als JPG speichern mit Uebername der EXIF-Daten, 90% Qualitaet, Breite und Hoehe jeweils 25% und keine Drehung
_GDIPlus_ImageSaveAsJPG($hImage, $sNewFile, True, 90, 0.25, 0.25, 0)
If FileExists($sNewFile) Then ShellExecute($sNewFile)
Exit
#cs
$iRotate = Type of rotation and flip:
0 - No rotation and no flipping (A 180-degree rotation, a horizontal flip and then a vertical flip)
1 - A 90-degree rotation without flipping (A 270-degree rotation, a horizontal flip and then a vertical flip)
2 - A 180-degree rotation without flipping (No rotation, a horizontal flip followed by a vertical flip)
3 - A 270-degree rotation without flipping (A 90-degree rotation, a horizontal flip and then a vertical flip)
4 - No rotation and a horizontal flip (A 180-degree rotation followed by a vertical flip)
5 - A 90-degree rotation followed by a horizontal flip (A 270-degree rotation followed by a vertical flip)
6 - A 180-degree rotation followed by a horizontal flip (No rotation and a vertical flip)
7 - A 270-degree rotation followed by a horizontal flip (A 90-degree rotation followed by a vertical flip)
#ce
Func _GDIPlus_ImageSaveAsJPG($hImage, $sSaveFile, $bEXIF = True, $iQuality = 90, $fScaleW = 1.0, $fScaleH = 1.0, $iRotate = 0)
Local $hScaledBitmap, $sCLSID, $tData, $tParams, $bRet, $iError = 0
$hScaledBitmap = _GDIPlus_ImageScale($hImage, $fScaleW, $fScaleH) ; das Bild skalieren (neue Bitmap wird erstellt)
If $iRotate Then _GDIPlus_ImageRotateFlip($hScaledBitmap, $iRotate) ; die neue Bitmap drehen bzw. spiegeln (wenn gewuenscht)
If $bEXIF Then ; die EXIF-Daten in die neue Bitmap kopieren (wenn gewuenscht)
_GDIPlus_ImageCopyPropertyItems($hImage, $hScaledBitmap)
If @error Then Return SetError(@error, @extended, False)
EndIf
$sCLSID = _GDIPlus_EncodersGetCLSID('JPG')
$tParams = _GDIPlus_ParamInit(1)
$tData = DllStructCreate('int Quality') ; Struktur fuer die JPG-Qualitaet erstellen
DllStructSetData($tData, 'Quality', $iQuality) ; JPG-Qualitaet entsprechend setzen (von 0 = schlechteste bis 100 = beste)
_GDIPlus_ParamAdd($tParams, $GDIP_EPGQUALITY, 1, $GDIP_EPTLONG, DllStructGetPtr($tData, 'Quality'))
$bRet = _GDIPlus_ImageSaveToFileEx($hScaledBitmap, $sSaveFile, $sCLSID, $tParams)
If @error Then $iError = 4
_GDIPlus_BitmapDispose($hScaledBitmap)
$tData = 0
Return SetError($iError, 0, $bRet)
EndFunc ;==>_GDIPlus_ImageSaveAsJPG
Func _GDIPlus_ImageCopyPropertyItems(ByRef $hSourceImage, ByRef $hDestImage)
Local Const $tagGDIPPROPERTYITEM = 'uint id;uint length;ushort type;ptr value;'
Local $aRes, $iSize, $iCount, $tBuffer, $pBuffer, $tGDIPPROPERTYITEM
$aRes = DllCall($__g_hGDIPDll, 'uint', 'GdipGetPropertySize', 'hwnd', $hSourceImage, 'uint*', 0, 'uint*', 0)
If @error Then Return SetError(1, @extended, False)
$iSize = $aRes[2] ; $aRes[2] = Total size in bytes
$iCount = $aRes[3] ; $aRes[3] = Number of property items
$tBuffer = DllStructCreate('byte[' & $iSize & ']')
$pBuffer = DllStructGetPtr($tBuffer)
$aRes = DllCall($__g_hGDIPDll, 'uint', 'GdipGetAllPropertyItems', 'hwnd', $hSourceImage, 'uint', $iSize, 'uint', $iCount, 'ptr', $pBuffer)
If @error Then Return SetError(2, @extended, False)
For $i = 0 To $iCount - 1
$tGDIPPROPERTYITEM = DllStructCreate($tagGDIPPROPERTYITEM, $pBuffer)
$aRes = DllCall($__g_hGDIPDll, 'uint', 'GdipSetPropertyItem', 'hwnd', $hDestImage, 'ptr', $pBuffer)
If @error Then Return SetError(3, @extended, False)
$pBuffer += DllStructGetSize($tGDIPPROPERTYITEM)
$tGDIPPROPERTYITEM = 0
Next
$tBuffer = 0
Return True
EndFunc ;==>_GDIPlus_ImageCopyPropertyItems
Vielleicht könnt ihr so eine Funktion ja auch gebrauchen...
P.S.: Als Anhang findet ihr ein Test-JPG (mit EXIF-Daten).
Ein kleines Tool (erstellt ein Traymenü) zum ändern der Bildschirm-Auflösung der angeschlossenen Monitore. Sollte ansonsten selbsterklärend sein.
Die angeschlossenen Monitore werden automatisch erkannt. Ebenso die verfügbaren Auflösungen. Wobei ich die Auflösungen auf die 32 Bit Auflösungen und auf alle mit mehr als 60 Hz beschränkt habe.
Wer mehr will muss die Konstanten im Script (kommentiert) ändern. Version 1.0.0.0:
- Bei der aktuellen Auflösung befindet sich jetzt ein Haken.
- Man kann das Programm jetzt in den Autostart packen ("Start with windows").
- Eine MsgBox mit Programminformationen, wenn man den Info-Eintrag (ganz oben im Menü) anklickt.
Mit dieser Funktion kann man Bilddateien, die eine falsche Dateiendung aufweisen, automatisch umbenennen lassen.
Die Funktion liest das korrekte Bildformat aus und ändert die Dateiendung entsprechend.
Die UDF:
Show ContentSpoiler:
#Region ;************ Includes ************
#include-once
#include <GDIPlus.au3>
#EndRegion ;************ Includes ************
Global $__g_iIFFE_DEBUG = True ; True = Debug-Ausgaben eingeschaltet
If $__g_hGDIPDll = 0 Then
_GDIPlus_Startup()
OnAutoItExitRegister('__IFFE_Exit')
EndIf
Global Const $__g_aGDIPDecoders = _GDIPlus_Decoders()
Global Const $__g_sIFFE_Version = '1.0.0.0'
Global Const $__g_sIFFE_Date = '2017-10-16 12:00:00'
;===============================================================================
; Function Name: _GDIPlus_ImageFixFileExtension($sFilename)
; Description: Diese Funktion korrigiert die Dateiendung einer Bilddatei,
; wenn die Bilddatei eine falsche Endung aufweist.
; Existiert der neue Dateiname bereits, wird der neue Dateiname
; um einen Zaehler " (n)" erweitert.
; Wenn die bereits existierende Datei allerdings inhaltsgleich
; (gleiche CRC32-Checksumme) ist, mit der neuen Datei,
; dann wird die Datei mit der falschen Endung geloescht.
; Parameter(s): $sFilename = Dateiname und -pfad der Bilddatei
; Requirement(s): #include <GDIPlus.au3>
; Return Value(s): bei Erfolg = der neue Dateiname
; @extended = 0 - die Datei wurde umbenannt
; @extended = 1 - die Datei wurde nicht umbenannt
; @extended = 2 - die Datei war identisch mit einer
; bereits existierenden Datei
; im Fehlerfall wird 0 zurueckgegeben und
; @error = 1 wenn FileMove fehlgeschlagen ist
; @error = 2 wenn PathYetAnotherMakeUniqueName fehlgeschlagen ist
; @error = Rueckgabe von _GDIPlus_ImageGetRawFormat, wenn
; Datei nicht vorhanden oder keine Bilddatei
; Author(s): Oscar & Bitnugger (www.autoit.de)
;===============================================================================
Func _GDIPlus_ImageFixFileExtension($sFilename)
Local $hImage, $aRet, $iFormat = -1, $iError, $aExt, $sNewFile, $aCrc32[2]
$hImage = _GDIPlus_ImageLoadFromFile($sFilename)
$aRet = _GDIPlus_ImageGetRawFormat($hImage)
$iError = @error
_GDIPlus_ImageDispose($hImage)
If $iError Then Return SetError($iError, 0, 0)
For $i = 1 To $__g_aGDIPDecoders[0][0]
If $aRet[1] = $__g_aGDIPDecoders[$i][5] Then
$iFormat = $i
ExitLoop
EndIf
Next
If $iFormat = -1 Then Return SetError(30, 0, 0)
__IFFE_DebugPrint('> _GDIPlus_ImageFixFileExtension(): FileName = ' & $sFilename & @CRLF)
__IFFE_DebugPrint('> _GDIPlus_ImageFixFileExtension(): Format = ' & $__g_aGDIPDecoders[$iFormat][5] & @CRLF)
__IFFE_DebugPrint('> _GDIPlus_ImageFixFileExtension(): Extensions = ' & $__g_aGDIPDecoders[$iFormat][6] & @CRLF)
$aExt = StringSplit(StringReplace(StringLower($__g_aGDIPDecoders[$iFormat][6]), '*', ''), ';', 2)
For $sExt In $aExt
If $sExt = StringRegExpReplace($sFilename, '(?:.+)(\..+)', '$1') Then Return SetError(0, 1, $sFilename)
Next
$sNewFile = StringRegExpReplace($sFilename, '(.+)\..+', '$1') & $aExt[0]
If FileExists($sNewFile) Then
$aCrc32[0] = __IFFE_ComputeCrc32($sFilename)
If @error Then Return SetError(40, 0, 0)
$aCrc32[1] = __IFFE_ComputeCrc32($sNewFile)
If @error Then Return SetError(40, 0, 0)
If $aCrc32[0] = $aCrc32[1] Then
__IFFE_DebugPrint(StringFormat('! _GDIPlus_ImageFixFileExtension(): Diese Dateien sind identisch:\r' & _
'! --> Crc32 = 0x%s %s\t - Falsche Dateierweiterung (wird gelöscht)\r' & _
'+ --> Crc32 = 0x%s %s\t - Richtige Dateierweiterung (wird behalten)\r', _
$aCrc32[0], $sFilename, $aCrc32[1], $sNewFile))
FileDelete($sFilename)
Return SetError(0, 2, $sNewFile)
EndIf
EndIf
$aRet = DllCall('shell32.dll', 'int', 'PathYetAnotherMakeUniqueName', 'wstr', '', 'wstr', $sNewFile, 'ptr', 0, 'ptr', 0)
If @error Or Not $aRet[0] Then Return SetError(2, 0, 0)
$sNewFile = $aRet[1]
Return FileMove($sFilename, $sNewFile, 1) ? SetError(0, 0, $sNewFile) : SetError(1, 0, 0)
EndFunc ;==>_GDIPlus_ImageFixFileExtension
Func __IFFE_DebugPrint($sString)
If $__g_iIFFE_DEBUG Then ConsoleWrite($sString)
EndFunc ;==>__IFFE_DebugPrint
Func __IFFE_ComputeCrc32($sFilePath)
Local $hFile, $bData, $iLen, $tData, $aRet
$hFile = FileOpen($sFilePath, $FO_BINARY)
If $hFile = -1 Then Return SetError(1, 0, 0)
$bData = FileRead($hFile)
FileClose($hFile)
$iLen = BinaryLen($bData)
If $iLen = 0 Then Return SetError(2, 0, 0)
$tData = DllStructCreate('byte[' & $iLen & ']')
DllStructSetData($tData, 1, $bData)
$aRet = DllCall('ntdll.dll', 'dword', 'RtlComputeCrc32', 'dword', 0, 'struct*', DllStructGetPtr($tData), 'int', $iLen)
If @error Or Not $aRet[0] Then Return SetError(@error + 10, @extended, 0)
Return Hex($aRet[0], 8)
EndFunc ;==>__IFFE_ComputeCrc32
WIMS ist ein Tool, um auf der Festplatte nach großen Dateien Ausschau zu halten.
Man muss einen Suchpfad vorgeben, kann zusätzlich festlegen, ob der Suchpfad rekursiv (inkl. Unterverzeichnissen) durchsucht wird und ob auch versteckte Dateien/Ordner mit einbezogen werden sollen.
Am wichtigsten ist aber die Vorgabe ab welcher Dateigröße die Dateien in der Liste aufgenommen werden sollen. Wählt man die Dateigröße zu klein, werden sehr viele Dateien gefunden. Das geht schnell in die Hunderttausende und dann dauert das Sortieren und das Einfügen in das Listview relativ lange.
Bei der Vorgabe (nur Dateien größer 10 MB) ist das Tool aber recht schnell. Wenn man versehentlich eine zu kleine Dateigröße gewählt hat und es einem zu lange dauert, kann man die Suche auch mit {ESC} abbrechen.
Ist die Liste erstmal erstellt, kann man mit einem Doppelklick auf einen Eintrag die entsprechende Datei starten (wird per ShellExecute aufgerufen).
Außerdem gibt es noch ein Kontextmenü, in dem man Dateien löschen oder an einen anderen Ort verschieben kann.
Es ist schon interessant, was da zum Vorschein kommt. Ich konnte schon so einige Dateien entsorgen, die sich in den Untiefen meiner Platte versteckten.
Screenshot:
Edit 08.10.17: Kleines Update, damit das Script auch unter Win10 fehlerlos läuft.
Im Anhang befindet sich einmal ein ZIP-Archiv, in dem sich das AutoIt-Script sowie alle Includes befinden. So kann man sich eine eigene Exe compilieren. Und ich biete hier auch eine compilierte Exedatei an. Die ist für sich lauffähig (das ZIP-Archiv wird nicht benötigt).
Spielanleitung
Bei Spielbeginn bekommt man ein Startkapital von 100€. Vor jedem Spiel kann man einen bestimmten Prozentsatz davon setzen (der Mindesteinsatz beträgt allerdings 10€).
Gespielt wird mit einem Pokerspiel (52 Karten: 2, 3, 4, 5, 6, 7, 8, 9, 10, Bube, Dame, König, Ass und diese 13 Karten jeweils in den vier Spielfarben: ♦ Karo, ♥ Herz, ♠ Pik und ♣ Kreuz).
Ein Spiel besteht darin, dass man von dem Kartenstapel 5 Karten bekommt. Anschließend kann man entscheiden, welche Karten man austauschen will.
Dazu klickt man sie mit der linken Maustaste an, sodass sie umgedreht werden. Man darf zwei Mal beliebig viele Karten austauschen (Runde 1 und Runde 2), danach erfolgt die Gewinnauswertung.
Gewinnmöglichkeiten (in absteigender Reihenfolge): Royal Flush = Fünf Karten in einer Spielfarbe und in Folge, mit dem Ass als höchste Karte.
Beispiel: ♠10, ♠B, ♠D, ♠K, ♠A
Gewinn: 30 mal den Einsatz Straight Flush = Fünf Karten in einer Spielfarbe und in Folge, ohne das Ass als höchste Karte.
Beispiel: ♦3, ♦4, ♦5, ♦6, ♦7
Gewinn: 20 mal den Einsatz Anmerkung:
Kein Ass als höchste Karte (siehe 'Royal Flush')
Das Ass kann als niedrigste Karte (1) eingesetzt werden.
Four of a kind = Vier Karten mit dem gleichen Wert.
Beispiel: ♦D, ♥D, ♠D, ♣D
Gewinn: 15 mal den Einsatz Full House = Drei und zwei Karten mit jeweils dem gleichen Wert.
Beispiel: ♦10, ♠10, ♣10 und ♥8, ♣8
Gewinn: 10 mal den Einsatz Flush = Fünf Karten in einer Spielfarbe
Beispiel: ♥5, ♥8, ♥10, ♥D, ♥K
Gewinn: 7 mal den Einsatz Straight = Fünf Karten in Folge und in unterschiedlicher Spielfarbe.
Beispiel: ♠5, ♥6, ♦7, ♠8, ♣9
Gewinn: 5 mal den Einsatz Anmerkung:
Das Ass kann als höchste Karte (über dem König) oder als niedrigste Karte (1) eingesetzt werden.
Three of a kind = Drei Karten mit dem gleichen Wert.
Beispiel: ♥6, ♠6, ♣6
Gewinn: 3 mal den Einsatz Two Pair = Zwei mal 2 gleiche Karten.
Beispiel: ♦3, ♥3, ♣7, ♠7
Gewinn: Kein Gewinn, aber man bekommt den Einsatz zurück. One Pair = Zwei Karten mit dem gleichen Wert.
Beispiel: ♥10, ♣10
Gewinn: Kein Gewinn, aber man bekommt den halben Einsatz zurück. Nothing = Nichts von den oberen MöglichkeitenGewinn: Kein Gewinn. Man verliert den Einsatz.
Jackpot
Zusätzlich zu den obigen Gewinnmöglichkeiten, besteht die Chance auf den Gewinn des Jackpots. In diesen Jackpot fließt ein Teil (20%) der verlorenen Einsätze.
Hat man mit seinen Karten einen Gewinn erzielt (Three of a kind oder höher) und es befindet sich Geld im Jackpot, so zieht die Bank eine Karte vom Kartenstapel.
Diese wird oben links angezeigt und mit der höchsten Karte des Spielers verglichen.
Ist die höchste Karte des Spielers höher als die Karte der Bank, so erhält der Spieler das Geld aus dem Jackpot (zusätzlich zum obigen Gewinn). Ist die Karte der Bank höher, so bleibt das Geld im Jackpot.
Statistik
Es werden zwei Statistiken über die Spiele geführt.
Zum Einen eine Gesamtstatistik über alle Spiele und zum Anderen eine Spielerstatistik.
Die Spielerstatistik wird bei jedem Neustart des Spiels auf Null gesetzt bzw. beim laden eines Spielstands auf die dort gespeicherten Werte gesetzt.
Sprachauswahl
Es gibt die Möglichkeit, die Beschriftung der Felder und die Beschriftung der Karten (Bube / Jack, Dame / Queen) zwischen Deutsch und Englisch umzuschalten.
Dazu muss man lediglich auf eine der beiden Flaggen (rechts oben) klicken.
Menü "Einstellungen"
Hier gibt es die Möglichkeit, die Sprache für die Gewinnauswertung zwischen Deutsch und Englisch umzuschalten (unabhängig von der Sprache für die übrige Beschriftung). Das habe ich eingebaut, damit man trotz deutscher Beschriftung die Gewinnauswertung auf englisch haben kann.
Außerdem gibt es die Möglichkeit, ein schwarzes Hintergrundfenster anzeigen zu lassen. Damit stört der übrige Desktop nicht so sehr beim spielen. Außerdem flackert dieser Hintergrund in grün oder rot (gewonnen / verloren) bei der Jackpotauswertung.
Menü "Programm"
Mit "Spiel laden" kann man einen vorher abgespeicherten Spielstand wieder laden, um an der abgespeicherten Stelle weiterspielen zu können. Achtung!
Nachdem der Spielstand erfolgreich geladen wurde, wird die Spielstanddatei gelöscht!
Damit soll verhindert werden, dass man mehrmals an der abgespeicherten Stelle wieder neu anfangen kann.
Mit "Spiel speichern" kann man einen Spielstand abspeichern, damit man später weiterspielen kann.
Das Laden und Speichern funktioniert aber nur, wenn gerade kein Spiel läuft (die Beschriftung des großen Buttons steht auf "Start").
Nachdem die letzte Version von meinem MP3-Player (Starplayer v3) bereits 7 Jahre her ist, habe ich den Player mal fast komplett neu geschrieben.
Er entspricht jetzt meinen Anforderungen und ich möchte ihn mit euch teilen.
Es gibt viele MP3-Player-Programme, warum also noch eines?
Zum Einen natürlich, weil es mir Spaß macht, sowas in AutoIt zu programmieren. Zum Anderen aber auch, weil ich so ein paar Besonderheiten einbauen kann.
Eine (für mich) wesentliche Besonderheit ist die Möglichkeit die Titel aus einer Playlist zu exportieren. Was heißt das?
Nun, man lädt eine Playlist in den Starplayer oder stellt eine Playlist zusammen, das ist egal. Wenn man damit fertig ist, klickt man im Kontextmenü vom Starplayer "Playlist exportieren" an, wählt dann ein Zielverzeichnis und der Starplayer kopiert alle MP3-Dateien aus der Playlist in dieses Zielverzeichnis. Außerdem erstellt er eine Playlist ("!Playlist.m3u") mit den MP3-Dateien und speichert sie im Zielverzeichnis. Sehr praktisch, wenn man eine SD-Card für's Auto befüllen will.
Eine weitere Besonderheit ist die Möglichkeit, die abgespielten MP3s in eine Playlist zu protokollieren. So kann man den Starplayer auf einer Party verwenden und kann hinterher noch genau sehen, wann welcher Titel gespielt wurde.
Natürlich kann man den Starplayer auch als Standard-Player für ".mp3" und ".m3u" registrieren, sodass man die MP3s auch per Doppelklick abspielen kann. Befindet sich noch kein Titel in der Playlist, wird der neue Titel auch gleich abgespielt, ansonsten wird er an die Playlist angehängt.
Das festlegen der Aus- und Einblendzeit ist auch so eine Besonderheit, die mir wichtig war. So entsteht ein Überblendeffekt bzw. es verringert die Pausenzeit zwischen den Titeln.
Ich habe aber auch eine Hilfe geschrieben, wo ich noch auf einige Dinge hinweise.
Screenshot:
Update v4.0.1.0:
- Die GUIs für die Programm-Informationen und die Hilfe werden jetzt nur einmalig bei Programmstart erstellt und dann nur per SHOW/HIDE ein-/ausgeblendet. Irgendwie führte das dynamische erstellen der GUIs zu gelegentlichen Abstürzen von AutoIt. Das sollte jetzt behoben sein.
- Ich habe beim Start des Programms noch einen Test eingebaut, ob die zuletzt gespeicherte Position des Fensters noch einem Monitor entspricht (im Multi-Monitor-Betrieb könnte es ja sein, dass der Monitor abgeschaltet ist). Wenn dort kein Monitor ist, dann wird der Starplayer auf dem aktuellen Monitor zentriert gestartet.
- Es gibt jetzt auch eine Installer-Version (die befindet sich im Anhang "Starplayer_v4_0_1_0_Setup.exe"). Danke Musashi, für die Hilfe mit InnoSetup!
Alle benötigten Dateien (Script, Includes, Grafiken, Icons, Fonts, etc.) findet ihr im ZIP-Archiv im Anhang.
ich habe ein keines Tool geschrieben, mit dem ich rekursiv alle Einträge einer bestimmten Software aus der Registry auslesen kann. Wie kann ich es nun schaffen, wie es der Export aus der Registry es kann, die gefundenen Einträge mit allen Schlüsseln wie es die Registry auch tut, zu exportieren? Der Export soll mit allen gefundenen Einträgen in eine einzige .txt und .reg Datei geschrieben werden. Allerdings eben so wie es die Registry exportiert und nicht wie in meinem Beispielcode zu sehen ist.
Anbei mein Code. Es wäre klasse wenn mir weitergeholfen werden könnte.
Global $sInput1, $sstart, $nMsg, $sString
Global $sTitle = 'RegSearch'
Global $sVersion = '1.0.0.0'
Global $sAuthor = 'Bazii'
Global $sDate = '26.07.2017'
Global $sFound = ''
Global $hDLL = DllOpen("user32.dll")
If _Singleton ($sTitle, 1) = 0 Then ; Wenn eine Instanz dieses Programms läuft, dann Meldung ausgeben ...
MsgBox(64, "Achtung", " -RegSearch- wurde bereits gestartet und kann nicht ein zweites Mal gestartet werden!", 10) ; Meldung ausgeben (Teil 1)
Exit ; Programm beenden
EndIf; Ende der If-Abfrage: Läuft bereits eine weitere Instanz?