これらの手順を実行しましたが、正しく機能しません。 Chromeのカスタムプロトコルハンドラ
基本的に、カスタムアプリはありません。特定のURLでIEを開くハンドラーを作成したいだけです。
これが私の登録です:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\ie]
"URL Protocol"="\"\""
@="\"URL:IE Protocol\""
[HKEY_CURRENT_USER\Software\Classes\ie\DefaultIcon]
@="\"Explorer.exe,1\""
[HKEY_CURRENT_USER\Software\Classes\ie\Shell]
[HKEY_CURRENT_USER\Software\Classes\ie\Shell\open]
[HKEY_CURRENT_USER\Software\Classes\ie\Shell\open\command]
@="\"C:\\Program Files\\Internet Explorer\\iexplore.exe\" \"%1\""
動作しますが、Chromeからie:www.google.comを開くと、IEを開くように求められますが、開いているURLに "ie:"が保持されます...無限ループを生成します。
どうすれば修正できますか?
ありがとう
いくつかのテストの後、私は別の戦略に移ります。代わりに、中間バッチスクリプトを対象とします。そして、バッチはプロトコルとURLを分割し、IEを開きます。
ここにバッチがあります:
echo %1%
set var=%1
set var=%var:~4,-1%
Start "" "%ProgramFiles%\Internet Explorer\iexplore.exe" %var%
このスクリプトをinternet-Explorer-protocol-handler.reg
として保存:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\ie]
"URL Protocol"="\"\""
@="\"URL:IE Protocol\""
[HKEY_CURRENT_USER\Software\Classes\ie\DefaultIcon]
@="\"Explorer.exe,1\""
[HKEY_CURRENT_USER\Software\Classes\ie\Shell]
[HKEY_CURRENT_USER\Software\Classes\ie\Shell\open]
[HKEY_CURRENT_USER\Software\Classes\ie\Shell\open\command]
@="cmd /k set myvar=%1 & call set myvar=%%myvar:ie:=%% & call \"C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe\" %%myvar%% & exit /B"
次に、スクリプトを実行して、レジストリにキーをインストールします。次のようになります。
これで、ie:
プロトコルを使用するリンクがInternet Explorerで開きます。
<a href="ie:https://www.google.com/">Google</a>
パラメータと特殊文字(&、%など)を含む拡張URLの問題を解決する解決策を次に示します。
Regファイルのコマンドを次のように置き換えます。
powershell -windowstyle hidden -command "& {$Url = '%1' ; $Url = $Url -replace 'ie:',''; $IE=new-object -com internetexplorer.application ; $IE.navigate2($Url) ; $IE.visible=$true }"
作業レジストリ :
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\ie]
"URL Protocol"=""
@="URL:IE Protocol"
[HKEY_CURRENT_USER\Software\Classes\ie\Shell]
[HKEY_CURRENT_USER\Software\Classes\ie\Shell\open]
[HKEY_CURRENT_USER\Software\Classes\ie\Shell\open\command]
@="cmd /c set url=\"%1\" & call set url=%%url:ie:=%% & call start iexplore -nosessionmerging -noframemerging %%url%%"
重要な注意事項:
%1
を二重引用符で囲む必要があります。そうしないと、example.com?a=1&b=2
のような複数のパラメーターを持つURLはexample.com?a=1
に削除され、&
の後のパラメーターは無視されます。iexplore
を呼び出すときは、二重引用符を削除する必要があります。二重引用符を削除せずに、複数のIEウィンドウをChromeから開くと、最初のIEウィンドウのみが正しいURLを取得します。ただし、コマンドset url=%%url:\"=%%
またはset url=%%url:~1,-1%%
は機能しません。iexplore
に-nosessionmerging
と-noframemerging
のスイッチを追加します。これらは コマンドラインオプション IEの「マージ」動作を制御します。次のコマンドは、渡されるすべてのクエリパラメータに対して機能します。
cmd/C set myvar = "%1"を呼び出し、set myvar = %% myvar:ie:= %%を呼び出し、start/separate "iexplore.exe" %% myvar %%を呼び出して終了します。
レジストリの最後の行を次のようにすると、レジストリの実装はより一般的になります。
_@="cmd /C set myvar=%1 & call set myvar=%%myvar:ie:=%% & call start /separate iexplore %%myvar%% & exit"
_
カスタムスクリプトを作成する必要はありません。
ターゲットURLに複数のクエリパラメータを含めることができる場合、最初のパラメータのみがIEに渡されるという問題に直面する可能性があります(IE検証)このような場合は、次の回避策を実行できます...エンコード後にターゲットURLを渡す新しいhtmlファイルを作成し、IEでこのHTMLを開きます。
window.location = "ie:"+<URL to the above HTML>+"?path="+encodeURIComponent(<target URL>);
HTMLファイルで、デコードされたターゲットURLにリダイレクトする
_<html>
<head>
<title>
IE Redirect
</title>
<script>
function getUrlVars() {
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,
function(m,key,value) {
vars[key] = value;
});
return vars;
}
function openURL(){
window.location.href=decodeURIComponent(getUrlVars()["path"]);
}
</script>
</head>
<body onload="openURL()">
</body>
</html>
_
上記は私のアプリケーションで完全に機能しました。
次のコマンドは、渡されるすべてのクエリパラメータに対して機能します。
cmd/C set myvar = "%1"を呼び出し、set myvar = %% myvar:ie:= %%を呼び出し、start/separate "iexplore.exe" %% myvar %%を呼び出して終了します。
リンクにアンパサンドがあり、アンパサンドが削除された後はIE11で開かない場合は、二重引用符を使用する必要があります。