我正在使用WPF 4.5中的WinForms替换应用程序 .
当前的WinForms应用程序从C组件流式传输视频 . C#WinForms控件有以下代码:
public void StartVideoStream(int iCamera)
{
if (InvokeRequired)
{
delStartVideoStream del = new delStartVideoStream(StartVideoStream);
Invoke(del, new object[] { iCamera });
}
else
{
if (!VideoPlaying)
{
int iSuccess = ClientComm.StartVideoStream(iCamera, ucVideoPlayer.Handle,
(ClientComm.streaming_protocols)Properties.Settings.Default.VideoStreamProtocol,
Properties.Settings.Default.VideoStreamFrameRate);
if (iSuccess != 0)
{
Debug.WriteLine("[ucVideo] Could not play video.");
}
}
else
{
ClientComm.SelectVideoStream(iCamera);
}
VideoPlaying = true;
}
}
您可以看到它将其句柄传递给COM组件,该组件将视频直接写入其中 .
问题是在WPF控件中没有句柄 . 我怎么能这样做WPF?
谢谢 .
1 回答
我看到这样做的唯一方法是使用HwndHost(https://msdn.microsoft.com/en-us/library/system.windows.interop.hwndhost%28v=vs.110%29.aspx)在WPF控件内部托管WinForms控件 . 不幸的是,这让你回到WinForms领域 .
HwndHost有点涉及到一个明智的答案,但这里有一个合理的教程:http://blogs.msdn.com/b/ivo_manolov/archive/2007/10/07/5354351.aspx
您应该能够从Vlc.DotNet库(https://github.com/ZeBobo5/Vlc.DotNet)获得一些有用的指针,它们执行类似的操作 . 基于此,如果将WPF应用程序窗口的句柄传递给COM组件,视频可能会覆盖整个窗口 . 另一方面,如果您从WPF组件内的WinForms组件与COM组件通信,则可以使用WinForms组件的句柄并使窗口的其余部分远离阻塞 .