屏蔽Real的ActiveX插件的右键菜单

本人正在做的项目中(一个基于P2P的视频点播软件GridCast),需要一个播放器,自己做播放器,实在不划算,因为我们是实验室不是公司。所以采用Real的ActiveX播放插件,而且支持RTSP协议,呵呵。但是遇到一个非常烦人的问题,Real的Actviex插件有右键菜单,最气人的是那个浮动的小按钮“在Real中播放”,一点就跑到real中播放去了。查了很多资料,在csdn上也问了很久,没人帮我解答如何屏蔽这些咚咚。real插件虽然提供一个SetContextMenu(bool)函数,但是调用了完全不起作用。查了很多资料,最后终于找到一个办法,不仅对Real插件有效,对所有activeX插件应该都有效。就是重载CWnd的PreTranslateMessage函数(VC生成的Real插件的类是继承与CWnd类的)。此函数非常有用,因为所有该窗口和该窗口的子窗口的消息都将先经过该函数,所以就可以在这个函数里动点手脚了,呵呵。只要点击右键的消息或者鼠标移动的消息不传到Real的插件去,它就不会有了菜单和浮动按钮了,而且对右键消息我们可以处理一下,让它转发给另外一个主窗口一个WM_CONTEXTMENU消息,这样我们自己的右键菜单就弹出来了!
代码示例:
BOOL CRealPlayer::PreTranslateMessage( MSG* pMsg )
{
 if ( pMsg->message == WM_COMMAND )
 {
  theApp.Message( MSG_DEBUG, _T("WM_COMMAND:wparam=%d"),pMsg->wParam );
 }
 if ( pMsg->message > WM_USER )
 {
  theApp.Message( MSG_DEBUG,_T("User message : %d"), pMsg->message );
 }
 if ( ! ( pMsg->message == WM_RBUTTONDOWN || pMsg->message == WM_RBUTTONUP || pMsg->message == WM_MOUSEMOVE ||
  pMsg->message == WM_RBUTTONDBLCLK ) )
 {
  if ( pMsg->message == WM_LBUTTONDBLCLK )
  {
   GetParent()->PostMessage( WM_COMMAND, ID_MEDIA_FULLSCREEN, 0 );
   return true;
  }
  return CWnd::PreTranslateMessage( pMsg );
 }
 else
 {
  if ( pMsg->message == WM_RBUTTONDOWN )
  {
   POINT point;
   ::GetCursorPos(&point);
   DWORD lp = 0, x = point.x, y = point.y;
   lp = ( x | ( y << 16 ) );
   CMediaFrame* pMediaFrame = (CMediaFrame*)GetParent();
   pMediaFrame->PostMessage( WM_CONTEXTMENU, (DWORD)pMediaFrame->GetSafeHwnd(), lp );
   return true;
  }
  return true;
 } 
}

不过有一点得需要注意,这个函数中不能写太多语句或者是执行很长时间的语句,如for循环等,因为此函数调用率非常高。

此方法只能用于MFC界面程序中,也就是有CWinApp的吧。我写的activex控件,嵌入real的activex控件,这种方法就失效了,最后没办法,只有使用钩子了。。。。钩到所有当前线程的鼠标消息,当鼠标在对应窗口区域并且当前窗口是焦点的时候,屏蔽相应的鼠标右键。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值