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

时间:2013-10-29 10:18:01

标签: c++ windows winapi icons taskmanager

我有一些Windows应用程序,可以使用win api函数

更改其图标
SendMessage(hwnd, WM_SETICON, ICON_BIG, icon_handle);
SendMessage(hwnd, WM_SETICON, ICON_SMALL, icon_handle);

Shell_NotifyIcon(...);

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

3 个答案:

答案 0 :(得分:2)

来自this SO answer

  

更改所有图标非常重要,包括应用程序,包括小型和大型:

//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文件; this SO article还提到您需要将消息发送到应用程序的最顶层窗口。

我可以在任务栏,alt-tab和任务管理器中切换图标 a)使用Visual Studio资源编辑器创建图标 b)使用HICON hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1));之类的代码加载图标 c)将WM_SETICON, ICON_SMALL发送到最顶层窗口 - 我使用的是MFC SDI应用程序,因此我将消息发送到主框架窗口(AfxGetApp()->m_pMainWnd

注意:MSDN Docs for WM_SETICON提及

中的评论
  

系统不会复制图标。在销毁窗口之前不要破坏图标

答案 1 :(得分:1)

这是一般的Windows错误。任务管理器和资源管理器很长时间都会记住与文件关联的图标。如果您的图标在exe中具有最低ID,则它应显示为任务管理器(根节点)中的应用程序图标。但如果你最近更改了它,它可能无法正常工作。窗口的图标本身就是一个完全不同的东西 - 如果它没有显示,那么你的代码就错了。

答案 2 :(得分:0)

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