社区
C++ Builder
帖子详情
关于CppWebBrowser消息拦截的问题!!各位帮忙:)
sun_wyz
2003-04-15 05:26:23
我最近写了一个浏览器玩,
想拦截CppWebBrowser上鼠标点饥连接的消息,并取得点饥连接的地址,
但好象CppWebBowser没有提供接口函数,
不知道怎样才能够达到以上的目的呢??
各位大虾帮忙!!
...全文
60
13
打赏
收藏
关于CppWebBrowser消息拦截的问题!!各位帮忙:)
我最近写了一个浏览器玩, 想拦截CppWebBrowser上鼠标点饥连接的消息,并取得点饥连接的地址, 但好象CppWebBowser没有提供接口函数, 不知道怎样才能够达到以上的目的呢?? 各位大虾帮忙!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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一下
基于Go语言大型企业级电商秒杀系统实战教程
消息
队列可以削峰,将
拦截
大量并发的请求,这也是一个异步处理过程,后台业务根据自己的处理能力,从
消息
队列中主动的拉取请求
消息
进行业务处理 前端方案 浏览器端(js): 页面静态化:将活动页面上的所有可以静态...
宝塔面板提示“您的请求带有不合法参数,已被网站管理员设置
拦截
!”解决办法
宝塔面板提示“您的请求带有不合法参数,已被网站管理员设置
拦截
!”解决办法 解决方法如下: 去除该站点的POST过滤
LIS算法:经典DP
问题
( 导弹
拦截
问题
)
题目简单描述:为了
拦截
敌国的袭击,科学家研发出一套导弹系统,导弹系统有个缺陷:第一发炮弹可以到达任意高度,然而之后的每一发炮弹都不能高于前一发的高度。 现给出数个导弹的高度( <=50000的正整数 )...
关于axios的两种
拦截
方式:请求
拦截
和响应
拦截
关于axios的两种
拦截
方式:请求
拦截
和响应
拦截
为什么做的html链接不合法,“您的请求带有不合法参数,已被网站管理员设置
拦截
!”解决办法...
近期有不少用户在使用网站安全狗的时候,登入网站后台更新文件的时候经常会出现这样
拦截
:“您的请求带有不合法参数,已被管理员设置
拦截
”,如图所示:解决方法:1.出现这样的
拦截
页面,大家先查看一下网站防火墙的...
C++ Builder
13,825
社区成员
102,679
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章