如何在任务管理器中更改应用程序图标

How to change app icon in taskmanager

本文关键字:应用程序 图标 任务管理器      更新时间:2023-10-16

我有一些Windows应用程序可以使用win api函数更改他的图标

SendMessage(hwnd, WM_SETICON, ICON_BIG, icon_handle);
SendMessage(hwnd, WM_SETICON, ICON_SMALL, icon_handle);
Shell_NotifyIcon(...);
它会更改任务栏

和托盘(任务栏通知区域)中的图标,但任务管理器中的图标仍未更改。如何在任务管理器中更改图标?可能吗?

从这个 SO 答案

更改所有图标(包括应用程序)非常重要,无论大小:

//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);

编辑

根据这个 SO 答案,图标需要是一个 .由图标编辑器创建的ICO文件;这篇SO文章还提到您需要将消息发送到应用程序的最顶部窗口。

我可以通过以下方式
切换任务栏、alt-tab 和任务管理器中的图标a) 使用 Visual Studio Resource Editor
创建图标b) 使用类似 HICON hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1));
的代码加载图标c) 将WM_SETICON, ICON_SMALL发送到最顶层窗口 -- 我使用的是 MFC SDI 应用程序,因此我将消息发送到主帧窗口 ( AfxGetApp()->m_pMainWnd

注意:MSDN 文档中的注释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);