ファイルを開く際に規定のexeを知る方法について VB.NET

このQ&Aのポイント
  • VB.NETでファイルを開く際に規定のexeを取得する方法を知りたいです。現在の開発環境はVB.NETとFramework1.1です。
  • mp3ファイルなどがダブルクリックされた際に自動で開くアプリケーションが何なのかを知りたいです。レジストリキーを調べる方法で取得できるのでしょうか?
  • 提供されたソースコードでは、Microsoft.Win32.RegistryKeyを使用してmp3ファイルのデフォルトアプリケーションを取得しようとしていますが、正しく取得できていないようです。改善点を教えていただきたいです。
回答を見る
  • ベストアンサー

ファイルを開く際に規定のexeを知る方法について VB.NET

VB.NETとFramework1.1の開発環境です。 mp3ファイルなどがダブルクリックされた際に 自動で開くアプリケーションが何なのかを知りたいのですが、 レジストリキーを調べるということで間違いはないでしょうか? それで、それを取得しようと下記のようなソースで試してみた のですが、どうしてもstrにはNothingしか入りません。 間違っている箇所などありましたらその箇所をご教授頂けないでしょうか。 宜しくお願いいたします。 Dim regkey As Microsoft.Win32.RegistryKey = _ Microsoft.Win32.Registry.ClassesRoot.OpenSubKey("mp3file\shell\open\command", False) If (regkey Is Nothing) Then Return Nothing Dim str As String str = CType(regkey.GetValue("REG_SZ"), String) Console.WriteLine(str) str = regkey.GetValue("string") Console.WriteLine(Str)

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

  • ベストアンサー
回答No.1

俺の環境(.NET 3.5)だと HKEY_CLASSES_ROOT\mp3file\shell\open\command の既定の値に "C:\Program Files\Media_Player_Classic\v6.4.9.1\v20080308\mplayerc.exe" "%1" と書かれているとして ----------------- '多分この四つの中には.NET 1.1でかけないものがあるかと Option Explicit On Option Compare Binary Option Strict On Option Infer Off Public Class Class1 Public Shared Sub Main() Dim c As Class1 = New Class1() System.Console.WriteLine(c.hoge()) System.Console.ReadKey(true) '単なる待機。 End Sub Public Function hoge() As String Dim regkey As Microsoft.Win32.RegistryKey = _ Microsoft.Win32.Registry.ClassesRoot.OpenSubKey("mp3file\shell\open\command", False) If (regkey Is Nothing) Then return Nothing End If Dim str As String 'MSDNのドキュメントにあるとおり,RegistryKey.GetValueメソッドの第一引数は【値の型】じゃなくて【名前】です。 'ただし、既定値の場合,Nothingか空文字列を入れることになってます。 'ところで,本題とは無関係ですが,個人的にはCTypeよりもDirectCastの方が好きです。 'http://blogs.wankuma.com/jeanne/archive/2005/03/18/12271.aspx 'わんくま同盟のサーバがコケているので移転前のものでも見てください。 'http://www.ailight.jp/blog/jeanne/archive/2005/03/18/5072.aspx str = DirectCast(regkey.GetValue(""), String) return str End Function End Class '============解らなければ読み飛ばしてください======== 'なお,MSDNのドキュメントについたコメントによると, 'GetValueで得られたObjectの段階で(.NETではStringに変換する必要がありますが)すでに文字列扱いされており 'null文字(C言語やC++言語で「文字列の終わり」を示す特殊な文字) '以後のデータを得ることは出来ないそうです。 '============== 'また、Windows32 APIを叩くことに慣れているならば, 'FindExecutableA関数も検討してみてください(FindExecutableW関数があるかは不明) 'って 'http://stackoverflow.com/questions/162331/finding-the-default-application-for-opening-a-particular-file-type-on-windows 'に書いてあった。 ----------------- このプログラムを実行したところ, "C:\Program Files\Media_Player_Classic\v6.4.9.1\v20080308\mplayerc.exe" "%1" が正常に表示されました。 ああ、そうそう、起動するアプリケーションって必ずHKEY_CLASSES_ROOTで HKEY_LOCAL_MACHINEやHKEY_CURRENT_USERにならないのかも気になりますね

goo081102
質問者

お礼

ご回答ありがとうございます。 空白を指定したら思い通りの文字列を取ることが出来ました。 また大変ためになる情報もありがとうございます。 API関数も早速試してみることにします。 HKEY_CLASSES_ROOTから取ってくるのはregeditで検索して 最初に見つけたのがこれだったのですが、HKEY_LOCAL_MACHINEにもありますね。 そちらから取るようにします。 どうもありがとうございました。

