【问题标题】:Clone window across all screens在所有屏幕上克隆窗口
【发布时间】:2013-04-30 07:59:33
【问题描述】:

我在我的操作系统中使用双视图设置(1 个视图扩展到 2 个屏幕)。在我的 winforms 应用程序中,我可以将特定窗口移动到辅助屏幕,例如:

foreach (Screen s in Screen.AllScreens)
{
    if (!s.Primary) {
        myform.Bounds = s.Bounds;
        break;
    }
}

一切都很好,当我可以看到这个辅助屏幕时。如果我看到它,我可以使用此类窗口窗体提供的任何功能,例如我可以通过点击相应的按钮来关闭它。

但是如果我看不到这个辅助屏幕怎么办,例如这是显示在另一个房间墙上的投影图像?那时我不能使用我被遗弃的形式。如何应对这种不舒服的情况(不能搬到同一个房间)?

我想要的是在我的主屏幕和辅助屏幕上都显示这种形式的精确副本。我真的很想拥有同一个窗口的多个实例,精确副本,其中一个实例反映另一个实例的更改,反之亦然。我可以使用放置在远程位置的主屏幕来控制辅助屏幕(对一些弹出信息等做出反应)。我不知道如何使用winforms在.Net中实现这样的东西。怎么办?

顺便说一句:如果这很难实现,从概念的角度可以做什么?我知道我可以定义一些键盘快捷键,但这不是我想要的。有什么想法吗?

【问题讨论】:

  • 一个窗口有一个句柄。复制该句柄(及其包含的所有句柄)将是有问题的。相反,如何创建一个显示在主屏幕上的“元”窗口列表,其中包含指向看不见的屏幕上的表单的链接。这样您就可以通过元应用程序向它发送命令来控制它。
  • 我认为使用 Windows 显示设置来“复制”显示 (microsoft.com/athome/organization/…) 是不可能的,对吧?
  • @Michael Todd:很好的建议,如果您有类似方法的更多信息,我将不胜感激。
  • @scott:对,这里超出了范围。

标签: c# .net winforms multiple-monitors


【解决方案1】:

从概念上讲,您可以使用第二个窗口(称为“镜像表单”)来复制主表单。 Capture the screen for the primary form 并在镜像窗体上显示捕获的部分。

那部分是容易的部分。如果您希望能够与 Mirror 表单进行实际交互,则需要捕获所有用户输入,例如鼠标移动、悬停、单击事件和键盘事件,并将它们重播到主表单上。

您可以通过捕获所有事件处理程序并在主表单上重放它们来使用 Mirror 表单上的事件处理程序来做到这一点。但是,我会考虑在镜像表单上捕获消息。这可能更全面,也可能是一种更简洁的代码方式,可以“监控”事件并将它们发送到主表单。您还可以“吃掉”进入镜像表单的消息,这些消息会导致焦点发生变化(例如,如果输入焦点突然从主表单转移到镜像表单,而用户认为他们正在与主表单交互,则可能会出现问题)。

有关消息的更多信息,请查看覆盖然后WndProc of the Form(实际上是Control.WndProc)和here。一篇不错的概述文章是Deliver The Power Of Spy++ To Windows Forms With Our New Tool。它还处理不相关的跨进程通信,但解释了有关消息和拦截它们的许多细节。

【讨论】:

  • 感谢您的努力 (+1)。明天我会通过它,因为现在是波兰的半夜。
  • “镜像形式”(快照)方法非常聪明,因为我不预测观众会与投影形式进行交互。但是,将有 2 个与此相关的问题。第一个是对原始表格所做更改的反应。由于这种形式是交互式的——随着时间的推移,那里正在绘制一些东西,快照窗口应该反映这些变化。理想情况下 - 只检测发生变化的方块。第二件事 - 分辨率。克隆 1:1 不允许投影仪和笔记本电脑使用不同的分辨率(这是很常见的事情)。
  • 我现在正在考虑创建分离窗口(简单的控制面板,在操作员侧),以控制不可见的投影窗口。这些窗口将被耦合。控制窗口将参考投影的窗口,反之亦然 - 如果有人关闭其中一个窗口,则第二个窗口也将关闭。控制面板仅会实现次要功能(状态更改、关闭按钮等)。完整的“克隆”似乎是相当大的开销..(尽管它毕竟会很酷)。
  • @JaroslawWaliszko 要更新有关更改的快照,您可以响应正确的 Windows 消息。 WM_PAINT 如果我在需要重新绘制自身的任何窗口/hwnd 上正确回忆。因此,只需检测 WndProc 中的那些并触发更新。分辨率需要更多考虑,但我认为您可以通过将窗口重新绘制到具有不同分辨率的不同 hDC/图形设备上来解决这个问题。对于快速简单的 hack(尽管图像质量较低),我首先会使用缩放图像。对于商业应用程序窗口,它可能是可以接受的。
  • @JaroslawWaliszko 我认为“操作员窗口”方法(类似于我关于“镜像形式”的答案的第一部分)是一种可靠的方法。绝对是最大的收益。正如我在回答中继续解释的那样(在“简单的部分”之后),您可能可以进行完整的克隆,但在实施和测试方面需要付出更多的努力。所以我认为运算符窗口方法是一个很好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 2010-12-23
  • 1970-01-01
  • 2016-10-21
  • 2011-07-30
  • 2018-07-07
相关资源
最近更新 更多