让网页加载完后自动修改选项卡名称,结果失败,求指教!

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: 让网页加载完后自动修改选项卡名称,结果失败,求指教!

Re: 让网页加载完后自动修改选项卡名称,结果失败,求指教!

Post by tmplinshi » 06 Jun 2015, 05:06

上面的代码使用了两个事件响应函数。发了个求助帖解决了此问题。

Code: Select all

global HTab

Gui, Add, Tab2, w1280 h320 HwndHTab, a|b
Gui, Add, ActiveX, wp-20 hp-40 vWB1, Shell.Explorer
Gui, Tab, 2
Gui, Add, ActiveX, wp hp vWB2, Shell.Explorer
Gui, Show

For i, url in ["http://www.sohu.com", "http://www.baidu.com"]
{
    WB%i%.Silent := True
    WB%i%.Navigate(url) 
    ComObjConnect(WB%i%, new WB_Events(i))
}
Return

class WB_Events {
    __New(TabIdx) {
        this.TabIdx := TabIdx
    }
    TitleChange(title) {
        TabSetText(HTab, this.TabIdx, title)
    }
    NewWindow3(ppDisp, Cancel, dwFlags, bstrUrlContext, bstrUrl, WB) {
        cancel[] := true ; 取消弹出新窗口
        WB.Navigate(bstrUrl)
    }
}

TabSetText(HTAB, Item, ItemText) { ; Extracted from just me's Class_GuiTabEx.ahk
    Static TCIF_TEXT := 0x0001
    Static OffTxP := (3 * 4) + (A_PtrSize - 4)
    Static TCM_SETITEM := A_IsUnicode ? 0x133D : 0x1306   ; TCM_SETITEMW : TCM_SETITEMA
    Static Size := (5 * 4) + (2 * A_PtrSize) + (A_PtrSize - 4)
    VarSetCapacity(TCITEM, Size, 0)
    NumPut(TCIF_TEXT, TCITEM, 0, "UInt")
    NumPut(&ItemText, TCITEM, OffTxP, "Ptr")
    SendMessage, TCM_SETITEM, Item - 1, &TCITEM, , % "ahk_id " . HTAB
}

DisableSetRedraw() {
    static _ := OnMessage(0x0B, "DisableSetRedraw") ; WM_SETREDRAW = 0x0B
    return 0
}

GuiClose:
ExitApp

Re: 让网页加载完后自动修改选项卡名称,结果失败,求指教!

Post by tmplinshi » 05 Jun 2015, 16:24

NavigateComplete2 并不是代表网页加载完成,而是代表导航(打开网址)完成。
DocumentComplete 事件才表示加载完毕。获取标题的话,用 TitleChange 事件最合适了。(了解更多事件 -> https://msdn.microsoft.com/en-us/librar ... s.85).aspx)

Code: Select all

gui,new
Gui ,+Resize
Gui, Add, Tab2,x0 y0 w1280 h720 vTabGroup HwndHTab, General|New  ;添加组框架,包含两页
Gui,Tab,General ;对第一页进行设置
Gui, Add, ActiveX, w1270 h700 vWB, Shell.Explorer ;把浏览器添加到第一页
Gui,Tab,New
Gui, Add, ActiveX, w1270 h700 vWB2, Shell.Explorer
Gui, Tab  ; 随后的控件不属于任何选项卡控件的一部分.
Gui,Show

global HTab ; <-- 全局变量,在函数中可访问

WB.Silent := True ; 这一句可以避免一些网页弹出脚本错误
WB.Navigate("http://www.sohu.com") 
ComObjConnect(WB, wb1_Events)  ; 连接WB事件到WB1_events类对象

WB2.Silent := True ; 这一句可以避免一些网页弹出脚本错误
WB2.Navigate("http://www.baidu.com")
ComObjConnect(WB2, wb2_Events)  ; 连接WB事件到WB2_events类对象
Return

class wb1_Events {
    TitleChange(title) {
        TabSetText(HTab, 1, title)
    }
}
class wb2_Events {
    TitleChange(title) {
        TabSetText(HTab, 2, title)
    }
}
Return
 
GuiClose:
ExitApp

DisableSetRedraw() {
    static _ := OnMessage(0x0B, "DisableSetRedraw") ; WM_SETREDRAW = 0x0B
    return 0
}

TabSetText(HTAB, Item, ItemText) { ; Extracted from just me's Class_GuiTabEx.ahk
    Static TCIF_TEXT := 0x0001
    Static OffTxP := (3 * 4) + (A_PtrSize - 4)
    Static TCM_SETITEM := A_IsUnicode ? 0x133D : 0x1306   ; TCM_SETITEMW : TCM_SETITEMA
    Static Size := (5 * 4) + (2 * A_PtrSize) + (A_PtrSize - 4)
    VarSetCapacity(TCITEM, Size, 0)
    NumPut(TCIF_TEXT, TCITEM, 0, "UInt")
    NumPut(&ItemText, TCITEM, OffTxP, "Ptr")
    SendMessage, TCM_SETITEM, Item - 1, &TCITEM, , % "ahk_id " . HTAB
}

让网页加载完后自动修改选项卡名称,结果失败,求指教!

Post by youwantme » 05 Jun 2015, 09:02

在两个选项卡(Tab2)上分别放置了一个网页。我希望每次网页加载完毕后,都自动将选项卡的名字改为该网页的Title,代码如下,结果失败。

求高手指教,谢谢!!

Code: Select all

gui,new
Gui ,+Resize
Gui, Add, Tab2,x0 y0 w1280 h720 vTabGroup, General|New  ;添加组框架,包含两页
Gui,Tab,General ;对第一页进行设置
Gui, Add, ActiveX, w1270 h700 vWB, Shell.Explorer ;把浏览器添加到第一页
Gui,Tab,New
Gui, Add, ActiveX, w1270 h700 vWB2, Shell.Explorer
Gui, Tab  ; 随后的控件不属于任何选项卡控件的一部分.
Gui,Show
WB.Silent := True ; 这一句可以避免一些网页弹出脚本错误
WB2.Silent := True ; 这一句可以避免一些网页弹出脚本错误
WB.Navigate("http://www.sohu.com") 
WB2.Navigate("http://www.baidu.com")
ComObjConnect(WB, WB_events)  ; 连接WB事件到WB_events类对象
Return

class WB_events  ;链接到前面的Web事件
{
    NavigateComplete2(wb, NewURL)  ;网页加载完成时,执行下列命令
    {
	Name1:=wb.document.title
	Name2:=wb2.document.title
	GuiControl,, TabGroup, |%Name1%|%Name2%
    }
}
Return

GuiClose:
exitapp

Top