Значки, размер шрифта и ярлыки приложения Windows 7 на панели задач

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

  • В Windows 7 установлено значение font-size = 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 с множеством значков разных размеров - возможно, это улучшит ситуацию, но это утомительное решение!

Любые идеи?


person Andrew Wyatt    schedule 21.04.2010    source источник
comment
что Вы имеете в виду, говоря, что A.exe имеет ярлык, связанный с ним; B.exe этого не делает. Что здесь означает связанный ярлык ?? ...   -  person TheCodeArtist    schedule 21.04.2010
comment
После того, как я создал исполняемый файл A.exe, я перешел к папке, содержащей A.exe, с помощью проводника Windows, щелкнул A.exe, чтобы выбрать его, щелкнул правой кнопкой мыши и выбрал опцию «Создать ярлык».   -  person Andrew Wyatt    schedule 21.04.2010
comment
Вы уверены, что A.exe и B.exe идентичны? В частности, есть ли в A.exe манифест, в котором указано dpiAware = true?   -  person Eric Brown    schedule 28.07.2010
comment
Изначальная проблема была в рабочих приложениях. Однако, чтобы проверить, что происходит, мы создали A.exe и B.exe, которые были двумя отдельными диалоговыми приложениями MFC в Visual Studio 2008. Мы, вероятно, использовали значения по умолчанию для проекта и создали два приложения без изменений, за исключением того, что я обеспечил ресурс .ico был одним и тем же значком в обоих проектах. Я не сталкивался с настройкой манифеста dpiAware - я проверю это и посмотрю, как это влияет на эту проблему.   -  person Andrew Wyatt    schedule 30.07.2010


Ответы (1)


Просто встретил эту проблему со следующим простым сценарием (все на 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);
}
person XuJD    schedule 11.12.2014