在所有屏幕上克隆窗口

时间:2013-04-29 23:14:31

标签: c# .net winforms multiple-monitors

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

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

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

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

我想要的是在我的主屏幕和次要屏幕上同时显示此类表格的完全复制品。我真的希望有相同窗口的多个实例,精确副本,其中一个实例反映另一个实例的更改,反之亦然。我可以使用放置在远程位置的主屏幕控制辅助屏幕(对某些弹出信息做出反应等)。我不知道如何在.Net中使用winforms实现类似的东西。怎么做?

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

1 个答案:

答案 0 :(得分:2)

从概念上讲,您可以使用第二个窗口(称之为“镜像”)来复制主窗体。 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。它还涉及跨进程通信,这是不相关的,但解释了很多关于消息和拦截它们的细节。