Как изменить значок приложения в диспетчере задач

У меня есть несколько приложений Windows, которые могут изменить его значок, используя функции Win API

SendMessage(hwnd, WM_SETICON, ICON_BIG, icon_handle);
SendMessage(hwnd, WM_SETICON, ICON_SMALL, icon_handle);

Shell_NotifyIcon(...);

Это меняет значок на панели задач и в трее (область уведомлений панели задач), но значок в диспетчер задач еще не изменилось.
Как я могу изменить значок в TaskManager? Является ли это возможным?

1

Решение

От этот так ответ

Важно поменять все значки, включая приложение, как маленькие, так и большие:

//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 упоминает

Система не делает копию значка. Не разрушайте иконку перед разрушением окна

2

Другие решения

Это общая ошибка Windows. Диспетчер задач и проводник запоминают значки, связанные с файлами, очень долго. Если ваш значок имеет наименьший идентификатор в exe, он должен отображаться как значок приложения в диспетчере задач (корневой узел). Но если вы изменили его недавно, это может не сработать. Значок самого окна — это совсем другое — если он не отображается, ваш код неверен.

1

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);
0
По вопросам рекламы [email protected]