skyfree 发表于 2010-9-24 10:09:24

[已解决]从DLL中获取图标的问题

本帖最后由 skyfree 于 2010-9-25 21:15 编辑

一般来说使用DLL中的图标文件是用GUICtrlSetImage函数实现,设定要读取的DLL,以及图标的编号就可以了,如GUICtrlSetImage($IconCtrlHdl,"x:\xx\xx.dll",1001),其中$IconCtrlHdl为图标空间的句柄。

但最近我从注册表中读出了这样的图标信息,如:"%systemroot%\system32\imageres.dll,-93",很显然,图标文件位于C:\Windows\System32\imageres.dll中,但“-93”究竟是不是图标的编号?

尝试用过GUICtrlSetImage(C:\Windows\System32\imageres.dl,"x:\xx\xx.dll",-93)和GUICtrlSetImage(C:\Windows\System32\imageres.dl,"x:\xx\xx.dll",93),即使用和不使用“-”,发现读出的图标不是我所需要的。那究竟想“-93”这样的编号,究竟指的是什么,还请各位帮忙分析。

十分感谢!

3mile 发表于 2010-9-24 10:49:48

$aRet = _PickIconDlg(@SystemDir & "\shell32.dll", 8, WinGetHandle(""))
If Not @error Then MsgBox(64, "Results", StringFormat("IconFile Selected: %s\nIconID Selected: %i", $aRet, $aRet))

Func _PickIconDlg($sFileName, $nIconIndex=0, $hWnd=0)
    Local $nRet, $aRetArr
   
    $nRet = DllCall("shell32.dll", "int", "PickIconDlg", _
      "hwnd", $hWnd, _
      "wstr", $sFileName, "int", 1000, "int*", $nIconIndex)
   
    If Not $nRet Then Return SetError(1, 0, -1)
   
    $aRetArr = $nRet
    $aRetArr = $nRet
   
    Return $aRetArr
EndFunc

3mile 发表于 2010-9-24 10:57:20

这个应该可以帮助你。
x:\xxxx\AutoIt3\Examples\GUI\Advanced\enumicons.au3

republican 发表于 2010-9-24 11:09:30

回复 1# skyfree
该编号应该是与TraySetIcon相对应的。

lixiaolong 发表于 2010-9-24 11:51:29

本帖最后由 lixiaolong 于 2010-9-24 12:15 编辑

GUICtrlSetImage(-1, "C:\Windows\System32\imageres.dll", -93)

这个“-93“就是,首先建立一个文件夹
在文件夹上点右键,打开属性,选[自定义]
点[更改图标],点[浏览] 选C:\Windows\System32\imageres.dll
然后出现很多图标,第一个就是 -1 ,从上往下数,-1 -2 -3 ,,,,
第93个图标就是 -93#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>

Opt('MustDeclareVars', 1)

Example()

Func Example()
        Local $msg

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

        GUICtrlCreateButton("my picture button", 10, 20, 40, 40, $BS_ICON)
        GUICtrlSetImage(-1, "C:\Windows\System32\imageres.dll", -93)

        GUISetState()

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

                If $msg = $GUI_EVENT_CLOSE Then ExitLoop
        WEnd
EndFunc   ;==>Example忘说了,我干才试了一下,如果使用的系统是XP,在imageres.dll里找图标就不正常
Vista和Win7可以正常找到需要的图标

6678720 发表于 2010-9-24 14:47:32

谢谢各们大侠,学习了。

skyfree 发表于 2010-9-24 22:31:08

十分感谢各位的解答,认真学习了

cocoazhang 发表于 2010-9-24 22:38:50

来学习了!!!!!!!

shenrenba 发表于 2010-9-25 10:20:04

这个LZ是自由天空的SKYFREE吗?

hzxymkb 发表于 2010-9-25 20:52:11

欢迎skyfree到来!

afan 发表于 2010-9-25 21:06:56

解决了的话还请前辈修改标题,加注“已解决”

yiruirui 发表于 2010-10-8 13:28:20

估计不是吧?

shuangsexing 发表于 2012-2-12 18:34:24

学习了各位大大

Free-IT 发表于 2015-2-1 23:50:02

学习下DLL,对这方面的知识了解甚少
页: [1]
查看完整版本: [已解决]从DLL中获取图标的问题