2009-04-12 18 views
3

新しいブラウザプロセスでURLを開く必要があります。ブラウザプロセスが終了したときに通知を受ける必要があります。新しいブラウザプロセスでURLを開く

 Process browser = new Process(); 
     browser.EnableRaisingEvents = true; 
     browser.StartInfo.Arguments = url; 
     browser.StartInfo.FileName = "iexplore"; 

     browser.Exited += new EventHandler(browser_Exited); 

     browser.Start(); 

「ファイル名は」ユーザーのデフォルトのWebブラウザではなく、Iexploreのために固定されているので、明らかに、これが原因ではないだろう:私が現在使用しているコードは次のようです。ユーザーのデフォルトのWebブラウザがどのようなものか把握するにはどうすればよいですか?

私はVista-> forwardで動作しています。可能であれば、XPはサポートするのが良いでしょう。

もう少しコンテキスト:私は、ローカルディスクからいくつかのファイルを処理する非常に小さなスタンドアロンのWebサーバーを作成しました。サーバーの起動の終わりに、私はブラウザを起動したいと思う。ユーザーが終了してブラウザを閉じると、Webサーバーを終了します。上記のコードは、IEのみを使用する以外に、完全に動作します。

ありがとうございます!

答えて

5

私は今、私がしたいことをするためにC#のコードを作業しています。現在のデフォルトブラウザをロードするために実行する必要がある「コマンドライン」が返されます:

using System; 
using System.Collections.Generic; 
using System.Runtime.InteropServices; 
using System.Linq; 
using System.Text; 

namespace testDefaultBrowser 
{ 
    public enum ASSOCIATIONLEVEL 
    { 
     AL_MACHINE, 
     AL_EFFECTIVE, 
     AL_USER, 
    }; 

    public enum ASSOCIATIONTYPE 
    { 
     AT_FILEEXTENSION, 
     AT_URLPROTOCOL, 
     AT_STARTMENUCLIENT, 
     AT_MIMETYPE, 
    }; 

