这是个老梗了,也没什么技术含量。因为自从接触Linux之后,Windows上我所知道的那一点api基本上都忘光了。所以这样的博文可以当做是备忘,说不定有天还能用的到。
Windows上想要获取浏览器的地址栏信息,基本思路是枚举浏览器的子窗体,然后获取hwnd(handle of window),最后使用SendMessage & WM_GETTEXT(或者 GetWindowText大体上没什么区别)。好,基于这样的事实,我们来做个简单的实现。
1.获取IE窗口
这个很简单通过FindWindow就可以做到,前提是我们已经知道了IE8的ClassName(窗口的类名称)是“IEFrame”。这样的话,用FindWindow这样的函数,就可以直接获取。当然,如果你是像获取Chrome这类浏览器,请先在Spy++中抓取窗口看看类名称。
2.通过枚举得到地址栏子窗体
使用Spy++可以很轻松地得到IE8的子窗体分布情况,请看下图:
下面两个我就不列出来了(因为编辑这个太累了),我们需要获取的是这样一个路径:IEFrame->WorkerW->RebarWindow32->Address Band Root->Edit。
到此为止基本上问题分析就已经结束了,直接上代码吧(叙述真累人)。
3.代码
Private Function GetIE8Url() As String Dim hwnd As Long 'default 0, which eq top-hwnd. Dim lpsz1 Dim url As String * 2048 Dim length As Long For Each lpsz1 In Array("IEFrame", _ "WorkerW", _ "ReBarWindow32", _ "Address Band Root", _ "Edit") hwnd = FindWindowEx(hwnd, 0&, lpsz1, vbNullString) Next length = SendMessage(hwnd, WM_GETTEXT, 2048&, ByVal url) GetIE8Url = Left(url, length) End Function
如上所示,获取IE8地址栏URL信息的函数就实现了。我没有写函数声明,和容错处理,因为这样的函数是在确定IE8在运行的情况下执行的(当然你可以改写)。