Наш магазин на eBay Наш магазин на AliExpress Наш канал в telegram

Рабочие столы Windows и простейший менеджер рабочих столов на С++ Builder

Рабочие столы Windows

Как я недавно узнал, — в Windows 10 у пользователей наконец «появилась» такая штука, как виртуальные рабочие столы. Сейчас, наверное, многие скажут, — Здравствуйте вам, проснулся, уже 11-я винда вышла, алё. Но, подождите кидаться тапками, сейчас мы ещё узнаем, кто тут из нас проснулся? Я то, по-крайней мере после семёрки всё больше с линуксом работаю, либо с виртуальными машинами с какой-нибудь старой виндой (типа семёрки или XP), запущенными опять же из под линукса, а вот некоторые до сих пор в инете пишут, какое же крутое изобретение эти виртуальные рабочие столы, хотя эти самые столы вообще-то уже более 20 лет с нами. Да, да, вы не ослышались, соответствующий API, появился в винде, если я не ошибаюсь, ещё со времён NT4 и сами мелкомягкие активно им пользовались. Впрочем, их умение продавать вчерашний снег всегда меня поражало.

Итак, что же это за штука такая, виртуальный рабочий стол и чем он отличается от реального? Ну, вообще говоря, реальным рабочим столом является только тот, под которым стоит системный блок вашего компьютера и на котором стоит подключенный к нему монитор. А вот любой рабочий стол в вашей винде — виртуальный. Лучше всего прочитать про концепцию windows-станций и рабочих столов у самих мелкомягких в документации (я её на всякий случай в пэдээфничек выгрузил, пока лавочку не прикрыли).

Общий смысл в том, что в винде есть три группы объектов: user (пользовательские: менюшки, иконки, курсоры, окна…), GDI (объекты графического интерфейса: шрифты, кисти, палитры…) и Kernel (токены доступа, процессы, сокеты, windows-станции, рабочие столы…). Кстати, почитать про эти группы тоже можно прямо в документации от Microsoft. Так вот, объекты ядра — защищаемые (securable), а вот первые две группы объектов — нет. Действия над защищаемыми объектами система контролирует, используя всякие токены доступа (access tokens), идентификаторы защиты (SID), описатели защиты (security descriptors), списки контроля доступа (ACL) (со всем этим, кстати, неплохо бы разобраться). Для остальных групп объектов никакой защиты нет.

И как же тогда защитить всякие секретные данные, которые мы вводим в разных окошках от каких-нибудь любопытных программ или пользователей? Очень просто, решили мелкомягкие, — нужно привязать незащищаемые объекты к защищаемым. Для этого как раз и придумали виндовс-станции (windows stations) и рабочие столы (desktops).

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

Процесс без нужных прав не может создать окно на нашем рабочем столе, а значит и не может получить данные из расположенных на этом столе окон. Как я уже сказал, сами мелкомягкие давно это используют. Например, окошки обычных программ привязаны по-умолчанию к рабочему столу default. Но, скажем, когда вы нажимаете сочетание клавиш ctrl+alt+del — вы в результате попадаете на другой рабочий стол, который называется Winlogon. На этом же рабочем столе вы вводите свой пароль при входе в винду. На этот же рабочий стол система переключает вас, когда спрашивает разрешение на выполнение каких-либо действий. Обычному юзеру на этот рабочий стол не попасть, соответственно, данные из привязанных к этому столу окошек не украсть, кнопки в привязанных к нему окошках — не нажать (прав не хватит). Когда включается хранитель экрана, он тоже запускается на отдельном рабочем столе — screensaver (а вдруг там вирус?). Даже когда винда обнаруживает, что ваша копия нелицензионна — она тоже просто переключает вас на другой рабочий стол, с которого вы не можете убежать.

