使用libvlc制作视频播放器等软件时,有时需要捕获用户的鼠标操作,从而进行一些定制化操作,如自定义右键菜单等等..
首先,vlc播放视频时的鼠标处理在src\video_output\display.c中的VoutDisplayEventMouse函数中,如果说我们的应用程序中需要处理双击事件,那就在VOUT_DISPLAY_EVENT_MOUSE_DOUBLE_CLICK这个case中进行处理,如何将这个事件传到我们的应用程序中呢?
我的方法是这样的:在src\video_output\video_output.c中的vout_Create中函数中创建一个vlc的视频输出的变量
var_Create(p_vout,"my_mouse_event",VLC_VAR_INTEGER);
//初始化变量
var_SetInteger(p_vout,"user_mouse_event",0);
回到VOUT_DISPLAY_EVENT_MOUSE_DOUBLE_CLICK这个case中,在case中设置这个变量,暂定为1,我们还可以定义许多其他值,如单击鼠标:2,鼠标释放:3等等
var_SetInteger(osys->vout,"user_mouse_event",100);
这样就知道用户何时在视频播放界面上进行了什么鼠标操作,第一步就完成了,下一步是如何在应用程序中获取上面的信息呢?我们可以在libvlc的接口中添加两个接口:一个是读取上面自定义的鼠标事件user_mouse_event的值,一个是清零user_mouse_event
VLC_PUBLIC_API int libvlc_video_get_mouse_event( libvlc_media_player_t *p_mi,unsigned num); VLC_PUBLIC_API int libvlc_video_set_mouse_event( libvlc_media_player_t *p_mi,unsigned num,int value);
上面是函数申明,函数实现可以这样做:
int libvlc_video_get_mouse_event( libvlc_media_player_t *p_mi,unsigned num) { vout_thread_t *p_vout = GetVout (p_mi, num); if (p_vout == NULL) return -1; return var_GetInteger(p_vout, "user_mouse_event"); } int libvlc_video_set_mouse_event( libvlc_media_player_t *p_mi,unsigned num,int value) { vout_thread_t *p_vout = GetVout (p_mi, num); if (p_vout == NULL) return -1; return var_SetInteger(p_vout, "user_mouse_event",value); }
最后在应用程序中开一个后台线程或循环 通过libvlc_video_get_mouse_event 读取user_mouse_event就知道用户何时进行了何种鼠标操作了.