扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:李汉鹏 来源:VCKBASE 2007年10月19日
关键字:

// 窗口标题"Microsoft Internet Explorer"的资源标识
#define IDS_MESSAGE_BOX_TITLE 2213
HRESULT CLhpHtmlView::OnShowMessage(HWND hwnd,
LPOLESTR lpstrText,
LPOLESTR lpstrCaption,
DWORD dwType,
LPOLESTR lpstrHelpFile,
DWORD dwHelpContext,
LRESULT * plResult)
{
//载入Shdoclc.dll 和IE消息框标题字符串
HINSTANCE hinstSHDOCLC = LoadLibrary(TEXT("SHDOCLC.DLL"));
if (hinstSHDOCLC == NULL)
return S_FALSE;
CString strBuf,strCaption(lpstrCaption);
strBuf.LoadString(hinstSHDOCLC, IDS_MESSAGE_BOX_TITLE);
// 比较IE消息框标题字符串和lpstrCaption
// 如果相同,用自定义标题替换
if(strBuf==lpstrCaption)
strCaption = m_DefaultMsgBoxTitle;
// 创建自己的消息框并且显示
*plResult = MessageBox(CString(lpstrText), strCaption, dwType);
//卸载Shdoclc.dll并且返回
FreeLibrary(hinstSHDOCLC);
return S_OK;
} 从代码中可以看到通过设定m_DefaultMsgBoxTitle的值来改变消息宽的标题,修改此值是同过SetDefaultMsgBoxTitle来实现 void CLhpHtmlView::SetDefaultMsgBoxTitle(CString strTitle)
{
m_DefaultMsgBoxTitle=strTitle;
}
怎样定制、修改浏览器向Web服务器发送的HTTP请求头GET /text7.htm HTTP/1.0 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, \ application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* Referer: http://localhost Accept-Language: en-us User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Poco 0.31; LHP Browser 1.01; \ .NET CLR 1.1.4322) Host: localhost Connection: Keep-Alive CHtmlView的 void Navigate2( LPCTSTR lpszURL, DWORD dwFlags = 0, LPCTSTR lpszTargetFrameName = NULL, LPCTSTR lpszHeaders = NULL, LPVOID lpvPostData = NULL, DWORD dwPostDataLen = 0 );函数参数lpszHeaders可以指定HTTP请求头,示例如下:
Navigate2(_T("http://localhost"),NULL,NULL, "MyDefineField: TestValue");
我们捕获的HTTP头如下: 
#define WM_NVTO (WM_USER+1000)
class NvToParam
{
public:
CString URL;
DWORD Flags;
CString TargetFrameName;
CByteArray PostedData;
CString Headers;
};
void CDemoView::OnBeforeNavigate2(LPCTSTR lpszURL,
DWORD nFlags,
LPCTSTR lpszTargetFrameName,
CByteArray& baPostedData,
LPCTSTR lpszHeaders,
BOOL* pbCancel)
{
CString strHeaders(lpszHeaders);
if(strHeaders.Find("User-Agent:LHPBrowser 1.0") < 0)// 检查头里有没有自定义的User-Agent串
{
*pbCancel = TRUE;// 没有,取消这次导航
if(!strHeaders.IsEmpty())
strHeaders += "\r\n";
strHeaders += "User-Agent:LHPBrowser 1.0";// 加上自定义的User-Agent串
NvToParam* pNvTo = new NvToParam;
pNvTo->URL = lpszURL;
pNvTo->Flags = nFlags;
pNvTo->TargetFrameName = lpszTargetFrameName;
baPostedData.Copy(pNvTo->PostedData);
pNvTo->Headers = strHeaders;
// 发送一个自定义的导航消息,并把参数发过去
PostMessage(WM_NVTO,(WPARAM)pNvTo);
return;
}
CHtmlView::OnBeforeNavigate2(lpszURL,
nFlags,
lpszTargetFrameName,
baPostedData,
lpszHeaders,
pbCancel);
}
LRESULT CDemoView::OnNvTo(WPARAM wParam, LPARAM lParam)
{
NvToParam* pNvTo = (NvToParam*)wParam;
Navigate2((LPCTSTR)pNvTo->URL,
pNvTo->Flags,
pNvTo->PostedData,
(LPCTSTR)pNvTo->TargetFrameName,
(LPCTSTR)pNvTo->Headers);
delete pNvTo;
return 1;
}
在OnBeforeNavigate2中如果发现没有自定义的User-Agent串,就加上这个串,并取消本次导航,再Post一个消息(一定要POST,让OnBeforeNavigate2跳出以后再进行导航 ),在消息中再次导航,再次导航时请求头已经有了自己的标识,所以能正常的导航。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。