我们有一个使用双显示器设置的应用程序 – 用户A将与显示器1一起工作,而用户B将与显示器2同时工作。 显示器2是触摸屏设备。
现在的问题是,当用户A在他的屏幕上键入内容时,如果用户B试图做某事,用户A最终将失去从他的窗口的焦点,这是灾难性的。
即使用户B对Monitor 2做了些什么,在Monitor 1的窗口中保留焦点也许是一个很好的解决scheme?
有一些手肘油脂是可能的。 将此代码粘贴到您在触摸屏上显示的窗体中:
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上托管一台虚拟机,并通过USB视频“卡”(不太合适)让虚拟机访问第二台显示器。 几乎现代的虚拟机允许USB传输。
大多数情况下,多头显示器既可用于为单个用户提供大量的屏幕空间,也可用作仅显示设备(例如,在大型基础架构设置中显示实时网络/服务器状态)。
我不能看到让两个用户同时访问相同桌面环境的方法,而不会遇到焦点问题。 如果你考虑一下,允许两个应用程序(或者在这种情况下,一个具有两个用户“区域”的应用程序总是会有问题,因为应用程序需要试图跟踪哪个输入设备最近在哪个区域工作屏幕。
您可以添加功能来过滤每个设备的输入,并将每个不同的输入发送到一组单独的控件,但我想这将需要一些驱动程序级别的工作。
我从来没有使用触摸屏,但我倾向于认为他们像鼠标一样工作。 所以如果这是真的,我认为你可以使用Windows挂钩来捕获事件。 如果事件是来自键盘(我认为是单一的),将其引导到您的第一个窗口。 如果事件来自鼠标,请检查其坐标(或者可能是设备ID,如果有的话,我不知道)。 如果它在你的第一个窗口内,直接输入它。 如果它在第二个屏幕,直接输入到第二个窗口。
如果屏幕不像一个鼠标,我想你会找到另一种方法来为它挂钩。
我不知道这是否会奏效。 这只是一个概念性的想法。
编辑:当然,您需要确定哪个应用程序应该在第一个屏幕上接收消息。 我猜Z-顺序可以帮助,除非用户打开一些顶部的应用程序。 跟踪OnFocus消息(或类似的东西)可能会更好,以跟踪哪个应用程序获得焦点(不包括您的其他应用程序)。
(解释任何与这种方法的不足之处的评论是非常受欢迎的!)
你能不能伪造它? 有一个跨越两个监视器的窗口,并充当您正在使用的窗口的容器?