    [Guid("4e530b0a-e611-4c77-a3ac-9031d022281b"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    public interface IApplicationAssociationRegistration 
    { 
     void QueryCurrentDefault([In, MarshalAs(UnmanagedType.LPWStr)] string pszQuery, 
     [In, MarshalAs(UnmanagedType.I4)] ASSOCIATIONTYPE atQueryType, 
     [In, MarshalAs(UnmanagedType.I4)] ASSOCIATIONLEVEL alQueryLevel, 
     [Out, MarshalAs(UnmanagedType.LPWStr)] out string ppszAssociation); 

     void QueryAppIsDefault(
      [In, MarshalAs(UnmanagedType.LPWStr)] string pszQuery, 
      [In] ASSOCIATIONTYPE atQueryType, 
      [In] ASSOCIATIONLEVEL alQueryLevel, 
      [In, MarshalAs(UnmanagedType.LPWStr)] string pszAppRegistryName, 
      [Out] out bool pfDefault); 

     void QueryAppIsDefaultAll(
      [In] ASSOCIATIONLEVEL alQueryLevel, 
      [In, MarshalAs(UnmanagedType.LPWStr)] string pszAppRegistryName, 
      [Out] out bool pfDefault); 

     void SetAppAsDefault(
      [In, MarshalAs(UnmanagedType.LPWStr)] string pszAppRegistryName, 
      [In, MarshalAs(UnmanagedType.LPWStr)] string pszSet, 
      [In] ASSOCIATIONTYPE atSetType); 

     void SetAppAsDefaultAll(
      [In, MarshalAs(UnmanagedType.LPWStr)] string pszAppRegistryName); 

     void ClearUserAssociations(); 
    } 

    [ComImport, Guid("591209c7-767b-42b2-9fba-44ee4615f2c7")]// 
    class ApplicationAssociationRegistration 
    { 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      IApplicationAssociationRegistration reg = 
       (IApplicationAssociationRegistration) new ApplicationAssociationRegistration(); 

      string progID; 
      reg.QueryCurrentDefault(".txt", 
       ASSOCIATIONTYPE.AT_FILEEXTENSION, 
       ASSOCIATIONLEVEL.AL_EFFECTIVE, 
       out progID); 
      Console.WriteLine(progID); 

      reg.QueryCurrentDefault("http", 
       ASSOCIATIONTYPE.AT_URLPROTOCOL, 
       ASSOCIATIONLEVEL.AL_EFFECTIVE, 
       out progID); 
      Console.WriteLine(progID); 
     } 
    } 
} 

Whew!正しい答えに向かって私を押してくれてありがとう!

1

デフォルトブラウザを決定する方法は、このブログの記事で説明されています。ブログの記事から

http://ryanfarley.com/blog/archive/2004/05/16/649.aspx

以上:

private string getDefaultBrowser() 
{ 
    string browser = string.Empty; 
    RegistryKey key = null; 
    try 
    { 
     key = Registry.ClassesRoot.OpenSubKey(@"HTTP\shell\open\command", false); 

     //trim off quotes 
     browser = key.GetValue(null).ToString().ToLower().Replace("\"", ""); 
     if (!browser.EndsWith("exe")) 
     { 
      //get rid of everything after the ".exe" 
      browser = browser.Substring(0, browser.LastIndexOf(".exe")+4); 
     } 
    } 
    finally 
    { 
     if (key != null) key.Close(); 
    } 
    return browser; 
} 
+0

ありがとうございました!私は彼らがデフォルトのプログラム設定を追加して以来、これを見るためのAPIが今あるという印象を受けました。 お待ちして申し訳ありませんが、私はメールが届いていませんでした。 – Gordon

+0

これは、デフォルトのWebブラウザを取得しません。私の場合、IE8はデフォルトとして設定されており、Firefox用になっています。これを処理するにはより良い方法が必要です。 – benmatth

+0

matthewsは正しいですが、少なくともVistaではこれは常にFirefoxへのパスを返します。おそらくHKCU \ Software \ Microsoft \ Windows \ Shell \ Associations \ UrlAssociations \ http \ UserChoiceのように見えます。 – mhenry1384

1

[OK]を、私はそれを発見したかもしれないと思います - IApplicationAssociationRegistration :: QueryCurrentDefault [1]。ドキュメントによると、これはShellExecuteによって使用されるものです。私はそれが動作するようになるとコードを投稿しますが、他の人がこれが正しいことだと思う人は興味があります(BTW、私はOSレベルでVista以上です)。

[1]:http://msdn.microsoft.com/en-us/library/bb776336(VS.85).aspx QueryCurrentDefault

2

あなたが(ファイル)エクスプローラのアプリケーションに知られているファイルタイプのパスを渡すと、それがが正しいことを行う「う、例えば

Process.Start("explorer.exe", @"\\path.to\filename.pdf"); 

このファイルをPDFリーダーで開きます。

ただし、URLで同じものを試してみると、

Process.Start("explorer.exe", @"http://www.stackoverflow.com/"); 

IEを起動します(私のマシンのデフォルトブラウザではありません)。

私は知っているが、質問に答えることはできませんが、私はそれが面白いsidenoteだと思った。

+1

ShellExecuteは、あなたが望むものをまったく実行します。デフォルトのブラウザを起動します。問題はプロセスIDを取得するために開始されたプロセスを監視できるようにすることです。ユーザがブラウザを閉じるときにコードを終了する必要があります(タブが難しいが、現在は十分に近い)。 – Gordon

+0

Thats weird ..デフォルトのブラウザはChromeで、Chromeは – om471987

+0

です。ShellExecuteとProcess.Startは、アンカー(#)が付いたURLがあるまで有効です。適切にコード化されていても、それらを渡すと起動しません。 – jschroedl

1

会議の回路に1週間はいますが、今度はこれに戻ります。私はC++でこれを行うことができます - そしてそれは正しく動作するようです!しかし、これをC#(または.NET)に変換しようとすると、すべて失敗しました(Post On Question)。ここで

この質問につまずく他人のためのC++のコードです:私は最終的にそれが働いて得るとき

#include "stdafx.h" 
#include <iostream> 
#include <shobjidl.h> 
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS  // some CString constructors will be explicit 

#include <atlbase.h> 
#include <atlstr.h> 
#include <AtlDef.h> 
#include <AtlConv.h> 

using namespace std; 
using namespace ATL; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    HRESULT hr = CoInitialize(NULL); 
    if (!SUCCEEDED(hr)) { 
     cout << "Failed to init COM instance" << endl; 
     cout << hr << endl; 
    } 

    IApplicationAssociationRegistration *pAAR; 
    hr = CoCreateInstance(CLSID_ApplicationAssociationRegistration, 
     NULL, CLSCTX_INPROC, __uuidof(IApplicationAssociationRegistration), 
     (void**) &pAAR); 
    if (!SUCCEEDED(hr)) 
    { 
     cout << "Failed to create COM object" << endl; 
     cout << hr << endl; 
     return 0; 
    } 

    LPWSTR progID; 
    //wchar_t *ttype = ".txt"; 
    hr = pAAR->QueryCurrentDefault (L".txt", AT_FILEEXTENSION, AL_EFFECTIVE, &progID); 
    if (!SUCCEEDED(hr)) { 
     cout << "Failed to query default for .txt" << endl; 
     cout << hr << endl; 
    } 
    CW2A myprogID (progID); 
    cout << "Result is: " << static_cast<const char*>(myprogID) << endl; 

    /// Now for http 

    hr = pAAR->QueryCurrentDefault (L"http", AT_URLPROTOCOL, AL_EFFECTIVE, &progID); 
    if (!SUCCEEDED(hr)) { 
     cout << "Failed to query default for http" << endl; 
     cout << hr << endl; 
    } 
    CW2A myprogID1 (progID); 
    cout << "Result is: " << static_cast<const char*>(myprogID1) << endl; 

    return 0; 
} 

私はC#のコードを掲載します!

+0

Windows 8.1ではこれが失敗するという警告だけです。 iexplore.exeへのパスの代わりにprogid: "IE.HTTP"を返します。そこで適切に起動するためには、さらにいくつかの作業が必要です。 – jschroedl

0

短い答え、できません。

Firefoxがデフォルトのブラウザで、Firefoxインスタンスが既に実行されている場合、Firefoxは同じfirefox.exeプロセスの別のウィンドウまたはタブで開かれ、ページを閉じた後でも、プロセスはすべてのウィンドウとタブを閉じるまで終了しません。この場合、現在のプロセスのURLをマーシャリングする一時的なfirefox.exe procがあるため、プロセスを開始するとすぐにプロセスが終了するという通知を受け取ります。 (これが、Firefoxの単一のインスタンス管理がどのように機能するかを仮定したものです)。

1

私はこのコードをプロジェクトに書いたことがあります。デフォルトのブラウザに追加のパラメータが設定されていることに留意してください。それはもともとブラウザのHTMLドキュメントを開くために作成されたのですが、私はいつも私のデフォルトプログラムをのエディタに設定しています。私のテキストエディタ。明らかに、それはURLでも完璧に機能します。

/// <summary> 
    ///  Opens a local file or url in the default web browser. 
    /// </summary> 
    /// <param name="path">Path of the local file or url</param> 
    public static void openInDefaultBrowser(String pathOrUrl) 
    { 
     pathOrUrl = "\"" + pathOrUrl.Trim('"') + "\""; 
     RegistryKey defBrowserKey = Registry.ClassesRoot.OpenSubKey(@"http\shell\open\command"); 
     if (defBrowserKey != null && defBrowserKey.ValueCount > 0 && defBrowserKey.GetValue("") != null) 
     { 
      String defBrowser = (String)defBrowserKey.GetValue(""); 
      if (defBrowser.Contains("%1")) 
      { 
       defBrowser = defBrowser.Replace("%1", pathOrUrl); 
      } 
      else 
      { 
       defBrowser += " " + pathOrUrl; 
      } 
      String defBrowserProcess; 
      String defBrowserArgs; 
      if (defBrowser[0] == '"') 
      { 
       defBrowserProcess = defBrowser.Substring(0, defBrowser.Substring(1).IndexOf('"') + 2).Trim(); 
       defBrowserArgs = defBrowser.Substring(defBrowser.Substring(1).IndexOf('"') + 2).TrimStart(); 
      } 
      else 
      { 
       defBrowserProcess = defBrowser.Substring(0, defBrowser.IndexOf(" ")).Trim(); 
       defBrowserArgs = defBrowser.Substring(defBrowser.IndexOf(" ")).Trim(); 
      } 
      if (new FileInfo(defBrowserProcess.Trim('"')).Exists) 
       Process.Start(defBrowserProcess, defBrowserArgs); 
     } 
    } 
+0

Windowsは、レジストリ内のデフォルトのブラウザを見つける場所を変更し続けているようです。しかし、完全なプロセスとその議論を構築する方法はまだ使えると思います。 – Nyerguds

関連する問題