C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[18]: ショートカットファイルのアイコン設定 [1]


(過去ログ 38 を表示中)

[トピック内 29 記事 (21 - 29 表示)]  << 0 | 1 >>

■19416 / inTopicNo.21)  Re[13]: ショートカットファイルのアイコン設定
  
□投稿者/ こみ (8回)-(2008/05/22(Thu) 20:33:20)
予想以上に難しい問題でしたね・・・。
ファイルインデックスを取ることは難しそうですね、
レジストリも見ていたんですが、*.slnの直下にはデフォルトアイコンはなく、色々たどっていかないと
たどり着けませんでした。
*.txtや*.wav、*.jpgなどもそうだった気がします。

素直に「ExtractAssociatedIcon」でも使ってアイコンをセーブした方が手っ取り早いでしょうが、
Vistaなどの「特大アイコン表示」が活かせない仕様になってしまいそうで・・・・、
引用返信 編集キー/
■19419 / inTopicNo.22)  Re[14]: ショートカットファイルのアイコン設定
□投稿者/ 魔界の仮面弁士 (743回)-(2008/05/22(Thu) 20:53:59)
No19416 (こみ さん) に返信
> レジストリも見ていたんですが、*.slnの直下にはデフォルトアイコンはなく、

HKEY_CLASSES_ROOT\.sln の規定値として書かれている文字を取得します。
たとえば、そこに "slnfile" と書かれていた場合は、HKEY_CLASSES_ROOT\slnfile を開きます。

その下に DefaultIcon キーがあれば良し。それをそのまま IconLocation プロパティに使えます。

DefaultIcon キーが無く、替わりに ShellEx\IconHandler キーがあるような場合には、
シェルエクステンションの実装次第なので、単純には行きません。

一応、IconHandler のキーにある GUID を元に
 HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\InprocServer32
をひも解くと、そこに書かれた DLL 内にあるアイコンリソースが使われている事が
多いのですが、どのアイコンインデックスが使われるのかは実装依存ですし、そもそも
アイコン自体を動的に作成するタイプの DLL の場合はお手上げです。

その場合はやはり、関連付けられているアイコンを保存して、それを参照させるしか無いかと…。
引用返信 編集キー/
■19422 / inTopicNo.23)  Re[14]: ショートカットファイルのアイコン設定
□投稿者/ こみ (9回)-(2008/05/22(Thu) 21:40:53)

> 一例でいいので、ショートカットとして作成したい具体的なことを箇条書きにしてみてはいかがでしょう。
> 技術的なことは抜きで構いません。
> まずはゴールを明確にしてみる必要があると思います。
>
> なので、作ったショートカット(どうつくるかはこの際関係なし)で何が実現できればいいのか
> そしてそれはどのように見せられればいいのか、をはっきりさせたほうが良いと思います。
>
> ゴールが見えれば、ピンポイントで答えが返ってくるかもしれませんよ。
>

伝わってませんでしたか・・・orz
失礼しました、がんばってまとめて見ます


外部ファイルのショートカットを作りたい!
条件
・ショートカットのターゲットは必ず「"固定パス自作アプリ.exe" "パラメータ"」
・ショートカットのアイコンは指定したファイルのアイコンと同じもの
希望結果
アイコンは普通なのに、実際実行してみると、「自作アプリ.exe」が起動してごちゃごちゃする

処理の流れ
起動した後、ファイル選択ダイアログを表示して、ファイルを一つ指定、
その後「ターゲットを"固定パス自作アプリ.exe" "パラメータ"」「アイコンは選択されたファイルのアイコン」で
ショートカットを作成して終了


これだけです、
指定されるファイルは決まっていません。

よろしくお願いいたしますm(_ _)m
引用返信 編集キー/
■19462 / inTopicNo.24)  Re[15]: ショートカットファイルのアイコン設定
□投稿者/ とっちゃん (303回)-(2008/05/23(Fri) 13:22:26)
とっちゃん さんの Web サイト
No19422 (こみ さん) に返信

