WebBroswer控件获取超链接、强制在本控件打开所有链接

这两天使用到Web控件进行浏览网页,我想很多人都会遇到一个问题,就是点击超链接会经常调出IE进行展示,找了很久才发现在控件的NewWindow3消息中可以进行处理,一开始我在NewWindow2的消息处理中处理,但是该函数没有携带超链接地址,而NewWindow3则携带了更多信息,包括超链接地址。

在对话框上右键选择“插入ActiveX控件”(前提是你新建工程的时候选择了支持ActiveX控件才能插入,我没有选择该项,泪~~),然后选择MicroSoft Web Broswer 控件,右键该控件绑定成员变量,给该变量添加事件NewWindow3的处理函数。

void CWebWindow::NewWindow3Explorer(LPDISPATCH* ppDisp, BOOL* Cancel, unsigned long dwFlags, LPCTSTR bstrUrlContext, LPCTSTR bstrUrl)
{
*Cancel = TRUE;  //取消弹出IE动作
m_ctrlWeb.Navigate(bstrUrl, NULL, NULL, NULL, NULL);//在web控件打开超链接地址
}

因为NewWindow3事件是在弹出新窗口的时候发生,其实还有其他情况会触发NewWindow3,MSDN对该事件说明如下:

 

The event is raised during the following actions:

  • The user clicks a link while pressing the SHIFT or CTRL key.
  • The user right-clicks a link and selects Open in New Window or Open in New Tab .
  • There is a targeted navigation to a frame name that does not yet exist, or _blank.
  • Script invokes window.open.
  • A browser application calls Navigate or Navigate2 with the navOpenInNewWindow flag. 

我发现有时候在点击网页上某些链接时并不弹出新窗口,而是直接在本控件打开,这个时候NewWindw3不会被触发,那就只能在别的事件里获取超链接了,我是在NavigateComplete2事件里获取链接的。

void CWebWindow::NavigateComplete2Explorer(LPDISPATCH pDisp, VARIANT* URL)
{
char* lpszText = _com_util::ConvertBSTRToString(URL->bstrVal);//BSTR转char*
}

顺便说下BSTR这个类型,维基百科解释如下:

C-Style 字符串
C程序语言本身原并不支援字串数据结构。字符串通常以一个字符数组(或称阵列)或一个指向字符资料的指标指标来表达。由于C语言的数组不包含其长度的资讯,故亦无法表示所载之字符串之长度。C语言社群对此通用之解决方案为于字符串末端增添一数值0的字符。C语言的标准程序库中的字符串处理功能亦以此为基础。C-Style 字符串特点为不直接包含长度资讯。要取得字符串之长度,就必须从头到尾数算字符数目,直到遇到字符0为止。由于不设长度资讯,故C-style 字符串的长度理论上可以无上限。

Pascal-style 字符串
Pascal程序语言采取另一种方向处理字符串。在储存字串的记忆空间的开首,储存一固定长度整数以表达其长度。如此Pascal-style 字符串不需要在最后增添额外字符以标明其结束。但由于字符串开首储存字串长度的空间有限,故Pascal-style 的字串长度有上限。但在获得字串长度方面有速度优势。

BSTR 字符串
BSTR 字符串结合了C-style 字符串和Pascal-style字符串。它在开首储存了字符串长度,在字符串结尾以字符0识别。和pascal-style 字符串不同,指向BSTR字符串的指标指向第一个字符,而非开首的字串长度。故此适用于读取C-style 字符串的程序库同样适用于BSTR字符串(但写入则另作别论)。如果获得其长度,则以其指标地址减去字符串长度数值所需空间,以获得其字串长度之地址。

了解下是什么就行了,我!只!关!注!怎!么!转!化!啊!

关于BSTR、char*和CString的转换见以下blog:

http://blog.youkuaiyun.com/zeuskaaba/article/details/4082826

第一次写bolg,记录下学到的东西。

 

 

智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的一些核心知识解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值