У меня есть несколько приложений Windows, которые могут изменить его значок, используя функции Win API
SendMessage(hwnd, WM_SETICON, ICON_BIG, icon_handle);
SendMessage(hwnd, WM_SETICON, ICON_SMALL, icon_handle);
Shell_NotifyIcon(...);
Это меняет значок на панели задач и в трее (область уведомлений панели задач), но значок в диспетчер задач еще не изменилось.
Как я могу изменить значок в TaskManager? Является ли это возможным?
Важно поменять все значки, включая приложение, как маленькие, так и большие:
//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);
РЕДАКТИРОВАТЬ:
Согласно этот так ответ, значок должен быть файлом .ICO, созданным редактором иконок; эта ТАКАЯ статья также упоминается, что вам нужно отправить сообщение в самое верхнее окно приложения.
Я мог бы переключить значок в панели задач, Alt-Tab и в диспетчере задач с помощью
а) создание значка с помощью редактора ресурсов Visual Studio
б) загрузка иконки с кодом вроде HICON hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1));
в) отправка WM_SETICON, ICON_SMALL
до самого верхнего окна — я использовал приложение MFC SDI, поэтому я отправил сообщение в главное окно фрейма (AfxGetApp()->m_pMainWnd
)
ПРИМЕЧАНИЕ: комментарий в Документы MSDN для WM_SETICON упоминает
Система не делает копию значка. Не разрушайте иконку перед разрушением окна
Это общая ошибка Windows. Диспетчер задач и проводник запоминают значки, связанные с файлами, очень долго. Если ваш значок имеет наименьший идентификатор в exe, он должен отображаться как значок приложения в диспетчере задач (корневой узел). Но если вы изменили его недавно, это может не сработать. Значок самого окна — это совсем другое — если он не отображается, ваш код неверен.
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);