wcb2@cornell.edu Ответов: 3

Изменить значок, отображаемый на панели задач во время выполнения


У меня есть приложение Windows 7, где мне нужно изменить значок, отображаемый в основной форме, и значок, отображаемый Windows на панели задач во время выполнения.

В коде я просто меняю форму.Icon property и это работает без проблем, если я запускаю приложение из EXE-файла. Значок меняется в форме и на панели задач без проблем.

Однако если я запускаю приложение с ярлыка на рабочем столе, значок меняется только в основной форме, а значок, отображаемый на панели задач, никогда не меняется. По-видимому, Windows загружает значок панели задач из кэша. Единственные предложения, которые я могу найти о том, как обновить кэшированный значок панели задач, - это удалить iconcache, а затем перезапустить windows. Это решение, очевидно, не будет работать для изменения значка во время выполнения.

Кто-нибудь знает, как изменить значок панели задач во время выполнения для приложения, запущенного с помощью ярлыка на рабочем столе??? Я предполагаю, что есть некоторые функции api, которые будут работать, но я не могу понять это.

Sergey Alexandrovich Kryukov

Кто-то уже задавал подобный вопрос недавно, во время развертывания. Никто не объяснил мне: почему? Теперь, почему во время выполнения?
—СА

wcb2@cornell.edu

Приложение, которое я создаю, позволяет пользователю переключать "учетные записи" во время выполнения. При переключении учетной записи значок, отображаемый на панели задач, должен измениться, чтобы дать пользователю визуальное указание (на панели задач), какая учетная запись выбрана в запущенном приложении.

Sergey Alexandrovich Kryukov

- Ответил я. Я бы посоветовал изменить только значок окна (или, гораздо лучше, только часть значка: пользователь должен предоставить значок с прозрачностью, и вы можете наложить его в качестве переднего плана с неизмененным фоном). Я не думаю, что изменение значка приложения имело бы смысл; и это невозможно; я попытался объяснить, почему.
—СА

wcb2@cornell.edu

Почему он будет работать нормально, если нет ярлыка, нацеленного на EXE-файл? Это становится проблемой только после создания ярлыка для EXE-файла.

Sergey Alexandrovich Kryukov

Кстати, если вы хотите разрешить несколько экземпляров приложения, окно 7 будет отображаться красиво, под общим значком приложения. Когда вы наводите на него курсор мыши, вы получаете отдельные основные окна размером с миниатюру, с их (разными) значками формы. Разве это не лучшая идея?
—СА

3 Ответов

Рейтинг:
26

wcb2@cornell.edu

Я подумал об очень легком обходном пути, который мог бы сработать для других. Моя основная проблема была связана с тем, как Windows кэширует значки ярлыков приложений. Это мешало мне изменить значок панели задач во время выполнения. Что, безусловно, возможно. Поэтому вместо того, чтобы иметь ярлык запуска, указывающий непосредственно на exe-файл основного приложения, я указываю ярлык на приложение запуска, которое раскрывается в основном приложении. Таким образом, главное приложение exe никогда не запускается из ярлыка. Таким образом, значок на панели задач может быть изменен во время выполнения. Это очень хорошо работает для меня.


D3athRace

Можете ли вы представить пример того, как вы это сделали? Это было бы очень кстати.

Luc Pattyn

К вашему сведению: недавно я узнал, что Windows 10 делает это по-другому: значок панели задач не зависит от значка приложения, а соответствует значку в текущей активной форме.

Рейтинг:
2

Member 14621376

Приложение не будет показывать Вам панель задач во время выполнения, пока у вас нет никаких ярлыков для нее.
Если вы избавитесь от всех ярлыков и запустите его из папки Runtime, он будет работать нормально...
Но это не то, что нам нужно.

никто нигде не предусмотрел решения какой... какой позор....


Richard Deeming

Этот вопрос был решен семь лет назад. Ваша жалоба на то, что решение не исправило другой вопрос, не является "решением" этого уже решенного вопроса.

Рейтинг:
1

Sergey Alexandrovich Kryukov

Пожалуйста, смотрите мой комментарий к этому вопросу. Почему?

А теперь несколько заметок. Значок формы-это совсем другое дело, вы действительно можете легко изменить его во время выполнения. Это может даже иметь некоторый смысл (другой режим работы, другая часть функциональности). Значок, показанный на панели задач, - это совсем другое дело, он называется значок приложения. Поскольку ОС использует его, он должен храниться в PE-модуле (файле) каким-то универсальным способом, не специфичным для .NET. Значок приложения на самом деле является встроенным приложением манифест. Для сборки это хранится в файле модуль, тот, кто держит манифест приложения для сборки. (Visual Studio поддерживает только создание сборок с одним модулем на сборку, но компиляция на более низком уровне позволит вам иметь более одного модуля на сборку, но только один из них будет содержать манифест; он называется "основной модуль сборки".)

