阅读:2242回复:11
如何提取地址栏中url的内容??有分送
知道一个窗口的句柄,如何提取该窗口中地址栏内的url内容呢?我是新手,就给这么多分吧。谢谢
|
|
沙发#
发布于:2005-03-13 15:41
getwindowtext
|
|
|
板凳#
发布于:2005-03-13 16:58
getwindowtext 先枚举窗口句柄,再用这个函数,因为工具栏也是窗口 |
|
|
地板#
发布于:2005-03-13 17:35
能不能再具体点楼上的?谢谢了~~~地址栏的句柄是什么呢
|
|
地下室#
发布于:2005-03-13 17:51
能不能再具体点楼上的?谢谢了~~~地址栏的句柄是什么呢 难道要把代码写出来 :P |
|
|
5楼#
发布于:2005-03-13 18:58
[quote难道要把代码写出来 :P [/quote]
偶是菜鸟~~是用win32汇编写的程序,但是功底还是弱弱的~~~ 不是偶懒~偶这两天一直捣弄这个~ 郁闷哦~~ 另外楼上三位,已经给你们分了:) 就是少了点 [编辑 - 3/13/05 by bisonal23] |
|
6楼#
发布于:2005-03-13 19:44
你不是已经有句柄了吗?
|
|
|
7楼#
发布于:2005-03-13 21:13
The GetWindowText function copies the text of the specified window\'s title bar (if it has one) into a buffer. If the specified window is a control, the text of the control is copied.我现在只能通过GetActiveWindow得到当前窗口的句柄,但是如何得到地址栏控件的句柄呢???希望高手不惜赐教~3ks
|
|
8楼#
发布于:2005-03-13 21:14
[quote]getwindowtext 先枚举窗口句柄,再用这个函数,因为工具栏也是窗口 [/quote] 工具栏是控件吧~~~ [编辑 - 3/13/05 by bisonal23] |
|
9楼#
发布于:2005-03-13 22:53
The GetWindowText function copies the text of the specified window\'s title bar (if it has one) into a buffer. If the specified window is a control, the text of the control is copied.我现在只能通过GetActiveWindow得到当前窗口的句柄,但是如何得到地址栏控件的句柄呢???希望高手不惜赐教~3ks 使用FindWindowEx、EnumWindows等函数来得到 |
|
|
10楼#
发布于:2005-03-14 11:10
说一句。任何控件都是窗体
|
|
11楼#
发布于:2005-03-15 14:27
已经搞定!谢谢大家
把自己的汇编代码贴出来,以后也许有人用得上 szIE db \'IEFrame\',0 szEdit db \'Edit\',0 hwnd dd ? chClassName db 100 dup(?) _JustWind proc ;获取当前活动窗口 invoke GetForegroundWindow mov hwnd, eax lea edi, chClassName invoke GetClassName, hwnd, edi, 100 lea edi, chClassName invoke lstrcmp, edi, offset szIE .if eax == 0 invoke EnumChildWindows, hwnd, _GetProc, 0 .end if _JustWind endp _GetProc proc _hwnd, _lParam local @buf[128]:byte invoke GetClassName, _hwnd, addr @buf, 128 invoke lstrcmp, addr @buf, offset szEdit .if eax == 0 invoke SendMessage, _hwnd, WM_GETTEXT, 128, addr @buf .if eax > 0 ;将buf内容进行处理 .end if .end if _GetProc endp ************************************************************ 下面还有我找到的vc代码和dephi的 vc第一个 //buff ist the handel to IE Windows char buffer[256]; HWND child; HWND ie; if(ie = ::FindWindow(\"IEFrame\",buff)) { if(child = ::FindWindowEx(ie,0,\"WorkerW\",0)) { if(child = ::FindWindowEx(child,0,\"ReBarWindow32\",0)) { if(child = ::FindWindowEx(child,0,\"ComboBoxEx32\",0)) { ::SendMessage(child,WM_GETTEXT,255,(long)&buffer[0]); CString test = buffer; AfxMessageBox(test); } } } } vc第二个 首先说一下IE窗口中,地址栏窗口到底在哪里?,IE窗口的类型是\"IEFRAME\", IEFRAME ---WorkerW ---RebarWindow32 ---ComboBoxEx32 (就在这里了,根据它就可以取得地址) ---ComboBox (根据它是不能取得地址的,为什么,我也不清楚,还望高手指教) ---EDIT (显示地址的编辑框,也可以由它取得) ---WorkerW (另一个子窗口,但是没有自己的子窗口) ---Shell DocObject View (真正的客户区,WebBrowse所在地,下面有众多的子窗口,层次也比较多) ---状态条子窗口 因此只要我们找到了地址栏所在的窗口就可以把它的文本取出来了。 下面是我的例子,取遍所有的顶层窗口,得到后用AfxMessageBox()把它显示出来,该段程序直接添加在OnButton()就可以了。 void CListenDlg::OnButton2() { HWND hIE=::FindWindow(\"IEFRAME\",0); //获得第一个IE窗口 HWND hbegin=hIE; //记录下来 bool bnext=false; while(hIE) { TCHAR bb[200]; //获取标题 ::SendMessage(hIE,WM_GETTEXT,200,(LPARAM)bb); CString ss(bb); //注意:explorer也是使用的IE窗口,也含有地址栏,判断是不是正在浏览网页的真正IE窗口 if(ss.Find(\"Microsoft Internet Explorer\")>0) //一般情况下这样判断是可以的,除非你的IE被别人恶意修改了,呵呵 { bool bfind=false; HWND hSub=::FindWindowEx(hIE,0,_T(\"WorkerW\"),0);//查找子窗口 while(hSub && !bfind) { HWND hss=::FindWindowEx(hSub,0,_T(\"ReBarWindow32\"),0); while(hss && !bfind) { //找到包含地址栏的窗口,取地址 HWND hs3=::FindWindowEx(hss,0,\"ComboBoxEx32\",0); if(hs3) { bfind=true; ::SendMessage(hs3,WM_GETTEXT,200,(LPARAM)bb); //::GetWindowText(hs3,bb,200); AfxMessageBox(bb); break; } } hSub=::FindWindowEx(hIE,hSub,_T(\"RebarWindow32\"),0); } } hIE=::GetNextWindow(hIE,GW_HWNDNEXT);//按照z-序向下找 //如果已经到最下边了,从hbegin开始向上找 if(!hIE && !bnext) { bnext=true; hIE=::GetNextWindow(hbegin,GW_HWNDPREV); } } } delphi function EnumChildWindowsProc(hwnd: Integer; lparam: Longint): Boolean; stdcall; var buffer: array[0..255] of char; begin Result := True; GetClassName(hwnd,buffer,256); if StrPas(Buffer)=\'Edit\' then begin SendMessage(hwnd,WM_GETTEXT,256,lparam); Result:=False; end; end; //SendMessage+WM_GETTEXT procedure TForm1.Button1Click(Sender: TObject); var hwnd: Integer; buffer: array[0..255] of char; begin hwnd := FindWindow(\'CabinetWClass\',nil); if hwnd< > 0 then begin EnumChildWindows(hwnd,@EnumChildWindowsProc,Integer(@buffer[0])); Caption := StrPas(buffer); end; end; …*********************************************** 最后感谢驱动网上各位高手的指点:) |
|