新規screenで開くようにしてみました。
#uselib "ole32.dll"
#func IIDFromString "IIDFromString" wstr, var
#define IID_IUnknown "{00000000-0000-0000-C000-000000000046}"
#usecom IUnknown IID_IUnknown
#comfunc IUnknown_QueryInterface 0 int, int
#define IID_IDispatch "{00020400-0000-0000-C000-000000000046}"
#define DIID_DWebBrowserEvents2 "{34A715A0-6587-11D0-924A-0020AFC7AC4D}"
#define DISPID_NEWWINDOW2 251
#define VARIANT_TRUE -1
#define VARIANT_FALSE 0
// ウィンドウ(comobj配列)の最大
// 2以上にして下さい。1にすると新しいウィンドウが開けません。
#define MAX_WINDOW 10
// comobj型の配列確保
dimtype ie, vartype("comobj"), MAX_WINDOW
dimtype ie_event, vartype("comobj"), MAX_WINDOW
axobj ie, "Shell.Explorer.2"
comevent ie_event, ie, DIID_DWebBrowserEvents2, *lb_event
ie->"Navigate" "http://www.onionsoft.net/hsp/"
onexit gosub *lb_exit
stop
*lb_event
sel = ginfo_sel // 現在の操作対象を保存
ev_id = ginfo_act // タブブラウザならタブアイテムのインデックスを使う
if (ev_id < 0) | (ev_id >= MAX_WINDOW) : return
gsel ev_id
switch comevdisp(ie_event(ev_id))
case DISPID_NEWWINDOW2
gosub *lb_OnNewWindow2
swbreak
swend
gsel sel // 操作対象を戻す
return
*lb_OnNewWindow2
// 使えるIDを探す
new_id = -1
repeat MAX_WINDOW
if varuse(ie(cnt)) == 0 : new_id = cnt : break
loop
if new_id == -1 {
comevarg v2, ie_event(ev_id), 1, 2
v2("value") = VARIANT_TRUE // 新しいウィンドウを開かない
dialog "これ以上開けません"
return
}
// 新規ウィンドウ作成
screen new_id
axobj ie(new_id), "Shell.Explorer.2"
comevarg v1, ie_event(ev_id), 0, 2 // 一つ目のパラメータをVARIANT型で取得
ppDisp = v1("refptr") // ppdispVal
// IID構造体に変換
dim iid, 4
IIDFromString IID_IDispatch, iid
// 新規ウィンドウ(IE)のIDispatchをppdispValに取得
IUnknown_QueryInterface ie(new_id), varptr(iid), ppDisp
// 新規ウィンドウのイベント設定
comevent ie_event(new_id), ie(new_id), DIID_DWebBrowserEvents2, *lb_event
return
*lb_exit
sel = ginfo_sel
gsel wparam, -1
clrobj
delcom ie_event(wparam)
delcom ie(wparam)
count = 0
repeat MAX_WINDOW
if varuse(ie(cnt)) : count++
loop
if count == 0 : end // 全て閉じていれば終了
gsel sel
return