MSBuild использует файл значков в этом случае этап построения: http://msdn.microsoft.com/en-us/library/microsoft.build.tasks.generateapplicationmanifest.aspx[^].

Тем не менее, в отличие от значка формы, этот значок доступен только для чтения И, как вы должны знать, исполняемый модуль, загруженный для выполнения, не может быть изменен, независимо от того, насколько высоки ваши разрешения. Это важная функция защиты большинства современных ОС.

И даже если бы вы могли каким-то образом изменить этот значок (нет, я не думаю, что это возможно), это разрушило бы их цель. Элементы управления ОС полагаются на этот значок, чтобы сохранить ваше приложение хорошо узнаваемым; он не будет получать никаких уведомлений, Если вы можете изменить его, потому что это не так, как все устроено.

—СА


wcb2@cornell.edu

То, что я пытаюсь сделать, работает просто отлично, когда нет ярлыка для EXE-файла. Как только создается ярлык, предназначенный для EXE-файла, значок панели задач перестает обновляться во время выполнения. Я бы предпочел не вступать в философские дебаты о том, почему я не должен пытаться сделать это. Вместо этого я просто хотел бы знать, сделал ли кто-нибудь это успешно. И если да, то как. Спасибо!

Sergey Alexandrovich Kryukov

Это не будет "сделано успешно", я попытался объяснить, почему. И никто с тобой не спорит, с чего бы это мне? Вы принимаете ответ формально (зеленая кнопка) или нет?
—СА

wcb2@cornell.edu

Вы не предоставили решения. Скорее вы предлагаете альтернативы. Поэтому я бы не стал считать ваш ответ "решением".

В этом пункте я не согласен с тем, что это невозможно. Поэтому я продолжу пытаться разобраться в этом. Спасибо.

Sergey Alexandrovich Kryukov

Что вы хотите, если решение невозможно? И альтернатива-это не "просто".
Конечно, это полностью зависит от вас. Особенно если вы не согласны. Я все еще не понимаю, что заставляет вас думать, что это возможно. Не могли бы вы объяснить?
—СА

wcb2@cornell.edu

Если то, о чем я спрашиваю, невозможно, пожалуйста, объясните, почему это работает просто отлично, если я запускаю приложение, запустив EXE непосредственно. Приложение делает именно то, что я хочу, и значок меняется во время выполнения на панели задач! Это становится проблемой только после создания ярлыка для EXE-файла.

Sergey Alexandrovich Kryukov

Извините, я не понимаю. Что именно "работает просто отлично"? Не могли бы вы описать его? Когда значок изменяется и действительно ли это значок приложения, а не значок формы? Есть ли у вас отчетливо различающиеся значки: приложение и форма? Конечно, если я ошибаюсь, то с радостью признаю это, но мне нужны доказательства.
—СА

wcb2@cornell.edu

Это значок формы mdi. Это значок, который windows отображает на панели задач во время работы приложения. Когда я говорю это, "работает просто отлично". Я имею в виду именно это. Я могу изменить значок, который windows отображает на панели задач во время выполнения. Да, это совершенно разные файлы значков. Значок изменяется, когда пользователь меняет учетные записи через:

Me.Icon = Новая Система.Рисование.Значок(Приложение.StartupPath & "\Images\" & myIconFileNames(2%))

Sergey Alexandrovich Kryukov

Я уже говорил вам, что значки форм могут быть изменены. Не могли бы вы прочитать его еще раз? Однако на панели задач значок приложения отображается сверху. Все ваши "разногласия" исчезли. Но тогда я не вижу в этом проблемы.

И если вы даже используете MDI, и потому что вы, по-видимому, не принимаете никаких советов, вам не о чем говорить; это просто несерьезно.

Желаю вам всего наилучшего,
—СА

X7Rider

Я столкнулся с той же проблемой. Мне нужно изменить значок панели задач во время выполнения (одна единственная форма с возможностью выбора разных значков). Он работает, когда я запускаю exe - файл релизной версии. И он не работает, если я запускаю его из ярлыка (или запускаю отладочный exe-файл).

Sergey Alexandrovich Kryukov

Это решается по-другому. Вы должны иметь два или более значков в ресурсах и заменить их в управлении. Довольно легкий. Вы понимаете, в чем дело?
—СА