DOBON.NET DOBON.NETプログラミング掲示板過去ログ

インストール時のアイコンの更新

環境/言語:[Windows Vista Ultimate Visual Studio 2005 NET Framework2.0]
分類:[.NET]

お世話になります。

Visual Studio 2008にてVBによるアプリを作成し、インストーラも作成しました。
カスタム動作で拡張子登録とアイコンの登録を行いました。
テストインストールではレジストリ記述も正常でした。

このままでも問題ないのですが、一点不満がありましてご質問させていただきます。

インストール後に、登録拡張子のファイルアイコンを更新(再描画)したいのですが、
どのように記述すればよろしいでしょうか?
いろいろと探してみたのですがわかりませんでした。
Refresh等のようなコマンドになるように思いますが、教えていただけますと幸いです。

アプリインストール前に登録予定拡張子のファイルがある場合、真っ白のアイコンです。
そして、アプリインストールで、拡張子、アイコン登録を行ったと同時にこの真っ白アイコンを登録アイコンに再描画したいです。
また登録拡張子、アイコンの削除(アンインストール)時にはまたこのアイコンを真っ白アイコンになるようにしたいです。

よろしくお願いいたします。
■No22080に返信(たかしさんの記事)
> インストール後に、登録拡張子のファイルアイコンを更新(再描画)したいのですが、
> どのように記述すればよろしいでしょうか?
> いろいろと探してみたのですがわかりませんでした。
> Refresh等のようなコマンドになるように思いますが、教えていただけますと幸いです。

いまいち質問が意図がつかめてないですが
デスクトップ画面の何もないところでF5キーを押して直るなら
デスクトップ画面に対して、再描画でしょうかね
Refresh、Update、Invalidateメソッドの違い
http://dobon.net/vb/dotnet/control/all.html
やじゅさん
コメントありがとうございます。
私事でいろいろとあり、お返事遅くなりました。
すみません。

表現がいまいち分かりづらくすみません。
いま再度調べたところ
ソフトのインストール時に拡張子とアイコンをレジストリに登録した後に
システムに変更を通知することをすれば即座に変更が反映されるようです。
これをVBで記述する方法がみあたらないです。
C++での記述は見つかったのですがこれをそのまま書いても無理で、あるいはそれに相当するVBでの記述方法がわかりませんでした。

ソフトをインストール後にF5キーを押下しても反映されません。

よく、市販のソフトウエアをインストールするとインストールの最後で画面が再描画されアイコンが再構築されます。
アイコンの再構築を手動で行う方法はありますがこれだと一端ログオフしないといけないようですが、市販アプリをインストールした時はログオフしなくても反映されます。
その方法が分からず困っております。

よろしくお願いいたします。
> C++での記述は見つかったのですがこれをそのまま書いても無理で、あるいはそれに相当するVBでの記述方法がわかりませんでした。
見つけられたのであれば、それを示して頂けると回答しやすいのではないのでしょうか。

恐らく、.NET Frameworkだけでは実現できないのではないかと推測されますので、API等を頼ることになるとみられます。
Googleで「拡張子 レジストリ 更新 通知」で検索。

http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/870_RegistEx.t.htm

Googleで「SHCNE_ASSOCCHANGED VB.NET」で言語を限定せずに検索。

http://www.xtremedotnettalk.com/showthread.php?t=97929

英語ですが、十分な内容かと思います。
■No22080に返信(たかしさんの記事)

ここにはいつも流し読みなので見落としてました。

えっと、「拡張子関連付け」を行いたいのですよね?
ソリューションエクスプローラでセットアッププロジェクトを選択し
ファイルの種類ビューを出せばそこで設定できますが
それではだめなのでしょうか?

こちらなら、F1キーを押せばそれなりではあるもののヘルプも出てきますよ。
Azuleanさん

ありがとうございます。

正直まだプログラミングは理解していないところが多いのですが
何とかできました。

クラスライブラリのPublic Overrides Sub Install〜に
Call SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0)
を記述し、モジュールに
Public Declare Sub SHChangeNotify Lib "shell32.dll" (ByVal wEventsID As Integer, ByVal uFlags As Integer, ByVal dwItem1 As Integer, ByVal dwItem2 As Integer)と定数を設定。

このdllファイルを作成アプリケーションのセットアッププロジェクトのカスタム動作に追加しました。

これをリビルドして、インストールを試したところ
見事、インストール直後にアイコンが更新されました。

アンインストール時にも
Call SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0)
を呼び出し、白紙アイコンに戻すことができました。

市販アプリのようなインストール動作になりかなりうれしいです。

どうもありがとうございました。

とっちゃんさん

コメントありがとうございます。
いま私がこのコメントを作成中にコメントを頂いたのですが、コメントの機能をちらっと見てみました。いままであまり気にしていなかったのですが、作成アプリと既存拡張子の関連付けができるようですね?
新規拡張子作成やその新規拡張子にたいするアイコンの登録もできるのでしょうか?
私も調べてみます。

今回の私の件ですが、システムにオリジナルの拡張子を追加(レジストリ書き込み)してそれに対する自作アイコンを関連付けする動作をインストーラに組み込みました。そしてこの一連の動作をインストール直後にシステムに知らせる(更新する)ためのプログラム(拡張子が追加されたよ。アイコンが登録されたよと)を新たに追加する件でどのようにすれば良いのか分からず行き詰まっておりました。
この更新通知により、インストール直後アイコンがすぐに変更されるようになります。
またアンインストール時にはオリジナル拡張子はシステムから削除されアイコン登録も削除されます。そして削除されてしまった拡張子のアイコンがデスクトップやフォルダ内にあればそれは真っ白のアイコンに切り替わります。

この「ファイルの種類」で「システムに更新の通知」までできてしまうのでしょうか?
だとしたらビックリです。
Visual Studio 2008もまだまだ便利な機能がたくさんあるんですね。
まだまだ修行です!
解決済み!
■No22126に返信(たかしさんの記事)

> いま私がこのコメントを作成中にコメントを頂いたのですが、コメントの機能をちらっと見てみました。いままであまり気にしていなかったのですが、作成アプリと既存拡張子の関連付けができるようですね?
> 新規拡張子作成やその新規拡張子にたいするアイコンの登録もできるのでしょうか?
> 私も調べてみます。
>

できます。。。というかそのための仕組みです。

たとえば、自作アプリ用のデータファイルとして拡張子
.ABC のファイルを用意するとした場合
該当ビューで対象コンピュータでコンテキストメニューを出すと
ファイルの種類の追加というメニューが出ます。

それを選択すると、ProgId名の記述を要求されるので
それを記述します(プログラム的な識別子になります)。

後の設定はプロパティウィンドウを出して行いますが、
必要最低限の設定はできるはずですので、それで行けるかと。

インストール時には自動的にシステムに通知が行われますし
アンインストールすれば設定は自動的に消えます。

やりたいことだけ書けばいいだけなので、コーディングも必要ありません。
#アプリ自体の受け取り処理はいりますがw

他にも色々機能があるので、カスタム動作で実装は最後手段と思って
探してみることをお勧めします。
とっちゃんさん

ありがとうございます。

そうなんですか。。。。。
意外とこういった操作に関しての情報収集が難しいので、あきらめておりました。


Visual Studioのいままで使ってない機能なども今後は調べてみます。

本当にありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板