说,如果我想从Windows可执行文件中提取图标。我可以通过在Visual Studio中打开它来获得该图标ID:

然后,我将对48x48大小的图标感兴趣:

所以我的假设是:
HICON hIcons[4];
::ExtractIconEx(L"mstsc.exe", -13011, hIcons, NULL, 4);
hIconLogo = hIcons[3];

WORD wIcnId = -13011;
WORD wIcnInd = 3;
hIconLogo = ::ExtractAssociatedIconEx(hInst, L"mstsc.exe", &wIcnInd, &wIcnId);
最佳答案
ExtractIconEx 函数只能返回两种尺寸的图标:大和小。这些是相对大小,由环境定义。 “大”图标通常为32x32像素,但在某些系统配置上可能会更大。 “小”图标通常为16x16像素,但同样需要注意。唯一的保证是“小”图标比“大”图标小。如果您想知道系统的实际大小,则可以使用GetSystemMetrics和SM_CXICON调用“大”图标,或者使用SM_CYICON和SM_CXSMICON调用“小”图标的 SM_CYSMICON 函数。
操作系统内部使用“小”和“大”图标。大多数API仅处理“小”和“大”(有时也称为“大”图标)。例如,当您使用set an icon for a window时,您将设置“小”图标或“大”图标。这些是您仅有的两个选择。ExtractIconEx函数将phIconLarge参数设置为指向大图标的句柄数组的指针。 phIconSmall参数设置为指向小图标的句柄数组的指针。由于您为NULL参数传递了phIconSmall,因此您没有得到任何小图标。 hIcons充满了文件中“大”图标的句柄,在您的系统上,它们是32x32图标的不同位深。
ExtractAssociatedIcon 函数(及其前任兄弟)仅返回“大”图标。因此,在调用它时,应该获得与调用ExtractIconEx相同的结果。我不太确定您是说它给您带来不同的结果。它可能与索引有关。负索引意味着ExtractIconEx有一些特殊之处,但我不确定它们是否对ExtractAssociatedIcon有效。该文档没有太多提示。
SHGetFileInfo 函数尽管在许多方面都更加强大,包括从任何文件系统对象中提取图标的能力,但具有相同的基本限制:它为您提供了SHGFI_LARGEICON和SHGFI_SMALLICON的选择。
如果您需要提取自定义尺寸的图标(即系统“小”和“大”尺寸以外的图标),则需要做更多的工作。 本质上有两个选项:
SHGetImageList 函数,这是另一个shell辅助函数,但是可以检索包含图标的shell图像列表。它为您提供了更多的图标大小选项:SHIL_SMALL(通常为16x16),SHIL_LARGE(通常为32x32),SHIL_EXTRALARGE(通常为48x48)和SHIL_JUMBO(通常为256x256-仅在Vista和更高版本上)。因此,如果您要求SHIL_EXTRALARGE,则会得到您要寻找的48x48图标。 SHGetFileInfo 函数,但是这次将是在 shell 程序图像列表中检索所需图标的索引。使用SHGFI_SYSICONINDEX选项进行检索。 HICON ExtractExtraLargeIcon(LPCTSTR pszPath)
{
// Determine the index of the desired icon
// in the system image list.
SHGETFILEINFO sfi;
SHGetFileInfo(pszPath, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX);
// Retrieve the system image list.
// (To get 48x48 icons, we use `SHIL_EXTRALARGE`.)
IImageList* piml;
if (SHGetImageList(SHIL_EXTRALARGE, IID_IImageList, (void**)&piml) == S_OK)
{
HICON hIcon;
if (piml->GetIcon(sfi.iIcon, ILD_TRANSPARENT, &hIcon) == S_OK)
{
return hIcon;
}
}
// Oops! We failed.
return NULL;
}
SHDefExtractIcon 。 SHDefExtractIcon(上面的代码示例尝试使用的代码)失败,则 IExtractIcon::Extract 是您更强大的后备。该功能的强大之处在于它的nIconSize参数,该参数指定您要提取的图标的实际大小。 HICON ExtractArbitrarySizeIcon(LPCTSTR pszPath, int size)
{
HICON hIcon;
if (SHDefExtractIcon(pszPath, 1, 0, &hIcon, NULL, size) == S_OK)
{
return hIcon;
}
return NULL; // failure
}
无论您做什么,请记住,只要API函数返回HICON,就会将该资源的所有权转让给您。这意味着,在使用完图标后,必须通过调用 DestroyIcon 函数来销毁它,以免泄漏。
关于c++ - ExtractIcon和ExtractAssociatedIcon之间的区别?需要提取特定大小的图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37370241/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是