问题描述
请问大家鼠标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的二次开发,不知道你温伟鹏的程序你调通了吗?