参考文章: http://blog.csdn.net/zjf82031913/article/details/7209436

补充说明:经测试,在调用修改后的dll时,要在 vlc上覆盖以透明层(如panel),才可以监视到鼠标的消息。

 在使用过程中libvlc创建出来渲染窗口消息在内部捕获并进行处理,外部的window 无法收到消息,如双击,单击事件,这样就给使用者带来了很多不方便的地方.官网论坛有人说要想捕获鼠标消息要钩子.开始用钩子成功捕获了,但是钩子必须是全局的很不方便.

后来在网上看到了有人修改源码:修改文件module/video_output/DirectX/events.c 把WM_RBUTTONUP等消息在视频窗体上把该消息再转发一次,

            {
            POINT pt;
            pt.x = GET_X_LPARAM(msg.lParam);
            pt.y = GET_Y_LPARAM(msg.lParam);
            ClientToScreen(msg.hwnd, &pt);//把子窗体鼠标坐标转换为屏幕坐标
            ScreenToClient(p_event->p_vout->p_sys->hparent, &pt);//在把屏幕坐标转换为父窗体鼠标坐标
            PostMessage(p_event->p_vout->p_sys->hparent, WM_RBUTTONUP, msg.wParam, MAKELPARAM(pt.x, pt.y));//给父窗体发送该消息,并附带鼠标坐标值
            }

按照上面的修改重新编译vlc-1.0.1把生成dll替换plugins里的就可以;

vlc-1.1.5源码变了很多所以修改变为:

/modules/video_output/msw/events.c中

 

case WM_LBUTTONDOWN:

            MousePressed( p_event, msg.hwnd, MOUSE_BUTTON_LEFT );

             //modify

            {

           POINT pt;

           pt.x = GET_X_LPARAM(msg.lParam);

           pt.y = GET_Y_LPARAM(msg.lParam);

           ClientToScreen(msg.hwnd,&pt);

           ScreenToClient(vd->sys->hparent,&pt);

           PostMessage(vd->sys->hparent,WM_LBUTTONDOWN,msg.wParam,MAKELPARAM(pt.x,pt.y));

            }

            break;

修改后libvlc的父窗口可以收到WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDBLCLK,WM_MBUTTONDOWN,WM_RBUTTONDOWN,WM_RBUTTONUP消息.

posted on 2012-05-16 16:36  佐伊凡  阅读(1548)  评论(1编辑  收藏  举报