c#中多个屏幕上的重复Windows窗体

我正在为一家汽车公司开发一个反馈系统。 在计费台上,有一个双显示器设置:一个用于计费人员,另一个用于提供反馈的客户。 我需要在两个屏幕上复制Windows表单,作为镜像,以便计费人员可以看到客户给出的反馈。

我使用下面的代码在辅助屏幕上显示:

Screen[] sc; Form f = new Form(); sc = Screen.AllScreens; f.FormBorderStyle = FormBorderStyle.None; f.Left = sc[1].Bounds.Left; f.Top = sc[1].Bounds.Top; f.Height = sc[1].Bounds.Height; f.Width = sc[1].Bounds.Width; f.StartPosition = FormStartPosition.Manual; f.Show(); 

但是,它不会镜像主屏幕上的表单。 我还提到了重复的窗口问题,但它会为同一个窗体创建不同的实例,这不会镜像Windows窗体。 如何在两个屏幕上镜像?

一种可行的方法是捕获将数据输入到计时器上的图像的表单(使用合理的延迟使其“几乎是实时”)并在辅助表单上的PictureBox上使用它。 要将表单捕获到图像,请执行以下操作:

 Bitmap bmp = new Bitmap(form.Width, form.Height); form.DrawToBitmap(bmp, new Rectangle(Point.Empty, bmp.Size)); 

然后将bmp作为图像分配给另一个窗体上的PictureBox

我已经制作了一个快速示例项目并将其上传到这里: https : //www.dropbox.com/s/pjuk3zvpbglhodb/SOTestMirror.zip?dl = 0

缺少在二级屏幕和样式上打开表单,但显示了可能的方法

结果是: 结果

为了记录:我不知道为什么当在DrawToBitmap上调用DrawToBitmap时,它使用Windows 7 chrome而不是Windows 8来复制到位图…这很有意思,至少可以说(而且我会说一个bug )。 这是在Win 8.1上运行的。 (由于我在任何地方都没有看过这个,我在Connect上打开了一个错误: https : //connect.microsoft.com/VisualStudio/feedback/details/1059444/in-windows-8-drawtobitmap-on-a- form-draw-the-windows-7-chrome )

以下是从扩展屏幕截取屏幕截图并显示在图片框中的简单代码。 你也可以保存到图像文件。

在计时器中添加此代码以在某个时间间隔刷新屏幕。

 private Bitmap bmpScreenshot; bmpScreenshot = new Bitmap(Screen.AllScreens[1].Bounds.Width, Screen.AllScreens[1].Bounds.Height, PixelFormat.Format32bppArgb); Graphics.FromImage(bmpScreenshot).CopyFromScreen(Screen.AllScreens[1].Bounds.X, Screen.AllScreens[1].Bounds.Y, 0, 0, Screen.AllScreens[1].Bounds.Size, CopyPixelOperation.SourceCopy); pictureBox1.Image = bmpScreenshot; pictureBox1.Refresh(); GC.Collect(); 

你也可以获得主屏幕的截图。