问题描述
我用C#做一个WINFORM程序,用来抓取某个网页上的TETXBOX再往里面填数据。但这个网页是用openModalDialog方法弹出的窗口,我只能找到它的父窗口找不到它,上午查了半天还是没得法,请各位大虾指点小子一、二。
解决方案
解决方案二:
constintWM_GETTEXT=0x000D;constintWM_SETTEXT=0x000C;constintWM_CLICK=0x00F5;[DllImport("User32.dll",EntryPoint="FindWindow")]privatestaticexternIntPtrFindWindow(stringlpClassName,stringlpWindowName);[DllImport("user32.dll",EntryPoint="FindWindowEx")]privatestaticexternIntPtrFindWindowEx(IntPtrhwndParent,IntPtrhwndChildAfter,stringlpszClass,stringlpszWindow);[DllImport("User32.dll",EntryPoint="SendMessage")]privatestaticexternintSendMessage(IntPtrhWnd,intMsg,IntPtrwParam,stringlParam);voidPopLogin(){//下面的这些参数都可以用Spy++查到stringlpszParentClass="#32770";//整个窗口的类名stringlpszParentWindow="登录窗口标题";//窗口标题//stringlpszClass="Edit";//需要查找的子窗口的类名,也就是输入框stringlpszClass_Submit="Button";//需要查找的Button的类名stringlpszName_Submit="确定";//需要查找的Button的标题stringtext="";IntPtrParenthWnd=newIntPtr(0);IntPtrEdithWnd=newIntPtr(0);IntPtrip=newIntPtr(0);//查到窗体,得到整个窗体ParenthWnd=FindWindow(lpszParentClass,lpszParentWindow);//判断这个窗体是否有效if(!ParenthWnd.Equals(IntPtr.Zero)){EdithWnd=FindWindowEx(ParenthWnd,EdithWnd,"SysCredential","");if(!EdithWnd.Equals(IntPtr.Zero)){ip=EdithWnd;EdithWnd=FindWindowEx(ip,newIntPtr(0),"Edit","");if(!EdithWnd.Equals(IntPtr.Zero)){text="你的密码";SendMessage(EdithWnd,WM_SETTEXT,(IntPtr)0,text);retval++;}EdithWnd=FindWindowEx(ip,newIntPtr(0),"ComboBoxEx32","");if(!EdithWnd.Equals(IntPtr.Zero)){ip=EdithWnd;EdithWnd=FindWindowEx(ip,newIntPtr(0),"ComboBox","");if(!EdithWnd.Equals(IntPtr.Zero)){ip=EdithWnd;EdithWnd=FindWindowEx(ip,newIntPtr(0),"Edit","");if(!EdithWnd.Equals(IntPtr.Zero)){text="你的账号";//调用SendMessage方法设置其内容SendMessage(EdithWnd,WM_SETTEXT,(IntPtr)0,text);retval++;}}}}//得到Button这个子窗体,并触发它的Click事件EdithWnd=FindWindowEx(ParenthWnd,newIntPtr(0),lpszClass_Submit,lpszName_Submit);if(!EdithWnd.Equals(IntPtr.Zero)){SendMessage(EdithWnd,WM_CLICK,(IntPtr)0,"0");retval++;}}}
解决方案三:
我调用了usingmshtml;usingSHDocVw;
解决方案四:
网页并不是普通Windows应用程序,你用Spy++是无法抓取网页上的Textbox等控件的,所以1楼的办法是对网页没有作用的.对于网页弹出框,你有两个选择.1.使用MSAA技术,Google"MicrosoftActiveAccessibility"2.获取弹出框的handle,这个你可以用FindWindows,然后注册WM_HTML_GETOBJECT消息来获取IHTMLDocument接口,就可以操作里面的控件了.IntPtrieServerHandle=//弹出框的"InternetExplorer_Server"handle.intnMsg=Win32API.RegisterWindowMessage("WM_HTML_GETOBJECT");UIntPtrlRes;if(Win32API.SendMessageTimeout(ieServerHandle,nMsg,0,0,Win32API.SMTO_ABORTIFHUNG,1000,outlRes)==0){returnnull;}return(HTMLDocument)Win32API.ObjectFromLresult(lRes,typeof(IHTMLDocument).GUID,IntPtr.Zero);
解决方案五:
呵呵,没看清楼主的需求,不好意思,我那个是针对弹出式登录的。
解决方案六:
引用3楼shrinerain的回复:
网页并不是普通Windows应用程序,你用Spy++是无法抓取网页上的Textbox等控件的,所以1楼的办法是对网页没有作用的.对于网页弹出框,你有两个选择.1.使用MSAA技术,Google"MicrosoftActiveAccessibility"2.获取弹出框的handle,这个你可以用FindWindows,然后注册WM_HTML_GETOBJECT消息来获取IHTMLDocument接口,就可以操作里面的控件了.C#codeIntPtrieServerHandle=//弹出框的"InternetExplore…
厉害!
解决方案七:
厉害