関連するQ&A

  • OS(Win10かWin11)の判別方法について

    いつもお世話になっております。 icevainと申します。 ご質問させていただきます。 VB.netでOSがWindows10ならある処理を行うというツールを考えております。 ネット上で下記のコードを見つけ試してみたのですが、Windows11でも動いてしまいます。 ここから Dim regkey As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey( "SOFTWARE\Microsoft\Windows NT\CurrentVersion", False) If regkey.GetValue("ProductName") = "Windows 10 Enterprise" _ OrElse regkey.GetValue("ProductName") = "Windows 10 Home" Then 'Windows10ということでここを抜けて然るべき処理を行います。 Else   ’Windows10以外なら終了。 Me.Close() End If ここまで お分かりの方おりましたらお知恵をお貸し頂けないでしょうか。 よろしくお願いいたします。

  • Visual C#のエラーについて

    レジストリを読み込むときにエラーが出ます。(指定されたキャストは有効ではありません) bool b_tbar private void Form1_Load(object sender, EventArgs e) { try { Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\***", false); if (regkey == null) { b_tbar = true; return; } b_tbar = (bool)regkey.GetValue("tbar");  <ーーここでエラー regkey.Close(); } catch (Exception e1) { MessageBox.Show( e1.Message); } } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"***"); regkey.SetValue("tbar", b_tbar); regkey.Close(); } どこをどうなおしたら良いのでしょか?教えてくださいお願いいたします。

  • VB.NETで、システムのレジストリ書込が拒否されます。

    VB.NETで、システムのレジストリ書込が拒否されます。 アクセス権限変更は、どのように書けばよいでしょうか? サンプルコードを記します。 Dim rk As Microsoft.Win32.RegistryKey = _ Microsoft.Win32.Registry.CurrentUser.OpenSubKey _ ("Software\Microsoft\Windows\CurrentVersion\Policies\System", _ Microsoft.Win32.RegistryKeyPermissionCheck.Default, _ Security.AccessControl.RegistryRights.FullControl) rk.SetValue("Int", 1) rk.Close() 開発環境からの拒否メッセージは、 "要求されたレジストリ アクセスは許可されていません" 実行環境からは、 "レジストリ キーに書き込めません。" と、なります。 ご教示いただけますでしょうか。 どうぞよろしくお願いいたします。

  • VB.NETの関数プロシージャの書き方を教えてください。

    Public A As String という変数にある文字列データが入っていて、 ボタンを押すとその時に変数X,Y,Zに入っている 文字列を検索してButton1_Clickプロシージャ内に戻って来て KekkaX,KekkaY,KekkaZに数値が入るような関数プロシージャなのですが、 呼び出す部分の書き方と関数のプロシージャ名の書き方を教えて頂きたいです。 検索する部分は自分で出来ると思うので大丈夫です。 Public A As String = "何かの文字列" Button1_Click Dim X,Y,Z As String Dim KekkaX,KekkaY,KekkaZ as Integer '変数Aの中からX,Y,Zを検索したい X="*****" Y="ABCDE" Z="#####" GetKensakuKekka(????????) ←この部分の書き方を教えて下さい。 'KekkaX,KekkaY,KekkaZ 内に検索結果を取得したい Console.WriteLine(KekkaX) Console.WriteLine(KekkaY) Console.WriteLine(KekkaZ) End Sub Function GetKensakuKekka (???????????) ←この部分の書き方を教えて下さい。 ・ ・ ・ End Function よろしくお願い致します。

  • VB.NETのデリゲートについて

    VB.NETのデリゲートについて質問です。 以下のプログラムなのですが、 デリゲート型をインスタンス化しているところで、コンストラクタにパラメータを渡していますが、 そのコンストラクタはどこに定義されているのでしょうか。 (AddressOf t1.Ohayou)というパラメータが渡されていますが、このパラメータを受け取っているコンストラクタがどれなのかが分かりません。 ご教示よろしくお願いいたします。 Delegate Sub Myprint(ByVal s As String) Module Module1 Sub Main() Dim t1 As Test1 = New Test1() Dim t2 As TEst2 = New Test2() Dim d As Myprint = New Myprint(AddressOf t1.Ohayou) d.Invoke("VB太郎") d = New Myprint(AddressOf t2.Konbanwa) d.Invoke("VB太郎") End Sub End Module Class Test1 Sub Ohayou(ByVal s As String) Console.WriteLine("おはようございます。{0}です。", s) End Sub End Class Class Test2 Sub Konbanwa(ByVal s As String) Console.WriteLine("こんばんわ。{0}です。", s) End Sub End Class

  • Date型へのキャストについて

    VB.NET初心者です。 String型からDate型へキャストをしたいのですが、よそのサイト様を参考にいろいろ試してみたのですが、うまくいかず困っています。どなたか、教えてください。よろしくお願いします。 エラー:『文字列は有効なDateTimeではありません』 Dim str1 As String = "2009/08/01" または Dim str2 As String = "2009/08/01 12:00:00" str2 = str2.substring(0,10).replacce("/","") の形式で取得した値を"yyyy/mm/dd形式で"Date方へキャストしたいのですが.... Dim dt As Date = Date.ParseExact(str, "yyyy/MM/dd", Nothing) Dim dt As Date = Date.parse(str) Dim dt As Date = Ctype(str, Date) など試してみたのですが、#8/1/2009#のように書式がおかしいのですが、どこを直せばよいのでしょうか? Date.ParseExact()でできると思っていたのですが、悩んでいます。よろしくお願いします。

  • ArrayListに格納したクラス内のメンバの呼び出し方法(VB)

    お世話になります。VB2003でご質問があります。 通常Arryalistでは下記例1のように使用するのが一般的だと思うのですが、例2のようにArryaListにクラスを追加し、その中のメンバを呼び出すにはどのようにコーディングすればよいのでしょうか? コメントのコンパイルエラー箇所の部分です。 お手数ですが、ご教授よろしくお願いいたします。 ******************************************* (例1) Dim Test as new ArrayList Test.ADD("テスト") console.writeline(test(0)) ******************************************* ******************************************* (例2) Public Class A public strA as string public sub subTest() strA = "おはよう" end sub End Class Public Class B Dim a as new ArrayList a.Add(new A) a(0).subTest '--コンパイルエラー箇所 console.writeline(a(0).strA) '--コンパイルエラー箇所 End Class *******************************************

  • VB 配列の内容をファイルに書き込む

    VB2008を使用しています。 stg_bitという配列に一文字ずつ「abc・・・」 のように入っているものを、テキストファイルに出力したいのですが・・・ stg_bitという配列の内容をファイルに書き込みたいのですが、 うまくいきません。 ご教授お願いします!! Dim i As Integer Dim stg_str As String Dim Writer As New IO.StreamWriter("C:sample.txt") Writer.WriteLine(stg_bit) Writer.Close()

  • vb.netからエクセルファイルを開きたいのですが

    vb.netからエクセルファイルを開きたいのですが、 オフィス2010をインストールしてから動作しなくなりました。 ------------------------------------------------------------------------ Imports Microsoft.Office.Interop Sub ExcelOpen() Dim ExcApp As Excel.Application Dim book As Excel.Workbook Dim MyPath As String MyPath = "C:\Excel.xlsm" ExcApp = CreateObject("Excel.Application") ExcApp.Visible = True book = ExcApp.Workbooks.Open(MyPath) ExcApp = Nothing End Sub ------------------------------------------------------------------------ これで2007の時は起動してたのですが、2010だとダメです。 Microsoft Excel 14.0 Object Libraryに参照設定しています。 実行すると、 ExcApp.Visible = True の部分で サーバーによって例外が返されました。 (HRESULT からの例外: 0x80010105 (RPC_E_SERVERFAULT)) となります。 どうすればいいでしょうか?ご教授よろしくお願いします。

  • 正規表現で<BR>の行を除外したいです。 VB.NET

    VB.NETで正規表現を使って2つの文字列に囲まれた部分を 取得したいのですが、文字列の先頭と末尾の部分の<BR>の行と 空行を削除したいです。 具体的には対象の文字列が ”ABC <BR> <BR> あいうえお <BR> かきくけこ <BR> さしすせそ <BR> <BR> <BR> XYZ” となっていた場合に ”あいうえお <BR> かきくけこ <BR> さしすせそ” を取得したいです。 現在このようになっています。 Public STR As String Sub Form1_Load Dim sr As New System.IO.StreamReader("c:\0.html", system.Text.Encoding.Default) STR = sr.ReadToEnd TextBox2.Text = "(?<data>.+?)" End Sub Sub Button1_Click  Dim A As String = "ABC"  Dim Z As String = "XYZ"  Label1.Text = A & TextBox2.Text & Z  Dim r As New Regex(Label1.Text, RegexOptions.Singleline)  Dim m As System.Text.RegularExpressions.Match  Try  TextBox1.Text = r.Match(STR).Result("${data}")  Catch ex As Exception  Console.WriteLine("Error")  End Try End Sub <BR>が<br>や<Br><bR>< br >などにも対応したりと 条件がいろいろありすぎて色々試したのですが、 どうしても分かりませんでした。 申し訳ございませんが、お助け頂ければ幸いです。

専門家に質問してみよう