.NET TIPS

既定のブラウザ/メーラの.EXEファイル・パスを取得するには?[C#、VB]

デジタルアドバンテージ 一色 政彦
2007/10/04

 「TIPS:プログラムからブラウザやメーラを起動するには?」では、既定のブラウザ(以降、デフォルト・ブラウザ)や既定のメーラ(以降、デフォルト・メーラ)を起動する方法を紹介した。しかしこの方法では、(デフォルト・ブラウザやデフォルト・メーラを立ち上げたうえで)実際にWebページを開くときやメールを作成するときにしか使用できない。つまり、「単にデフォルト・ブラウザやデフォルト・メーラを立ち上げたいだけ」という用途では使えないのだ。

 このような用途を実現するには、デフォルト・ブラウザやデフォルト・メーラの.EXEファイルのパスを取得して、それを直接実行するのが、最も素直な方法だろう。そこで本TIPSでは、デフォルト・ブラウザやデフォルト・メーラの.EXEファイル・パスを取得する方法を紹介する。

デフォルト・ブラウザやデフォルト・メーラの.EXEファイル・パスを取得する方法

 デフォルト・ブラウザやデフォルト・メーラの.EXEファイルのパスを調べるには、レジストリを参照するとよい。具体的には、それぞれ以下のキーの「(既定)」値を調べればよい。

  • デフォルト・ブラウザ:HKEY_CLASSES_ROOT\http\shell\open\command
  • デフォルト・メーラ:HKEY_CLASSES_ROOT\mailto\shell\open\command

 次の画面は、レジストリ・エディタで実際にデフォルト・ブラウザのレジストリ値を調べているところである。

(レジストリ・エディタによる)デフォルト・ブラウザに関するレジストリ値の参照
この例では「HKEY_CLASSES_ROOT\http\shell\open\command」を参照して、デフォルト・ブラウザの.EXEファイル・パスを調べている。なお、レジストリ・エディタを起動するには、[スタート]メニューの[ファイル名を指定して実行]をクリックして[ファイル名を指定して実行]ダイアログを起動し、そのダイアログのテキストボックスに「regedit」を入力して実行する。
  キー「HKEY_CLASSES_ROOT\http\shell\open\command」をクリック。
  「(既定)」値を参照する。
  デフォルト・ブラウザの.EXEファイル・パスが含まれた文字列が格納されている。ちなみに、この[文字列の編集]ダイアログは「(既定)」値をダブルクリックすれば表示される。

 上の画面を見ると分かるように、これらの値では、デフォルト・ブラウザの.EXEファイルのフル・パスがあり、その後に「-requestPending -osint -url "%1"」というコマンドライン引数が続いている。これらのコマンドライン引数(オプション)の方は、本稿の目的では不要である(そのためそれらの説明は割愛する)。ここでは、最初の.EXEファイル・パスのみを抽出すれば完了である。

 レジストリの値を取得する方法については、「TIPS:レジストリの値を取得するには?」を参考にしてほしい。なお、本稿のように「(既定)」の値を取得する場合には、RegistryKeyオブジェクト(Microsoft.Win32名前空間)のGetValueメソッドの第1パラメータに空文字(「""」もしくは「String.Empty」)を指定すればよい。

 以上の処理を実装したコード例を次に示す。

using System;
using Microsoft.Win32;
using System.IO;
using System.Diagnostics;

class Program
{
  static void Main(string[] args)
  {
    // 既定のブラウザとメーラのパスを取得する
    string browserPath = GetDefaultBrowserExePath();
    string mailerPath = GetDefaultMailerExePath();

    // ブラウザとメーラを立ち上げる
    Process.Start(browserPath);
    Process.Start(mailerPath);
  }

  private static string GetDefaultBrowserExePath()
  {
    return _GetDefaultExePath(@"http\shell\open\command");
  }

  private static string GetDefaultMailerExePath()
  {
    return _GetDefaultExePath(@"mailto\shell\open\command");
  }

  private static string _GetDefaultExePath(string keyPath)
  {
    string path = "";

    // レジストリ・キーを開く
    // 「HKEY_CLASSES_ROOT\xxxxx\shell\open\command」
    RegistryKey rKey = Registry.ClassesRoot.OpenSubKey(keyPath);
    if (rKey != null)
    {
      // レジストリの値を取得する
      string command = (string)rKey.GetValue(String.Empty);
      if (command == null)
      {
        return path;
      }

      // 前後の余白を削る
      command = command.Trim();
      if (command.Length == 0)
      {
        return path;
      }

      // 「"」で始まる長いパス形式かどうかで処理を分ける
      if (command[0] == '"')
      {
        // 「"〜"」間の文字列を抽出
        int endIndex = command.IndexOf('"', 1);
        if (endIndex != -1)
        {
          // 抽出開始を「1」ずらす分、長さも「1」引く
          path = command.Substring(1, endIndex - 1);
        }
      }
      else
      {
        // 「(先頭)〜(スペース)」間の文字列を抽出
        int endIndex = command.IndexOf(' ');
        if (endIndex != -1)
        {
          path = command.Substring(0, endIndex);
        }
        else
        {
          path = command;
        }
      }
    }

    return path;
  }
}
Imports Microsoft.Win32
Imports System.Diagnostics

Module Module1

  Sub Main()
    ' 既定のブラウザとメーラのパスを取得する
    Dim browserPath As String = GetDefaultBrowserExePath()
    Dim mailerPath As String = GetDefaultMailerExePath()

    ' ブラウザとメーラを立ち上げる
    Process.Start(browserPath)
    Process.Start(mailerPath)
  End Sub

  Private Function GetDefaultBrowserExePath() As String
    Return _GetDefaultExePath("http\shell\open\command")
  End Function

  Private Function GetDefaultMailerExePath() As String
    Return _GetDefaultExePath("mailto\shell\open\command")
  End Function

  Private Function _GetDefaultExePath(ByVal keyPath As String) As String
    Dim path As String = ""

    ' レジストリ・キーを開く
    ' 「HKEY_CLASSES_ROOT\xxxxx\shell\open\command」
    Dim rKey As RegistryKey = _
      Registry.ClassesRoot.OpenSubKey(keyPath)
    If Not rKey Is Nothing Then
      ' レジストリの値を取得する
      Dim command As String = _
        CType(rKey.GetValue(String.Empty), String)
      If command = Nothing Then
        Return path
      End If

      ' 前後の余白を削る
      command = command.Trim()
      If command.Length = 0 Then
        Return path
      End If

      ' 「"」で始まる長いパス形式かどうかで処理を分ける
      If command.Chars(0) = """"c Then
        ' 「"〜"」間の文字列を抽出
        Dim endIndex As Integer = command.IndexOf(""""c, 1)
        If endIndex <> -1 Then
          ' 抽出開始を「1」ずらす分、長さも「1」引く
          path = command.Substring(1, endIndex - 1)
        End If
      Else
        ' 「(先頭)〜(スペース)」間の文字列を抽出
        Dim endIndex As Integer = command.IndexOf(" "c)
        If endIndex <> -1 Then
          path = command.Substring(0, endIndex)
        Else
          path = command
        End If
      End If
    End If

    Return path

  End Function

End Module
デフォルト・ブラウザとデフォルト・メーラの.EXEファイル・パスを取得するコンソール・アプリケーションのサンプル・プログラム(上:C#、下:VB)

 コードの意味、内容についてはコード中のコメントが参考になると思うので割愛する。

 このサンプル・プログラムを実行すると、デフォルト・ブラウザとデフォルト・メーラが起動する。プログラムの起動方法については「TIPS:ほかのアプリケーションを実行するには?」を参考にされたい。

 また、本稿の方法では、短い8.3形式の.EXEファイル・パスが得られるが、これを長いパス形式に変換したい場合には、「TIPS:8.3形式の短いパスを長いパスに変換するには?」を参照していただきたい。End of Article

カテゴリ:クラス・ライブラリ 処理対象:レジストリ
使用ライブラリ:Registryクラス(Microsoft.Win32名前空間)
使用ライブラリ:RegistryKeyクラス(Microsoft.Win32名前空間)
関連TIPS:プログラムからブラウザやメーラを起動するには?
関連TIPS:レジストリの値を取得するには?
関連TIPS:ほかのアプリケーションを実行するには?
関連TIPS:8.3形式の短いパスを長いパスに変換するには?

この記事と関連性の高い別の.NET TIPS
既定のテキスト・エディタの.EXEファイル・パスを取得するには?
プログラムからブラウザやメーラを起動するには?
8.3形式の短いパスを長いパスに変換するには?
レジストリの値を列挙するには?
レジストリの値を取得するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間