鼠标hook函数中如何调用COM接口函数?

问题描述

请问大家鼠标HOOK函数中不能直接调用COM接口函数??下面是我的一个hook例子:///<summary>///鼠标钩子///</summary>privateMouseHookmouseHook;//设置鼠标钩子mouseHook=newMouseHook();mouseHook.MouseClick+=newMouseEventHandler(mouseHook_MouseClick);mouseHook.StartHook(HookType.WH_MOUSE_LL,0);///<summary>///鼠标钩子。鼠标单击事件///</summary>///<paramname="sender"></param>///<paramname="e"></param>voidmouseHook_MouseClick(objectsender,MouseEventArgse){IntPtrhWnd=WindowFromPoint(e.Location);//获取鼠标点击的窗口句柄if(hWnd==this.GeRenderHWnd)//判断是否为GoogleEarth视图窗口句柄this.GeRenderHWnd{Pointpoint=this.panel1.PointToClient(e.Location);//鼠标点转换为在panel1控件中的客户坐标//如果鼠标击点位置在panel1控件内部,则说明鼠标点击了GoogleEarth视图控件if(this.panel1.ClientRectangle.Contains(point)){DoublePointdp=DetermineScreenCoordinates(point.X,point.Y);//转换成屏幕坐标/***//屏幕的点X,Y坐标转成经纬高三个坐标值PointOnTerrainGEpGe=GeApp.GetPointOnTerrainFromScreenCoords(dp.X,dp.Y);***///新线程ParameterizedThreadStartpts=newParameterizedThreadStart(ShowMousePoint);Threadthread=newThread(pts);thread.Start(dp);}}}//线程方法protectedvoidShowMousePoint(objectobj){DoublePointdp=(DoublePoint)obj;PointOnTerrainGEpGe=GeApp.GetPointOnTerrainFromScreenCoords(dp.X,dp.Y);MessageBox.Show("当前鼠标位置:Lnt="+pGe.Longitude.ToString()+";Lat="+pGe.Latitude.ToString());}上面的程序在hook函数中使用辅助线程,运行没有问题,但我想在主线程中某个控件中使用GeApp.GetPointOnTerrainFromScreenCoords(dp.X,dp.Y)的返回值pGe(在线程方法中无法访问主线程的控件)。直接在hook函数中调用com接口函数(如上例/******/注释部分)会提示错误::“因为应用程序正在发送一个输入同步呼叫,所以无法执行传出的呼叫。”间接的方法我看到有创建新的类,在新类构造函数中将主窗体指针this传递过去,在新类创建方法同时操作com接口和主窗体控件(暂不知道这个方法是否可行),可不可以直接在hook函数中操作com接口?

解决方案

解决方案二:
测试了一下,创建新类传递主窗体指针,可以同时操作com接口和主窗体控件,但要在新类中自由使用主窗体的函数,要修改很多函数、控件、域的公共属性,麻烦!希望有更简单的方法能直接在hook函数中调用com接口
解决方案三:
本人C#新手,请高手们帮帮忙啊~
解决方案四:
别沉了,还没结帖呢~
解决方案五:
你上面的代码,对我这个新手来说也遇到问题了,我现在也在弄googleearth的二次开发,不知道你温伟鹏的程序你调通了吗?

时间: 2024-11-10 07:57:40

鼠标hook函数中如何调用COM接口函数?的相关文章

c++-内联函数中可以调用其他函数么

