В свое время при знакомстве с линуксом меня заинтриговала возможность вызова консоли в том виде, в каком это сделано в многочисленных играх. Из примеров подобных программ можно упомянуть Guake и Yakuake. Вменяемых вариантов под Windows найти не получилось, поэтому спустя какое-то время я созрел на написание своего варианта.
Помня о том, что я не программист, а всего-лишь обычный админ, я понял, что писать терминал полностью с нуля не потяну. Поэтому логичным решением было использовать то, что есть — cmd.exe и родную оболочку от PS.
Сначала я попытался встроить окно родного шелла в свое, отрезая у него бордеры и заголовок, но внезапно оказалось, что эмулятор терминала ведет себя совсем не так, как обычное окно и при отрезании заголовка (WS_CAPTION) с помощью SetWindowLong() начинаются странные глюки с отрисовкой. Из других «бонусов» — WS_VSCROLL выставляется постоянно и не снимаем, а размеры самого окна не могут быть изменены попиксельно, только с учетом ширины буфера экрана и размера шрифта.
Стало ясно, что окно терминала придется оставить в покое. Тогда я просто решил сдвигать его влево-вверх так, чтобы заголовок и граница не были видны, а справа прикрывать границу и скролл с помощью еще одного пустого окна.
Итого, логика получилась примерно такая:
Несмотря на откровенные костыли такая схема вполне адекватно заработала на всем, начиная от Windows XP.
Известные баги:
Скачать: setup, portable, говнокод
Протестировано на Windows XP/Vista/7/8, в качестве эмуляторов терминала проверялись cmd, bash и powershell.
UPD: Для указания шрифта и ширины рабочего пространства нужно запустить cmd.exe отдельно, щелкнуть ПКМ по заголовку и настроить умолчания. Альтернативно — как предложил zzeneg.
Хоткей по умолчанию для вызова консоли — Ctrl-TAB
UPD2: Все пожелания учту и постараюсь реализовать в следующем большом обновлении, после нового года. Ну, сами понимаете ;)
UPD3: Новая версия:
Фичами займусь в следующем большом апдейте, вкратце список такой:
1. Возможность устанавливать размер окна по горизонтали.
2.Поддержка mintty (мануал)
3. Возможность указывать хоткей без модификатора.
Думаю пока все. Всем спасибо за отзывы и с наступающим! :)
Помня о том, что я не программист, а всего-лишь обычный админ, я понял, что писать терминал полностью с нуля не потяну. Поэтому логичным решением было использовать то, что есть — cmd.exe и родную оболочку от PS.
Сначала я попытался встроить окно родного шелла в свое, отрезая у него бордеры и заголовок, но внезапно оказалось, что эмулятор терминала ведет себя совсем не так, как обычное окно и при отрезании заголовка (WS_CAPTION) с помощью SetWindowLong() начинаются странные глюки с отрисовкой. Из других «бонусов» — WS_VSCROLL выставляется постоянно и не снимаем, а размеры самого окна не могут быть изменены попиксельно, только с учетом ширины буфера экрана и размера шрифта.
Стало ясно, что окно терминала придется оставить в покое. Тогда я просто решил сдвигать его влево-вверх так, чтобы заголовок и граница не были видны, а справа прикрывать границу и скролл с помощью еще одного пустого окна.
Итого, логика получилась примерно такая:
- Спауним процесс шелла, ищем хэндл окна с помощью GetWindowThreadProcessId()
- Кастуем на окно SetParent()
- Сдвигаем окно влево на SM_CXFRAME и вверх на SM_CYFRAME + SM_CYCAPTION
- Подстраиваем высоту главного окна с учетом невозможности указать точные размеры терминалу
- Справа прикрываем границу и скролл (опционально) отдельным окном, при любой отрисовке пихая ему HWND_TOP
Несмотря на откровенные костыли такая схема вполне адекватно заработала на всем, начиная от Windows XP.
Известные баги:
- Рандомные косяки с отрисовкой в эмуляторе терминала, пока не понял как лечить
- Невозможность использовать команду «найти» в контекстном меню
Скачать: setup, portable, говнокод
Протестировано на Windows XP/Vista/7/8, в качестве эмуляторов терминала проверялись cmd, bash и powershell.
UPD: Для указания шрифта и ширины рабочего пространства нужно запустить cmd.exe отдельно, щелкнуть ПКМ по заголовку и настроить умолчания. Альтернативно — как предложил zzeneg.
Хоткей по умолчанию для вызова консоли — Ctrl-TAB
UPD2: Все пожелания учту и постараюсь реализовать в следующем большом обновлении, после нового года. Ну, сами понимаете ;)
UPD3: Новая версия:
- Частично исправлено возможное моргание при открытии-закрытии
- rCons теперь будет искать конфиг сначала в своей директории, а потом в AppData
Фичами займусь в следующем большом апдейте, вкратце список такой:
1. Возможность устанавливать размер окна по горизонтали.
2.
3. Возможность указывать хоткей без модификатора.
Думаю пока все. Всем спасибо за отзывы и с наступающим! :)