我有一些 Windows 应用程序可以使用 win api 函数更改他的图标
SendMessage(hwnd, WM_SETICON, ICON_BIG, icon_handle);
SendMessage(hwnd, WM_SETICON, ICON_SMALL, icon_handle);
Shell_NotifyIcon(...);
它改变了任务栏和托盘(任务栏通知区域)中的图标,但任务管理器中的图标仍然没有改变。如何更改任务管理器中的图标?可能吗?
我有一些 Windows 应用程序可以使用 win api 函数更改他的图标
SendMessage(hwnd, WM_SETICON, ICON_BIG, icon_handle);
SendMessage(hwnd, WM_SETICON, ICON_SMALL, icon_handle);
Shell_NotifyIcon(...);
它改变了任务栏和托盘(任务栏通知区域)中的图标,但任务管理器中的图标仍然没有改变。如何更改任务管理器中的图标?可能吗?
从这个答案
更改所有图标很重要,包括应用程序,无论大小:
//Change both icons to the same icon handle.
SendMessage(hwnd, WM_SETICON, ICON_SMALL, hIcon);
SendMessage(hwnd, WM_SETICON, ICON_BIG, hIcon);
//This will ensure that the application icon gets changed too.
SendMessage(GetWindow(hwnd, GW_OWNER), WM_SETICON, ICON_SMALL, hIcon);
SendMessage(GetWindow(hwnd, GW_OWNER), WM_SETICON, ICON_BIG, hIcon);
编辑:
根据this SO answer,图标需要是由图标编辑器创建的 .ICO 文件;这篇 SO 文章还提到您需要将消息发送到应用程序的最顶层窗口。
我可以通过以下方式切换任务栏、alt-tab 和任务管理器中
的图标 a) 使用 Visual Studio 资源编辑器创建图标
b) 使用类似 c) 的代码加载图标HICON hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1));
c) 发送WM_SETICON, ICON_SMALL
到最顶部的窗口——我正在使用一个 MFC SDI 应用程序,所以我将消息发送到主框架窗口 ( AfxGetApp()->m_pMainWnd
)
注意:MSDN Docs 中关于 WM_SETICON的评论提到
系统不会复制图标。在销毁窗口之前不要销毁图标
这是一个一般的 Windows 错误。任务管理器和资源管理器会在很长一段时间内记住与文件关联的图标。如果您的图标在 exe 中的 ID 最低,它应该在任务管理器(根节点)中显示为应用程序图标。但是,如果您最近更改了它,它可能无法正常工作。窗口本身的图标是完全不同的 - 如果它没有显示,你的代码是错误的。
BOOL sendWndIconToTaskbar(HWND hWnd,HICON hIcon)
{
BOOL ret = TRUE;
ASSERT(hWnd);
if(!::IsWindow(hWnd))
return FALSE;
CWnd* pWnd;
pWnd = pWnd->FromHandle(hWnd);
ASSERT(pWnd);
if(!pWnd)
return FALSE;
if(pWnd->GetParent())
{
if(::SetWindowLong(hWnd,GWL_HWNDPARENT,NULL) == 0)
return FALSE;
}
if(!(pWnd->ModifyStyle(NULL,WS_OVERLAPPEDWINDOW)))
ret = FALSE;
pWnd->SetIcon(hIcon,TRUE);
pWnd->SetIcon(hIcon,FALSE);
return ret;
}
HICON hIconSm = (HICON)LoadImage(NULL, "default.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE);
sendWndIconToTaskbar(pOcxDlg->m_hWnd,hIconSm);