LibVlc使用简单方便,Delphi调用其接口播放视频文件或者网络视频(RTSP、RTMP等各种协议),几行代码就搞定了,实在是制作视频播放器的最佳利器。
不过,调用libvlc_media_player_set_display_window设置了播放窗口以后,你会发现窗口无法响应鼠标的消息了,因为VLC接管了该窗口的所有鼠标消息处理。比如,在Panel1里面播放,希望在鼠标单击Panel1的时候做某些处理,然鹅Panel1.OnClick在播放视频时根本不理你,接收不到!
咋办呢?网上有很多人给的方法是修改VLC源码,在源码中把鼠标事件处理的消息回传。这样是可以实现的,不过,编译VLC尤其是win32上的编译,历来是一件让人挠头不止的恐怖事情,VLC的forum上整天都有人咨询关于LibVLC编译的问题,新版本的3.0+版本VLC编译那几乎是没人成功过。。。OMG。。。
其实有个简单的办法可以实现。换个思路。
首先定义一个新的控件:
TVlcMouseEventWinCtrl = class(TWinControl)
private
procedure WMEraseBkgnd(var msg: TWMEraseBkGnd); message WM_ERASEBKGND;
protected
procedure CreateParams(var params: TCreateParams); override;
public
published
property OnClick;
property OnDblClick;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
end;
然后,把这控件的两个函数完成一下:
procedure TVlcMouseEventWinCtrl.WMEraseBkgnd(var msg: TWMEraseBkGnd);
begin
SetBkMode (msg.DC, TRANSPARENT);
msg.result := 1;
end;
procedure TVlcMouseEventWinCtrl.CreateParams(var params: TCreateParams);
begin
inherited CreateParams(params);
params.ExStyle := params.ExStyle or WS_EX_TRANSPARENT;
end;
最后,在窗口创建的时候,把这个控件绑定到Panel1上面,搞定!
FMouseEventWinCtrl := TVlcMouseEventWinCtrl.Create(SELF);
Panel1.InsertControl(FMouseEventWinCtrl);
FMouseEventWinCtrl.SetBounds(0, 0, Panel1.Width, Panel1.Height);
FMouseEventWinCtrl.OnClick := Panel1Click;
FMouseEventWinCtrl.OnMouseMove := Panel1MouseMove;
看,就是这么简单!