代码之家  ›  专栏  ›  技术社区  ›  amazedsaint

如何用双监视器应用程序解决这个焦点问题?

  •  2
  • amazedsaint  · 技术社区  · 16 年前

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

    现在,问题是,当用户A在屏幕上键入某个东西时,如果用户B试图做某件事,那么用户A最终将失去窗口的焦点,这是灾难性的。

    即使用户B对监视器2做了些什么,在监视器1中保持窗口焦点的一个好的解决方案是什么?

    5 回复  |  直到 16 年前
        1
  •  5
  •   Hans Passant    16 年前

    用一些肘部润滑脂是可能的。将此代码粘贴到触摸屏上显示的表单中:

    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();
        }
    
        2
  •  4
  •   Marc Gravell    16 年前

    对我来说,听起来你可能想要两台电脑…或者可以在PC上托管一个虚拟机,并通过一个USB视频“卡”(不完全正确的术语)让虚拟机访问第二个监视器。MMOST现代虚拟机允许USB传输。

    大多数情况下,多头显示器要么用于为单个用户提供大量屏幕不动产,要么用作仅显示功能(例如,通过大型基础设施设置显示实时网络/服务器状态)。

        3
  •  1
  •   ZombieSheep    16 年前

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

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

        4
  •  1
  •   Hosam Aly    16 年前

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

    如果屏幕不像鼠标,我想你会找到另一种方法来钩住它。

    我不知道这样行不行。这只是一个概念上的想法。

    编辑: 当然,您需要确定哪个应用程序应该在第一个屏幕上接收消息。我想z-order会有帮助,除非用户打开一些top应用程序。最好跟踪onfocus消息(或类似消息),以跟踪哪个应用程序获得关注(不包括您的其他应用程序)。

    (欢迎使用此方法解释任何不符合之处的评论!)

        5
  •  0
  •   Stever B    16 年前

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