atl对话框上加载了flash控件,怎么去掉flash右键菜单,网上说的都是mfc的情况,盼高手指点!

解决方案 »

  1.   

    原理不都是一样的吗?
    截获FLASH窗口的右击消息就行了
      

  2.   

    参考一下这个虽是MFC的,但是方法原理一样
    http://hi.baidu.com/beyond0769/blog/item/b1efacd7403cb8d0a044df61.html
      

  3.   

    这种情况有点复杂,取决于多个条件,比如控件有没有窗口,导致右键菜单弹出的原始消息,快捷键等等。
    如果控件是有窗口的,就要子类化控件窗口拦截消息,如果控件没有窗口,相关消息在容器阶段就应该拦截,不要交给控件的IOleInPlaceObjectWindowless::OnWindowMessage处理。
    右键菜单弹出的原始消息也有多种可能,WM_RBUTTONDOWN/WM_RBUTTONUP/WM_CONTEXTMENU都是可能的诱发来源。
    快捷键也是导致菜单弹出的可能因素,例如属性键、ALT+ENTER等等,所以在可能的情况下,部分键盘消息也应该不交给IOleInPlaceActiveObject::TranslateAccelerator处理。建议多做试验,每种控件的实现都不一样,甚至同一种控件在不同状态下的实现方式也可能不一样。
      

  4.   

    十分感谢你的解答,本人是个新手,一些事情不是很明白,还得向你请教
    如果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控件的容器了,应该怎么拦截呢?
      

  5.   

    如果控件有窗口,如何得到窗口句柄?
    =====================================
    从控件接口查询IOleWindow接口,然后调用GetWindow方法。容器阶段怎么拦截消息?
    =====================================
    如果你用CAxWindow作为容器窗口,建议复制它的源码到自己的代码中,因为必须修改这些源码才有足够的控制能力,它只是按照最普通的方式封装的,没有足够的灵活性。
    主要查看它的容器接口实现部分和窗口过程函数,找到转发消息的地方,按自己的要求修改过滤规则。