• ベストアンサー

ファイルタイプ関連付を調べる(フォルダオプションを使用しない方法)

標記に関しレジストリを調べる方法を過去の質問から探し出しました。しかし、この方法だとファイルタイプに関連づけられた「ディフォルト」のアプリケーションしか示されません。 ユーザーが独自におこなった関連付「フォルダオプションには示されている」をプログラム的に探す方法を御教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.10

>一言だけさらなる要望を述べれば、私の探求も含めて「現状ではこのようである」というだけで、 MSの仕様とは直接関係していないところが弱いと思います マイクロソフトのページでも調べたんですけど、見つからなかったんですよねぇ~。 もしかしたら、非公開かもしれませんね。 >Windws9xや、次期Windwsでコロリと変わってしまうかも そうそう、書くのをすっかり忘れていましたけど、 調べたのは、Windows2000です。 確か、Windows95やWindows98では、あのApplicationキーは無かった気がします。 レジストリも、9X系とNT系では、少し違っている気がしました。 >そろそろポイント発行の時期かもしれませんが、面白い話が続いたので、 もうしばらくオープンにしておきます。 構いませんよ。 お役に立てなかったので(笑)。

その他の回答 (9)

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.9

いろいろ試したところ、2つの方法があるようです。 よく見たら、これは既に#1の補足に書いてありましたね(^^; (まずい、無駄骨をおらせてしまったかも。。) 一応、試した結果は、 〇拡張子未登録のファイルに対し、 「アプリケーションから開く」-「これらのファイルを開いたときは、いつもこのアプリケーションを~」 をチェックすると、Applicationというキーが作られる。 〇既にファイルタイプが登録されているものに対し、 「アプリケーションから開く」-「これらのファイルを開いたときは、いつもこのアプリケーションを~」 をチェックすると、Applicationというキーは作られない。 〇Applicationキーと、ファイルタイプの両方がレジストリに登録されている場合は、  Applicationキーから優先的に参照される。 〇Applicationキーにあるプログラム・ファイル名のパス名は、  \HKEY_CLASSES_ROOT\Application\(アプリ名)\shell\open\command  にある。 〇\HKEY_LOCAL_MACHINEと\HKEY_CLASSES_ROOTは、これはどっちでもいいみたい。  *レジストリエディタで、一方を変えてみたところ、すぐにもう一方にも反映されていました。 結局、あまりお役に立てず、時間を無駄に使ってしまったようです。 すみません(^^;

noname#182251
質問者

お礼

色々お調べ頂き有り難うございます。特に今回「レジュメ」が出たのが貴重です。今後も時々参照するかと思います。 一言だけさらなる要望を述べれば、私の探求も含めて「現状ではこのようである」というだけで、MSの仕様とは直接関係していないところが弱いと思います。Windws9xや、次期Windwsでコロリと変わってしまうかも。 ただ拙アプリケーションでは、この部分はあくまでも「お手伝い、サービス」で、アプリケーションを最終選択するのはユーザーの責任ということなので、それほど深刻な問題ではありません。 そろそろポイント発行の時期かもしれませんが、面白い話が続いたので、もうしばらくオープンにしておきます。

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.8

こんにちは。 だいたい理解したつもりなので、今回は考えを述べさせてもらうことにします。 処理の概略は、 1.アプリに登録されたファイルがクリック(?)される。 2.そのファイルの拡張子を取得。 3.アプリ内DBの中から、その拡張子の情報を取得。 4.その情報の起動区分が、   ・Windowsデフォルトの場合     ->Windowsレジストリから起動対象アプリ名を取得。   ・Windowsデフォルトではない場合     ->自作アプリ内DBから起動対象アプリ名を取得。 5.アプリを起動。 となるでしょう。 さて、問題になっているのは、4の 「->Windowsレジストリから起動対象アプリ名を取得。」 の箇所だと思います。 どうやって取得するかというと、やはり私が最初に書いた通り、 <指定された拡張子に関連付けされたアプリ名を取得> 1.レジストリの    HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.拡張子   からファイルタイプを取得。 2.HKEY_LOCAL_MACHINE\SOFTWARE\Classes\(ファイルタイプ)\shell\open\command   を取得。 となるでしょう。 エクスプローラーでファイルを右クリックして表示されるメニューの、 「開く」に関連付けされているのは、ここのはずです。 試しに、レジストリを書き換えて、実験してみてください。 プログラム名を適当に変えて、クリックをすると直ぐに反映されているはずです。 ところで、ファイルタイプやプログラム名を取得するには、 キーに対しての「名前」が(標準)である値を取得しなければならないわけですが、 この「(標準)」というのをプログラムでどのように指定するのかは、 残念ながらお答えできません。 (現在Cの環境がないもので。。。) これでどうでしょうか? 疑問点はどうぞ。

noname#182251
質問者

補足

