- Offizieller Beitrag
Wenn man den "'File to Base64 String' Code Generator" von UEZ benutzt, um Grafiken in das Script einzubetten, dann fällt einem schnell auf, dass man das Fenster-Icon nicht so einfach ändern kann.
Mit GuiSetIcon geht es nicht! Es gibt aber eine WinApi-Funktion "_WinAPI_SetClassLongEx", mit der man die Icons (in der Taskleiste und oben/links im Fenster) ändern kann.
Dazu muss man aber die Binaerdaten der PNGs vorher in HICONs umwandeln, damit Windows damit klar kommt. Hier habe ich mal ein Beispiel dafür geschrieben:
AutoIt
#include <APISysConstants.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WinAPISys.au3>
_GDIPlus_Startup()
Global $adLanguage[2] = [_englishpng(), _germanpng()] ; Binaerdaten der PNGs laden
Global $ahIconLang[2]
For $i = 0 To 1
$ahIconLang[$i] = _CreateHIconFromBinary($adLanguage[$i]) ; die Binaerdaten in ein HIcon umwandeln
Next
Global $hGui = GUICreate('Testfenster', 400, 300) ; normales Fenster mit AutoIt-Icon als Fenster-Icon
GUISetState()
MsgBox(0, 'MsgBox', StringFormat('Noch ist das AutoIt-Icon zu sehen.\r\nNach dem schließen der MsgBox wird auf das\r\nIcon aus dem Speicher umgeschaltet.'))
_WinAPI_SetClassLongEx($hGui, $GCL_HICON, $ahIconLang[0]) ; das Icon in der Taskleiste ersetzen
_WinAPI_SetClassLongEx($hGui, $GCL_HICONSM, $ahIconLang[0]) ; das Icon oben/links im Fenster ersetzen
MsgBox(0, 'MsgBox', StringFormat('Und jetzt das Icon auf das zweite HIcon umschalten.'))
_WinAPI_SetClassLongEx($hGui, $GCL_HICON, $ahIconLang[1]) ; das Icon in der Taskleiste ersetzen
_WinAPI_SetClassLongEx($hGui, $GCL_HICONSM, $ahIconLang[1]) ; das Icon oben/links im Fenster ersetzen
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
; Achtung! Aufraeumen nicht vergessen!
For $hIcon In $ahIconLang
_WinAPI_DeleteObject($hIcon) ; die HIcons wieder aus dem Speicher entfernen
Next
_GDIPlus_Shutdown()
Exit
Func _CreateHIconFromBinary($dBinary, $iSize = 32)
Local $hBitmap, $hResize, $hIcon
$hBitmap = _GDIPlus_BitmapCreateFromMemory($dBinary)
$hResize = _GDIPlus_ImageResize($hBitmap, $iSize, $iSize)
$hIcon = _GDIPlus_HICONCreateFromBitmap($hResize)
_GDIPlus_BitmapDispose($hResize)
_GDIPlus_BitmapDispose($hBitmap)
Return $hIcon
EndFunc ;==>_CreateHIconFromBinary
;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2015-09-19
Func _englishpng($bSaveBinary = False, $sSavePath = @ScriptDir)
Local $englishpng
$englishpng &= 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADCElEQVR42u2Wa0hTYRzGn2M40+ksU1xSSGQqK61peEWlLAsjaIWkpTk1rJZSWHr2ofJS5MJLZSiWJooKFmh+0KAyC6dogxQUJi3t8iGV1sV0zssiO+ek5bx1BsH6sOfT+3LeP8/vnP/7fzgEjCzCBGACMAEYHaDQOyQqJi870TrYD9PTQG5pK64Wt+Db6OSSRQUXw3HwTSvUheXM3uFULOpdg5GU2bhkja2NBdLEvkjgDGLoynVwfb3QE7TtDlESk0gGKN/LzB0dwE+TgAYZHpnAjfJ23KxoXxTk1qV9EPXJoS6aAZCI8cAlCMlZjYsaJ0d645j5IKbKq2DhsgH8VMrHzwsNDQ+lBG9TDHlCHCmLt/mMHxXVYAPCBmA5Y/WXMepLt+F2WY2UAD+ChLW7jGtpDglVwAZkOQA2xoXVCoxpp4Cxvj8As+RsQFyc7bCzq0kPoFm4CyrVEDvjWdEAJ1NyyK3bQ2Tze2dtyYEo1BW65hZ8/zoMro8QlgLX388/pOfqATilp2CkSQ7dwBBzjj5PSzuuQ91jJTRzjWek7G6XEqWHosm9bpsXAPxNmo5OjHcrmbWlp4B5U0P1rP+VlMi3WU/usOAZDPAv1DY1+h8A3D0ST+5132J4C+QKaLt6mLWV0APWQT4GAzzvo1oQl5RNenovvIT0OB0O94AVNRXTVERqWhWYUKrAcV4HXlgIBjLz9S9hxjkQxK9kH6fOaeQvsGK1LSz2hOJ+k4oa34kFAL30JZw/hrTxmVh/nBX7YxVvJTQtHRjKKYJu8CPMxNEoG10Dgdta7O5+qgfwxDMUvf1qnD8eCAc7LnNJ6brJ12/BiTuKSp0TCmpe6ifr3BxgY1x0r5OZ4+WCiM6R09G+7EBoAHuBmJQkxsjYGM+KTRSzASmurJUStbV1pEh0QMbG2BAANiCdnhupIMq4HCFU9MZrO3vgSCahSsdHXoViUeNZXUsLw/53HfhUUs3s7ROi0OgSiFTZoyVruFYcpMQHMC02MyMYkPoLWWXG/yExAZgATADGBvgJP/jk1FfufMIAAAAASUVORK5CYII='
Local $bString = _WinAPI_Base64Decode($englishpng)
If @error Then Return SetError(1, 0, 0)
$bString = Binary($bString)
If $bSaveBinary Then
Local Const $hFile = FileOpen($sSavePath & "\english.png", 18)
If @error Then Return SetError(2, 0, $bString)
FileWrite($hFile, $bString)
FileClose($hFile)
EndIf
Return $bString
EndFunc ;==>_englishpng
Func _germanpng($bSaveBinary = False, $sSavePath = @ScriptDir)
Local $germanpng
$germanpng &= 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAlElEQVR42mNkGGDAOOqAUQcMBgcoArHaANl/C+SAciDuGCAHVIw6YNQBjPxAB7AOkAP+gBwwDegA9wFywAGQA6YDHeA2QA44OOqAQeGAGYwM5a7/B8YBhxiBDlhTz1Dubz0wDth5GuiA9b0M5QGOA+OAHcdGHTDqAKADwt0YFDUUB6ZJducxpEk2oGDUAaMOGHAHAABpjj7bxlq0/AAAAABJRU5ErkJggg=='
Local $bString = _WinAPI_Base64Decode($germanpng)
If @error Then Return SetError(1, 0, 0)
$bString = Binary($bString)
If $bSaveBinary Then
Local Const $hFile = FileOpen($sSavePath & "\german.png", 18)
If @error Then Return SetError(2, 0, $bString)
FileWrite($hFile, $bString)
FileClose($hFile)
EndIf
Return $bString
EndFunc ;==>_germanpng
Func _WinAPI_Base64Decode($sB64String)
Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)
If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "")
Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]")
$aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0)
If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "")
Return DllStructGetData($bBuffer, 1)
EndFunc ;==>_WinAPI_Base64Decode
Alles anzeigen