Koh*_*anz 6 c# multiple-monitors
这是我的情况(对不起啰嗦,但我发现很难简明扼要地描述):
我们有一个C#应用程序(我们开发)在一个带有两个监视器的系统上运行.但是,每个监视器都面向不同的用户.也就是说,具有控制权的用户1仅看到监视器A和用户2,其具有"只读"位置仅看到监视器B.到目前为止,我们一直使用克隆显示器,使得A和B显示相同的信息.然而,期望能够在工作流中的特定实例处向用户1和2显示不同的事物.
这需要桌面有时克隆而其他时间是扩展的情况.不幸的是,这个解决方案对我来说似乎是不可取的,因为当您在桌面模式之间切换时,视觉上会发生什么(屏幕变黑,临时重新定位窗口) - 它基本上不是一个干净的过渡.这就是我正在探索替代方案的原因.
显然,仅克隆的解决方案将无法正常工作,因此离开了扩展模式.
扩展模式很容易让我在监视器A和B上显示两种不同的形式,但是我可以做什么呢?我希望两个监视器显示相同的东西?有没有办法让我在原始文件打开时显示C#System.Windows.Forms.Form的"复制"或"克隆",这反映了相同的信息?
我忽视了这个问题的另一种解决方案吗?或者"使用DisplaySwitch.exe在显示模式之间切换"方法是否正确?
(假设我们完全控制平台 - 硬件和软件)
根据您的需要,即必须刷新的频率等,始终可以选择创建表单的位图,并以第二种形式显示该位图。
我个人认为这是一种黑客行为,并且使用 @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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1327 次 |
| 最近记录: |