VC向浏览器(IE,Firefox)发送鼠标单击消息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC向浏览器(IE,Firefox)发送鼠标单击消息相关的知识,希望对你有一定的参考价值。

试图使用SendMessage函数向火狐发送一个鼠标单击消息,现在能得到火狐的Handle,发送WM_CLOSE可以关闭火狐,但是火狐不响应WM_LBUTTONDOW消息。求助~

还有实验的时候向一个画图程序去发送消息,同样得到handle,在SendMessage的时候发现,WM_LBUTTONDOWN没有效果,但是WM_CLOSE却可以将画图关闭(和火狐的是一样的)

代码如下:
#include "windows.h"
#include "stdio.h"
void main()
HWND hWnd;
hWnd=::FindWindow(NULL,"Mozilla Firefox");
if(hWnd)

printf("Hello World!\n");
::SendMessage(hWnd,WM_LBUTTONDOWN,0,MAKELONG(200,200));
::SendMessage(hWnd,WM_LBUTTONUP,0,MAKELONG(200,200));
// ::SendMessage(hWnd,WM_CLOSE,0,0);

printf("End Hello World!\n");

1楼说的MK_LBUTTON也不行。
我的网页整个是一个图,点上就能跳转
运行结果是 Hello World能输出,也就是能找到,但是网页不跳转,也就是那个消息没有被处理

微软从IE5.0开始便允许开发人员向其工具栏中添加按钮,其实现方法的本质就是修改注册表,添加创建此按钮所需的信息。首先要创建此按钮的GUID(globally unique identifier),这个GUID可以通过Visual Studio中的Guidgen.exe来产生。例如一个生成的GUID是1FBA04EE-3024-11D2-8F1F-0000F87ABD16(本例在以下的叙述中都使用这个GUID来作说明)。有了GUID值后,要在Windows注册表中创建子键:

HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Extensions\1FBA04EE-3024-11D2-8F1F-0000F87ABD16

在此子键下创建如下字串值:

1)CLSID

这是IE的CLSID,其值必须为1FBA04EE-3024-11D2-8F1F-0000F87ABD16

2)Default Visible

指明此按钮默认状态下是否可见,Yes表示可见,No为不可见

3)ButtonText

按钮文字

4)Icon

默认状态下的图标全路径,例如c:\vckbase.ico。也可以是EXE文件中包含的图标,例如:C:\PROGRA~1\NETANTS\NetAnts.exe,1000

5)HotIcon

鼠标移到按钮上时的图标全路径

如下子键为按下按钮后需要执行的相应动作:可以是COM对象、浏览条Explorer Bar、脚本Script、可执行文件。下面我们逐个进行介绍:

①COM对象

你需要建立名为ClsidExtension的字串值,其值应该为此COM对象的GUID,例如金山词霸就使用ClsidExtension来调用自己的COM对象。

②浏览条Explorer Bar

所谓浏览条就是类似我们按下往IE历史按钮后打开的历史记录列表,其本质好比MFC中的CReBar对象。 浏览条也可以自己制作,因为超出了本文的范围,暂不作讲解。 为了在按下按钮后打开一个浏览条,你需要建立名为BandCLSID的字串值,其值为浏览条的CLSID。

③脚本Script

按下按钮后执行的脚本,例如:"%SystemRoot%\web\related.htm",你可以在这个html文件里面加上脚本来得到IE当前的许多信息,需要注意的是假如你想通过Script打开非脚本的HTML文件是不可行的。请参考如下NetAnts取得当前页所有链接的脚本代码

<script language="VBScript">
On Error Resume Next
set NetAntsApi = CreateObject( "NetAnts.API" )
if err<>0 then
Alert("NetAnts not properly installed on this PC!")
else
set links = external.menuArguments.document.links
ReDim params(links.length*2)
params(0)=external.menuArguments.document.Url
for i = 0 to links.length-1
params(i*2+1)=links(i).href
params(i*2+2)=links(i).innerText
next
NetAntsApi.AddUrlList params
end if
</script>

我们再看一个比较有用的脚本,这段脚本的作用是得到当前地址,并打开此网址的首页:

<script>
//userURL得到的是当前地址,例如是http://www.yesky.com
userURL=external.menuArguments.location.href;
protocolIndex=userURL.indexOf("://",4);
serverIndex=userURL.indexOf("/",protocolIndex + 3);
finalURL=userURL.substring(0,serverIndex);
external.menuArguments.open(finalURL, "_blank");//打开网址;
</script>

④可执行文件

