参考文章:
补充说明:经测试,在调用修改后的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消息.