> 外部ファイルのショートカットを作りたい!
> 条件
> ・ショートカットのターゲットは必ず「"固定パス自作アプリ.exe" "パラメータ"」
> ・ショートカットのアイコンは指定したファイルのアイコンと同じもの
> 希望結果
> アイコンは普通なのに、実際実行してみると、「自作アプリ.exe」が起動してごちゃごちゃする
>
> 処理の流れ
> 起動した後、ファイル選択ダイアログを表示して、ファイルを一つ指定、
> その後「ターゲットを"固定パス自作アプリ.exe" "パラメータ"」「アイコンは選択されたファイルのアイコン」で
> ショートカットを作成して終了
>
>
> これだけです、
> 指定されるファイルは決まっていません。
>
ターゲット部分については問題ないということでOKですかね?

問題なのは、アイコンをどうやって選択させるか?と
その選択させたアイコンをどう指定するか?
ということでいいですか?

ここは、一対で考える必要がある部分になると思いますが
まずはアイコンをセットするための方法を確定しておきたいところですね。

要するに、.IconLocation にどういう値をセットすれば意図したものになるか?
です。
#これで最初の部分に戻るはず。

さて、とりあえず今の時点で成功した風になっているのは
"C:\Windows\System32\regedit.exe" など、アイコンを持つファイルを
そのまま指定した場合ということでいいですかね。

本番に行く前に.txtのデフォルトあたりで試してみますか。
XP以降のOSであれば、.txt のデフォルト設定は
txtfileというProgIdになっています(ProgId=HKEY_CLASSES_ROOT\HogeType の HogeType にあたる部分のこと)。

このキーには、DefaultIcon が適度にいい感じで設定されていますのでこれを利用してみます。
XP ではこの値は
%SystemRoot%\system32\shell32.dll,-152
Vistaでは
%SystemRoot%\system32\imageres.dll,-102
となっており、いずれも、REG_EXPAND_SZ という型で保持されているはずです。
プログラム的には展開して取り出すわけですが、今は手作業でやるという前提で考慮して
%SystemRooT% は、そのまま、C:\Windows など Windows のインストール先に置き換えて文字列を用意してください。

これをそのまま、(,-102という部分も含め)指定してみてください。

うまくテキストファイルのアイコンになれば、WSHの.IconLocation での設定は "パス,数値" とDefaultIcon と
同じ形でセットできるということになります。
もし、これがだめだということになると、この方法(WSHでのショートカット作成)は使えないということになります。


まずは、ここまでを実験してみてください。

わからないところがあったら、素直にわからないと言ってくださいね。
言わないとわからないということがわからないですから。

文章見ればわかると思いますが、実際に実験して動くという確証を持ってやってませんのでその部分は
ご了承いただきたいと思います。