问题描述 内联函数中可以调用其他函数么 比如: inline void FuncA(_T para) { FuncB(para, para+1); } void FuncB(_T paraA, _T paraB) { //Something } 我试了下是可以通过编译的,函数运行也正常. 我想知道在编译时,FuncA调用的地方直接使用一句" FuncB(para, para+1); "进行替换, 还是说整个FuncB也会被展开塞进代码里?或者说对于这种情况编译器不会生成内联函数? 解决

递归-我想问一下这个我要怎么才能在主函数中实现调用 谢谢

问题描述 我想问一下这个我要怎么才能在主函数中实现调用 谢谢 #include <stdio.h>//循环赛问题 n=2^k 个运动员要进行循环赛 (1)每个选手必须与其他n-1名选手各比赛一次 //(2)每个选手一天只能赛一次 (3)循环赛一共进行n-1天 //利用分治法解决这个问题 用递归的方法用一分为二的策略对选手进行分割 知道剩下2个选手时 只需让这两个选手比赛就可以了 #include <stdlib.h> #define N 8 int a[N][N]; void Ta

php php调用js js-PHP中如何调用JS自定义函数

问题描述 PHP中如何调用JS自定义函数 大家好,小弟最近在做一个PHP页面,页面中有一个下拉列表的onchange事件需要调用一个JS文件中得方法,我试了很多次依然不能成功,请各位大神帮忙出出主意吧~!跪谢~~! 解决方案 PHP是无法直接调用JS函数的,因为不是一个层面的东西,如果你想问的是PHP与JS通信,可把数据互通 参考:PHP与Javascript通信流程深入解析 解决方案二: 这个问题啊,怎么说呢,首先得明白html和js的关系,其实js是脚本,php也是脚本,当时设计出来的初衷都

c++中如何调用perl接口????????

问题描述 c++中如何调用perl接口???????? 大家好,刚用perl,一直用c++,请问c++中如何调用perl接口???????????????大神求教 解决方案 Perl调用C++Linux下C调用C++接口详解

wcf-java中怎么调用WCF接口

问题描述 java中怎么调用WCF接口 求助各位大神,java怎么调用WCF的接口,来实现发短信的功能...

c语言数组与函数-如何在函数中给已经在主函数中定义好的数组赋值

问题描述 如何在函数中给已经在主函数中定义好的数组赋值 已经在main()中定义了一个长度为20的数组,想在定义的函数中给数组赋值,但一直报错,请问如何修改? void arrin(int *arr) { int i; arr[]={1,1,2,2,3,3,4,5,6,5,6,7,7,8,8,9,9,0,0}; for(i=0;i<20;i++) printf("%d",arr[i]); } main() { int testarr[20]; ............ } 解决方

c++问题-C++的类中怎么在一个函数中引用上一层的函数

问题描述 C++的类中怎么在一个函数中引用上一层的函数 在同一个类中怎么引用先定义的函数来定义函数?比如在一个时期类的定义中,一个日期加1的函数中怎么调用先定义的一个求是否闰年的函数. 解决方案 C++定义隐式转换函数将类转换为内部的一个成员变量c++函数默认参数是一个好的设计吗? 解决方案二: 直接在函数内调用就可以了.不知道你说的上一层是什么意思.是基类的函数还是集合类所属的对象的函数,前者直接调用,或者用 基类类名::函数名后者用构造函数传对象指针 解决方案三: 同一个类中的函数都是通过t

js调用父框架函数与弹窗调用父页面函数的简单方法_javascript技巧

调用父级中的 aaa的函数 子页面中: onclick="window.parent.frames.aaa()" 父页面中: function aaa() { alert('bbbbb'); } frame框架里的页面要改其他同框架下的页面或父框架的页面就用parent window.opener引用的是window.open打开的页面的父页面. window.frames对象可以引用iframe里的页面,也可以引用frameset里的页面. 可以这样 window.frames[0]

C++在成员函数中使用STL的find_if函数实例_C 语言

本文实例讲述了C++在成员函数中使用STL的find_if函数的方法.分享给大家供大家参考.具体方法分析如下: 一般来说,STL的find_if函数功能很强大,可以使用输入的函数替代等于操作符执行查找功能(这个网上有很多资料,我这里就不多说了). 比如查找一个数组中的奇数,可以用如下代码完成(具体参考这里:http://www.cplusplus.com/reference/algorithm/find_if/): #include <iostream> #include <algori