2

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

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

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

4

5 回答 5

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();
    }
于 2008-12-24T14:21:31.483 回答
4

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

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

于 2008-12-24T10:48:52.927 回答
1

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

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

于 2008-12-24T11:00:58.643 回答
1

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

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

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

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

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

于 2008-12-24T12:36:15.487 回答
0

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

于 2008-12-24T17:00:00.383 回答