Icon austauschen

  • Hallo zusammen.
    Habe eine kurze und knackige Anfrage.
    Ist es möglich, das Symbol oder Icon, welches sich immer links oben in einem Fenster befindet, auszutauschen?
    Sprich, man öffnet das die Anwendung (von mir aus den Explorer) und danach ein Autoit Script welches das Ordnersymbol links neben der Fensterbezeichnung "Arbeitsplatz" gegen ein definiertes Icon austauscht.

    Gruß
    dusg

  • Du brauchst nur in der desktop.ini, die sich im Ordner befindet, wo du das Icon tauschen willst. Wenn dort keine desktop.ini ist, musst du eine erstellen. Dort drin kannst du dann folgendes schreiben:

    Code
    [.ShellClassInfo]
    IconFile=icon.ico
    IconIndex=0

    Bei IconFile musst du die Icon Datei angeben, wenn das Icon nicht im selben Ordner ist, auch den Pfad.

    Dies ändert aber auch das Ordnersymbol im Verezichnis, da dies die selben sind.

  • Am besten ist, wenn du das Icon des jeweiligen Programmes mit dem Resource Hacker austauschst.
    Bei eigenen Guis kannst du einfach mit GUISetIcon das Icon bestimmen.
    Ansonsten probier mal das da:

    Spoiler anzeigen
    [autoit]

    _GUISetIcon(WinGetHandle("[ACTIVE]", ""), "shell32.dll", 322) ; name, not ordinal value

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _GUISetIcon($hGui, $sModule, $iName) ; for loaded modules in this shape

    [/autoit] [autoit][/autoit] [autoit]

    Local $a_hCall = DllCall("kernel32.dll", "hwnd", "GetModuleHandleW", "wstr", $sModule)

    [/autoit] [autoit][/autoit] [autoit]

    Local $hModule = $a_hCall[0]

    [/autoit] [autoit][/autoit] [autoit]

    $a_hCall = DllCall("user32.dll", "hwnd", "LoadImageW", _
    "hwnd", $hModule, _
    "int", $iName, _
    "dword", 1, _ ; IMAGE_ICON
    "int", 32, _
    "int", 32, _
    "dword", 0) ; LR_DEFAULTCOLOR

    [/autoit] [autoit][/autoit] [autoit]

    Local $hIcon = $a_hCall[0]

    [/autoit] [autoit][/autoit] [autoit]

    DllCall("user32.dll", "hwnd", "SendMessageW", _
    "hwnd", $hGui, _
    "dword", 0x0080, _ ; WM_SETICON
    "dword", 1, _ ; 1 = ICON_BIG, 0 = ICON_SMALL
    "ptr", $hIcon)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_GUISetIcon

    [/autoit]
  • Hallo funkey

    Danke.
    Genau das habe ich gesucht.
    Funktioniert hervorragend.
    Das verbeuge ich mich vor dir :rock:

    @m-obi
    Hab deine Lösung nicht ausprobiert.
    Glaube aber auch nicht, dass es das war was ich wollte.
    Ich danke trotzdem für den schnellen Lösungsvorschlag.

    Ich wünsche euch ein frohes Fest und einen guten Rutsch

    Gruß
    dusg

  • Hallo funkey

    Jetzt hätte ich doch mal eine Frage.
    Du nimmst ja das neue Icon aus der shell32.dll. Und zwar die Nummer 322.
    Was muss ich aber machen, wenn ich ein eigenes Icon benutzen will was in einem beliebigne Verzeichnis liegt?
    Sorry für die Frage. Aber ich mit DLLCalls kennen ich mich (noch) nicht so gut aus.

    Gruß
    dusg

  • Hallo dusg,

    funkey hatte die Antwort GUISetIcon schon gegeben, allerdings auch eine Alternative dazu. Hier das Beispiel aus der Hilfe Ver. 3.3.2.0 zu GUISetIcon:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('MustDeclareVars', 1)

    [/autoit] [autoit][/autoit] [autoit]

    Example()

    [/autoit] [autoit][/autoit] [autoit]

    Func Example()
    Local $sFile = "MEINICON.ico"; den Filenamen austauschen
    Local $msg

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("My GUI new icon") ; will create a dialog box that when displayed is centered

    [/autoit] [autoit][/autoit] [autoit]

    GUISetIcon($sFile) ; will change icon

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(); will display an empty dialog box

    [/autoit] [autoit][/autoit] [autoit]

    ; Run the GUI until the dialog is closed
    While 1
    $msg = GUIGetMsg()

    [/autoit] [autoit][/autoit] [autoit]

    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd
    EndFunc ;==>Example

    [/autoit]

    mfg (Auto)Bert

  • Hallo AutoBert

    Danke für deine Antwort.
    Den Code den funkey gepostet hat ist genau der, den ich brauche.
    Er tauscht das Icon eines existierenden Windowsfenster aus (z.B. Explorer) und nicht eines von mir programmierten GUI.
    Das ist auch alles so richtig.
    Für mich (gaaanz leicht vortgeschrittener Anfänger) birgt dieser Code nur folgendes Problem.
    funkey holt das neue Icon aus der shell32.dll.
    Ich habe aber ein eigenes Icon gemacht. Welches dann genommen werden soll.
    Ich weiß jetzt leider nicht, wie ich den Code ändern muss, damit mein Icon genommen wird.
    Glaube nicht, dass mir da GUISetIcon weiterhilft.

    Gruß
    dusg