如何使用双显示器应用程序解决此焦点问题?

时间:2008-12-24 10:44:32

标签: c# .net windows winforms multiple-monitors

我们有一个使用双显示器设置的应用程序 - 用户A将与Monitor 1配合使用,用户B将同时使用Monitor 2。监视器2是一个触摸屏设备。

现在,问题是,当用户A在屏幕上输入内容时,如果用户B尝试做某事,用户A将最终失去他窗口的焦点,这是灾难性的。

即使用户B对监视器2执行某些操作,在监视器1中保持对窗口的关注可能是一个很好的解决方案?

5 个答案:

答案 0 :(得分:5)

可以使用一些肘部油脂。将此代码粘贴到您在触摸屏上显示的表单中:

protected override CreateParams CreateParams {
  get {
    const int WS_EX_NOACTIVATE = 0x08000000;
    CreateParams param = base.CreateParams;
    param.ExStyle |= WS_EX_NOACTIVATE;
    return param;
  }
}

确保表单不会从主窗体中窃取焦点。看起来像这样:

  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      Thread t = new Thread(SecondMonitor);
      t.IsBackground = true;
      t.SetApartmentState(ApartmentState.STA);
      t.Start();
    }
    private void SecondMonitor() {
      Form2 f2 = new Form2();
      f2.StartPosition = FormStartPosition.Manual;
      f2.Left = 800;   // Use Screen class here...
      f2.ShowDialog();
    }

答案 1 :(得分:4)

对我来说,听起来你可能想要2台PC ......或者可能在PC上托管VM,并通过USB视频“卡”让VM访问第二台显示器(不是很合适的术语)。最现代的VM允许USB传输。

大多数情况下,多头显示器要么用于为单个用户提供大量屏幕空间,要么用作仅显示设施(例如,通过大型基础架构设置显示实时网络/服务器统计信息)。 / p>

答案 2 :(得分:1)

我无法看到允许两个用户同时访问同一桌面环境而不会遇到焦点问题的方法。如果您考虑一下,允许两个应用程序(或者在这种情况下,一个具有两个用户“区域”的应用程序将始终存在问题,因为应用程序需要尝试跟踪哪个输入设备最近在哪个区域工作屏幕。

可能能够添加功能来过滤每个设备的输入并将每个不同的输入发送到一组单独的控件,但我想这需要一些驱动程序级别的工作。

答案 3 :(得分:1)

我从未使用过触摸屏,但我倾向于认为它们像鼠标一样工作。因此,如果这是真的,我认为您可以使用Windows挂钩来捕获事件。如果事件来自键盘(我假设是单一的),请将其指向您的第一个窗口。如果事件来自鼠标,请检查其坐标(或者设备ID,如果有的话,我不知道)。如果它在您的第一个窗口内,则直接输入它。如果它在第二个屏幕中,则直接输入到第二个窗口。

如果屏幕不像鼠标,我猜你会找到另一种方法来为它设置一个钩子。

我不知道这是否有效。这只是一个概念性的想法。

编辑:当然,您需要确定哪个应用程序应在第一个屏幕上接收消息。我猜Z-order可以提供帮助,除非用户打开一些顶级应用程序。跟踪OnFocus消息(或类似的东西)以跟踪哪个应用程序正在获得焦点(不包括您的其他应用程序)可能更好。

(非常欢迎使用此方法解释任何缺陷的评论!)

答案 4 :(得分:0)

你能不假装吗?有一个窗口跨越两个监视器,并充当您正在使用的窗口的容器吗?