自制获取文件图标工具(getIconImage函数)

By o3o_o3o_o3o at 2022-05-19 • 1人收藏 • 1257人看过

原理:把文件创建一个快捷方式,保存到另一个文件夹里(保证这个文件的快捷方式是在文件夹里面的第一位),用win.ui.explorer里的loadFile把快捷方式的图标显示出来,截个图,再关闭explorer的窗口(速度要快),再把图片保存一下。


值得一提的是:这个东西也可以获取文件夹的图标。


import win.ui;
import fsys.lnk;
import win.ui.explorer;
import soImage;
lnk=fsys.lnk();
Img = soImage();
getIconImage = function(filepath){
	var Form = win.form(text="aardio form";right=200;bottom=70)
	Form.add(treeview={cls="treeview";left=-54;top=0;right=50;bottom=70;asel=false;bgcolor=16777215;edge=1;z=1})
	string.save("F:\getIconImage\1.lnk","1");
	lnk.path = filepath;
	lnk.save("F:\getIconImage\1.lnk")
	var explorer = win.ui.explorer( Form.treeview );
	explorer.setIconSize("extralarge")
	explorer.loadFile("F:\getIconImage");
	Form.setPos(-300,-300,,,1/*_HWND_BOTTOM*/);
	Form.show(true);
	Form.setPos(0,0,,,1/*_HWND_BOTTOM*/);
	win.delay(150);
	Img.capture(Form.treeview.hwnd);
	Img.crop(69,2,129,66);
	Img.save("\icon.jpg");
	Form.close();
}


getIconImage(/*路径*/);


可能会因为电脑版本的不同,crop的位置也会不同。这是我使用的电脑:

版本:Windows 10 家庭中文版

版本号:21H

操作系统内部版本:19044.1706


5 个回复 | 最后更新于 2022-10-01
2022-05-19   #1

另辟蹊径

2022-05-19   #2

2022-09-27   #3

截图的话就不能透明底了吧

2022-09-27   #4

2022-10-01   #5


这是来自官方论坛的例子,可以参考下获取图标的做法

import win.ui;
/*DSG{{*/
mainForm = win.form(text="aardio form";right=427;bottom=458)
mainForm.add(
button={cls="button";text="清空";left=124;top=390;right=293;bottom=429;z=2};
listview={cls="listview";left=9;top=10;right=417;bottom=375;acceptfiles=1;edge=1;mode="icon";z=1}
)
/*}}*/

import fsys.info
import win.imageList
import process
import fsys.table
var fsystable = fsys.table("/paths.table")

mainForm.enableDpiScaling();
mainForm.show();

var add = function(filePath,dontsave){
        var sfi = fsys.info.get(filePath, 0x100/*_SHGFI_ICON*/|0x4000/*_SHGFI_SYSICONINDEX*/)
        var imageList = win.imageList(topointer(sfi.returnValue))
        mainForm.listview.setImageList( imageList,0/*_LVSIL_NORMAL*/ )
        var spth = io.splitpath(filePath)
        var itemtext = spth.file
        if(!#itemtext) itemtext = spth.drive
        mainForm.listview.addItem(itemtext,,sfi.iIcon)
        ::DestroyIcon(sfi.hIcon)
        imageList.destroy()
        if(dontsave) return ;
        if(!fsystable) fsystable = fsys.table("/paths.table")
        table.push(fsystable,filePath)
        fsystable.save()
}

for(k,v in fsystable){
        if(k = "_gc") continue ;
        if(!io.exist(fsystable[k])){
                fsystable[k] = null
                fsystable.save()
                continue;
        }
        add(fsystable[k],true)
}

mainForm.listview.wndproc = function(hwnd,message,wParam,lParam){
        select(message) {
                case 0x233/*_WM_DROPFILES*/{
                        var tmpfiletab = win.getDropFile(wParam)
                        for(i=1;#tmpfiletab;1){
                                add(tmpfiletab[i])
                        }
                }
        }
}
mainForm.listview.onnotify = function(id,code,ptr){
        select(code) {
            case 0xFFFFFFFD/*_NM_DBLCLK*/ {
                    var nm = mainForm.listview.getNotifyMessage(code,ptr)
                    if(nm.iItem){
                        process.execute(fsystable[nm.iItem])
                }
            }       
    }
}
mainForm.button.oncommand = function(id,event){
        fsystable = null
        collectgarbage("collect")
        string.save("/paths.table","{}" )
        mainForm.listview.clear()
}
return win.loopMessage();


登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...