Что нового

Получение название ресурса(Иконки) как отображает их Explorer

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
всем привет :smile: .
Как узнать какое название ресурса в *.exe/*.dll которое отображается в Explorer, Обычно нумерация с 0, но некоторые программы...
4539.98181752169.png
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Ganibal95,
_WinAPI_ShellExtractAssociatedIcon() из WinAPIEx.au3
 
Автор
Ganibal95

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
А как теперь этот Handel в название ресурса превратить?)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Есть понятие названия ресурса, а есть индекс. Первое, это то, что у тебя на скриншоте. Второе, это просто порядковый номер иконки в файле, начиная с нуля. Следующие два вызова згрузят одну и ту же иконку:

Код:
_WinAPI_ShellExtractIcon('autoit-v3-setup.exe', -103, 32, 32)


Код:
_WinAPI_ShellExtractIcon('autoit-v3-setup.exe', 0, 32, 32)
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
_WinAPI_ShellExtractAssociatedIcon() из WinAPIEx.au3
Что-то не нашел этой функции в WinAPIEx.au3
Обычно нумерация с 0, но некоторые программы...
и
Следующие два вызова згрузят одну и ту же иконку:
Знаю, что Yashied давно не показывался на форуме, но может кто-то подскажет, почему, иконки из shell32.dll в казалось бы одинаковых случаях начинают отсчет либо с нуля, либо с единицы и как это понять? На основе примера из справки: https://www.autoitscript.com/autoit3/docs/libfunctions/_WinAPI_ShellExtractIcon.htm сделал для себя просмотр иконок с их индексами (видимо вернее с номерами иконок). При этом просмотр показывает все верно, начиная с нуля. А когда подставляю к себе в скрипт (обычное нарисованное окно), то почему-то номер смещается на единицу.
Вот мой скрпит для просмотра номера иконки:
Код:
#include <GUIConstantsEx.au3>
#include <SendMessage.au3>
#include <StaticConstants.au3>
#include <WinAPIIcons.au3>
#include <WinAPIShellEx.au3>

Local $iIndex = 0, $iTotal = _WinAPI_ExtractIconEx(@SystemDir & '\shell32.dll', -1, 0, 0, 0)
ConsoleWrite($iTotal & @CR)
_ArrayDisplay($iTotal)

Local $hForm = GUICreate('Test ' & StringReplace(@ScriptName, '.au3', '()'), 160, 160)
Local $idButtonP = GUICtrlCreateButton('назад', 5, 130, 70, 23)
Local $idButtonN = GUICtrlCreateButton('вперед', 80, 130, 70, 23)
Local $idIcon = GUICtrlCreateIcon(@SystemDir & '\shell32.dll', 0, 69, 54, 32, 32)
Local $hIcon = GUICtrlGetHandle(-1)
Local $Lable = GUICtrlCreateLabel("", 10, 10, 50, 20)
GUISetState(@SW_SHOW)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $idButtonP
            $iIndex -= 1
             If $iIndex < 0 Then
                $iIndex = $iTotal - $iIndex - 1
            EndIf
            _WinAPI_DestroyIcon(_SendMessage($hIcon, $STM_SETIMAGE, 1, _WinAPI_ShellExtractIcon(@SystemDir & '\shell32.dll', $iIndex, 32, 32)))
             GUICtrlSetData($Lable, $iIndex)
        Case $idButtonN
            $iIndex += 1
            If $iIndex > $iTotal - 1 Then
                $iIndex = 0
            EndIf
            _WinAPI_DestroyIcon(_SendMessage($hIcon, $STM_SETIMAGE, 1, _WinAPI_ShellExtractIcon(@SystemDir & '\shell32.dll', $iIndex, 32, 32)))
             GUICtrlSetData($Lable, $iIndex)
    EndSwitch
WEnd
И вот как вставляю в свой скрипт с окном:
Код:
Local $idIcon = GUICtrlCreateIcon(@SystemDir & '\shell32.dll', 40, 69, 54, 32, 32)
; Local $idIcon = GUICtrlCreateIcon('shell32.dll', 40, 69, 54, 32, 32) ; Можно и так, но результат один

Кстати, некоторые вообще не подхватываются в моем окне
И как узнать именно индекс, о котором говорил Yashied?
 
Последнее редактирование:

---Zak---

Скриптер
Сообщения
455
Репутация
120
И как узнать именно индекс, о котором говорил @Yashied?
Если Вы работали с массивами, то вы сразу догадаетесь о каких индексах идет речь.
Если нет, то в вкратце могу попробовать объяснить на примере:
Код:
Local $aArray[] = ["Item 1", "Item 2", "Item 3"]
ConsoleWrite(UBound($aArray) &' - сколько элементов в массиве'&@CRLF)
ConsoleWrite($aArray[0] &' - выведем первый элемент массива'&@CRLF)

For $i = 0 To UBound($aArray) - 1
   ConsoleWrite($aArray[$i] &' - выведем '&$i&' элемент массива'&@CRLF)
Next

В текущем примере у Нас имеется массив, который содержит 3 элемента (UBound).
Но обращаться к элементам массива мы должны с 0, т.е. с 0 индекса массива.

Другими словами чтобы перебрать все элементы массива - мы можем получить кол-во элементов в массиве, а обращаться к ним через индекс, но т.к. он (индекс) начинается с 0 - мы отнимаем единицу.

PS: $iTotal - содержит кол-во элементов массива. А $iIndex - это индекс массива. Т.е. чтобы получить последний индекс массива мы должны выполнить выражение $iTotal - 1

GUICtrlCreateIcon - вторым параметром указывается порядковый номер и то в ОТРИЦАТЕЛЬНОМ числе (), но не индекс иконки.
Код:
Local $idIcon = GUICtrlCreateIcon(@SystemDir & '\shell32.dll', -41, 69, 54, 32, 32)

-41... т.к. нужна иконка с ИНДЕКСОМ 40, но порядковый номер не может начинаться с 0... а так как начинается с -1, то вот и получается, что чтобы получить иконку с индексом 40, нужно прибавить 1 - и перевести все это дело в отрицательные числа

В общем как-то так что ли...
Код:
#include <GUIConstantsEx.au3>
#include <SendMessage.au3>
#include <StaticConstants.au3>
#include <WinAPIIcons.au3>
#include <WinAPIShellEx.au3>

Local $iIndex = 0, $iTotal = _WinAPI_ExtractIconEx(@SystemDir & '\shell32.dll', -1, 0, 0, 0) - 1
ConsoleWrite($iTotal & @CR)

Local $hForm = GUICreate('Test ' & StringReplace(@ScriptName, '.au3', '()'), 160, 160)
Local $idButtonP = GUICtrlCreateButton('назад', 5, 130, 70, 23)
Local $idButtonN = GUICtrlCreateButton('вперед', 80, 130, 70, 23)
Local $idIcon = GUICtrlCreateIcon(@SystemDir & '\shell32.dll', -1, 69, 54, 32, 32)
Local $hIcon = GUICtrlGetHandle(-1)
Local $Lable = GUICtrlCreateLabel($iIndex, 10, 10, 50, 20)
GUISetState(@SW_SHOW)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $idButtonP
            $iIndex -= 1
             If $iIndex < 0 Then
                $iIndex = $iTotal - $iIndex - 1
             EndIf
             ConsoleWrite($iIndex & @CR)
            _WinAPI_DestroyIcon(_SendMessage($hIcon, $STM_SETIMAGE, 1, _WinAPI_ShellExtractIcon(@SystemDir & '\shell32.dll', $iIndex, 32, 32)))
             GUICtrlSetData($Lable, $iIndex)
        Case $idButtonN
            $iIndex += 1
            If $iIndex > $iTotal Then
                $iIndex = 0
             EndIf
             ConsoleWrite($iIndex & @CR)
            _WinAPI_DestroyIcon(_SendMessage($hIcon, $STM_SETIMAGE, 1, _WinAPI_ShellExtractIcon(@SystemDir & '\shell32.dll', $iIndex, 32, 32)))
             GUICtrlSetData($Lable, $iIndex)
    EndSwitch
 WEnd
 

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Если Вы работали с массивами, то вы сразу догадаетесь о каких индексах идет речь.
Скажем, доводилось работать с массивами. Думал, что понимаю, о каких индексах говорит @Yashied. Спасибо за примеры, но я попробую пояснить ситуацию.
У нас с вами получаются одинаковые результаты при просмотре иконок приведенным скриптом. Прикрепляю скрины работы вашего и моего скп\рипта на одной и той же иконке номера совпадают. С этим вопросов нет. Но когда я пробую вставить в совершенно другой срипт полученный номер иконки, либо смещается на 1, либо вообще не подхватывается. Потому и задался вопросом, точно ли я понимаю о каких индексах идет речь и почему в другом скрипте нужный номер иконки может оказаться совершенно другим?
Напр, в приведенном мною примере вставки:
Код:
Local $idIcon = GUICtrlCreateIcon(@SystemDir & '\shell32.dll', 40, 69, 54, 32, 32)

Номер иконки сместился на единицу. Искать примеры, где даже в ближайшем окружении от номера не просматриваются соседи из поиска моим или вашим скриптом сейчас нет времени, но может чуть позже покажу. После 200 вообще такое часто встречается. При этом даже иногда выскакивают иконки которые однозначно были в начале моего поиска и открываются и под другими номерами (обычно до 100)
 

Вложения

  • иконки 1.jpg
    иконки 1.jpg
    9.4 КБ · Просмотры: 0
  • иконки 2.jpg
    иконки 2.jpg
    9 КБ · Просмотры: 0
Последнее редактирование:
Верх