VLC 修改源码,添加对鼠标事件的响应

参考文章: 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消息.

你可能感兴趣的:(VLC应用)