Delphi调用LibVLC播放视频,窗口如何响应键盘鼠标的消息?OnClick、OnDblClick、OnMouseMove

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;
看,就是这么简单!

你可能感兴趣的:(流媒体)