电子白板,控件播放功能,屏幕分享

Posted zbfamily

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了电子白板,控件播放功能,屏幕分享相关的知识,希望对你有一定的参考价值。

仿照好视通的电子白板,做了一个小demo,记录一下,将office,pdf等文档转换成图片,然后把图片做成inkcanvas的背景,录放inkcanvas控件达到屏幕分享的目的

电子白班前台用到的是InkCanvas,xaml代码

    <Grid x:Name="grid">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="30"/>
        </Grid.RowDefinitions>
        <StackPanel Orientation="Horizontal" Grid.Row="1" x:Name="sp">
            <Button Height="28" Width="80" x:Name="background" Click="background_Click" Content="background"/>
            <TextBlock x:Name="tbx" Background="AliceBlue" Width="50"/>
            <Button x:Name="clear" Height="28" Width="80" Content="clear" Click="clear_Click"/>
            <Button x:Name="acpk" Height="28" Width="80" Click="acpk_Click"/>
            <Button x:Name="saveBipmap" Height="28" Width="80" Content="save" Click="saveBipmap_Click"/>
        </StackPanel>
        <InkCanvas x:Name="inkCanvas" Background="Pink"/>

    </Grid>

cs代码,获取控件,然后把控件保存成图片,把保存好的图片转发给其他端口,其他端口进行播放显示。

