ATL对话框加载flash控件,怎么去掉flash右键菜单 atl对话框上加载了flash控件,怎么去掉flash右键菜单,网上说的都是mfc的情况,盼高手指点! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 原理不都是一样的吗?截获FLASH窗口的右击消息就行了 参考一下这个虽是MFC的,但是方法原理一样http://hi.baidu.com/beyond0769/blog/item/b1efacd7403cb8d0a044df61.html 这种情况有点复杂,取决于多个条件,比如控件有没有窗口,导致右键菜单弹出的原始消息,快捷键等等。如果控件是有窗口的,就要子类化控件窗口拦截消息,如果控件没有窗口,相关消息在容器阶段就应该拦截,不要交给控件的IOleInPlaceObjectWindowless::OnWindowMessage处理。右键菜单弹出的原始消息也有多种可能,WM_RBUTTONDOWN/WM_RBUTTONUP/WM_CONTEXTMENU都是可能的诱发来源。快捷键也是导致菜单弹出的可能因素,例如属性键、ALT+ENTER等等,所以在可能的情况下,部分键盘消息也应该不交给IOleInPlaceActiveObject::TranslateAccelerator处理。建议多做试验,每种控件的实现都不一样,甚至同一种控件在不同状态下的实现方式也可能不一样。 十分感谢你的解答,本人是个新手,一些事情不是很明白,还得向你请教如果flash控件本身是有窗口的,我怎么能得到flash控件的窗口呢?相关消息在容器阶段就应该拦截,应该怎么拦截呢?我是这样做的CAxWindow m_flashControlWindow;m_flashControlWindow = GetDlgItem(IDC_SHOCKWAVEFLASH1);//这句实际上得到的是flash控件的宿主窗口m_flashControlWindow.QueryControl(__uuidof(IShockwaveFlash),(void**)&pMyCtl);CString flashPAth;flashPAth = "D:\\ok.swf";HRESULT hr;hr = pMyCtl->put_WMode( CComBSTR("Transparent") );hr = pMyCtl->put_Movie(flashPAth.AllocSysString());if(SUCCEEDED(hr))pMyCtl->Play();按照你的说法,m_flashControlWindow应该就是flash控件的容器了,应该怎么拦截呢? 如果控件有窗口,如何得到窗口句柄?=====================================从控件接口查询IOleWindow接口,然后调用GetWindow方法。容器阶段怎么拦截消息?=====================================如果你用CAxWindow作为容器窗口,建议复制它的源码到自己的代码中,因为必须修改这些源码才有足够的控制能力,它只是按照最普通的方式封装的,没有足够的灵活性。主要查看它的容器接口实现部分和窗口过程函数,找到转发消息的地方,按自己的要求修改过滤规则。 MFC开发ocx 添加属性的问题 控制台服务程序(CreateService函数创建的)中recvfrom收不到消息? VC中如何创建DBF格式的表格 现在C++还有前途? 写文件的问题在线等 请问那里可以下载到《设计模式:可复用面向对象软件的基础》 如何使鼠标点击对话框的任何一个地方都可以拖动对话框?而不止是标题栏? 关于指针的强制转换? 块看看下面的CTypedPtrArray 为什么出错!!!!!!!!!!!!!!!!!!!!! 关于socket问题?菜鸟求助! VC 6.0如何使用最新的SDK 初级问题,向大家请教,关于MSDN的
截获FLASH窗口的右击消息就行了
http://hi.baidu.com/beyond0769/blog/item/b1efacd7403cb8d0a044df61.html
如果控件是有窗口的,就要子类化控件窗口拦截消息,如果控件没有窗口,相关消息在容器阶段就应该拦截,不要交给控件的IOleInPlaceObjectWindowless::OnWindowMessage处理。
右键菜单弹出的原始消息也有多种可能,WM_RBUTTONDOWN/WM_RBUTTONUP/WM_CONTEXTMENU都是可能的诱发来源。
快捷键也是导致菜单弹出的可能因素,例如属性键、ALT+ENTER等等,所以在可能的情况下,部分键盘消息也应该不交给IOleInPlaceActiveObject::TranslateAccelerator处理。建议多做试验,每种控件的实现都不一样,甚至同一种控件在不同状态下的实现方式也可能不一样。
如果flash控件本身是有窗口的,我怎么能得到flash控件的窗口呢?相关消息在容器阶段就应该拦截,应该怎么拦截呢?我是这样做的
CAxWindow m_flashControlWindow;m_flashControlWindow = GetDlgItem(IDC_SHOCKWAVEFLASH1);//这句实际上得到的是flash控件的宿主窗口
m_flashControlWindow.QueryControl(__uuidof(IShockwaveFlash),(void**)&pMyCtl);CString flashPAth;
flashPAth = "D:\\ok.swf";
HRESULT hr;
hr = pMyCtl->put_WMode( CComBSTR("Transparent") );
hr = pMyCtl->put_Movie(flashPAth.AllocSysString());
if(SUCCEEDED(hr))pMyCtl->Play();按照你的说法,m_flashControlWindow应该就是flash控件的容器了,应该怎么拦截呢?
=====================================
从控件接口查询IOleWindow接口,然后调用GetWindow方法。容器阶段怎么拦截消息?
=====================================
如果你用CAxWindow作为容器窗口,建议复制它的源码到自己的代码中,因为必须修改这些源码才有足够的控制能力,它只是按照最普通的方式封装的,没有足够的灵活性。
主要查看它的容器接口实现部分和窗口过程函数,找到转发消息的地方,按自己的要求修改过滤规则。