我想用VC++写一段网页操作的程序,但不成功。同志们能不能帮我分析一下问题,理清一下编程思路。
我在一个网页上希望完成这样的任务:首先,我想在对话框中用一个Microsoft Web Browser控件打开一个网页,在上面获得一些链接。然后,将这些依次在另一个Microsoft Web Browser控件上,依次打开这些链接进行一些表单操作。
问题是:我在第一个控件上的DownloadCompleteExplorer1()函数使用Navigate()函数,想在第二个控件上依次打开链接的网页,在DownloadCompleteExplorer2()函数中进行相关操作。但是实际上每次运行都只能打开最后一个链接。也就是说,使用Navigate()函数后,并不等待第二个控件的DownloadComplete事件执行,就继续第一个控件DownloadCompleteExplorer1()的下一条语句。(我想第一个控件的DownloadCompleteExplorer1()没执行完,是不会执行第二个控件的DownloadCompleteExplorer2()函数的。)怎样解决上面的问题呢?我想可能需要用多线程,但是多线程我正在学习中,同志们能给些解决办法吗?最好有例程。
不胜感激!
VC++怎样进行多网页操作?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答
- ChatGPTᴼᴾᴱᴺᴬᴵ 2023-02-25 16:49关注
该回答引用ChatGPT
您的问题可能是因为在第一个WebBrowser控件的DownloadComplete事件处理函数中,使用了异步方式Navigate到链接页面,导致第二个WebBrowser控件的DownloadComplete事件处理函数在第一个WebBrowser控件的DownloadComplete事件处理函数之前触发,从而导致第二个WebBrowser控件只打开最后一个链接页面。
为了解决这个问题,您可以考虑使用同步方式Navigate到链接页面,即在第一个WebBrowser控件的DownloadComplete事件处理函数中,在调用第二个WebBrowser控件的Navigate函数之前,先等待第一个WebBrowser控件的Navigate完成。您可以使用WebBrowser控件的ReadyState属性来判断页面是否已经加载完毕,当ReadyState属性为READYSTATE_COMPLETE时,表示页面已经加载完成。
以下是示例代码,供您参考:
// 定义成员变量 CStringArray m_links; // 存储链接 int m_currentLinkIndex; // 当前链接索引 // 第一个WebBrowser控件的DownloadComplete事件处理函数 void CMyDialog::DownloadCompleteExplorer1() { // 获取链接 IHTMLDocument2Ptr spDoc = m_webBrowser1.GetDocument(); IHTMLElementCollectionPtr spLinks = spDoc->links; long linksCount = spLinks->length; for (long i = 0; i < linksCount; i++) { IHTMLElementPtr spLink = spLinks->item(i); CString link = spLink->getAttribute(_T("href"), 0); m_links.Add(link); } // 依次打开链接 m_currentLinkIndex = 0; NavigateToNextLink(); } // 第二个WebBrowser控件的DownloadComplete事件处理函数 void CMyDialog::DownloadCompleteExplorer2() { // 在页面加载完毕后执行相关操作 // ... // 继续打开下一个链接 m_currentLinkIndex++; NavigateToNextLink(); } // 导航到下一个链接 void CMyDialog::NavigateToNextLink() { if (m_currentLinkIndex < m_links.GetCount()) { // 等待第一个WebBrowser控件的Navigate完成 while (m_webBrowser1.get_ReadyState() != READYSTATE_COMPLETE) { Sleep(100); } // 在第二个WebBrowser控件中打开链接 CString link = m_links[m_currentLinkIndex]; m_webBrowser2.Navigate(link, NULL, NULL, NULL, NULL); } }
在上面的示例代码中,我们使用了一个CStringArray类型的成员变量m_links来存储链接,使用一个整型成员变量m_currentLinkIndex来表示当前链接的索引。在第一个WebBrowser控件的DownloadComplete事件处理函数中,我们先获取链接,并将它们存储到m_links数组中,然后设置m_currentLinkIndex为0,调用NavigateToNextLink函数来依次打开链接。
在NavigateToNextLink函数中,我们首先判断当前链接的索引是否小于链接数组的长度,如果是,就等待第一个WebBrowser控件的Navigate完成,然后在第二个WebBrowser控件中打开链接。如果当前链接的索引已经等于链接数组的长度,就表示所有链接已经打开完成,函数执行结束。
通过上述方式,我们可以确保在第一个WebBrowser控件的Navigate完成之后才会调用第二个WebBrowser控件的Navigate函数,从而避免了第二个WebBrowser控件只打开最后一个链接页面的问题。
需要注意的是,上述代码中使用了一个简单的等待方式来等待第一个WebBrowser控件的Navigate完成,这样会造成CPU的浪费。更好的方式是使用事件通知机制来通知第二个WebBrowser控件,第一个WebBrowser控件的Navigate已经完成,可以打开下一个链接了。如果您已经熟悉了多线程编程,可以使用多线程来实现这个功能。
解决 无用评论 打赏 举报
悬赏问题
- ¥20 删除和修改功能无法调用
- ¥15 kafka topic 所有分副本数修改
- ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
- ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
- ¥40 串口调试助手打开串口后,keil5的代码就停止了
- ¥15 电脑最近经常蓝屏,求大家看看哪的问题
- ¥60 高价有偿求java辅导。工程量较大,价格你定,联系确定辅导后将采纳你的答案。希望能给出完整详细代码,并能解释回答我关于代码的疑问疑问,代码要求如下,联系我会发文档
- ¥50 C++五子棋AI程序编写
- ¥30 求安卓设备利用一个typeC接口,同时实现向pc一边投屏一边上传数据的解决方案。
- ¥15 SQL Server analysis services 服务安装失败