【问题标题】:Duplicate Windows form on multiple screen in c#在 C# 中的多个屏幕上复制 Windows 窗体
【发布时间】:2014-12-30 21:24:37
【问题描述】:

我正在为一家汽车公司开发反馈系统。在计费台上,有一个双显示器设置:一个用于计费人员,一个用于提供反馈的客户。我需要在两个屏幕上复制一个 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();

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

【问题讨论】:

  • 为什么要投反对票?这似乎是一个真正的问题。
  • 您希望辅助表单如何反映原始表单?在您的代码中,您只是打开一个表单(或者看起来,如果f 是一个表单),但那里根本没有任何代码可以反映原始表单。 Color c = Color.Red; 行让我感到困惑
  • f 是 Form 的对象。我在问如何镜像原始的,在上面的代码中我已经展示了我如何在辅助屏幕上打开表单。
  • 对镜像的需求是一种非常奇怪的需求,而且不太可能是合适的。但是您需要编写 很多 更多的代码。迭代控件并更改 Location 属性。当客户修改其内容时,每个控件都需要通知其他表单。使用第二台显示器在硬件中执行此操作,只需显示与第一台显示器相同的内容,这是一个非常简单的解决方案。
  • @HansPassant 如果镜像表单不需要可编辑(问题说它只需要被看到),通过镜像位图也很简单,正如我在我的示例项目

标签: c# winforms screen mirroring multiple-monitors


【解决方案1】:

一种可能的方法是捕获将数据输入到计时器上的图像的表单(使用合理的延迟,使其“几乎是实时的”)并在辅助服务器上的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 时,它会使用 Windows 7 chrome 而不是 Windows 8 复制到位图...至少可以说这很有趣(而且我会说一个错误)。这是在 Win 8.1 上运行的。 (由于我没有在任何地方看到过这个,我在 Connect 上打开了一个错误:https://connect.microsoft.com/VisualStudio/feedback/details/1059444/in-windows-8-drawtobitmap-on-a-form-draws-the-windows-7-chrome

【讨论】:

【解决方案2】:

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

在计时器中添加此代码以每隔一段时间刷新屏幕。

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();

您还可以获取主屏幕的屏幕截图。

【讨论】:

猜你喜欢
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 2011-03-10
  • 2017-10-29
  • 1970-01-01
  • 2013-01-09
相关资源
最近更新 更多