引用返信 編集キー/
■19495 / inTopicNo.25)  Re[16]: ショートカットファイルのアイコン設定
□投稿者/ こみ (10回)-(2008/05/23(Fri) 19:30:32)
No19462 (とっちゃん さん) に返信
> ■No19422 (こみ さん) に返信
> 
>>外部ファイルのショートカットを作りたい!
>>条件
>>・ショートカットのターゲットは必ず「"固定パス自作アプリ.exe" "パラメータ"」
>>・ショートカットのアイコンは指定したファイルのアイコンと同じもの
>>希望結果
>>アイコンは普通なのに、実際実行してみると、「自作アプリ.exe」が起動してごちゃごちゃする
>>
>>処理の流れ
>>起動した後、ファイル選択ダイアログを表示して、ファイルを一つ指定、
>>その後「ターゲットを"固定パス自作アプリ.exe" "パラメータ"」「アイコンは選択されたファイルのアイコン」で
>>ショートカットを作成して終了
>>
>>
>>これだけです、
>>指定されるファイルは決まっていません。
>>
> ターゲット部分については問題ないということでOKですかね?
> 
> 問題なのは、アイコンをどうやって選択させるか?と
> その選択させたアイコンをどう指定するか?
> ということでいいですか?
> 
> ここは、一対で考える必要がある部分になると思いますが
> まずはアイコンをセットするための方法を確定しておきたいところですね。
> 
> 要するに、.IconLocation にどういう値をセットすれば意図したものになるか?
> です。
> #これで最初の部分に戻るはず。
> 
> さて、とりあえず今の時点で成功した風になっているのは
> "C:\Windows\System32\regedit.exe" など、アイコンを持つファイルを
> そのまま指定した場合ということでいいですかね。
> 
> 本番に行く前に.txtのデフォルトあたりで試してみますか。
> XP以降のOSであれば、.txt のデフォルト設定は
> txtfileというProgIdになっています(ProgId=HKEY_CLASSES_ROOT\HogeType の HogeType にあたる部分のこと)。
> 
> このキーには、DefaultIcon が適度にいい感じで設定されていますのでこれを利用してみます。
> XP ではこの値は
> %SystemRoot%\system32\shell32.dll,-152
> Vistaでは
> %SystemRoot%\system32\imageres.dll,-102
> となっており、いずれも、REG_EXPAND_SZ という型で保持されているはずです。
> プログラム的には展開して取り出すわけですが、今は手作業でやるという前提で考慮して
> %SystemRooT% は、そのまま、C:\Windows など Windows のインストール先に置き換えて文字列を用意してください。
> 
> これをそのまま、(,-102という部分も含め)指定してみてください。
> 
> うまくテキストファイルのアイコンになれば、WSHの.IconLocation での設定は "パス,数値" とDefaultIcon と
> 同じ形でセットできるということになります。
> もし、これがだめだということになると、この方法(WSHでのショートカット作成)は使えないということになります。
> 
> 
> まずは、ここまでを実験してみてください。
> 
> わからないところがあったら、素直にわからないと言ってくださいね。
> 言わないとわからないということがわからないですから。
> 
> 文章見ればわかると思いますが、実際に実験して動くという確証を持ってやってませんのでその部分は
> ご了承いただきたいと思います。
> 

ありがとうございます!
確認したところアイコンファイルを「txtfile」から確認することができました!
指定方法は以下の通りです

        With oShortcut
            .IconLocation = "%SystemRoot%\system32\imageres.dll,-102"
            .TargetPath = System.IO.Path.Combine(Application.StartupPath, "てすと.exe") 'リンク元のファイル名
            .Save()
        End With

これでアイコンはテキストファイル・実行パスは「てすと.exe」と、成功しました。

しかしレジストリには問題の「slnfile」が存在していません。
まだ色々と存在するものとしないものもあるようです、
なにかしら辿っていかないと駄目なようですね・・・

引用返信 編集キー/
■19502 / inTopicNo.26)  Re[15]: ショートカットファイルのアイコン設定
□投稿者/ とっちゃん (304回)-(2008/05/23(Fri) 22:30:42)
とっちゃん さんの Web サイト
No19495 (こみ さん) に返信

> ありがとうございます!
> 確認したところアイコンファイルを「txtfile」から確認することができました!
> 指定方法は以下の通りです
>
> With oShortcut
> .IconLocation = "%SystemRoot%\system32\imageres.dll,-102"
> .TargetPath = System.IO.Path.Combine(Application.StartupPath, "てすと.exe") 'リンク元のファイル名
> .Save()
> End With
>
> これでアイコンはテキストファイル・実行パスは「てすと.exe」と、成功しました。
>
> しかしレジストリには問題の「slnfile」が存在していません。
> まだ色々と存在するものとしないものもあるようです、
> なにかしら辿っていかないと駄目なようですね・・・

OK。これで第一段階はクリアですね。

次は、アイコンの確定方法となりますね。

さてここからはちょっと難しい世界になります。
レジストリエディタも駆使していきますが、シェルの構造を知っていなければなりません。
どこまで知識があるかわからないのですが、直接的に調べる部分のみで概要部分は全部割愛します。
概要とかまで手を出すと、それこそ本一冊分くらいのボリュームに膨れ上がってしまいますので。

ということで調査方法と取り出し方です。

