ie浏览器是什么东西 vc获取ie浏览历史
vc获取ie浏览历史
1.如何获取IE地址栏句柄
所有的IE都是在一个进程中不同的线程中运行的,所以用一般的方法是不太好用的,我以前也做了一个获取IE句柄的程序,不过是很久以前的事情了,凭记忆随便讲一下吧,可能还要你自己在去研究一下
1。在头文件中加入以下几行(我只稍稍试了试,没有做到底)
#include
#import"ms.tlb"

//或msthml.dll
#import"showcvw.dll"exclude("tagREADYSTATE")
2。用CoInitialize(NULL)与CoUninitalize()来初始化COM接口
3。IE未在运行对象表中注册,而是在ShellWindows中,声明以下变量用以得到ShellWindows对象
SHDocVw::IShellWindowsPtr spsWnds;
spsWnds.CreateInstance(__uuidof(SHDocVw::ShellWindows));
if( NULL == spsWnds )
//没有Shellwindow启动,IE也就没运行了
long count = spsWnds->GetCount;
if( count//没有Shellwindow启动,IE也就没运行了
//==0时有一个
4.获取一个IE窗口
IDispatchPtr spDisp;
long index; //从0到Count-1循环
_variant_t va(index , VI_I4 );
spDisp=spsWnd->Item( va );
SHDocVw::IWebBrowserzPtr spBrowser( spDisp );
if( NULL == spBrowser )
//无IE运行
得到IE后就可以用GetDocument与SetDocument等此类的函数来控制此IE了(很长时间了,有些什么函数也忘了,不过如果对VC与COM都较熟的话获得IE后就很简单了)
另外还得视当前的IE版本灵活应用,不同的版本相应函数也不同
2.如何获得打开的ie窗口数量(vc)
我的思路是使用API函数EnumWindows枚举所有的窗口句柄,再用GetClassName获取句柄的类名称,如果是IEFrame则认为是IE窗口。
代码如下: Private Sub cmdGetIEWindowCount_Click IEWindowCount = 0 Me.AutoRedraw = True EnumWindows AddressOf EnumWindowsProc, ByVal 0& MsgBox "一共找到" & CStr(IEWindowCount) & "个IE窗口" End Sub '------------------模块内容------------------------- Public IEWindowCount As Integer Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean Dim lpClassName As String, RetVal As Long lpClassName = Space(256) RetVal = GetClassName(hwnd, lpClassName, 256) If Left$(lpClassName, RetVal) = "IEFrame" Then IEWindowCount = IEWindowCount + 1 End If EnumWindowsProc = True End Function补充:不好意思,我以为是VB,你自己看着改吧。
3.用socket编写web浏览器如何实现查看历史记录函数啊
-- win API socket本文所谈到的Socket函数如果没有特别说明,都是指的Windows Socket API。
一、WSAStartup函数int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData );使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。
当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。
该函数执行成功后返回0。例:假如一个程序要使用2.1版本的Socket,那么程序代码如下wVersionRequested = MAKEWORD( 2, 1 );err = WSAStartup( wVersionRequested, &wsaData );二、WSACleanup函数int WSACleanup (void);应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket库的绑定并且释放Socket库所占用的系统资源。
三、socket函数SOCKET socket(int af, int type, int protocol );应用程序调用socket函数来创建一个能够进行网络通信的套接字。第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置PF_INET;第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM;第三个参数指定应用程序所使用的通信协议。
该函数如果调用成功就返回新创建的套接字的描述符,如果失败就返回INVALID_SOCKET。套接字描述符是一个整数类型的值。
每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。
每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数据结构都是在操作系统的内核缓冲里。下面是一个创建流套接字的例子:struct protoent *ppe;ppe=getprotobyname("tcp");SOCKET ListenSocket=socket(PF_INET,SOCK_STREAM,ppe->p_proto);四、closesocket函数int closesocket(SOCKET s );closesocket函数用来关闭一个描述符为s套接字。
由于每个进程中都有一个套接字描述符表,表中的每个套接字描述符都对应了一个位于操作系统缓冲区中的套接字数据结构,因此有可能有几个套接字描述符指向同一个套接字数据结构。套接字数据结构中专门有一个字段存放该结构的被引用次数,即有多少个套接字描述符指向该结构。
当调用closesocket函数时,操作系统先检查套接字数据结构中的该字段的值,如果为1,就表明只有一个套接字描述符指向它,因此操作系统就先把s在套接字描述符表中对应的那条表项清除,并且释放s对应的套接字数据结构;如果该字段大于1,那么操作系统仅仅清除s在套接字描述符表中的对应表项,并且把s对应的套接字数据结构的引用次数减1。closesocket函数如果执行成功就返回0,否则返回SOCKET_ERROR。
五、send函数int send(SOCKET s, const char FAR *buf, int len, int flags );不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。
该函数的第一个参数指定发送端套接字描述符;第二个参数指明一个存放应用程序要发送数据的缓冲区;第三个参数指明实际要发送的数据的字节数;第四个参数一般置0。这里只描述同步Socket的send函数的执行流程。
当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲区的长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余空间大小send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)。如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。
要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端。如果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。
(每一个除send外的Socket函数在执行的最开始。
4.VC++ 实现找到相应ie窗口并写入相应信息
先声明一个EnumWindowsProc ,比如:BOOL CALLBACK EnumWindowsProc_1(HWND hwnd,LPARAM lparam) ;然后实现此函数,比如:BOOL CALLBACK EnumWindowsProc_1(HWND hwnd,LPARAM lparam){ char lpWinTitle[256]; ::GetWindowText(hwnd,lpWinTitle,256-1); CString m_strTitle; m_strTitle.Format("%s",lpWinTitle); if(m_strTitle.Find("Inter Explorer")!=-1) { AfxMessageBox("这是一个IE窗口!") ; } return TRUE ;}然后就可以在其他地方调用EnumWindows的时候使用回调函数,比如:::EnumWindows(EnumWindowsProc_1,0) ;这是枚举出IE窗口的方法。