[Windows, C#]WindowsでURLスキームを使用して実行ファイルを呼び出す

iOSのURLスキームみたいな感じで呼び出せるようにする方法

レジストリに登録する

C#のプログラム

たとえば hoge というURLスキームを作成したとしよう。 javascriptから呼び出す場合は以下のようにする。

1
location.href = "hoge:" + encodeURIComponent("パラメータ&");

パラメータ部分は 全体 を encodeURIComponent でエンコードしたほうがよい(IE対策)

IEの場合はURLを勝手にデコードした状態で実行ファイルにデータ(URL)を渡すが、 その他のブラウザの殆どはデコードされていない状態でプログラムにデータを渡すため。

またIEから呼び出す時にURIが509文字超えると起動してくれなかったので、 長いURLの場合は分割してデータを渡す必要がある。(さらにブラウザからlocation.hrefに短時間に値を入れると最後の値以外が無視されるという問題にぶちあたる。URL毎にIFRAMEを作ってその中でlocation.hrefにURLをセットしてやるとほとんどのブラウザでうまくいく。今どうなっているのか分からないが調査時はChromeはこの方法だとうまくいかず、IE、FireFox、Safari、UIWebViewでは大丈夫だった。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void Main(string[] args)
{

string arg1 = args.First(); // URL全体

// スキーム部分から後ろの部分を切り出し
string param = Regex.Match(arg1, @"\w+?:(.*)").Groups[1].Value;

if (Regex.IsMatch(arg1, "[&=]"))
{
// URLデコードされていない場合はデコードするというおまじない
arg1 = HttpUtility.UrlDecode(arg1);
}

//
// お好きにどうぞ
//
}

IEで「外部プロトコルリクエスト」ポップアップを抑制する

URLスキームを実行すると「外部プロトコルリクエスト」を実行していいかどうかのポップアップがでる。これを抑制するにはユーザがポップアップで二度と表示しないように設定するか、インストーラなどでレジストリに何かを設定しておく(参考:Understanding Protocols - IEInternals - Site Home - MSDN Blogs)

たとえばURLスキーム hoge:// の場合は

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ProtocolExecute\hoge

に WarnOnOpen という名前で REG_DWORD 0 を設定する

まぁその他ブラウザ毎に設定があるっぽいので適当に探してレジストリ書き込めばいいと思うよ。

IEでURLスキームを実行時にプログラム実行時の警告を抑制する

外部プロトコルリクエストのポップアップ以外にも「Webサイトで、このプログラムを使ってWebコンテンツを開こうとしています」という警告が出てきたりして困るかもしれない。

そういう時は以下の様な感じの値をレジストリに書き込めばOK。

GUIDはなんでもいい?

1
2
3
4
5
6
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Low Rights\ElevationPolicy\{F568BB28-0957-4A34-BEA7-D5F566B52410}]
"AppPath"="C:\\Program Files (x86)\\Google\\Google Japanese Input\\"
"AppName"="GoogleIMEJaBroker32.exe"
"Policy"=dword:00000003
関連があるかもしれない記事