Это на самом деле можно сделать (т.е. вы можете заставить Windows 7 распознавать значок уведомления как тот же, даже если ClickOnce изменил путь к вашему исполняемому файлу во время обновления).Это просто очень привередливо и требует, чтобы каждый из приведенных ниже критериев был выполнен с высокой точностью:
- Создайте GUID на своем компьютере разработчика и присвойте ему член guidItem при каждом вызове Shell_NotifyIcon.Это всегда должен быть один и тот же GUID, даже между версиями вашего приложения (в этом вся суть).
- Установите флаг NIF_GUID при каждом вызове Shell_NotifyIcon.
- Цифровая подпись сборки с помощьюСертификат Authenticode, который будет доверенным на целевом компьютере (т. Е. На реальном).
Если настройки не сохраняются независимо от пути, -OR- Shell_NotifyIcon начинает выдавать вам ложные значения, это означает, чтоЛибо:
- Вы делаете по крайней мере один вызов Shell_NotifyIcon где-то в вашем коде, который не устанавливает член guidItem в структуре соответствующим образом или не устанавливает флаг NIF_GUID.
- Вы действительно не подписывали исполняемый двоичный файл.Если вы используете Visual Studio для этого, очень плохо не сообщать вам, когда подписи не работают из-за проблем с конфигурацией.Проверьте свойства файла в проводнике Windows и убедитесь, что вы можете перейти на вкладку, где отображается сертификат подписи.
- Ваш сертификат не является доверенным на целевом компьютере.
Если в какой-то момент вы запутались, и Shell_NotifyIcon начинает возвращать false и, похоже, не останавливается, сгенерируйте новый GUID, чтобы начать процесс заново.
Также Примечание. Проверьте версию ОС, чтобы убедиться, что вы 'на Windows 7 или выше, когда вы пытаетесь сделать что-нибудь, касающееся значка уведомления с GUID.Windows Vista и ниже выйдет из себя.
Пример:
var os = Environment.OSVersion.Version;
if (os.Major > 6 || (os.Major == 6 && os.Minor >= 6))
{
lpData.guidItem = Guid.Parse("Your Own Guid Here");
lpData.uFlags |= FlagEnum.NIF_GUID;
}