关于CppWebBrowser消息拦截的问题!!各位帮忙:)

sun_wyz 2003-04-15 05:26:23
我最近写了一个浏览器玩,
想拦截CppWebBrowser上鼠标点饥连接的消息,并取得点饥连接的地址,
但好象CppWebBowser没有提供接口函数,
不知道怎样才能够达到以上的目的呢??

各位大虾帮忙!!
...全文
60 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sun_wyz 2003-09-07
  • 打赏
  • 举报
回复
揭帖,有空我再试试,多谢叶子!!!

叶子哟 2003-09-07
  • 打赏
  • 举报
回复
用如下方法安装: hMsgHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,0,GetCurrentThreadId());
叶子哟 2003-09-07
  • 打赏
  • 举报
回复
你应该判断NewWindow2这个事件!
你也可以用钩子,不是dll,直接跟踪左键事件,当然得用接口了!判断点击时,当前的活动网页控件应该是<a></a>就对了
给你参考一下吧:
//通过Hook(WH_GETMESSAGE)截获窗口的消息

LRESULT CALLBACK GetMsgProc(int code,WPARAM wParam,LPARAM lParam)
{
if(code < 0)
return CallNextHookEx(hMsgHook,code,wParam,lParam);
//CallNextHookEx(hMsgHook,code,wParam,lParam);

MSG *Msg = (MSG*)lParam; //获取消息类型
// CoInitialize(NULL); //必须要这句初始化
//再把消息发回
//CallNextHookEx(hMsgHook,code,wParam,lParam);

// Msg->message == WM_KEYDOWN && Msg->wParam == VK_RETURN) 回车键
// Msg->message == WM_KEYDOWN && Msg->wParam == VK_TAB 切换键

try
{
if(Msg->message == WM_LBUTTONUP ||(Msg->message == WM_KEYUP && Msg->wParam == VK_TAB)) //鼠标左键
{
HWND hControl;
char ClassBuf[64];
AnsiString CtrlClassName;

hControl = Msg->hwnd;

ZeroMemory(ClassBuf,sizeof(ClassBuf));
GetClassName(hControl,ClassBuf,sizeof(ClassBuf));
CtrlClassName = AnsiString(ClassBuf);

//必须在IE页面上单击才进行处理
if(CtrlClassName != "Internet Explorer_Server" && CtrlClassName != "Internet Explorer_TridentCmboBx")
{

// CoUninitialize();
return CallNextHookEx(hMsgHook,code,wParam,lParam);
}
//////////////
HINSTANCE hInst;

hInst = LoadLibrary("OLEACC.DLL");
if(hInst != NULL)
{
IHTMLDocument2 *m_spActiveDoc2=NULL;
LPFNOBJECTFROMLRESULT pfnObjectFromLresult=NULL;
DWORD dwMsg;
LRESULT lRes;
HRESULT hr;

//查询当前鼠标单击的地方所对应的IHTMLDocument2对象
dwMsg = ::RegisterWindowMessage("WM_HTML_GETOBJECT");
SendMessageTimeout(hControl, dwMsg,0,0,SMTO_ABORTIFHUNG,1000,(DWORD*)&lRes);

pfnObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress(hInst,"ObjectFromLresult");

if(pfnObjectFromLresult != NULL)
{
hr = (*pfnObjectFromLresult)(lRes,IID_IHTMLDocument,0,(void**)&m_spActiveDoc2);

/* WCHAR strDoc[] = L"{626fc520-a41e-11cf-a731-00a0c9082637}";
//IID_IHTMLDocument2 CLSID
CLSID uuidDoc;
HRESULT hrDoc = CLSIDFromString((LPOLESTR)strDoc,
&uuidDoc //IID_IHTMLDocument2
);

HRESULT hr = (*pfnObjectFromLresult)( lRes, uuidDoc,
//IID_IHTMLDocument,
0, (void**)&m_spActiveDoc2);

*/
if(SUCCEEDED(hr))
{
// MessageBox(NULL,(FormatDateTime("yyyymmddhhnnss",Now())).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING);
IHTMLElement *m_spActiveElement;
//查询当前被单击的Element对象
hr = m_spActiveDoc2->get_activeElement(&m_spActiveElement);

if(SUCCEEDED(hr))
{
BSTR TagNameBStr;
AnsiString TagName;
// BSTR LocationURL = NULL;

m_spActiveElement->get_tagName(&TagNameBStr);

TagName = AnsiString(TagNameBStr).UpperCase();
// MessageBox(NULL,(TagName+FormatDateTime("yyyymmddhhnnss",Now())).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING);
if(TagName == "A")
{
/* IHTMLAnchorElement *m_spAnchor;

m_spActiveElement->QueryInterface(IID_IHTMLAnchorElement,(void**)&m_spAnchor);
if(m_spAnchor)
{
m_spAnchor->get_href(&LocationURL);
m_spAnchor->Release();
}
m_spActiveElement->Release();

//MessageBox(NULL,AnsiString("URL = " + AnsiString(LocationURL)).c_str(),NULL,MB_OK | MB_APPLMODAL | MB_ICONWARNING);

//给iwath发消息,表示链接被点击了
COPYDATASTRUCT cds; //因为要在进程之间传递数据,所以要使用WM_COPYDATA消息。
cds.dwData = sizeof(COPYDATASTRUCT);
cds.cbData = ("50," + AnsiString(LocationURL)).Length() + 1 ; //多分配一个字节用来放'\0',否则有可能乱码
cds.lpData = (LPVOID)("50,"+AnsiString(LocationURL)).c_str();
((byte*)cds.lpData)[("50,"+AnsiString(LocationURL)).Length()] = '\0';
//向主程序发送消息
SendMessage(FindWindow("TIEHookForm",NULL),WM_COPYDATA,0,(LPARAM)&cds);
*/ }
...
wangxd 2003-09-06
  • 打赏
  • 举报
回复
那就要根据地址判断了
sun_wyz 2003-09-06
  • 打赏
  • 举报
回复
楼上接着说说看,
很愿意听到大家的教诲 @_@

myie是怎么实现的呢????

大家帮忙呀,一天了才一个兄弟回复我 :(
sun_wyz 2003-09-05
  • 打赏
  • 举报
回复
比如我做了一个类似myie的浏览器,提供一个按钮,当按钮按下去时就在新窗口打开浏览页面。

如果像楼上Aweay()那样的话,就是死循环了!!!

因为只要打开新页面就开新窗口,新开的窗口又会触发OnBeforeNavigate2事件,又开新窗口..........

楼上的方法我早试过了,不行的.....可能我的问题问的不清楚,不好意思!

大家继续帮忙呀!!!
sun_wyz 2003-09-05
  • 打赏
  • 举报
回复
接着来
sun_wyz 2003-09-05
  • 打赏
  • 举报
回复
自己顶一下,谁帮忙????
Siney 2003-09-04
  • 打赏
  • 举报
回复
void __fastcall TForm1::CppWebBrowser1BeforeNavigate2(TObject *Sender,
LPDISPATCH pDisp, TVariant *URL, TVariant *Flags,
TVariant *TargetFrameName, TVariant *PostData, TVariant *Headers,
TOLEBOOL *Cancel)
{

}

URL应该是连接的地址吧
Siney 2003-09-04
  • 打赏
  • 举报
回复
CppWebBrowser不是提供了BeforeNavigate2事件可以检测到连接吗
sun_wyz 2003-09-04
  • 打赏
  • 举报
回复
我还要顶!!!
好久没问问题了,大家帮忙呀
sun_wyz 2003-09-04
  • 打赏
  • 举报
回复
大家帮忙,自己顶一下
sprewellkobe 2003-04-15
  • 打赏
  • 举报
回复
好象得用到html com的接口,那些涵数很多,up一下

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