長らくお付き合い頂き感謝しております。しかし、何か話が噛み合わず、具体的に追いかけてみました。まず 「.doc」 マイ コンピュータ\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.doc (標準)Word.Document.8 でした。そこで \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Word.Document.8\shell\Open\command に "C:\Program Files\Microsoft Office\Office\WINWORD.EXE" /n で問題ありません。 しかし「.jpg」を追いかけるとファイルタイプが「jpegfile」となり \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\jpegfile\shell\Open\command の値は "C:\Program Files\Common Files\Microsoft Shared\PhotoEd\PHOTOED.EXE" "%1" となり、私がエクスプローラーで結び付けているものとは異なりディフォルトのものです。 では求めるものがレジストリのどこに書かれているか? \HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.JPG の「Application」に、「iGximg.exe」が書かれていて、これが求めるものです。 しかし、これは探し回って見付かっただけで、此処を見れば良いとの裏付けがある話ではなく、そこら辺が問題ですが。 あとngsvxさんのご提示は \HKEY_LOCAL_MACHINE でしたが、私は通常 \HKEY_CLASSES_ROOT から探しています。どちらが良いのだろう?

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.7

>しかし僅かながら気になる箇所をもう一度執拗に書きますと(^^; これは非常に大事なことですね。 >「(拙作データベースの)利用者(不特定多数)が自分の利用するファイルを登録する」です。 あれっ? 誤解があるかも。。。 もしかしたら、関連付けはファイル毎に行うのですか? 例えば、a.csvはNotepad.exeだけど、b.csvはエクセルが起動するとか。 >「ファイルタイプとの関連付」はそのままにしておきたいということです 本物のレジストリは書き換えないということですね。 これは理解しています。 *関連付けの件が明確になったら、私の考えを伝えようと思います。

noname#182251
質問者

補足

>もしかしたら、関連付けはファイル毎に行うのですか? >例えば、a.csvはNotepad.exeだけど、b.csvはエクセルが起動するとか イエイエ違います(^^;説明が拙くて申し訳ありません。今のところあくまでも一拡張子、一アプリケーションです。 ということでご意見、楽しみにしております。

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.6

書き忘れました。 すみません、#5と合わせて見てください。 環境設定では、 拡張子毎に対して、 ・Windowデフォルトを使用 ・独自に設定 として、独自に設定の場合はアプリケーションを指定。 と、こんな感じでしょうか?

noname#182251
質問者

補足

旅に出ておりました関係で、補足が遅くなり失礼しました。 #5,#6併せてほぼご理解の通りだと思います。しかし僅かながら気になる箇所をもう一度執拗に書きますと(^^; >自作アプリ内にレジストリのようなものを持っておくということですね ウーン、レジストリを持つというよりも、何しろ作っているのがデータベースですから >1.自作ソフトに、test1.csvというファイルを登録する 私の思うように正確に言い換えると 「(拙作データベースの)利用者(不特定多数)が自分の利用するファイルを登録する」です。 2.以下#6も正しいご理解と思います。さらに一言追加するならば、「ファイルタイプとの関連付」は(既にご理解頂いていると思いますが)そのままにしておきたいということです。ご提示頂いた例でいえば、拙作データベースから .csv は Notepad が、エクスプローラーからは相変わらずエクセルが起動されるといった想定です。

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.5

理解のゴールが見えてきました(^^; 自作アプリ内にレジストリのようなものを持っておくということですね、きっと。 例えば、 1.自作ソフトに、test1.csvというファイルを登録する。 2.test1.csvを選択すると、エクセルが起動。   (現在.csvはエクセルが起動する設定) 2.環境設定で.csvの起動をエクセルからNotepadに変更する。 3.既に登録してあるtest2.csvを選択すると、Notepadが起動。 こんな動作でしょうか?

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.4

#2です。 うーん、こんな感じかな? 1.自作ランチャーには、プログラムではなくファイルを登録しておく。 2.登録されたファイルの1つをクリックすると、全てのプログラムの一覧が  表示され、ユーザーはその中から起動したいプログラムを選ぶ。  ただし、既にファイルタイプでアプリケーションと関連付がされている場合、  それをデフォルトとする。

noname#182251
質問者

補足

概ね(^^; 作ろうとしているのはランチャーというよりファイル管理アプリケーションです。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1009098 こちらに構想を記述しています。 作り始めると、すぐに判ったことは「ファイルを管理」するというより、各種データ(ファイル)を使用して「仕事をする」ということです。従って、必要なファイルが見付かれば、すぐにそれを処理するアプリケーションを経由して開きたい。 >2.登録されたファイルの1つをクリックすると、全てのプログラムの一覧が >表示され、ユーザーはその中から起動したいプログラムを選ぶ。 >ただし、既にファイルタイプでアプリケーションと関連付がされている場合、それをデフォルトとする この部分はちょっと違います。拡張子に結びつけられたアプリケーションは一つで、それが直ちに起動します。これは変更可能で、「環境設定」的なところでユーザーが行います。ですから「ファイルタイプ」辺りを調べなくても、一からユーザーが探せば済むのですが、それも余りに不親切と思い、サービスとしてディフォルトを提示しているわけです。何しろ90%以上はディフォルトで済むでしょうから。

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.3

#2です。 ??? すみません、さっぱり意味がわかりません。 最初の質問の、 >ユーザーが独自におこなった関連付「フォルダオプションには示されている」をプログラム的に探す方法を これは、 「Windowエクスプローラーの「ツール」-「フォルダーオプション」の「ファイルタイプ」 で表示される内容が知りたい」 という意味ではないのですか? 前回の回答は、そのためのものです。 (やりたいことがよく分からなかったので、あのような書き方になりました) で、今回いただいた補足の、 >通常はファイルタイプで関連付られているもので良いのですが、 例えば .htm で関連付の方は Internet Explorer のままで、 かつこのデータベースからは「Front Page で編集したい」 といった要望に応えようとしています。 の部分が理解できません。 Windowエクスプローラーでクリックすると、Internet Explorerが起動するのはそのままで、 自作ランチャー(?)でクリックすると、Front Pageが起動するということ? とすると、Front Pageとそのファイルの関係はどこで定義されてますか? その関連付けをレジストリから探すのでしょうか? それなら、前回の回答の箇所を見たらわかるはずだし・・・。

noname#182251
質問者

補足

誤解が深まっているようです(^^; >Windowエクスプローラーでクリックすると、Internet Explorerが起動するのはそのままで、 >自作ランチャー(?)でクリックすると、Front Pageが起動するということ この点にほぼ間違いはありません。しかし.htm とFront Pageはあくまでも一例として挙げただけで、ユーザーがどの拡張子とどのアプリケーションを結び着けるかはプログラム側は感知しません。またそのアプリケーションがレジストリに何か情報を書き込んでいる保証もありません。 その点ではほとんど100%ユーザー任せですが、既にファイルタイプでアプリケーションと関連付がされていて、かつユーザーに不満がない場合はそれをそのまま利用しようという構想です。 ウーンまだお判り頂けないかな?

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.2

私が登録をするときは、いつも次の手順で行ってますけど。。。 例えば、拡張子.xmlの編集を\Editor.exeにする場合、 1.HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.拡張子を登録。 2.名前が(標準)にデータを「xmlfile」にする。 3.HKEY_LOCAL_MACHINE\SOFTWARE\xmlfileを追加。   名前(標準)のデータを「XMLファイル」にする。 4.HKEY_LOCAL_MACHINE\SOFTWARE\xmlfile\shell\edit\commandを追加   名前(標準)のデータを\Editor.exeにする。 5.HKEY_LOCAL_MACHINE\SOFTWARE\xmlfile\shell\editの、   名前(標準)の値を、「編集(&E)」にする。 参考になりますか?

noname#182251
質問者

補足

参考になりますが意味合いがちょっと異なります。 ファイル管理データベースを作成中です。で、ユーザーは自分が管理したいファイルを登録し、必要に応じてアプリケーションから開きます。通常はファイルタイプで関連付られているもので良いのですが、例えば .htm で関連付の方は Internet Explorer のままで、かつこのデータベースからは「Front Page で編集したい」といった要望に応えようとしています。 つまりレジストリは読むだけで、ユーザーに「現在はこのアプリケーションが呼ばれます」と提示しておいて、後はユーザーが必要に応じて自分の好きなアプリケーションを指定します(データベースには登録するがレジストリは書き換えません)。 やろうとしていることがお判り頂けたでしょうか?

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.1

レジストリはどの場所を見たのでしょうか? フォルダオプションの表示もレジストリの値を見ています。 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.拡張子\OpenWithList  ↑ これを展開すると、名前がa~でアプリ名のデータが並んでいると思います。 MRUListの中に順番が書かれていて、どのアプリでテキストを開くかを判断していると思われ。 MRUListは通常はひとつだけ入っているはずです。 テキストファイルとか特定のものだけは .TXT と .txt_ 2種類あるみたいですが、この場合は、.txt_ を見るようです。 ※過去質問がこれと同じで、それで解決できなかった故の再質問だったら御容赦あれ。

noname#182251
質問者

お礼

御礼というよりも補足です(^^; HKEY_CURRENT_USER の方にはフォルダオプションでユーザーがディフォルト以外のアプリケーションを指定した時のみ Application に値が入るようです。それ以外の場合(ディフォルト)は HKEY_CLASSES_ROOT の方を追いかけて (標準)(regedt32だと名前なし)の値に加えて \shell\Open\command まで見に行かないと駄目みたいです。 MSDN あたりでちゃんと調べたわけではないので、もう少し情報が欲しい。

noname#182251
質問者

補足

>レジストリはどの場所を見たのでしょうか? ギョ(^^; HKEY_CLASSES_ROOT を見ていました。過去の回答情報は(私の探した範囲では)それだったので。 >HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.拡張子\OpenWithList 早速見ました。 .bmp で見ると a~j のアプリケーション名があり、.bmp を使用したアプリケーションのようです。MRUListは cebihadjf で左ほど最近利用したアプリケーションを意味するようです。 で、一段上の\FileExts\.bmp のところに Application なる値があり、ここに決め打ちのアプリケーション名が書いてあるようです。点数を出したいところですが、締め切られてしまうので、もう少し詳細を調べて報告と共に。有り難うございました。

関連するQ&A

専門家に質問してみよう