DOBON.NET DOBON.NETプログラミング掲示板過去ログ

e->Cancel = trueでキャンセルしたはずのIEが表示される

環境/言語:[Windows XP、Visual C++ 2005、.NET Framework 2.0]
分類:[.NET]

はじめまして。

Visual Studio 2005 で C++ のマネージアプリケーションで、ブラウザを作っているのですが、

WebBrowserコントロールを使用すると、新しいウィンドウはIEで開かれてしまいます。
そこで、以下のようにしてそのリンク先を表示することに成功しました。(ソースコードは問題ありですが・・・)

private: System::Void webBrowser1_NewWindow(System::Object^ sender, System::ComponentModel::CancelEventArgs^ e) {
e->Cancel = true;
try {
this->webBrowser1->Url = (gcnew System::Uri(this->webBrowser1->StatusText, System::UriKind::Absolute));
}
catch (Exception^) {
}
}

しかし、自分のアプリケーションの新しいウィンドウで、表示したいと思い、
Loadの処理を以下のようにしました。

private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
this->webBrowser1->StatusTextChanged += gcnew System::EventHandler(this, &Form1::webBrowser1_StatusTextChanged);
try {
String^ cmd = Environment::CommandLine;
int N = cmd->LastIndexOf("\"");
N++;
N++;
cmd = cmd->Remove(0,N);
this->webBrowser1->Url = (gcnew System::Uri(cmd, System::UriKind::Absolute));
}
catch(Exception^) {
this->webBrowser1->GoHome();
}
}

これで、「"C:\Internet.exe" http://www.yahoo.co.jp/」などとしたときにURLへジャンプするようになりました。
そこで、NewWindowの処理を以下のように書き換えてみました。

private: System::Void webBrowser1_NewWindow(System::Object^ sender, System::ComponentModel::CancelEventArgs^ e) {
e->Cancel = true;
Process^ proc = gcnew Process();
proc->StartInfo->FileName = Application::ExecutablePath;
proc->StartInfo->Verb = this->webBrowser1->StatusText;
proc->Start();
}

すると、e->Cancel = trueでキャンセルしたはずのIEが表示され、proc->Start()以降の処理が無視されるようになってしまいました。

長文になってしまい、申し訳ありませんが、C++に詳しい方の回答よろしくお願いします。
> proc->StartInfo->Verb = this->webBrowser1->StatusText;
Verb って、関連づけで使う「open」とかのことですよ。
あり得ない Verb を指定されたために Process::Start で例外が発生してるんじゃないでしょうかね(COM オブジェクト関連のイベント内の例外は暗黙に catch されて HRESULT に変換されます)。
コマンドライン引数を設定したいのなら、ProcessStartInfo::Arguments に設定してください。
言われたとおりにしたら動きました!
検索しても引っ掛からなくて困っていたので助かりました。
Hongliangさんありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板