(我正在使用Visual Studio 2008,但我记得也有旧版本的类似问题.)
我尝试了几种不同的方法(其中许多方法在其他问题中提到过),但我仍然遇到一些奇怪的问题:
将图标作为资源包含时,它会立即显示为可执行文件的图标,但是为了显示在任务栏上的图标,我必须重新启动计算机.在那之前,它继续显示为以前的图标.清理解决方案,重新启动VS,没有任何影响.这不是一个非常大的问题,因为它不会影响已发布的exe,但是知道它在哪里保持旧图标缓存以及如何摆脱它会很好.
无论我做什么,alt-tabbing时显示的图标是默认的应用程序图标(方形和白色以及通用).这包括嵌入在可执行文件的图标,以及设置ICON_BIG
有WM_SETICON
.
至于第二件事,我的代码看起来像:
hIcon = (HICON)( LoadImage( NULL, szFilename, IMAGE_ICON, 32, 32, LR_LOADFROMFILE ) ); if( hIcon ) SendMessage( hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon );
但是,发送后WM_SETICON
,GetLastError()
返回6,"句柄无效.". hWnd
是一个有效的窗口句柄,hIcon
似乎是一个有效的图标句柄.我已经尝试寻找WM_SETICON
可能导致该错误的原因,并且至少要找出它认为无效的WHICH句柄,但还没有运气.我在调用之前立即清除了错误代码SendMessage()
,因此必须在处理消息时将其设置在某处.
我尝试了另一种方法,从exe本身加载图标,其中资源的ID是101
(它是第一个也是唯一包含的资源):
hIcon = (HICON)( LoadImage( GetModuleHandle( NULL ), MAKEINTRESOURCE( 101 ), IMAGE_ICON, 48, 48, 0 ) ); if( hIcon ) SendMessage( hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon );
......但是同样的事情发生了; 在调用之后SendMessage()
,GetLastError()
给出相同的错误状态.
我尝试了不同的尺寸(例如48x48,所有这些尺寸都出现在图标文件中),但没有不同的效果.我知道这肯定是找到并加载图像,因为如果我指定一个不存在的大小或无效的资源ID或错误的文件名(取决于我如何加载它),它很久就会失败SendMessage()
.
奇怪的是,如果我指定ICON_SMALL
而不是ICON_BIG
,则调用成功且没有错误状态,但是从文档中,我需要使用ICON_BIG
设置alt-tabbing时使用的图标.此外,如果我使用ICON_BIG
但加载16x16图标,我没有错误状态,但没有任何变化.
关于什么可能导致WM_SETICON
失败的任何想法?我发布的任何代码都有严重错误(除了格式化/样式/转换问题,因为它简化为基础知识)?