まず、インストール プロセスがそのように動作する必要がある理由を教えてくれません。それは奇妙だと思いますが、そのようにするのには十分な理由があると思います。そうでない場合は、個々の問題に応急処置を施すのではなく、そこから始めてインストーラーを修正することをお勧めします。後で他の問題に遭遇することは避けられませんが、根本的な修正は、一連のバンドエイドよりもはるかに単純で保守が容易になるはずです.
とにかく、もしあなたがこの道をたどらなければならないWM_SETTINGCHANGE
としたら...メッセージのブロードキャストが機能しない理由は、これがアイコンとは何の関係もないからです。これらは Explorer によって個別に管理され、アイコン キャッシュを削除しない限り再構築されません。それは当然、それを再構築するように促します。これは、エンド ユーザーにとって一般的なトラブルシューティング手法ですが、プログラムで実行したいものではありません。醜いハックについて話してください。そして、ローカルの問題を解決するためにグローバルな状態を変更します。
さらに、OS の再起動が機能しない場合は、質問で聞こえるほど単純ではないことがわかります。更新が必要なプロパティです。既存のインストールの上に再インストールすることが機能する理由は、最初にショートカットが作成されたときに、そのターゲット実行可能ファイルが有効なアイコンを持つ予想される場所 (以前のインストールによってそこに配置された場所) に既に存在するためです。
私がお勧めするのは、既存のショートカットのアイコンを変更するコードを書くことです。実行可能ファイルを最終的な宛先にコピーした後、必ず実行してください。これを可能にするメソッドはIShellLink::SetIconLocation
、アイコンへのパス (これは実行可能ファイルへのパスになります) とアイコンのインデックス (これはおそらく 0 で、必要なアイコンが実行可能ファイルに含まれる最初で唯一のものです)。
もちろん、 を呼び出すSetIconLocation
には、 を実装するショートカットを表すオブジェクトを取得する必要がありますIShellLink
。これは COM インターフェイスであり、.NET Framework によってラップされているとは思えません。C# からのショートカットの作成に関する一般的な情報は、この質問への回答にあります。より具体的には、このラッパー クラスへのリンクがあり、これを使用してほとんどの面倒な作業を行うことができます。アイコンを設定/変更する方法は含まれていないと思いますが、簡単に追加できます。
または、Windows Scripting Host (WSH) ラッパーを使用して、これらの同じプロパティを取得できますWshShortcut
。これにはIconLocation
、コンマでパスからインデックスが区切られた単一の文字列引数のみを受け取ることを除いて、ほぼ同じように機能するプロパティがあります: myApp.exe, 0
. 特に十分に文書化されているわけではありませんが (私が見つけた限り)、既存のショートカットを取得するには、CreateShortcut
メソッドを使用して既存のショートカットへのパスを指定するだけです。例えば:
public void SetShortcutIcon(string shortcutPath, string iconPath, int iconIndex)
{
// Note: no error checking is performed for the parameters!
// This is not production-ready code!
// If a shortcut does not exist at the specified path, you should
// create a new one instead.
// If iconPath does not specify a valid executable file, you should
// set a default icon or perhaps abort.
IWshRuntimeLibrary.WshShell wsh = new IWshRuntimeLibrary.WshShell();
IWshRuntimeLibrary.IWshShortcut shortcut = wsh.CreateShortcut(shortcutPath);
shortcut.IconLocation = String.Format("{0}, {1}", iconPath, iconIndex);
shortcut.Save();
}
上記のコードをコンパイルするには、Windows スクリプト ホスト オブジェクト モデルへの参照もアプリケーションに追加する必要があることに注意してください。これを行うには、ソリューション エクスプローラーで [参照] フォルダーを右クリックし、[COM] タブをクリックして、一覧から [Windows スクリプト ホスト オブジェクト モデル] を見つけます。
これをテストしたところ、動作します。効果は瞬時です。