Кто ещё это использует? Ну, например, всякие не очень опасные программы-вымогатели. Как правило они просто открывают своё окошко на другом рабочем столе (не default) и пользователь никак не может с этого рабочего стола сбежать (так делать не нужно, это просто чтобы вы таких программ сильно не боялись). Или некоторые SCADA-системы, в которых как раз специально нужно, чтобы обычные пользователи не могли в Windows выйти. Аналогично, запускаем скаду на другом рабочем столе и всё, юзер никак с этого стола не сбежит. Даже если он по ctrl+alt+del перейдёт на стол winlogon и запустит «диспетчер задач», то диспетчер запустится на столе default, а юзер вернётся на тот стол, на котором он был перед нажатием ctrl+alt+del. Ну и все остальные горячие клавиши Windows (Win+R, Ctrl+ESC и другие) будут вызывать какие-либо действия на столе default, а не на том, на котором запущена ваша скада.

Следующий вопрос, — Как со всем этим работать? Как создавать рабочие столы, как на них переключаться? Я уже говорил, — в винде для этого есть специальные функции API. Выше была ссылка на документацию по Windows-станциям и рабочим столам от Microsoft. В этой доке есть раздел «Windows Station and Desktop Reference», в котором есть раздел «Windows Station and Desktop Functions», содержащий ссылки на описания API-функций для работы с рабочими столами (EnumDesktops, CreateDesktop, OpenDesktop, SwitchDesktop и другие). Кроме этого настоятельно рекомендую почитать документ «Window Stations and Desktops» с сайта installsetupconfig.com, там тоже всё довольно подробно описано, есть примеры, плюс в этой доке описана система всех этих токенов, сидов и прочего, что позволяет работать под произвольной учёткой.

Естественно, в сети давно уже есть куча разных менеджеров рабочих столов и для XP, и для Win7 и для других версий винды. Естественно, я тоже захотел изобрести свой собственный велосипед и написал свой простейший менеджер рабочих столов. Ниже приводится его описание, а также выложена сама программа и её исходники.

Простейший менеджер на C++ Builder

Итак, ниже показано рабочее окно программы.

менеджер виртуальных рабочих столов Windows

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

  • Run a new instance of the application, associated with the desktop we switched to — после переключения будет запущен ещё один экземпляр менеджера, но уже с окном на новом рабочем столе
  • Run a new instance of command line, associated with the desktop we switched to — после переключения будет запущена командная строка (cmd.exe) с окном на новом рабочем столе (например, чтобы потом эксплорер запустить)
  • Close this instance of the application after switching to another desktop — после переключения текущий экземпляр программы будет закрыт
  • Switch to the selected desktop when this instance of the application closes — если пользователь попытается закрыть программу, то перед закрытием он будет переключен на выбранный рабочий стол
  • Run the program selected below, associated with the desktop we switched to — после переключения будет запущена выбранная ниже программа (можно выбрать программу кнопкой Select program… или просто вписать путь к программе в поле под этой опцией). Эта опция позволяет запустить на новом столе произвольную программу (например, ту же SCADA-систему)

Ниже, под панелью опций, расположены кнопки, позволяющие создать новый рабочий стол или переключиться на выбранный. Кнопка Create new desktop создаёт новый рабочий стол с именем, прописанным в поле ввода справа от кнопки Create new desktop. Кнопка Switch to desktop выполняет переключение на выбранный рабочий стол. Имя выбранного рабочего стола указывается в поле ввода справа от кнопки Switch to desktop.

Ниже расположена таблица, в которой перечисляются все найденные программой рабочие столы (результат работы функции EnumDesktops). Если кликнуть правой кнопкой мыши по какому-либо имени из этого списка и во всплывающем меню кликнуть select desktop, то это имя пропишется в поле ввода напротив кнопки Switch to desktop (то есть этот стол выберется для переключения).

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

Кроме того, в программе предусмотрено сочетание горячих клавиш (Ctrl + Alt + S), позволяющее вернуться к начальному рабочему столу, на котором была запущена программа. Напоминание об этом можно увидеть в центральной области рабочего окна программы.

Вот, в общем-то, и всё. Ниже, как и обещал, сама программа и её исходники.

7z-архив с программой (257 Кбайт)

7z-архив с исходниками на C++ Builder 6 (429 Кбайт)

P.S. Чуть не забыл, — отдельный респект Virtual-у за его консультации и древние исходники на дельфях.

Добавить комментарий