Как использовать функциональность установки нескольких мониторов без физического оборудования?

Я провел последние несколько дней, исследуя, можно ли использовать Windows API (желательно Windows 8) для разработки приложения, которое может использовать функции в конфигурации с несколькими физическими мониторами, с одного физического монитора. Насколько я могу вам сказать, вы просто не можете этого сделать или просто не документируете вообще. Ниже я расскажу о своей проблеме и проведенных исследованиях в надежде, что кто-то сможет предоставить некоторые знания, которые я еще не встречал.


Проблема

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

Виртуальный экран (ссылка MSDN). enter image description here

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


Решение

Здесь я представлю ряд предлагаемых решений, которые я нашел, и почему они не будут работать (насколько я могу судить).

1. Используйте Window Station и Desktop API для создания совершенно новых рабочих столов и переключения между ними.

"Станция окна является защищаемым объектом, связанным с процессом, и содержит буфер обмена, таблицу атомов и один или несколько объектов рабочего стола. Рабочий стол - это защищаемый объект, содержащийся на оконной станции. Рабочий стол имеет логическую поверхность отображения и содержит объекты пользовательского интерфейса, такие как окна, меню и перехватчики. " Ссылка MSDN.

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

"Windows не предоставляет способ перемещения окна с одного рабочего объекта на другой, и поскольку на каждом рабочем столе должен выполняться отдельный процесс Explorer, чтобы предоставить панель задач и меню" Пуск ", большинство приложений для лотков видны только на первом рабочий стол". Sysinternals on TechNET.

2. Попытайтесь создать поддельный драйвер дисплея, чтобы заставить Windows полагать, что у него несколько мониторов.

Это, по-видимому, является допустимым вариантом для нескольких существующих похожих приложений, таких как ZoneScreen. Однако в Windows 7 стало сложно установить неподписанный драйвер, а в Windows 8 оказалось невозможным.

3. Подделайте его, пытаясь отследить приложения и заставить их скрываться между определенными пользователем группами мониторов.

Как коммерческие, так и бесплатные приложения, такие как DisplayFusion и Finestra Virtual Кажется, что на настольных компьютерах используется чрезвычайно запутанная и сложная система отслеживания запущенных приложений и попытки скрыть и показать их, когда пользователь переключается между виртуальными мониторами.

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


Что мне здесь не хватает? Является ли какое-либо из моих исследований неправильным до сих пор? Существуют ли области API, которые я еще не установил?

Ответ 1

разработать приложение, которое может использовать функции в конфигурации с несколькими физическими мониторами, с одного физического монитора

API Windows связывает каждый рабочий стол с процессом проводника, а панель задач, уведомления и т.д. управляются на рабочем столе. С помощью этого API можно создавать новые виртуальные рабочие столы, создавая новый рабочий объект. Однако, если вы пытаетесь создать что-то, что эквивалентно рабочим пространствам в дистрибутивах linux, вам не повезло. Объект рабочего стола управляет приложениями, запущенными в дереве процессов, и перемещение приложений между этими объектами рабочего стола и т.д. Невозможно из-за того, как обрабатываются обработчики окон.

Решение

Здесь я представлю ряд предлагаемых решений, которые я нашел, и почему они не будут работать (насколько я могу судить).

Единственный способ добиться чего-то близкого к рабочим пространствам - подделать его -

каждая рабочая область и ее процесс должны отображаться в панели задач/области уведомлений слотами. Но это очень сложно достичь, и игры, полноэкранные приложения и т.д. Обязательно сломаются. Я не знаю, как это будет работать в Win8. Итак, да - рабочие пространства в Windows собираются сосать с самого начала.