C# LibVLCSharp将VLC窗口渲染至当前窗口的两种方式

在添加了LibVLCSharp和LibVLCSharp.Platforms.Windows的Nuget包后,新建media绑定至XAML页面的VideoView的MediaPlayer,启动Play事件,VLC会弹出一个单独的Foreground窗口来进行输出,尝试了两种方式将MediaPlayer约束近当前窗口。

1.句柄方法

0X00.引用

using LibVLCSharp.Platforms.Windows;
using LibVLCSharp.Shared;

0X01.NativeMethods

public static class NativeMethods
    {
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr GetActiveWindow();

        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool IsWindow(IntPtr hWnd);
    }
//通过P/Invoke调用Windows API

0X02.获取Foreground窗口句柄并渲染VLC

private MediaPlayer mediaPlayer;
private IntPtr hwnd;
private LibVLC libVLC;
mediaPlayer ??= new MediaPlayer(libVLC);
mediaPlayer. Media = new Media(libVLC, new System.Uri("your video uri here"));
mediaPlayer.Hwnd = hwnd;
if (!mediaPlayer.IsPlaying)
   mediaPlayer.Play();

2.SwapChain方法

0X00.引用

using LibVLCSharp.Platforms.Windows;
using LibVLCSharp.Shared;

0X01.VideoView Initialized事件

private MediaPlayer mediaPlayer;
private LibVLC libVLC;
private string[] swapChain;
private void videoView_Initialized(object sender, InitializedEventArgs e)
{
    swapChain = e.SwapChainOptions;
    libVLC = new LibVLC(swapChain);
}

0X02.PageLoaded事件

private void Page_Loaded(object sender, RoutedEventArgs e)
{
    mediaPlayer ??= new MediaPlayer(libVLC);
    mediaPlayer. Media = new Media(libVLC, new System.Uri("your video uri here"));
    videoView.MediaPlayer=mediaPlayer;
    if (!videoView.MediaPlayer.IsPlaying)
        videoView.MediaPlayer.Play();
}
C# LibVLCSharp将VLC窗口渲染至当前窗口的两种方式
https://blog.async.website/index.php/archives/3380/
本文作者 snowysong@live.com
发布时间 2025-05-20
许可协议 CC BY-NC-SA 4.0
发表新评论