これは実際に行うことができます(つまり、更新中にClickOnceが実行可能ファイルのパスを変更した場合でも、Windows 7に通知アイコンを同じものとして認識させることができます)。それは非常に厄介であり、以下の基準のすべてが厳密な精度で満たされている必要があります。
- 開発マシンでGUIDを生成し、Shell_NotifyIconを呼び出すたびにそのGUIDにguidItemメンバーを設定します。アプリのリリースバージョン間でも、常に同じGUIDである必要があります(ここでのポイントです)。
- Shell_NotifyIconを呼び出すたびにNIF_GUIDフラグを設定します。
- ターゲットマシン(つまり、実際のマシン)で信頼されるAuthenticode証明書を使用してアセンブリにデジタル署名します。
パスに関係なく設定が保存されていない場合-または-Shell_NotifyIconがfalseをスローし始めます。これは、次のいずれかを意味します。
- 構造体のguidItemメンバーを適切に設定していない、またはNIF_GUIDフラグを設定していない、コード内のどこかでShell_NotifyIconを少なくとも1回呼び出しています。
- 実行可能なバイナリに実際に署名していません。Visual Studioを使用してこれを行う場合、構成の問題が原因で署名が失敗したときに通知しないのは非常に悪いことです。Windowsエクスプローラーでファイルのプロパティを確認し、署名証明書を表示するタブが表示されることを確認します。
- 証明書はターゲットマシンで信頼されていません。
ある時点で混乱し、Shell_NotifyIconがfalseを返し始め、停止していないように見える場合は、新しいGUIDを生成して、プロセスを最初からやり直してください。
また、注:GUIDを使用した通知アイコンに関して何かをしようとするときは、OSのバージョンをチェックしてWindows7以降を使用していることを確認してください。WindowsVista以下はおかしくなります。
例:
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;
}