- PR -

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

投稿者投稿内容
かすみ
会議室デビュー日: 2004/09/02
投稿数: 16
投稿日時: 2004-12-28 19:39
かすみです。

Windowsフォームのタイトルバーのアイコンに、
csprojのプロパティで指定しているアイコンを
表示させたいと思っています。
ただし、アプリケーション側で指定するのではなく
アプリケーションが参照するDLL側で
タイトルバーのアイコンを指定させたいのです。

そこで質問なのですが、DLLを参照しているアプリケーション側に
指定しているアプリケーションアイコンファイルをDLL側で、
Windowsフォームのタイトルバーのアイコンに表示するには
どのようにしたらよいのでしょうか?

質問が下手かもしれませんが、わかる方がいらっしゃいましたら
よろしくお願いします。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-12-28 22:40
引用:

Windowsフォームのタイトルバーのアイコンに、
csprojのプロパティで指定しているアイコンを
表示させたいと思っています。





引用:

ただし、アプリケーション側で指定するのではなく
アプリケーションが参照するDLL側で
タイトルバーのアイコンを指定させたいのです。



って、相反することを言ってませんか?

要するにやりたいことは

引用:

そこで質問なのですが、DLLを参照しているアプリケーション側に
指定しているアプリケーションアイコンファイルをDLL側で、
Windowsフォームのタイトルバーのアイコンに表示するには
どのようにしたらよいのでしょうか?



だとして、コードで実現するのはそれほど難しくないはずです。

大まかには

・DLL に、アイコンを取得する関数かクラスメソッドを実装する。
・フォームの Load イベントで↑を呼び出し、Icon プロパティに設定する。

という手順でできるんじゃないでしょうか。


_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://www.hidori.jp/
// Microsoft MVP for Visual C#

# Visual Studio2005 の全エディションに UnitTest 機能を!投票募集中↓
# http://lab.msdn.microsoft.com/ProductFeedback/viewFeedback.aspx?feedbackId=FD

[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2004-12-29 15:35 ]
かすみ
会議室デビュー日: 2004/09/02
投稿数: 16
投稿日時: 2004-12-29 09:56
お返事ありがとうございます。

すいません。質問が下手でしたね。。。

アイコンを取得する関数かクラスメソッドの実装とありますが、
.NETFreamWorkには該当メソッドは存在しないのでしょうか?
ヘルプとGoogleで調べてみたのですが、上手くHITしなかったので。。。

Loadイベントは実装しています。
あとはアイコンが設定できれば完成・・・なんです。

Freamworkにないとしたら、アイコン情報はどのように
取得できるのでしょうか?(具体的なコードが見てみたいです)
何度も質問して申し訳ありませんが、よろしくお願いします。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-12-29 12:00
引用:

アイコンを取得する関数かクラスメソッドの実装とありますが、
.NETFreamWorkには該当メソッドは存在しないのでしょうか?



「どこに」「どうやって」アイコンが格納されているのか分からないと回答は難しいです。
dll の中に、リソースとして取り込んであるんですか?

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
かすみ
会議室デビュー日: 2004/09/02
投稿数: 16
投稿日時: 2004-12-29 13:52
アイコンは、アプリケーション側のcsprojのプロパティ内の
アプリケーションアイコンで指定された位置に格納しています。
つまりアプリケーションによって、「どこに」は変わります。
「どうやって」は・・・.icoファイルとして、フォルダ内に保存してあります。
dllのリソースではないです。
回答になっていますでしょうか?

先ほど、とあるページで見つけたソースコードがあり、それで
動作上は問題なしで動いていたのですが、アンマネージドコードなので
コード規約に反するということで、まだ調べています。

とりあえず、動作しているソースコードを下記に記します。

-------------------------------------------------------------------------------
[DllImport( "shell32.dll", EntryPoint = "ExtractAssociatedIcon" )]
private extern static IntPtr ExtractAssociatedIcon
(
IntPtr hInst,
[MarshalAs(UnmanagedType.LPStr)] string lpIconPath,
ref int lpiIcon
);

private void LoadViewState() {
Assembly assembly;
assembly = Assembly.GetEntryAssembly();
string iconPath = assembly.Location;
IntPtr hInst = Marshal.GetHINSTANCE(
Assembly.GetExecutingAssembly().GetModules()[0] );
Int32 iIcon = 0;
IntPtr hIcon;

// ファイルに関連付けられたアイコンのハンドルを取得する
hIcon = ExtractAssociatedIcon( hInst, iconPath, ref iIcon );

// アイコンハンドルからIconオブジェクトを作成する
this.Icon = Icon.FromHandle( hIcon );

--------------------------------------------------------------------------------
上記はdll内のソースです。
LoadViewStateは、dll内のWindowsフォームをロードする際の関数です。

dll内から、アプリケーションのアセンブリを取得して、アイコンのハンドルを
取得するという方法のようですが、まだ完全には把握していません。。。

ExtractAssociatedIcon()がSDKのメソッドなので、
.NETFreamworkでは、どのようにして、アイコン情報が
取得できるのか、が問題として残っておりますが、
何か方法はご存知でしょうか?
かすみ
会議室デビュー日: 2004/09/02
投稿数: 16
投稿日時: 2004-12-29 14:47
追記でわかったことと、質問です。

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

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

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

わかるかたおられましたら、よろしくお願いします。
かすみ
会議室デビュー日: 2004/09/02
投稿数: 16
投稿日時: 2004-12-29 15:08
自分への返答。。。
アイコン名だけでは、リソース埋め込みではないので取れないようでした。
失礼しました。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-12-29 15:40
引用:

アイコンは、アプリケーション側のcsprojのプロパティ内の
アプリケーションアイコンで指定された位置に格納しています。
つまりアプリケーションによって、「どこに」は変わります。
「どうやって」は・・・.icoファイルとして、フォルダ内に保存してあります。
dllのリソースではないです。
回答になっていますでしょうか?



それはビルド時の話ですよね?

第3者にアプリケーションを配布した時などに、どうやって .ico ファイルの置いてある位置を検出するつもりでしょうか?(あなたが決めることです)

.exe と同じフォルダですか?

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/

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