関連付けされたアイコンを取り出すためには、
1.HKEY_CLASSES_ROOT 直下から ".sln" など「.」を含む拡張子名のキーを開く。
2.そのキーのデフォルト値のキーを開く。
3.2のキーにDefaultIcon キーがあれば、そのキーのデフォルト値をアイコンとする(これが、.txtなどはこのパターン")
4.3のキーがない場合(%1の場合を含む)は、ShellEx\IconHandler キーがあるかを確認する。
5.4のキーがあったら、そのキーのデフォルト値をCLSIDとする、COMオブジェクトを精製する。
6.ShellExtension のIExtractIcon インターフェースを用いてアイコンを取得する。

となります。

4までは、レジストリエディタを見ながら調べられるので問題ないと思います。

問題は、5から後ですね。
この部分は、残念ながらWSHでは利用できないと思います。
なので、IUnknownから直接QueryInterfaceを利用できるプログラミング言語を利用して処理を覚悟しないとだめと思います。

一応、6 の部分の資料は
http://msdn.microsoft.com/en-us/library/cc144067(VS.85).aspx
からたどれるところとなります。
Icon handler という項目があるので、そこにIExtractIcon のことが書かれています(そこだけ見ても他に必要な前提知識があるのでわからないかもしれませんが)。

と、一応これが正式な部分。

以下は、かなりずるいやり方ですが、.sln の場合のみの対応方法。

レジストリエディタで、VisualStudio.Launcher._sln というキーとそこに並ぶキーの中を見てください。
DefaultIcon があるので、そこに各バージョンごとの数字の付いたアイコンのパスが出ています。

これと、No19409 で魔界の仮面弁士さんが書いているように、.sln ファイルの先頭行にあるバージョンを
解析すれば該当するアイコンを探すことができます。

ちなみに、??proj も同じやり方で対応できます(解析方法は違いますけどね)。

あとはファイルを調べてどこにバージョンがあるかや、どうやってファイルが正しいと認識するかを
いくつかのファイルで試してみれば、解析できると思いますよ。

IExtractIcon を使うのとどっちが楽か?は、わかりませんけど。

引用返信 編集キー/
■19508 / inTopicNo.27)  Re[16]: ショートカットファイルのアイコン設定
□投稿者/ こみ (11回)-(2008/05/23(Fri) 23:36:29)
ありがとうございます!
普通なら見つかりそうにない情報など、たくさん提供してくださった御かげでヤル気がでてきました!

5.がちょっと長期戦になりそうですが、やる気がなくなるまでがんばってみます。
(挫折したらNo.4で・・・^^)
長い間お世話になりました。

成功したらまた書き込みます。
では、5.で気張ってきます

今までありがとうございましたっ! m(_ _)m
解決済み
引用返信 編集キー/
■19545 / inTopicNo.28)  Re[17]: ショートカットファイルのアイコン設定
□投稿者/ こみ (12回)-(2008/05/25(Sun) 13:19:26)
ちょっと面白い方法ができたので投稿します。

Dim oShell As Object = CreateObject("WScript.Shell")
Dim oShortcut As Object = oShell.CreateShortcut("c:\Users\komi\Desktop\we.lnk") 'ショートカットのファイル名
With oShortcut
.IconLocation = ".pdf"
.TargetPath = System.IO.Path.Combine(Application.StartupPath, "Link\Test.exe") 'リンク元のファイル名
.Save()
End With

このように「.IconLocation = ".pdf"」とすることで拡張子*.pdfのアイコンに自動でセットされます、
この方法ならアイコンをセットした後にファイルの関連付けされても自動で修正するようになりました。
しかし、まだ完全ではなく、「*.sln」の場合はVBS2008のファイルアイコンになってしまったりします。

後いまさらなんですが、「こみ」ではなく「Microg」です、
何度もお世話になってたんで隠してました。w
引用返信 編集キー/
■19546 / inTopicNo.29)  Re[18]: ショートカットファイルのアイコン設定
□投稿者/ Microg (7回)-(2008/05/25(Sun) 13:26:59)
解決付け忘れてました。。
解決済み
引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -