2011-09-06 71 views
6

这里上克隆的形式是我的情况(对不起,是啰嗦,但我发现很难简明地描述这一点):扩展桌面

我们有一个C#应用程序(即我们开发),其在带有两个监视器的系统上运行。但是,每台显示器都面向不同的用户。也就是说,具有控制权的用户1只看到监视器A和具有“只读”位置的用户2仅看到监视器B.直到现在,我们一直在使用克隆显示器,使得A和B显示相同的信息。但是,希望能够在工作流程的特定实例中向用户1和2显示不同的内容。

这需要桌面有时被克隆而其他时间被扩展的情况。不幸的是,这种解决方案对我来说似乎是不受欢迎的,因为当你在桌面模式(屏幕变黑,临时重新定位窗口)之间进行切换时,视觉会发生什么 - 它基本上不是一个干净的过渡。这就是我寻找替代品的原因。

显然,仅克隆解决方案将无法正常工作,因此需要使用扩展模式。

扩展模式很容易让我在监视器A和B上显示两种不同的形式,但是我能为两次监视器显示同样的事情做些什么?有没有办法让我显示C#System.Windows.Forms.Form的“复制”或“克隆”,而原始文件是否打开,这反映了相同的信息?

是否有另一种解决方案来解决这个问题?或者是“使用DisplaySwitch.exe的显示模式之间切换”的方法尽可能好?

(假设我们有在平台完全控制 - 硬件和软件)

+1

使用显示不同信息但显示相同信息的完全相同的系统有什么问题? (可能很好地使用了Mediator模式) – pdr

+0

@pdr我不确定,但我认为你建议的方法是,对于需要在A和B上显示相同信息的情况,我创建了两个Form X的实例并在每个显示器上显示一个实例?我认为,调解员将促进这两种情况,比如X1和X2,表格保持最新。我想我试图避免这种方法的主要原因是它意味着相当重要的重新分解,但它可能是唯一的选择。 – Kohanz

回答

0

根据您的需求,也就是它必须多久更新等,总有创建形式的位图,以及显示的选项第二种形式的位图。

我个人认为这是一种黑客行为,使用像@pdr这样的中介模式是一种更清洁的方法。但是如果你需要一个快速(和肮脏)的解决方案,这可能会完成工作。

发布的代码具有原型质量,应予以相应处理。

public partial class MainForm : Form 
{ 
    private bool m_Running; 

    public MainForm() 
    { 
     InitializeComponent(); 

     DuplicateForm f2 = new DuplicateForm(this.Text); 
     f2.Show(); 

     m_Running = true; 
     Thread t = new Thread(new ThreadStart(() => 
      { 
       while (m_Running) 
       { 
        this.Invoke(new MethodInvoker(() => 
        { 
         Bitmap bm = new Bitmap(Width, Height); 
         // pnl is a Panel with Dock=Fill 
         pnl.DrawToBitmap(bm, new Rectangle(0, 0, Width, Height)); 
         f2.SetImage(this, bm); 
        })); 

        Thread.Sleep(500); // or use a timer 
       } 
      })); 

     t.Start(); 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     m_Running = false; 
    } 
} 

public partial class DuplicateForm : Form 
{ 
    public DuplicateForm(string title) 
    { 
     InitializeComponent(); 
     Text = title + " [copy]"; 
    } 

    public void SetImage(Form source, Image img) 
    { 
     this.Size = source.Size; 
     // Picturebox is a PictureBox control with Dock=Fill 
     pictureBox1.Image = img; 
    } 
} 
+0

该应用程序包含实时视频,所以我同时欣赏对于快速入侵的建议(某种程度上,我要求提供),但这可能对我无效。 – Kohanz

+0

不,它肯定不会:) – havardhu

2

考虑使用远程访问程序,如TightVNC。它可以在环回模式下运行,在客户端程序中显示主监视器图像。然后您必须移动到第二台显示器才能获得克隆。与您最小化和恢复的自定义表单一起使用。

+0

这是一个有趣的选项。我将不得不调查TightVNC在扩展桌面上的外观(我需要它是无缝的,例如无边框,以便我可以在辅助监视器上“全屏显示”)以及我是否可以在不违反GPL的情况下使用它。 – Kohanz

2

现在详细说明我的评论,我有更多的时间。

与其试图将表单A克隆到表单B中,在两者之间建立某种通信层,以使表单A不关心与之通信的内容或显示的数据是相同的还是完全不同的。

最简单的方法是将中介挂钩到表单A上的事件上,并在触发这些事件时将必要的数据发送到表单B以呈现它。

在数据相同的情况下,这可能就像每次Form A更新并在Form B上渲染它时一样简单(很像Harvardflu的答案,但将该逻辑放入中介器中),或者你可以在另一个线程中运行应用程序进程,并通过不同的中介同时更新表单A和表单B(尽管如你所述,这可能是一次重大的重组)。

最佳解决方案可能介于两者之间。

+0

感谢您的阐述。我确实认为“最好”的解决方案在于这个领域的某个地方。需要多少重新考虑因素才是我需要更密切关注的问题。时间到原型,我想:) – Kohanz