2013-04-29 2 views
3

Я использую настройку dualview в своей ОС (1 вид расширен на 2 экрана). В моем приложении WinForms я могу переместить конкретное окно на дополнительный экран, например .:Клонирование окна на всех экранах

foreach (Screen s in Screen.AllScreens) 
{ 
    if (!s.Primary) { 
     myform.Bounds = s.Bounds; 
     break; 
    } 
} 

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

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

Я хочу сделать точный дубликат такой формы, которая будет отображаться как на моем основном экране, так и на вторичном. Мне бы очень хотелось иметь несколько экземпляров одного и того же окна, точную копию, где один экземпляр отражает изменения на другом, и наоборот. Я мог бы контролировать дополнительный экран (реагировать на некоторые всплывающие окна и т. Д.), Используя основной, размещенный в удаленном месте. Я не знаю, как реализовать что-то подобное в .Net с использованием winforms. Как это сделать ?

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

+0

Окно имеет ручку. Дублирование этого дескриптора (и всех его ручек) будет проблематичным. Вместо этого создайте «мета» список окон, который отображается на основном экране, со ссылкой на форму, которая находится на невидимом экране. Таким образом, вы можете управлять им, отправив команды через ваше мета-приложение. –

+0

Я предполагаю, что использование параметров экрана Windows для отображения «Дублировать» (http://www.microsoft.com/athome/organization/twomonitors.aspx#fbid=8FUzom9Mh1T) не может быть и речи, не так ли? –

+0

@Michael Todd: приятное предложение, если у вас есть более подробная информация о подобных подходах, я был бы признателен. – jwaliszko

ответ

2

Концептуально вы можете использовать второе окно (назовите его «Зеркальная форма»), чтобы дублировать основную форму. Capture the screen for the primary form и отобразить захваченную часть на форме зеркала.

Эта часть - легкая часть. Если вы хотите иметь возможность фактически взаимодействовать с формой Mirror, вам нужно будет захватить все входные данные пользователя, такие как перемещение мыши, наведение, щелчок событий и события клавиатуры и повторное воспроизведение их в основной форме.

Возможно, вы сможете сделать это с обработчиками событий в форме Зеркала, захватив все их и воспроизведя их в основной форме. Тем не менее, я бы посмотрел на захват сообщений в форме зеркала. Скорее всего, это более всеобъемлющий и, вероятно, более чистый способ кода, чтобы «контролировать» события и отправлять их в основную форму. Вы также можете «съесть» сообщения в зеркальную форму, из-за чего фокус будет изменяться (например, может возникнуть проблема, если фокус ввода внезапно смещается от первичной формы к форме зеркала, пока пользователь думает, что они взаимодействуют с основной формой).

Для получения дополнительной информации о сообщениях обратите внимание на переопределение WndProc of the Form (что действительно Control.WndProc) и here. Хорошая обзорная статья - Deliver The Power Of Spy++ To Windows Forms With Our New Tool. В нем также рассматривается взаимосвязь между процессами, которая не имеет отношения к делу, но объясняет большую часть деталей сообщений и их перехватывает.

+0

Спасибо за ваши усилия (+1). Я продолжу это завтра, так как сегодня в Польше посреди ночи. – jwaliszko

+0

Подход «Зеркальная форма» (моментальный снимок) очень умен, поскольку я не предсказываю, чтобы аудитория взаимодействовала с проецируемой формой. Однако с этим связаны две проблемы.Первая - это реакция на изменения, внесенные в первоначальную форму. Поскольку такая форма интерактивна - что-то расписывается там, когда время проходит, окно моментального снимка должно отражать эти изменения. Идеально - обнаружить только квадраты, на которых что-то изменилось. Второе - разрешение. Cloning 1: 1 не позволяет использовать разные разрешения для проектора и ноутбука (что довольно распространено). – jwaliszko

+0

Я рассматриваю прямо сейчас создание отдельного окна (простая панель управления со стороны оператора) для управления невидимым проецируемым окном. Эти окна будут соединены. Окно управления будет иметь ссылку на проецируемое одно и наоборот - если кто-то закроет одно из таких окон, второе будет закрыто. Только незначительные требуемые функции будут реализованы на панели управления (изменения статуса, кнопка закрытия и т. Д.). Полное «клонирование» кажется довольно большим накладным капиталом .. (несмотря на то, что все-таки было бы здорово). – jwaliszko

Смежные вопросы