Мне было интересно, как бы вы написали приложение, в котором в основном размещались бы другие приложения?
Причина, по которой я спрашиваю, заключается в том, что я хотел бы создать приложение, которое «побеждает» мой нынешний взрыв открытых окон. Раньше я использовал виртуальные оконные менеджеры, они хороши и все такое, но я мог многое сделать с помощью приложения, о котором упоминал.
В качестве альтернативы, кто-нибудь знает простое в использовании / интуитивно понятное приложение для ограничения окон "областями" вашего экрана? Что-то вроде GridMove, но более интуитивно понятное и менее сложное?





Множественные интерфейсы документов может вам помочь.
Несмотря на многочисленные голоса против, я поддерживаю этот ответ, потому что ОП никогда не указывал источник «взрыва окон». Я видел бизнес-приложения, которые открывали несколько окон одновременно (или пользователей, которые открывали несколько экземпляров «для экономии времени»), где MDI был бы для них хорошей функцией.
Если OP - опытный пользователь, которому нужен другой оконный менеджер, потому что он запускает сразу много приложений, то это действительно не применимо. Это также не та проблема, которую я хотел бы решить - это был бы способ уменьшить количество окон.
Вы действительно прочитали вопрос? Я не думаю, что MDI станет заменой оконного менеджера для OP.
Извините, если я не понял, но да, взрыв окон означает несколько окон приложений. В основном я пытаюсь создать приложение, которое действует как MDI для приложений Другие, то есть тех, которые ему не принадлежат. Предложение dreamlax звучит так, как будто оно может сработать.
Я думаю, что то, что вы описываете, обычно называется оконным менеджером. Оболочка Windows сама по себе является (плохим) примером оконного менеджера. Возможно, вы захотите изучить некоторые альтернативы. Я знаю, что портирование KDE на Windows было успешным, так что вы можете посмотреть текущее состояние этого проекта.
Microsoft также предоставляет PowerToy (IIRC), который обеспечивает поддержку виртуальных рабочих столов, но это действительно плохо. Вы думали о том, чтобы просто получить второй монитор (и, возможно, такую утилиту, как MultiMon Taskbar, чтобы получить вторую панель задач на другом мониторе)?
Вы можете создать окно, затем перечислить все окна, которые имеют стиль WS_OVERLAPPEDWINDOW, выбрать те, которые принадлежат приложению, которое вы хотите разместить, затем вызвать SetParent в окне, установив родительский элемент для созданного вами окна. Вы также можете использовать FindWindow, чтобы найти окно по его заголовку.
Все окна внутри дома никогда не могут выходить за границы окна дома, но при этом соблюдают все те же правила. Вы по-прежнему можете перетаскивать окна и т. д.
Проблема здесь в том, что если приложение внутри дома создает другое окно, его родителем, скорее всего, будет окно рабочего стола, а не окно дома.
Хммм, это звучит интересно. Я, вероятно, мог бы использовать ловушку Windows, чтобы поймать создание новых окон и переродить их после этого, если это единственный случай, о котором вы упомянули. Мне придется попробовать, спасибо dreamlax, это звучит примерно так, как я хочу.
В общем, всегда есть ВМ.
Это может быть излишним или неработающим в зависимости от специфики того, что вы пытаетесь сделать. Но VMWare позволит вам копировать / вставлять файлы и текст между вашей виртуальной машиной и локальным компьютером, так что это не так уж и далеко до настоящего оконного менеджера. Системные требования даже не такие уж и возмутительные, учитывая, сколько памяти занимает iTunes + типичный браузер.
Вот код, который использует FindWindow / SetParent для создания представления с вкладками, объединяющего различные приложения Док-станция для джедаев
Я также написал приложение (не бесплатное, не с открытым исходным кодом), которое развивает эту идею немного дальше, и оно называется WindowTabs. ВНИМАНИЕ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Единственное предостережение, которое я хотел бы вам сделать, это то, что не всем приложениям нравится быть родителями. Если вы пишете .NET, там есть кое-что из «Готча» (вот почему WindowTabs не использует родительский контроль).
Кроме того, как правило, после того, как вы выполняете SetParent, вы присоединяетесь к потокам на уровне Win32, что означает, что если один зависнет, все они будут тостами.
Полагаю, вы не упомянули об этом в своем сообщении, поскольку это, вероятно, «секретный соус» WindowTab, но что тогда WindowTabs использует, если не воспитание?
Хотел бы я быть достаточно умным, чтобы приготовить секретный соус! В основном я просто использую MoveWindow и SetWindowPos вместе с добавлением перехватчика в дочерние процессы для синхронизации стыковочного окна и закрепленного окна. Я размещу в блоге статью об архитектуре и в какой-то момент обновлю ее ссылкой.
+1 Привет! Я только что услышал о программных "вкладках" и попробовал. Это потрясающе. Мне было интересно то же самое, и я был о том, чтобы задать вопрос о SO о том, как это можно построить? Из-за привычки сначала искать, к счастью, я нашел вас (автора оконных вкладок) здесь. Прошло более 1,5 лет с тех пор, как вы разместили этот комментарий. Вы писали это сообщение в блоге? Где ссылка? Я хочу знать его архитектуру.
Я не хочу превращать свой ответ в бессовестную пробку для моего продукта :) Напишите мне, и я буду рад ответить на любые ваши вопросы об архитектуре.
Только заметил, что мой пост был отредактирован из-за приветствия и благодарности в конце. Не то чтобы меня это злило / раздражало / и т. д., А просто любопытно - сделал ли я что-то не так?