Значки панели задач приложения Windows 7, размер шрифта и ярлыки - PullRequest
2 голосов
/ 21 апреля 2010

Мы столкнулись с некоторым поведением, связанным с иконками на панели задач, которые Windows 7 отображает для различных приложений. Мне интересно, может ли кто-нибудь пролить свет на это:

  • В Windows 7 установлен размер шрифта = 110%.
  • В двух диалоговых приложениях MFC A.exe и B.exe встроен один и тот же ресурс .ico.
  • A.exe имеет ярлык, связанный с ним; B.exe нет.
  • Запуск A.exe показывает красивый интерполированный значок на панели задач.
  • При запуске B.exe на панели задач отображается другой значок (не интерполированный).

Мы бы хотели, чтобы на панели задач появлялся один и тот же значок для A.exe и B.exe - этого легко добиться, если бы ярлык для B.exe был похожим, чтобы выполнить то же поведение. Тем не менее, я действительно пытаюсь понять больше о том, что происходит.

Пытаясь понять, что происходит, я обработал сообщение WM_GETICON внутри B.exe, возвращая значок в соответствии с размерами, заданными размером GetSystemMetrics SM_CXICON / SM_CYICON или SM_CXSMALLICON / SM_CYSMALLICON. Однако это, похоже, не повлияло на значок, отображаемый на панели задач.

Я также знаю, что мы могли бы создать .ico-файл для встраивания в B.exe с множеством иконок разного размера - возможно, это улучшит ситуацию, но это утомительное решение!

Есть идеи?

1 Ответ

0 голосов
/ 11 декабря 2014

Только что встретил эту проблему по следующему простому сценарию (все на win7):

  1. создать A.exe со значком B
  2. создать B.lnk, связанный с A.exe с другим значком C (от winapi CreateLink)
  3. запустить с нажатием B.lnk. На некоторых машинах win7 значок панели задач - C. Но на некоторых других машинах (также win7) это B.

Если значок C, его даже нельзя изменить следующим кодом:

const HANDLE bigicon = ::LoadImage(::GetModuleHandle(0), MAKEINTRESOURCE(IDI_TO_ICON), IMAGE_ICON, 256, 256, 0);
if (bigicon) {
    ::SendMessage(theMainWnd, WM_SETICON, ICON_BIG, (LPARAM)bigicon);
    ::SendMessage(GetWindow(theMainWnd, GW_OWNER), WM_SETICON, ICON_BIG, (LPARAM)bigicon);
}
const HANDLE smallicon = ::LoadImage(::GetModuleHandle(0), MAKEINTRESOURCE(IDI_TO_ICON_SMALL), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);
if (smallicon) {
    ::SendMessage(theMainWnd, WM_SETICON, ICON_SMALL, (LPARAM)smallicon);
    ::SendMessage(GetWindow(theMainWnd, GW_OWNER), WM_SETICON, ICON_SMALL, (LPARAM)smallicon);
}
...