Я провел последние несколько дней, исследуя, можно ли использовать Windows API (желательно Windows 8) для разработки приложения, которое может использовать функции в конфигурации с несколькими физическими мониторами, с одного физического монитора. Насколько я могу вам сказать, вы просто не можете этого сделать или просто не документируете вообще. Ниже я расскажу о своей проблеме и проведенных исследованиях в надежде, что кто-то сможет предоставить некоторые знания, которые я еще не встречал.
Проблема
В конфигурациях с несколькими мониторами Windows 7+ можно использовать некоторые классные функции рабочего стола, такие как возможность использования одного большого рабочего стола, который охватывает несколько мониторов, бесшовное перетаскивание приложений между ними, возможность переключения между диапазоном панели задач или нет и т.д.
Виртуальный экран (ссылка MSDN).
Я хотел бы получить доступ к этому API и позволить моему приложению использовать его, чтобы позволить пользователю эффективно иметь несколько виртуальных рабочих столов с одного физического монитора. Просто как это.
Решение
Здесь я представлю ряд предлагаемых решений, которые я нашел, и почему они не будут работать (насколько я могу судить).
1. Используйте Window Station и Desktop API для создания совершенно новых рабочих столов и переключения между ними.
"Станция окна является защищаемым объектом, связанным с процессом, и содержит буфер обмена, таблицу атомов и один или несколько объектов рабочего стола. Рабочий стол - это защищаемый объект, содержащийся на оконной станции. Рабочий стол имеет логическую поверхность отображения и содержит объекты пользовательского интерфейса, такие как окна, меню и перехватчики. " Ссылка MSDN.
Это действительно чистый и простой способ эффективно создавать несколько рабочих столов в окнах, что позволяет пользователю переключаться между ними на одном мониторе. Однако он имеет следующие большие оговорки:
"Windows не предоставляет способ перемещения окна с одного рабочего объекта на другой, и поскольку на каждом рабочем столе должен выполняться отдельный процесс Explorer, чтобы предоставить панель задач и меню" Пуск ", большинство приложений для лотков видны только на первом рабочий стол". Sysinternals on TechNET.
2. Попытайтесь создать поддельный драйвер дисплея, чтобы заставить Windows полагать, что у него несколько мониторов.
Это, по-видимому, является допустимым вариантом для нескольких существующих похожих приложений, таких как ZoneScreen. Однако в Windows 7 стало сложно установить неподписанный драйвер, а в Windows 8 оказалось невозможным.
3. Подделайте его, пытаясь отследить приложения и заставить их скрываться между определенными пользователем группами мониторов.
Как коммерческие, так и бесплатные приложения, такие как DisplayFusion и Finestra Virtual Кажется, что на настольных компьютерах используется чрезвычайно запутанная и сложная система отслеживания запущенных приложений и попытки скрыть и показать их, когда пользователь переключается между виртуальными мониторами.
Это наиболее эффективное решение, так как оно в значительной степени соответствует всем требованиям. Но его взломать - некоторые приложения на самом деле не работают с ним, и есть много угловых случаев, когда он не работает.
Что мне здесь не хватает? Является ли какое-либо из моих исследований неправильным до сих пор? Существуют ли области API, которые я еще не установил?