假如想让IE在按下按钮后执行一个可执行文件, 可以增加名为Exec的字串值,其值为此可执行文件的全路径,例如c:\windows\notepad.exe或者是一个网址http://www.yesky.net
有了上面的知识,就可以通过修改注册表来实现向IE工具条添加按钮的功能了。

编程步骤

1、启动Visual C++6.0,生成一个基于对话框的应用程序,将程序命名为"IEButton";

2、修改应用程序对话框中的按钮,其标题分别为"添加"和"退出";

3、使用Class Wizard为应用程序的"添加"按钮添加鼠标单击的消息响应函数OnAdd();

4、添加代码,编译运行程序。

程序代码

void CIEButtonDlg::OnAdd()

///这是由GUIDGEN产生的GUID:06926B30-424E-4f1c-8EE3-543CD96573DC
CRegKey reg;
char KeyName[]="Software\\Microsoft\\Internet
Explorer\\Extensions\\06926B30-424E-4f1c-8EE3-543CD96573DC";
TCHAR PathName[MAX_PATH];
TCHAR IconPathName[MAX_PATH]; ///正常时的图标全路径
TCHAR HotIconPathName[MAX_PATH]; ///鼠标覆盖时的图标全路径
GetModuleFileName(0,PathName,MAX_PATH); ///得到本可执行文件的路径
strcpy(IconPathName,PathName);
strcpy(HotIconPathName,PathName);
strcat(HotIconPathName,",131"); ///131是图标的ID,你可以以资源方式打开EXE文件就可以看到所有资源及其ID
strcat(IconPathName,",129");
reg.Create(HKEY_LOCAL_MACHINE,KeyName);
reg.SetValue("1FBA04EE-3024-11D2-8F1F-0000F87ABD16","CLSID");
reg.SetValue("Yes","Default Visible");
reg.SetValue("天极网","ButtonText");
reg.SetValue(IconPathName,"Icon");
reg.SetValue(HotIconPathName,"HotIcon");
/////假如是执行脚本,可以是reg.SetValue("c:\\test.html","Script"); ///在test.html 存放你的脚本代码<br>
reg.SetValue("http://www.yesky.com/","Exec");///打开网页
参考技术A BM_CLICK消息试试,再一个,你要确认你找的hWnd对不对,画图程序里面可以画画的地方只是一个子窗口,它的hWnd和主窗体的hWnd是不一样的,WM_CLOSE肯定能响应,但是不代表其他消息就一定有效。

查找子窗体函数 ::FindWindowEx()

祝你好运!本回答被提问者采纳
参考技术B   您好,感谢您对火狐的支持

  可以使用:FindWindowEx属性,具体用法您可以参考:http://blog.csdn.net/coolszy/article/details/5523784
  您可以在火狐官方网站下载火狐浏览器,在火狐社区了解更多内容。希望我的回答对您有所帮助,如有疑问,欢迎继续在本平台咨询。
参考技术C 第三个参数, wParam, 设成MK_LBUTTON试试

鼠标滚动事件

鼠标滚动事件

关于滚动事件这方面,其实是比较乱的。

滚轮事件的兼容性差异有些不拘一格,不是以往的IE8-派和其他派,而是FireFox派和其他派。

包括IE6在内的浏览器是使用onmousewheel,而FireFox浏览器一个人使用DOMMouseScroll. 经自己测试,即使现在FireFox 19下,也是不识onmousewheel

在其他派中检测滚动数值的属性是wheelDelta ,向上滚为120,向下为-120。

在火狐中检测滚动数值的属性是detail,向上滚为-3,向下为3。

 

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <script>
            document.onmousewheel = function(event){
                ev = event || window.event;
                alert(ev.wheelDelta);
                if(ev.wheelDelta > 0){//120
                    alert()
                }else(//-120
                    alert()
                )
                    
                
            }
            document.addEventListener("DOMMouseScroll", function(ev) {
                alert(ev.detail);
                if(ev.detail < 0){//-3
                    alert()
                }else(//3
                    alert()
                )
            });
        </script>
    </body>
</html>

 

 

以上是关于VC向浏览器(IE,Firefox)发送鼠标单击消息的主要内容,如果未能解决你的问题,请参考以下文章

如何获取鼠标单击画布元素的坐标? [复制]

如何让firefox和chrome支持css自定义鼠标样式?IE中用“cursor:url()”属性可以实现,FF、Chrome怎么弄?

python+selenium3+firefox中使用ActionChains双击等鼠标事件操作报错,但是其它谷歌ie等浏览器均正常

鼠标滚动事件

python+selenium3+firefox中使用ActionChains双击等鼠标事件操作报错,但是其它谷歌、ie等浏览器均正常。

关于IE浏览器的缓存问题