C# IE操作 新しいタブ・ウインドウを追いかけるには
解決済
回答 1
投稿
- 評価
- クリップ 1
- VIEW 7,761
お世話になります
C#からIEの自動操作をしたいと思っています。
C#コード中でIEを起動し、DocumentCompleteイベントを登録しています。
確かにページ遷移でイベントは実行されるのですが、新しいタブを開いたり、ポップアップウインドウが出現したりしたときはイベントが実行されません。。。
どのようにして全てのタブ・ウインドウを追いかければよいでしょうか
(WebBrowserControlだとnewWindowとかnewWindow2を実装してやりました)
やりたいこと
IEをC#アプリ側から操作して、新しいタブやポップアップウインドウが開いてもそれらに対してDocumentCompleteイベントが起動して欲しい。DOM操作をする
(例)ある操作をすると、ポップアップウインドウが開いて「操作が完了しました/失敗しました」と表示するようなサイトへの対応
WebBrowserControlだとネット上にかなりの量の情報が転がっているのですが
IEのほうはあまり数が多くなく(excelマクロのほうはそこそこあるみたいなのでそれを参考にしたりもしてます)、困っています。加えて参考になるサイト等を教えていただけますと幸いです
よろしくお願いいたします。
public void StartIE(string url) {
ie = new SHDocVw.InternetExplorer();
ie.Navigate(url);
ie.Visible = true;
ie.NavigateComplete2 += Ie_NavigateComplete2;
ie.DocumentComplete += Ie_DocumentComplete;
}
//こんな感じ・・・
private void Ie_NavigateComplete2(object pDisp, ref object URL) {
Console.WriteLine("L URL =" + ie.LocationURL);
Console.WriteLine("L URL2 = " + ((SHDocVw.InternetExplorer)pDisp).LocationURL);
Console.WriteLine("NextUrl=" + URL.ToString());
//throw new NotImplementedException();
}
private void Ie_DocumentComplete(object pDisp, ref object URL) {
//処理とか
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
自分はSHDocVw.InternetExplorerを使用したことが無かったのですが、回答が付かないみたいなので少し調べてみました。
中途半端ですがとりあえずヒントになればと思います。
stackoverflow.com
をヒントに
public void StartIE(string url) {
~ 同じなので省略 ~
ie.NewWindow3 += Ie_NewWindow3;
}
//こんな感じ・・・
private void Ie_NavigateComplete2(object pDisp, ref object URL) {
~ 同じなので省略 ~
}
// 新しいWindowの処理
private void Ie_NewWindow3(ref object ppDisp, ref bool Cancel, uint dwFlags, string bstrUrlContext, string bstrUrl) {
SHDocVw.InternetExplorer newIe = new SHDocVw.InternetExplorer();
ppDisp = newIe.Application;
newIe.NavigateComplete2 += Ie_NavigateComplete2;
newIe.DocumentComplete += Ie_DocumentComplete;
newIe.NewWindow3 += Ie_NewWindow3;
}
private void Ie_DocumentComplete(object pDisp, ref object URL) {
~ 同じなので省略 ~
}
という感じで
NewWindow3イベントで新しく作成したオブジェクトを設定することでとりあえず動作しました。
但しこのままでは以下の問題もありますし、自分自身、正しく理解していないコードなので修正・調査して頂けたらと思います。(特にcomオブジェクトのようなので解放処理に気を付けてください)
問題点1:解放処理は書いてません
問題点2:新しいタブで開くを選択した場合でも新しいWindowで開いてしまいます。
問題点2のほうは新たに作成したSHDocVw.InternetExplorerに対して何らかの設定を行うことが可能かもしれません・・・
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/05/08 23:45
ppDisp に ie.applicationを渡すのがキモだったんですね
一歩進むことができました
ありがとうございました。
問題点1、2も自分の技術ではなかなか大変ではありますが、まずはいろいろチャレンジしてみたいと思います
今後質問のリクエストをさせていただくかもしれませんがよろしくお願いいたします