找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 1033|回复: 20

[分享] 从系统内置图标库中获取图标索引号

  [复制链接]
发表于 2026-7-27 23:03:15 | 显示全部楼层 |阅读模式
本帖最后由 redyear2026 于 2026-7-27 23:35 编辑

用 bat+powershell 脚本获取 c:\Windows\System32\shell32.dll 或 c:\Windows\System32\imageres.dll 包含的图标索引号,代码预设路径是前者,若改为后者,可在代码第4行自行替换...

test.bat
  1. <# ::
  2. @echo off &powershell -nop -c "iex(${%~f0}|out-string)" &pause&exit/b
  3. #>
  4. $n=0; $maxP=260; $lib='c:\Windows\System32\shell32.dll'
  5. $path=[Runtime.InteropServices.Marshal]::StringToBSTR($lib)
  6. $buf=New-Object Text.StringBuilder($lib, $maxP)
  7. Add-Type '
  8.    using System; using System.Runtime.InteropServices;
  9.    public class p {
  10.    [DllImport("shell32.dll", EntryPoint="PickIconDlg", CharSet=CharSet.Unicode)]
  11.    public static extern int picker(IntPtr h, [MarshalAs(UnmanagedType.LPWStr)] string path, uint maxPath, ref int index); } '
  12. $r=[p]::picker([IntPtr]::Zero, $buf, $maxP, [ref]$n)
  13. if ($r -ne 1) { exit }
  14. "图标库文件: $($buf.ToString())`n图标索引号: $n"; exit
复制代码





发表于 7 天前 | 显示全部楼层
很强大!
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
厉害,谢谢!
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
强大  谢谢

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
这个要学学
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
感谢分享!!
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
很实用的脚本啊,多谢楼主了
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
本帖最后由 窄口牛 于 2026-7-28 12:46 编辑

ps做不到点选吗?
不懂ps,让ai改vbs,说做不到获取图标序号,改个选择吧,就来了个批处理的数字选项。
GIF 2026-7-28 12-44-19.gif

点评

可以用纯批代码实现交互选择图标库文件》先用资源管理器分别打开两个窗口,其中会高亮选中对应的 shell32.dll 和 imageres.dll 文件,以便从中拖入一个库文件,点选其中的图标并提取其索引号。试试以下代码... test  详情 回复 发表于 7 天前
快快附上你改好的代码 想吃现成的~  详情 回复 发表于 7 天前
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
厉害,多谢老大的付出
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
这个挺实用
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
窄口牛 发表于 2026-7-28 12:43
ps做不到点选吗?
不懂ps,让ai改vbs,说做不到获取图标序号,改个选择吧,就来了个批处理的数字选项。

快快附上你改好的代码 想吃现成的~

点评

就把原脚本扔给ai,让帮你改成选择方式就行了。  详情 回复 发表于 7 天前
回复

使用道具 举报

发表于 7 天前 来自手机 | 显示全部楼层
yuping 发表于 2026-7-28 16:56
快快附上你改好的代码 想吃现成的~

就把原脚本扔给ai,让帮你改成选择方式就行了。
回复

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
本帖最后由 redyear2026 于 2026-7-28 19:26 编辑
窄口牛 发表于 2026-7-28 12:43
ps做不到点选吗?
不懂ps,让ai改vbs,说做不到获取图标序号,改个选择吧,就来了个批处理的数字选项。

可以用纯批代码实现交互选择图标库文件》先用资源管理器分别打开两个窗口,其中会高亮选中对应的 shell32.dll 和 imageres.dll 文件,以便从中拖入一个库文件,点选其中的图标并提取其索引号。试试以下代码...

test.bat
  1. <# ::
  2. @echo off &setlocal &set "d1=%SystemRoot%\system32\shell32.dll" &set "d2=%SystemRoot%\system32\imageres.dll"
  3. if exist "%d1%" (explorer /select,"%d1%")
  4. if exist "%d2%" (explorer /select,"%d2%")
  5. :loop_ico
  6.    set "p=" &set/p "p=拖入一个图标库文件:"
  7.   if not defined p (exit/b) else set "p=%p:"=%"
  8.    powershell -nop -c "$lib='%p%';iex(${%~f0}|out-string)" &goto loop_ico
  9. #>
  10. $n=0; $path=[Runtime.InteropServices.Marshal]::StringToBSTR($lib)
  11. $maxP=260; $buf=New-Object Text.StringBuilder($lib, $maxP)
  12. Add-Type '
  13.    using System; using System.Runtime.InteropServices;
  14.    public class p {
  15.    [DllImport("shell32.dll", EntryPoint="PickIconDlg", CharSet=CharSet.Unicode)]
  16.    public static extern int picker(IntPtr h, [MarshalAs(UnmanagedType.LPWStr)] string path, uint maxPath, ref int index); } '
  17. $r=[p]::picker([IntPtr]::Zero, $buf, $maxP, [ref]$n)
  18. if ($r -ne 1) { exit }
  19. "图标库文件: $($buf.ToString())`n图标索引号: $n"; exit
复制代码




回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
恩,ai给搞出来了,点选两个中的一个执行。

点评

你写一个简单的批处脚本都要先用 ai 吗?  详情 回复 发表于 7 天前
回复

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
窄口牛 发表于 2026-7-28 19:20
恩,ai给搞出来了,点选两个中的一个执行。

你写一个简单的批处脚本都要先用 ai 吗?

点评

批处理不一定需要,ps是一点点也不会。  详情 回复 发表于 7 天前
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
redyear2026 发表于 2026-7-28 19:27
你写一个简单的批处脚本都要先用 ai 吗?


批处理不一定需要,ps是一点点也不会;很明显,这不是批处理的范围。
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
窄口牛 发表于 2026-7-28 19:29
redyear2026 发表于 2026-7-28 19:27
你写一个简单的批处脚本都要先用 ai 吗?
  1. Powershell -nop -c "$n=0;$maxP=260;$lib='c:\Windows\System32\shell32.dll';$buf=New-Object Text.StringBuilder($lib,$maxP);Add-Type 'using System;using System.Runtime.InteropServices;public class p{[DllImport(\"shell32.dll\",EntryPoint=\"PickIconDlg\",CharSet=CharSet.Unicode)]public static extern int picker(IntPtr h,[MarshalAs(UnmanagedType.LPWStr)]string path,uint maxPath,ref int index);}';$r=[p]::picker([IntPtr]::Zero,$buf,$maxP,[ref]$n);if($r -eq 1){Write-Host \"图标库文件: $($buf.ToString())`n图标索引号: $n\"}else{Write-Host '用户选择了取消!'}"
复制代码


PS 命令一行过,,,
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
有小工具看的使用PECMD写的的,不懂你们用没用过。如图:
下载.png

点评

还是这个爽~! 麻烦传上来吧~ 集成到系统封装里面去。。。  详情 回复 发表于 6 天前
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
忧心的启 发表于 2026-7-29 16:45
有小工具看的使用PECMD写的的,不懂你们用没用过。如图:

还是这个爽~!  麻烦传上来吧~
集成到系统封装里面去。。。
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
向楼主学习了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-8-4 12:42

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表