Сохранение настроек видимости пользователя в приложении панели задач в Windows 7 - PullRequest
2 голосов
/ 21 марта 2011

У меня есть приложение, которое разворачивается через ClickOnce на общий сетевой ресурс. У меня установлен режим установки только онлайн. Приложение запускается в системном трее. В Windows 7, когда программа запускается впервые, она будет отображаться в расширенном системном трее (тот, где вы должны сначала нажать на стрелки, чтобы добраться до элемента). Проблема заключается в том, что когда пользователь устанавливает свои предпочтения так, чтобы приложение отображалось в главном трее, они теряются, когда я публикую обновление. Тогда мое приложение будет отображаться дважды в настройках (один раз для старой версии, в которой он установлен для отображения в главном лотке, а другой - для новой версии, которая не настроена для отображения в главном лотке. Как получить ее? работать так, чтобы им нужно было только один раз установить свои предпочтения, чтобы он показывался?

Здесь есть похожий вопрос: http://social.msdn.microsoft.com/Forums/en-US/winformssetup/thread/c33ab558-7fd5-4330-a985-9702358472d0/

Ответы [ 2 ]

2 голосов
/ 15 сентября 2012

Это на самом деле можно сделать (т.е. вы можете заставить 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;
}
0 голосов
/ 29 марта 2011

Раньше у нас было уведомление для нашего приложения.Наша проблема заключалась в том, что он не показывался, пока пользователь не установил все уведомления, чтобы они отображались постоянно.Если пользователь некоторое время не запускал приложение, а затем запускал его, оно больше не отображалось, пока не использовало его несколько раз.

Я не знаю, как обойти это.Мы закончили с этим по какой-то причине, а также по некоторым деловым причинам.

...