社区
C++ Builder
帖子详情
关于CppWebBrowser消息拦截的问题!!各位帮忙:)
sun_wyz
2003-04-15 05:26:23
我最近写了一个浏览器玩,
想拦截CppWebBrowser上鼠标点饥连接的消息,并取得点饥连接的地址,
但好象CppWebBowser没有提供接口函数,
不知道怎样才能够达到以上的目的呢??
各位大虾帮忙!!
...全文
65
13
打赏
收藏
关于CppWebBrowser消息拦截的问题!!各位帮忙:)
我最近写了一个浏览器玩, 想拦截CppWebBrowser上鼠标点饥连接的消息,并取得点饥连接的地址, 但好象CppWebBowser没有提供接口函数, 不知道怎样才能够达到以上的目的呢?? 各位大虾帮忙!!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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一下
Spring Boot实战:
拦截
器
什么是
拦截
器:
拦截
器在SpringBoot中主要有以下几个作用: 1.2
拦截
器的基本使用1.⾃定义
拦截
器:实现HandlerInterceptor接⼝,并重写其所有⽅法 2.注册配置
拦截
器:实现
Web
MvcConfigurer接⼝,并重写addInterceptors⽅法 3.启动服务, 试试访问任意请求, 观察后端⽇志 可以看到preHandle ⽅法执⾏之后就放⾏了, 开始执⾏⽬标⽅法, ⽬标⽅法执⾏完成之后执⾏ postHandle和afterCompletion⽅法.
LIS算法:经典DP
问题
( 导弹
拦截
问题
)
题目简单描述:为了
拦截
敌国的袭击,科学家研发出一套导弹系统,导弹系统有个缺陷:第一发炮弹可以到达任意高度,然而之后的每一发炮弹都不能高于前一发的高度。 现给出数个导弹的高度( <=50000的正整数 ),计算一套导弹
拦截
系统最多可以
拦截
多少导弹,如果需要
拦截
全部导弹需要多少套导弹
拦截
系统? LIS模板题,第一问是求一个数列的最长下降子序列,...
为什么做的html链接不合法,“您的请求带有不合法参数,已被网站管理员设置
拦截
!”解决办法...
近期有不少用户在使用网站安全狗的时候,登入网站后台更新文件的时候经常会出现这样
拦截
:“您的请求带有不合法参数,已被管理员设置
拦截
”,如图所示:解决方法:1.出现这样的
拦截
页面,大家先查看一下网站防火墙的防护日志,在防护日志里,有记录
拦截
时间、类型、内容。2.我们根据
拦截
类型,找到相应的功能模块,然后找到那条规则进行相应的修改。比如当我们出现 上面这个
拦截
提示的时候,我们去查看一下我们的网站安全狗的...
关于axios的两种
拦截
方式:请求
拦截
和响应
拦截
关于axios的两种
拦截
方式:请求
拦截
和响应
拦截
动态规划
问题
———
拦截
导弹(C语言)
6.
拦截
导弹 某国为了防御敌国的导弹袭击,发展出一种导弹
拦截
系统。但是这种
拦截
系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段。所以只有一套系统,因此有可能不能
拦截
所有的导弹。输入导弹依次飞来的高度(雷达给出的高度不大于30000的正整数)。计算这套系统最多能
拦截
多少导弹。 输入:N颗依次飞来的导弹高度,(导弹个数大于1000)。 输出:一套系统最多
拦截
的导弹数,并依次打印输出被
拦截
导弹的高度。 该
问题
可近
C++ Builder
13,870
社区成员
102,693
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章