【问题标题】:How to solve this focus problem with a dual monitor application?如何用双显示器应用程序解决这个焦点问题?
【发布时间】:2008-12-24 10:44:32
【问题描述】:

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

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

即使用户 B 对监视器 2 执行某些操作,什么可能是保持监视器 1 中窗口焦点的好解决方案?

【问题讨论】:

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


    【解决方案1】:

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

    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】:

      对我来说,听起来您可能想要两台 PC ......或者可能在 PC 上托管一个 VM,并通过 USB 视频“卡”(不太正确的术语)让 VM 访问第二个显示器。大多数现代 VM 都允许 USB 传输。

      大多数时候,多头显示器要么用于为单个用户提供大量屏幕空间,要么用作仅显示设施(例如,在大型基础设施设置上显示实时网络/服务器统计信息)。

      【讨论】:

      • 所以,你想说,当用户使用另一个窗口时,有没有一种方法可以将焦点保留在一个窗口上?谢谢
      • 我的意思是这将是困难而不是简单的;您可能需要专业知识和可能的特殊驱动程序。除此之外,我不知道。
      • 谢谢。但是托管 VM 是一个重量级的解决方案。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

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

        【讨论】:

        • 是的,它们的工作方式有点像鼠标。大多数驱动程序模拟鼠标点击。
        • 所以我们应该在 Monitor 2 上运行的应用程序中捕获窗口消息,如果不是在 Monitor 2 上运行的应用程序窗口上发生鼠标单击,则将其发送到应用程序在监视器 1 上运行
        • 但是我们应该知道当前在监视器 1 上哪个应用程序处于活动状态
        • 我以为你有两个窗口,而不是两个应用程序。但这不应该有太大的区别恕我直言。检查我编辑的答案。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-13
          • 1970-01-01
          • 1970-01-01
          • 2021-04-02
          相关资源
          最近更新 更多