3

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

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

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

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

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

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

4

1 回答 1

2

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

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

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

有关 Messages 的更多信息,请查看覆盖表单的 WndProc(实际上是Control.WndProc)和此处。一篇不错的概述文章是使用我们的新工具将 Spy++ 的力量传递给 Windows 窗体。它还处理不相关的跨进程通信,但解释了有关消息和拦截它们的许多细节。

于 2013-04-29T23:59:33.460 回答