WebBrowser リファレンス
Tablacus Explorer のメインウィンドウ、およびサブウィンドウ(オプション画面やダイアログ)に埋め込まれた Web ブラウザコントロール(CTRL_WB / CTRL_SW)のリファレンスです。
- 関連: te リファレンス(
te.Ctrl/te.CreateCtrl(CTRL_SW, ...)/te.Arguments)、api リファレンス、FolderView(ShellBrowser)リファレンス - 作成元:
TE/TE.cppのmethodWB[]とCteWebBrowser(コンストラクタ、Invoke、Close)、サブウィンドウのウィンドウプロシージャWndProc2の実装
記法: P=プロパティ、M=メソッド。メンバー名の照合は大文字小文字を区別しません。
目次
1. 概要
WebBrowser オブジェクトは、HTML ページを表示するウィンドウを表します。内部では次のどちらかが使われます。
| 種類 | 説明 |
|---|---|
| WebView2(Chromium ベース) | 優先して使われる。TE が用意した WebView2 用のコンポーネントを読み込めたとき(内部の判定値 g_nBlink が 1)。スクリプトエンジンも Edge の Chakra が選ばれる |
| IE の WebBrowser コントロール(MSHTML) | 上記が使えなかった場合の代替(g_nBlink が 2) |
どちらの場合も、このオブジェクトの Document や Window を通して、表示中のページの DOM や window オブジェクトにアクセスできます。
読み込まれたページからは、external(= te オブジェクト)経由で TE の機能を呼び出せます。
2. 取得方法
| 方法 | 説明 |
|---|---|
te.Ctrl(CTRL_WB) |
呼び出したスクリプトが動いているウィンドウの WebBrowser を返す。メインウィンドウのスクリプトからはメインの WebBrowser、サブウィンドウのページからはそのウィンドウの WebBrowser |
te.Ctrls(CTRL_WB) |
存在する WebBrowser すべて |
te.CreateCtrl(CTRL_SW, url, arguments, parent, width, height [, x, y]) |
新しいサブウィンドウを作って、その WebBrowser を返す(te リファレンス) |
イベントの Ctrl 引数 |
OnBeforeNavigate などで、Ctrl.Type == CTRL_WB なら WebBrowser(アドレスバーなどにドロップしたときの判定に使われる) |
非同期スクリプト(ui.js など WebView2 側)では await te.Ctrl(CTRL_WB) のように await が必要です。
3. メソッド
| 名前 | 戻り値 | 説明 |
|---|---|---|
Close() |
なし | ウィンドウを閉じる。ウィンドウをすぐに透明にしてから WM_CLOSE を送る(OnClose は呼ばれない) |
PreventClose() |
なし | OnClose の中で呼ぶと閉じる操作を取り消す(5章) |
Focus() |
なし | フォーカスを移す。WebView2 では IOleInPlaceObject を再アクティブにし、IE 版では親ウィンドウを前面に出す |
TranslateAccelerator(hwnd, msg, wParam, lParam) |
HRESULT | キー入力などのウィンドウメッセージを、内部のブラウザコントロールのアクセラレータ処理に渡す。4個の引数が必要。引数が足りない場合は E_NOTIMPL を返す |
4. プロパティ
| 名前 | 種別 | 説明 |
|---|---|---|
Type |
P(読み) | メインウィンドウの WebBrowser なら CTRL_WB、サブウィンドウなら CTRL_SW |
Data |
P | スクリプトが自由に保持できる値 |
hwnd |
P(読み) | ブラウザコントロールのウィンドウハンドル |
Document |
P | 表示中のページの document(IWebBrowser2.Document)。WebView2 のときは、値を代入すると内部の document プロパティを置き換える |
Window |
P(読み) | 表示中のページの window(HTML ウィンドウ)オブジェクト。取得できなければ空 |
Application |
P(読み) | 内部の IWebBrowser2.Application |
Visible |
P | ブラウザコントロールの表示/非表示 |
DropMode |
P(書き) | ブラウザコントロールへのファイルのドロップを受け付けるか(RegisterAsDropTarget)。WebView2 のときのみ有効で、IE 版では何も行わない。読み取りの値は返らない |
OnClose |
P(書き) | ウィンドウが閉じられるときに呼ばれる関数。引数は WebBrowser 自身(5章) |
5. イベント(OnClose)と閉じる処理
WebBrowser.OnClose = function (WB) { ... } を設定すると、ユーザーがウィンドウの「閉じる」ボタン(×)などで閉じようとしたとき、すぐには閉じずに、この関数が呼ばれます。関数の中で次のどちらかを行います。
| 呼び出し | 動作 |
|---|---|
WB.Close() |
閉じる処理を続行する(ウィンドウは空白ページへ移動したあと破棄される) |
WB.PreventClose() |
閉じる操作を取り消す(ウィンドウは開いたまま) |
OnCloseが設定されていないサブウィンドウで閉じる操作があったときは、そのまま閉じられます。OnCloseの呼び出しは、閉じる要求が出たウィンドウ(サブウィンドウ)でのみ行われます。WB.Close()でスクリプトから閉じた場合は、OnCloseは呼ばれません。OnCloseの中ではawaitが使える非同期関数も渡せます(options.jsがasync function (WB)を使用)。ただし、Close()/PreventClose()は、処理が終わるまで(非同期の確認が終わるまで)呼ばなければ、ウィンドウは閉じられない状態のままになります。- 閉じる処理のあと、
DocumentCompleteで空白ページに移動してからウィンドウが破棄される二段階の処理になっています。 - 実際の使用:
options.jsのInitOptionsが、変更があるときに「保存しますか」の確認を出し、ContinueOptionsでWebBrowser.PreventClose()を呼んで閉じるのをやめ、CloseWB(WebBrowser, true)で閉じています。ダイアログ系はReturnDialogResult(結果を返してWB.Close())をOnCloseに設定します。
6. メインウィンドウとサブウィンドウの違い
| 項目 | メイン(CTRL_WB) |
サブウィンドウ(CTRL_SW) |
|---|---|---|
| 取得 | te.Ctrl(CTRL_WB)(メインのスクリプトから) |
te.CreateCtrl(CTRL_SW, …) / サブウィンドウ内の te.Ctrl(CTRL_WB) |
OnClose |
呼ばれない(閉じる処理は te.OnClose 側) |
呼ばれる |
| ファイル/パスへのナビゲート | URL がファイルシステムのパス、::{…} 形式、または file:// と data: 以外の / を含む URL の場合、ブラウザで開かずに TE のウィンドウ/タブで開く |
同様の遷移キャンセルは行われない |
新しいウィンドウ(window.open など) |
TE 側でのオープンに置き換えられる(ブラウザでは開かない) | 同左 |
| 引数 | — | te.CreateCtrl(CTRL_SW, url, arguments, …) の arguments を、開かれたページが te.Arguments として一度だけ取得できる |
7. 定数
| 定数 | 値 | 説明 |
|---|---|---|
CTRL_WB |
0x20000 |
メインウィンドウの WebBrowser |
CTRL_SW |
0x20001 |
サブウィンドウの WebBrowser |
8. 使用例
// 1. サブウィンドウを開く(オプション画面の例に近い形)
const WB = te.CreateCtrl(CTRL_SW, "file:///C:/path/page.html", { name: "value" }, te.hwnd, 600, 400); // WebBrowser を返す
WB.OnClose = function (WB) {
// 確認なしで閉じる
WB.Close();
};
// 2. 閉じる前に確認して、取り消す
WB.OnClose = function (WB) {
// IDNO = 7 (api.MessageBox の戻り値)
if (api.MessageBox(te.hwnd, "閉じますか?", TITLE, MB_YESNO) == IDNO) {
WB.PreventClose(); // 取り消し
return;
}
WB.Close();
};
// 3. ページの DOM を読む
const doc = WB.Document;
const title = doc.title;
const win = WB.Window;
win.alert("hello");
// 4. 開かれたページ側(サブウィンドウ内)
// te.Arguments はこの値を一度だけ受け取って、クリアする
const args = te.Arguments;
const WebBrowser = te.Ctrl(CTRL_WB); // 自分自身の WebBrowser
WebBrowser.Close(); // 自分を閉じる
// 5. メインの WebBrowser(ドロップ先の判定)
te.OnDrop = function (Ctrl, dataObj, pgrfKeyState, pt, pdwEffect) {
if (Ctrl.Type == CTRL_WB) {
// アドレスバーなどにドロップされた
}
};
上の
te.CreateCtrl(CTRL_SW, ...)の引数の指定方法は te リファレンス のCreateCtrlの項を参照してください。OnDropの引数は、sync1.jsの実装での並び(Ctrl, dataObj, pgrfKeyState, pt, pdwEffect)に合わせています。TITLE・MB_YESNO・IDNOはconsts.jsなどで定義されているものを使う想定です(要確認)。