Icon richtig darstellen - ID falsch

  • Hi,
    ich will Icons anzeigen lassen.
    Diese werden aus der reg ausgelesen.

    "Leider" nimmt AutoIT eine andere Art der Nummervergabe als Windows :comp2:

    Bei Windows wird das erste Icon der shell32.dll mit "0" bezeichnet.
    Bei allen anderen folgenden Icons erhöht sich die ID um jeweils 1.

    Bei AutoIT sind die IDs nicht forlaufend.


    Wie kann ich dennoch das Icon korrekt darstellen lassen.

    Danke


    Hier ein Beispiel (es soll eigentlich die CD erscheinen)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Array.au3>

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

    $GUI = GUICreate("Test", 1000, 980, -1, -1)
    $beenden = GuiCtrlCreateButton ("beenden", 820, 70, 50, 50, $BS_ICON)
    GUICtrlCreateLabel(" beenden", 817, 40, -1, -1, BitOR($WS_BORDER, $SS_CENTERIMAGE))
    GUICtrlSetBkColor(-1, 0xB0E0E6)
    GUICtrlSetImage ($beenden, "shell32.dll", 28)

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

    $reg = "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AudioCD\DefaultIcon"

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

    $reg_hinten = ""

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

    $icon_reg = RegRead($reg, $reg_hinten)
    $icon = GUICtrlCreateIcon("", 0, 50, 50, 50, 50, BitOR($SS_NOTIFY,$WS_GROUP))
    If StringInStr($icon_reg, ",") Then
    $icon_split = StringSplit($icon_reg, ",")
    $icon_name = $icon_split[1]
    $icon_id = $icon_split[2]
    Else
    $icon_name = $icon_reg
    $icon_id = ""
    EndIf
    MsgBox(0,"",$icon_name & "|" & $icon_id & "|", 2)
    GUICtrlSetImage($Icon, $icon_name, $icon_id)

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

    GUISetState(@SW_SHOW)

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $beenden
    Exit
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    WEnd

    [/autoit]
    • Offizieller Beitrag

    Ich habe keine probable Lösung zur Hand - ich lasse das immer in einer Testschleife mit Zähleranzeige laufen, bis das gewünschte Zeichen erscheint.
    Ich kann nur bestätigen, dass die im Reshacker angezeigten ID's gar nix mit den Windowsinternen ID's der shell32.dll zu tun haben.
    Es ist nicht mal ein konstanter Versatz oder sonstiges System erkennbar.

  • Hallo,

    ich habe mir die Einstellungen in der Reg. angeschaut und habe festgestellt, dass manchmal die ID mit und machmal ohne Vorzeichen steht.

    Mit diesem Skript habe ich dann vergliechen wie die Icons in Autoit behandelt werden.

    Spoiler anzeigen
    [autoit]

    ;===============================================================================
    ;
    ; Description: Show all icons in the given file
    ; Requirement(s): Autoit 3.0.103+
    ; Author(s): YDY (Lazycat)
    ;
    ;===============================================================================

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

    #include <GUIConstants.au3>

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

    ; Setting variables
    Global $ahIcons[30], $ahLabels[30]
    Global $iStartIndex = 1, $iCntRow, $iCntCol, $iCurIndex
    Global $sFilename = @SystemDir & "\shell32.dll"; Default file is "shell32.dll"
    Global $iOrdinal=-1

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

    ; Creating GUI and controls
    $hGui=GUICreate("Icon Selector by Ordinal value", 385, 435, @DesktopWidth/2 - 192, _
    @DesktopHeight/2 - 235, -1, $WS_EX_ACCEPTFILES)
    GUICtrlCreateGroup("", 5, 1, 375, 40)
    GUICtrlCreateGroup("", 5, 50, 375, 380)
    $hFile = GUICtrlCreateInput('', 12, 15, 325, 16, -1, $WS_EX_STATICEDGE)
    If $CmdLine[0] = 0 Then
    GUICtrlSetData($hFile, $sFilename)
    Else
    GUICtrlSetData($hFile, $CmdLine[1])
    EndIf

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

    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    GUICtrlSetTip(-1, "You can drop files from shell here...")
    $hFileSel = GUICtrlCreateButton("...", 345, 14, 26, 18)
    $hPrev = GUICtrlCreateButton("Previous", 10, 45, 60, 24, $BS_FLAT)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $hNext = GUICtrlCreateButton("Next", 75, 45, 60, 24, $BS_FLAT)
    $hToggle = GUICtrlCreateButton("by Name", 300, 45, 60, 24, $BS_FLAT)

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

    ; This code build two arrays of ID's of icons and labels for easily update
    For $iCntRow = 0 to 4
    For $iCntCol = 0 to 5
    $iCurIndex = $iCntRow * 6 + $iCntCol
    $ahIcons[$iCurIndex] = GUICtrlCreateIcon($sFilename, $iOrdinal*($iCurIndex+1), _
    60 * $iCntCol + 25, 70 * $iCntRow + 80)
    $ahLabels[$iCurIndex] = GUICtrlCreateLabel($iOrdinal*($iCurIndex+1), _
    60 * $iCntCol+11, 70 * $iCntRow + 115, 60, 20, $SS_CENTER)
    Next
    Next

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

    GUISetState()

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

    While 1
    $iMsg = GUIGetMsg()
    ; Code below will check if the file is dropped (or selected)
    $sCurFilename = GUICtrlRead($hFile)
    If $sCurFilename <> $sFilename Then
    $iStartIndex = 1
    $sFilename = $sCurFilename
    _GUIUpdate()
    Endif
    ; Main "Select" statement that handles other events
    Select
    Case $iMsg = $hFileSel
    $sTmpFile = FileOpenDialog("Select file:", "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}", "Executables & dll's (*.exe;*.dll;*.ocx;*.icl)")
    If @error Then ContinueLoop
    GUICtrlSetData($hFile, $sTmpFile); GUI will be updated at next iteration
    Case $iMsg = $hPrev
    $iStartIndex = $iStartIndex - 30
    _GUIUpdate()
    Case $iMsg = $hNext
    $iStartIndex = $iStartIndex + 30
    _GUIUpdate()
    Case $iMsg = $hToggle
    if $iOrdinal = -1 Then
    $iOrdinal = 1
    GUICtrlSetData($hToggle, "by Ordinal")
    WinSetTitle($hGui,"","Icon Selector by Name value")
    Else
    $iOrdinal = -1
    GUICtrlSetData($hToggle, "by Name")
    WinSetTitle($hGui,"","Icon Selector by Ordinal value")
    EndIf
    _GUIUpdate()
    Case $iMsg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    Wend

    ; Just updates GUI icons, labels and set state of "Previous" button
    Func _GUIUpdate()
    For $iCntRow = 0 to 4
    For $iCntCol = 0 to 5
    $iCurIndex = $iCntRow * 6 + $iCntCol
    GUICtrlSetImage($ahIcons[$iCurIndex], $sFilename, $iOrdinal*($iCurIndex + $iStartIndex))
    If $iOrdinal = -1 Then
    GUICtrlSetData($ahLabels[$iCurIndex], -($iCurIndex + $iStartIndex))
    Else
    GUICtrlSetData($ahLabels[$iCurIndex], '"' & ($iCurIndex + $iStartIndex) & '"')
    EndIf
    Next
    Next
    ; This is because we don't want negative values
    If $iStartIndex = 1 Then
    GUICtrlSetState($hPrev, $GUI_DISABLE)
    Else
    GUICtrlSetState($hPrev, $GUI_ENABLE)
    Endif
    EndFunc

    [/autoit]

    und entsprechend dein Skript angepasst:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Array.au3>

    $GUI = GUICreate("Test", 1000, 980, -1, -1)
    $beenden = GuiCtrlCreateButton ("beenden", 820, 70, 50, 50, $BS_ICON)
    GUICtrlCreateLabel(" beenden", 817, 40, -1, -1, BitOR($WS_BORDER, $SS_CENTERIMAGE))
    GUICtrlSetBkColor(-1, 0xB0E0E6)
    GUICtrlSetImage ($beenden, "shell32.dll", 28)


    $reg = "HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AudioCD\DefaultIcon"

    $reg_hinten = ""

    $icon_reg = RegRead($reg, $reg_hinten)
    $icon = GUICtrlCreateIcon("", 0, 50, 50, 50, 50, BitOR($SS_NOTIFY,$WS_GROUP))
    If StringInStr($icon_reg, ",") Then
    $icon_split = StringSplit($icon_reg, ",")
    $icon_name = $icon_split[1]
    $icon_id = $icon_split[2]
    ; hier wird kontrolliert, ob Icon-ID ein Vorzeichen hat,
    ;wenn ja wird die Nummer ohne Vorzeichen weitergegeben.
    ;Bei ID ohne Vorzeichen wird die Nummer um 1 erhoeht.
    if StringIsAlNum($icon_id) = 1 Then
    $icon_id = $icon_id + 1
    Else
    $icon_id = Abs ($icon_id)
    EndIf
    Else
    $icon_name = $icon_reg
    $icon_id = ""
    EndIf
    MsgBox(0,"",$icon_name & "|" & $icon_id & "|", 2)
    GUICtrlSetImage($Icon, $icon_name, $icon_id)

    GUISetState(@SW_SHOW)


    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $beenden
    Exit
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    WEnd

    [/autoit]

    Ist es das, was du haben wolltest?

  • Hi,
    leider funktioniert es nicht so ganz.
    Da wo sich die ID nur um 1 ändert klappt es.

    Jedoch kommt es auch vor, dass es mehr als 60 sich ändert.
    Dann klappts leider nicht mehr :O

  • Hi,
    hab im englischen Forum mal geschaut.
    Dort gibt es ein Programm mit dem man zwischen den zwei verschiedenen Iconbeschriftungen wechseln kann

    http://www.autoitscript.com/forum/index.php?showtopic=50595&hl=shell32++icon++wrong

    Nur verstehe ich den Code nicht wirklich.

    Wie kann ich es für mein Problem verwenden???


    z. B. shell32.dll, 40
    sollte eigentlich ne AudioCD sein

    nach der anderen Nummerierung ist es aber das Startmenü :D

    EDIT: jemand ne Idee :D

  • Hi,

    wenn du den Skript ausführst und dein Icon suchst, dann siehst du, dass das AudioCD-Icon die Nummer 41 und nicht 40 hat.

    Wo jetzt der Fehler vorliegt kann ich dir nicht sagen, aber ich würde einfach die Nummer 41 nehmen und damit arbeiten.

  • Hi,
    das funktioniert so leider nicht :weinen:

    Ich lese ja den Namen der dll und Icon-ID aus der Reg aus.
    Aber AutoIt zeigt mir dann das falsche Icon

  • dann nimm einfach ausgelesene nummer PLUS 1 und das ganze * -1
    z.B. $icon = 40
    $icon = ($icon + 1) * (-1)

    Einmal editiert, zuletzt von progandy (29. Oktober 2007 um 20:09)