- PR -

アプリケーションアイコンを取得する方法

投稿者投稿内容
かすみ
会議室デビュー日: 2004/09/02
投稿数: 16
投稿日時: 2004-12-29 17:11
ビルド時の話です。

話の元が遅れましたが、.NETを拡張というか機能追加するDLLを
作成していますので、第3者はそのDLLを使用して.NETでの開発をします。
その.NETで開発されるもののアイコンは.NETのプロパティに
アイコン情報を任意で入力することになるので、
アイコンの場所は、第3者が決めることになりませんか?

この場合に第3者に配布するときに.icoファイルが必要なのでしょうか?
.EXEのアイコンと同じアイコンを使用することが前提ですので、
.EXEからアイコン(アプリケーションアイコン)の
情報を取得する方法を探しているのです。

説明下手で申し訳ありません。
かすみ
会議室デビュー日: 2004/09/02
投稿数: 16
投稿日時: 2004-12-29 17:57
とあるところのHPに、

「.NET Frameworkではアプリケーションのアイコンを
取得する手段が提供されていない 」

と書かれていたのですが、本当でしょうか?

そうすると、アンマネージコードで記述する以外に方法が
ないということになってしまうのですが・・・

知っておられる方がいらっしゃいましたら、できれば
MSの公式HPのリンクなどと一緒に教えていただけるとありがたいです。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-12-29 17:59
ごめんなさい、結局のところ何がしたいのかがよく分かりません。

引用:

話の元が遅れましたが、.NETを拡張というか機能追加するDLLを
作成していますので、第3者はそのDLLを使用して.NETでの開発をします。



機能追加する DLL とは何でしょう?
クラスライブラリのことでしょうか?

引用:

その.NETで開発されるもののアイコンは.NETのプロパティに
アイコン情報を任意で入力することになるので、
アイコンの場所は、第3者が決めることになりませんか?



それは DLL 開発者であり、EXE で開発者でないあなたとは関係の無い話ではないでしょうか?

DLL を使用する際に「この DLL を使用する EXE では、DLL 作成者の指定するアイコンを実行ファイルおよびメインフォームのアイコンとして使用すること」というルールを課したくて、その実現方法を探しているということなのでしょうか?

引用:

この場合に第3者に配布するときに.icoファイルが必要なのでしょうか?



場合によってはそれが一番簡単かもしれません。

引用:

.EXEのアイコンと同じアイコンを使用することが前提ですので、
.EXEからアイコン(アプリケーションアイコン)の
情報を取得する方法を探しているのです。



どこにあるアイコンを取得したいんでしょう?

あなたがおっしゃるように、第3者が .ico ファイルの置き場所を定めるなら、DLL 作成者のあなたがケアする問題ではないように思えるのですが。。。

.ico ファイルが提供されていて、そのパスが判明しているなら

Icon icon = new Icon (iconFilePathName);

で十分ですよね?

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2004-12-30 18:52
答えは知りませんが。

アプリケーション「A」がクラスライブラリ「B」を参照していて、
A側から、Bで定義されたFormを表示したときに、Aに関連付けられている
アプリケーションアイコンを、BのFormで表示したい
ということですよね?
どんなアプリケーションから参照されても呼び出し元のアイコンを表示したい、と。
かすみさんはBを作成していて、Aの実装方法は決められないのですよね?

複雑な問題なため理解するのに時間がかかりました。というか、こんなことできるとは
知らなかったのでこういう意味だとは思いもしませんでした。
が、実際に提示されたDllImportのコードを実装するとそうなりますね。

引用:
assembly = Assembly.GetExecutingAssembly();
this.Icon = new Icon(assembly.GetManifestResourceStream("アイコン名"));

で、アイコンの情報が取得できることがわかりました。

アプリケーション側で指定したアイコンの名前を、DLL側で取得できる
メソッドはあるのでしょうか?

埋め込まれてる場合はできるみたいですね。名前の取得はGetManifestResourceNames()
で調べる。下記サイトの一番下参照。
http://dobon.net/vb/dotnet/programing/bitmapresource.html

そもそも埋め込みとそうじゃない場合の違いがわかりません。埋め込みでない場合
(ビルドアクションを「埋め込まれたリソース」にしなかった場合)、確かに
GetManifestResourceNames() では取得できないですが、.icoファイルがなくても
.exeファイルのアイコンはExplorer上でちゃんと表示されますよね?

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=17349&forum=7
ここのスレッド、何かの参考になりますかね。

引用:
とあるところのHPに、

「.NET Frameworkではアプリケーションのアイコンを
取得する手段が提供されていない 」

と書かれていたのですが、本当でしょうか?

http://arton.no-ip.info/collabo/backyard/?HowtoInteractWin32API
これですかね?「直接的な方法がない」のはいまのところ本当っぽいですね。
出来るとしたらAssemblyからどうにかこうにか出来るのでしょうかね・・
ResourceManagerクラスも気にはなりました。

.NET 2.0になると
Icon icon = Icon.ExtractAssociatedIcon("exeファイルのパス")
なんていう、ずばりなメソッドで取得出来るみたいです。

[ メッセージ編集済み 編集者: べる 編集日時 2004-12-30 18:59 ]
かすみ
会議室デビュー日: 2004/09/02
投稿数: 16
投稿日時: 2005-01-05 18:13
ご返信ありがとうございます。

べるさんが要約していただいている通りです。
説明下手で申し訳ありません。
また、私が見たHPも同一のHPです。
引用:
--------------------------------------------------------------------------------
アプリケーション「A」がクラスライブラリ「B」を参照していて、
A側から、Bで定義されたFormを表示したときに、Aに関連付けられている
アプリケーションアイコンを、BのFormで表示したいということですよね?
どんなアプリケーションから参照されても呼び出し元のアイコンを表示したい、と。
かすみさんはBを作成していて、Aの実装方法は決められないのですよね?
--------------------------------------------------------------------------------
そうです。Aに関連付けられているアイコンをB側で取得?して
B側のFormの左上のアイコンにAのアイコンを表示したかったのです。
私が作成している側はBで、Aを作成する方の実装方法は
私には決められないのです。。

現在、.NETFreamwork1.1では直接は出来ない、という
結論で話が通っていきそうなので、深追いをこれ以上はしていません。

渋木さん、べるさん、稚拙な文章に親切に回答いただいてありがとうございました。
また、よろしくお願いいたします。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-01-05 19:55
引用:

そうです。Aに関連付けられているアイコンをB側で取得?して
B側のFormの左上のアイコンにAのアイコンを表示したかったのです。



Form A と Form B が親子関係にあるなら、Form B の Load イベントのハンドラで

this.Icon = ((Form) this.Parent).Icon;

とするのでは駄目ですか?

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
かすみ
会議室デビュー日: 2004/09/02
投稿数: 16
投稿日時: 2005-01-06 09:53
親子関係にはないので、無理でした。。。
(エラーになってしまいました。)

スキルアップ/キャリアアップ(JOB@IT)