Как решить проблему фокусировки с помощью приложения с двумя мониторами? - PullRequest
2 голосов
/ 24 декабря 2008

У нас есть приложение, которое использует настройку с двумя мониторами - пользователь A будет работать с монитором 1, а пользователь B будет работать с монитором 2 одновременно. Монитор 2 - это устройство с сенсорным экраном.

Теперь проблема в том, что когда пользователь А что-то печатает на своем экране, если пользователь Б пытается что-то сделать, пользователь А в конечном итоге теряет фокус из своего окна, что губительно.

Что может быть хорошим решением, чтобы сохранить фокус на окне в Monitor 1, даже если пользователь B что-то делает с Monitor 2?

Ответы [ 5 ]

5 голосов
/ 24 декабря 2008

Это возможно с небольшим количеством смазки для локтя. Вставьте этот код в форму, отображаемую на сенсорном экране:

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();
    }
4 голосов
/ 24 декабря 2008

Для меня это звучит так, как если бы вы хотели 2 компьютера ... или, возможно, разместили виртуальную машину на компьютере и дали бы доступ к второму монитору через USB-видеокарту (не совсем подходящий термин). Самые современные виртуальные машины позволяют передавать данные по USB.

В большинстве случаев дисплеи с несколькими головками используются либо для того, чтобы предоставить одному пользователю много экранной недвижимости, либо в качестве средства только для отображения (например, для отображения статистики сети / сервера в режиме реального времени при настройке большой инфраструктуры).

1 голос
/ 24 декабря 2008

Я никогда не работал с сенсорными экранами, но я склонен думать, что они работают так же, как мышь. Так что, если это правда, я думаю, вы можете использовать хуки Windows для захвата событий. Если событие происходит с клавиатуры (я предполагаю, что оно одиночное), направьте его в ваше первое окно. Если событие происходит от мыши, проверьте его координаты (или, возможно, идентификатор устройства, если оно есть, я не знаю). Если оно находится в вашем первом окне, прямой ввод в него. Если он находится на втором экране, прямой ввод во второе окно.

Если экран не похож на мышь, я думаю, вы найдете другой способ поставить на него зацепку.

Я не знаю, сработает ли это. Это просто концептуальная идея.

Редактировать: Конечно, вам нужно определить, какое приложение должно получать сообщения на первом экране. Я предполагаю, что Z-порядок может помочь, если пользователь не открывает какое-либо приложение сверху. Может быть лучше отследить сообщения OnFocus (или что-то подобное), чтобы отслеживать, какое приложение получает фокус (исключая ваше другое приложение).

(Комментарии, объясняющие любые недостатки этого метода, приветствуются!)

1 голос
/ 24 декабря 2008

Я не могу найти способ, позволяющий двум пользователям одновременно получать доступ к одной и той же среде рабочего стола, не сталкиваясь с проблемами фокусировки. Если подумать, разрешить два приложения (или в этом случае одно приложение с двумя пользовательскими «областями» всегда будет проблематично, поскольку приложению потребуется попытаться отследить, какое устройство ввода работало в последнее время, с какой областью экран.

Вы могли бы иметь возможность добавлять функции для фильтрации входов по устройству и отправлять каждый отдельный вход в отдельный набор элементов управления, но я полагаю, что это потребует некоторой работы на уровне драйвера.

0 голосов
/ 24 декабря 2008

Разве вы не можете подделать это? Есть одно окно, которое охватывает оба монитора и действует как контейнер для окон, с которыми вы работаете?

...