public partial class MainWindow : Window
    {
        #region MyRegion
        /// <summary>
        /// 获得窗体句柄
        /// </summary>
        /// <returns></returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        public static extern IntPtr GetForegroundWindow();
        /// <summary>
        /// 查找窗体1
        /// </summary>
        /// <param name="lpClassName"></param>
        /// <param name="lpWindowName"></param>
        /// <returns></returns>
        [DllImport("coredll.dll", EntryPoint = "FindWindow")]
        private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
        /// <summary>
        /// 激活窗体
        /// </summary>
        /// <param name="hWnd"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        public static extern bool SetForegroundWindow(int hWnd);
        ///// <summary>
        ///// 查找窗体2
        ///// </summary>
        ///// <param name="lpClassName"></param>
        ///// <param name="lpWindowName"></param>
        ///// <returns></returns>
        //[DllImport("user32.dll", EntryPoint = "FindWindow")]
        //private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
        /// <summary>
        /// 查找子窗体
        /// </summary>
        /// <param name="hwndParent"></param>
        /// <param name="hwndChildAfter"></param>
        /// <param name="lpszClass"></param>
        /// <param name="lpszWindow"></param>
        /// <returns></returns>
        [DllImport("user32.dll", EntryPoint = "FindWindow")]
        private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
        /// <summary>
        /// 获得窗体坐标
        /// </summary>
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
        /// <summary>
        /// 窗体坐标结构
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;                             //最左坐标
            public int Top;                             //最上坐标
            public int Right;                           //最右坐标
            public int Bottom;                        //最下坐标
        }
        
        #endregion
        public MainWindow()
        {
            InitializeComponent();
            timer = new DispatcherTimer();
            timer.Tick += timer_Tick;
            timer.Interval = TimeSpan.FromSeconds(0.5);
        }
        int index = 0;
        void timer_Tick(object sender, EventArgs e)
        {
            // 录制软件大小的屏幕
            //IntPtr ptr = new WindowInteropHelper(this).Handle;
            //ImageFromHandle(ptr);
            // 录制控件本身
            SaveControls(grid, index + "");
            index++;
            tbx.Text = index + "";
        }
        DispatcherTimer timer;
        bool stop = true;
        private void background_Click(object sender, RoutedEventArgs e)
        {
            if (timer != null)
            {
                if (stop)
                {
                    stop = false;
                    timer.Start();
                }
                else
                {
                    stop = true;
                    timer.Stop();

                }
            }
        }
        #region bitmapsource保存成文件

        private void SaveImageToFile(BitmapSource image, string filePath)
        {
            BitmapEncoder encoder = GetBitmapEncoder(filePath);
            encoder.Frames.Add(BitmapFrame.Create(image));

            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                encoder.Save(stream);
            }
        }
        /// <summary>
        /// 根据文件扩展名获取图片编码器
        /// </summary>
        /// <param name="filePath">文件路径</param>
        /// <returns>图片编码器</returns>
        private BitmapEncoder GetBitmapEncoder(string filePath)
        {
            var extName = System.IO.Path.GetExtension(filePath).ToLower();
            if (extName.Equals(".png"))
            {
                return new PngBitmapEncoder();
            }
            else
            {
                return new JpegBitmapEncoder();
            }
        }
        #endregion

        #region 屏幕截图

        static BitmapSource CopyScreen()
        {
            using (var screenBmp = new Bitmap((int)SystemParameters.PrimaryScreenWidth, (int)SystemParameters.PrimaryScreenHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
            {
                using (var bmpGraphics = Graphics.FromImage(screenBmp))
                {
                    bmpGraphics.CopyFromScreen(0, 0, 0, 0, screenBmp.Size);
                    return Imaging.CreateBitmapSourceFromHBitmap(
                        screenBmp.GetHbitmap(),
                        IntPtr.Zero,
                        Int32Rect.Empty,
                        BitmapSizeOptions.FromEmptyOptions());
                }
            }
        }
        static BitmapSource CopyScreen(int left, int top, int width, int height)
        {
            using (var screenBmp = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
            {
                using (var bmpGraphics = Graphics.FromImage(screenBmp))
                {
                    bmpGraphics.CopyFromScreen(left, top, 0, 0, screenBmp.Size);
                    return Imaging.CreateBitmapSourceFromHBitmap(
                        screenBmp.GetHbitmap(),
                        IntPtr.Zero,
                        Int32Rect.Empty,
                        BitmapSizeOptions.FromEmptyOptions());
                }
            }
        }
        #endregion

        #region 根据窗体句柄获取图片
        int i = 0;
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern IntPtr GetWindowRect(IntPtr hwnd, ref System.Drawing.Rectangle lpRect);
        private void ImageFromHandle(IntPtr handle)
        {
            RECT rect = new RECT();
            GetWindowRect(handle, ref rect);
            int width = rect.Right - rect.Left;
            int height = rect.Bottom - rect.Top;
            var img = new Bitmap(width, height);
            using (var g = Graphics.FromImage(img))
            {
                g.CopyFromScreen(new System.Drawing.Point(rect.Left, rect.Top),
                System.Drawing.Point.Empty, new System.Drawing.Size(width, height), CopyPixelOperation.SourceCopy);
                g.DrawImage(img, 0, 0, img.Width, img.Height);
                string path = string.Format("e:\test\13\{0}.png", i);
                if (File.Exists(path)) File.Delete(path);
                img.Save(path);
            }
            tbx.Text = i + "";
            i++;
        }
        #endregion

        private void clear_Click(object sender, RoutedEventArgs e)
        {
            inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
        }

        private void acpk_Click(object sender, RoutedEventArgs e)
        {
            inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
        }

        private RenderTargetBitmap RenderVisaulToBitmap(Visual vsual, int width, int height)
        {
            var ss = PresentationSource.FromVisual(vsual).CompositionTarget.TransformToDevice;
            var rtb = new RenderTargetBitmap(width, height, ss.OffsetX, ss.OffsetY, PixelFormats.Default);
            Console.WriteLine(ss.OffsetX + ":" + ss.OffsetY);
            rtb.Render(vsual);

            return rtb;
        }
        private void SaveControls(FrameworkElement control, string fileName)
        {
            int height = (int)control.ActualHeight;
            int width = (int)control.ActualWidth;
            RenderTargetBitmap rtb = RenderVisaulToBitmap(control, width, height);
            BmpBitmapEncoder encoder = new BmpBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(rtb));
            string dirPath = "e:\test\13";
            if (!Directory.Exists(dirPath))
                Directory.CreateDirectory(dirPath);
            string file = string.Format("{0}\{1}.png", dirPath, fileName);
            if (File.Exists(file)) File.Delete(file);
            using (Stream stm = File.Create(file))
            {
                encoder.Save(stm);
            }
        }
        private void saveBipmap_Click(object sender, RoutedEventArgs e)
        {
            SaveControls(inkCanvas, "image");
        }
    }

播放客户端代码xaml

<Border x:Name="borders"/>

cs代码

     DispatcherTimer timer;
        public MainWindow()
        {
            InitializeComponent();
            timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromSeconds(0.6);
            timer.Tick += timer_Tick;
            timer.Start();
        }
        string path1 = "e:\test\13";
        int index = 0;
        void timer_Tick(object sender, EventArgs e)
        {
            string path = System.IO.Path.Combine(path1, index + ".png");
            if (System.IO.File.Exists(path))
            {
                ImageBrush imageBrush = new ImageBrush();
                imageBrush.ImageSource = new BitmapImage(new Uri(path, UriKind.Absolute));
                borders.Background = imageBrush;
                index++;
            }
        }

  

 

以上是关于电子白板,控件播放功能,屏幕分享的主要内容,如果未能解决你的问题,请参考以下文章

怎样使用东方中原电子白板的屏幕录制

简单的方法来分享/讨论/协作的代码片段?

Android SurfaceView导致屏幕闪烁

delphi播放器用代码实现暂停功能

导航 PopUpToInclusive 不起作用?重新打开应用程序时,它会打开登录片段而不是电子邮件登录片段

HTML5 <video> Chrome中的播放器控件右侧三个点打开空白屏幕