Example | Скрываем чужую консоль
Данная малюсенькая прога призвана решить проблему, описанную здесь. Действительно, иногда "болтающееся" черное окно консоли раздражает. Поэтому мы напишем хитрую "обертку" для конcольных приложений, которые запускают программу, но прячут её основное консольное окно.
Код:
#include <process.h> FAQ Q. И как использовать? A. Компилите. Кладёте результат (например hidec.exe) в c:\windows\system32. Вместо стандартного запуска "целевого" консольного приложения идёте в Пуск->Выполнить, набираете hidec.exe путь\имя_целевого_приложения. Консольное приложение будет запущено, но его окна Вы не увидите. Q. Эй, а где оно? И как его теперь закрыть? A. Посмотрите через Ctrl+Alt+Del. Снимать с выполнение - там же. Если "целевое" приложение умеет само закрываться после окончания своей работы, то оно так и сделает. Q. А может, лучше _default.pif настроить, или ярлык с определёнными свойствами сделать? A. Я никого не заставляю делать именно по-моему. Q. Как компилить? A. Я использую Visual C++ Toolkit. Компиляция: cl hide_console.cpp /GA /O1 /link /defaultlib:advapi32.lib /defaultlib:user32.lib Q. И что, я в своих консольных приложениях такое должен делать? A. Нет. В "своём" консольном приложении используёте FreeConsole(), или пишите через WinMain, а не main(). Данная "обёртка" нужна для чужих приложений. Q. Можно использовать в моих программах куски текста? A. Да, сделано специально для посетителей www.oszone.net Q. У меня ещё вопросы... A. Задавайте здесь, я отвечу. |
Отличная утилитка, спасибо!
Реально ли сделать так, что бы скрытое окно можно было просмотреть, скажем, по нажатию сочетания клавиш? |
Тут возник вопрос: как бы приостановить действие батника, содержащего несколько последовательных вызовов hidec? Дело в том, что в таком случае программы вызываются практически одновременно, а иногда надо подождать сначала завершения одного процесса, а затем выполнить вызов следующего приложения.
Вот ответ: Код:
#include <process.h> Код:
hidec.exe dontwaitme_1.exe Надеюсь, кому-то пригодится. Готовый (скомпилёный) вариант екзешника: тут (22K, сжато в зип до 11К) |
hasherfrog
Спасибо! Я так понял, что /W - case sensitive? Добавлено: хм, почему-то timestamp файла забежал в будущее... Архив с нормальным временем, а файл внутри 6/27/05 14:58. У меня сейчас 14:13 :) |
Vadikan
>> /W - case sensitive? Да. Лень было писать нормальную разборку синтаксиса :-( Теоретически можно было написать ((lpszCmd[1]|0x40) == 'W') - стал бы инсенситив. Только я спешил очень. Если надо, завтра перекомпилю. Но тут вопрос такой... Понимаешь, это всё равно кривой разбор строки. Например, пара пробелов вместо одного - и ничего не запустится :-( Соответственно, в инструкции по эксплуатации я должен был бы написать: "Внимательно формируйте командную строку!!!" - и этим снять с себя обязательства за AS IS. Или написать нормальный парсер, а это не улыбается (сегодня, так-то он у меня где-то валяется; или стандартный можно подцепить, правда, за счёт увеличения размера файла). >> хм, почему-то timestamp файла забежал в будущее... Ты забыл, где ты, а где я? :-) А таймстамп у архива получился нормальный, потому что он (как скачанный файл) получил время окончания скачки. Это в настройках браусвера где-то, емнип. |
Vadikan
:] К вопросу о размере... Savant'у есть что предложить :] Сейчас только разберёмся с ключиками... |
Вложений: 1
Код зазипован вместе с бинарником
Компиляция из ком. строки: Код:
cl hidec.cpp /GA /O1 /link /subsystem:windows kernel32.lib advapi32.lib user32.lib |
Насчет timestamp я потом уже догадался :)
Так, размер я вижу, значительно уменьшился и появилось окошко, об'ясняющее как юзать. Это хорошо. Только вот ключ стал /w. Вы либо сделайте нечувствительным к регистру, либо верните /W, а то путаница получается. Что же касается пробелов лишних, то это проблемы того, кто составляет батник. Нормальные люди ставят один пробел перед ключом, а остальным такая утилита не нужна ;) А почему такая разница в размерах, просветите? P.S. Я тут по ходу дела протестировал утилиту не из батника, а из RunOnceEx - все работает и ключ тоже. |
Vadikan
Цитата:
|
>> А почему такая разница в размерах, просветите?
Дык это недавно обсуждалось у нас тут :] Я же говорил, что у меня по аналогии "с кондачка" не получилось (с ключам компиляции/линковки запарка была), но Savant проявил мужество :] и довёл дело до конца. *** ЗЫ. Упс, опоздал :]]] *** Savant >> замена memcpy - кстати, а зачем? Как раз дабы устранить использование стандартных ненужных библиотек. |
Vadikan
Цитата:
hasherfrog Я почему-то считал, что memset - своеобразный inline и трогать его не стал... |
Savant
Исправил на |0x40 на |0x20? :] Балбесы. >> memset - своеобразный inline и трогать его не стал... Может и так. Но инклуд за инклудом тянет какую-то либу при линковке - я проверял. |
hasherfrog & Savant
Спасибо. На MSFN утилиту же протестировали на Т-39 (за 39 минут до окончания установки виндовс, самый ранний этап на котором пользователь может запускать исполняеме файлы) - все работает. Насчет разных редакторов я понял, а вот этого Цитата:
|
Vadikan
>> comments in Russian, though ;-) LOL. Может правда перевести на англ.? |
>> мне не надо, спасибо :D
Ну ты это, заходи, если что... (c) Волк, "Жил-был пёс" ;-) P.S. А тему мы завтра утречком почистим... Наверное. :-/ |
Savant Да ну, вряд ли там кто вникать будет в комменты. Просто изначально в этой теме было с исходным кодом, так там и сделал. hasherfrog Да, это вам не букмарклетам русский эквивалент придумывать, тут целиком предложения на сленге :) |
Утилита подверглась усиленному тестированию на MSFN. Как выяснилось, она не работает из cmdlines.txt. Команды внесенные в файл передаются командному интерпретатору в порядке их появления в файле. Синтаксис файла такой
Код:
[Commands] Не работает вариант Код:
[Commands] Цитата:
|
Меня вот какие вопросы интересуют: а предполагается ли запуск из cmdlines.txt такой конструкции "<exe-file> <parameter(s)>" и в каком виде передается исполняемая строка?
Просто из командной строки, например, выполнить такое нельзя (все, что имеется в кавычках будет посчитано за имя файла и будет выдано сообщение """winmine /?"" не является внутренней или внешней командой, исполняемой программой или пакетным файлом."). Тем не менее, почему-то прокатывает вариант "cmd /?"... |
"cmd /?" выполнить нельзя. Попробуйте не из командной строки, а из Пуск->Выполнить.
Vadikan, как-то не совсем понятно. Почитал-почитал доки по ссылке "почему"... А если (без /w) Код:
"hidec" "file1.cmd" Код:
"hidec /w file1.cmd" Всё дело в особенностях передачи аргументов в качестве командной строки. Я одно время очень тщательно разбирался с этим вопросом. И могу точно сказать, что в случае Цитата:
1. С использованием argv, argc: аргумент 0: x:\path with spaces\hidec.exe - без кавычек аргумент 1: /w аргумент 2: cmd.exe 2. С простым разбором (как у Savant'а: аргумент 0: x:\path with spaces\hidec.exe - не важно, но 99%, что без кавычек аргумент 1: /w cmd.exe - без кавычек. Нельзя писать так: c:/> "hidec" "/w cmd" c:/> "hidec /w cmd" c:/> "hidec cmd" Можно так: c:/> "hidec" /w "cmd" c:/> "hidec" /w cmd c:/> hidec /w cmd Что же касается файлов cmdlines.txt... Я не понял всё равно, почему Вы всё время пытаетесь запустить "hidec 1.cmd", а не "1.cmd", внутри которого куча hidec'ов? Есть, конечно, ещё вариант запрятать /w прямо внутрь hidec, т.е. сделать какой-нибудь wait4 (аналог hidec, но с ожиданием), если уж всё так упёрлось именно в /w. Будет две утилитки, а не одна? |
hasherfrog
Цитата:
Цитата:
Упирается-то не в ключ /w, a в то, что не срабатывает Код:
[Commands] |
Добавлю новым постом. В общем, говорить о том, что совсем не работает
Код:
[Commands] |
Vadikan
Я повторю. Предположим, есть batch.cmd, в котором происходит вызов пяти cmd.exe. Каждый из них будет открывать консоль самостоятельно. Итого - пять штук. Применённый как такому batch.cmd одноразовый hidec (i.e. hidec batch.cmd) скроет только окно консоли самого batch.cmd, на cmd.exe внутри он не подействует, потому что и не должен. Он обрубает только показ окна процесса-сына. Внуки вольны поступать, как им заблагорассудится. Более того, если бы, предположим, cmd.exe открывал два окна, скрывалось бы только первое. Поэтому я и настаиваю на использовании hidec внутри batch.cmd, попытка "обернуть" серию консольных приложений не пройдёт никогда. В примере, вызов hidec batch.cmd: Код:
file1.exe Код:
hidec file1.exe Надеюсь, объяснил. |
hasherfrog
Но в таком случае окно batch.cmd будет висеть все время выполнения внутренних команд... |
Savant
Ну да. Поэтому для "полной заглушки" нужно ещё и hidec batch.cmd. Более того, в большинстве стандартных случаев (например, при выполнении батника с системными командами типа cls, dir и т.д.; а также при выполнении консольных приложений, которые довольствуются родительской консолью, а не открывают свою) достаточно одного вызова hidec'а, на собственно batch.cmd. Но в случае с cmdlines.txt очевидно, что процесс, отвечающий за отработку команд оттуда (из cmdlines.txt) вынимает команды по очереди и каждое очередное приложение не имеет родительской консоли, потому что консоль предыдущего приложения из очереди закрылось всесте с самим приложением. Наверное, так. Чего-то я уже запутываюсь. |
Цитата:
hasherfrog Я понимаю как пользоваться утилитой, и как вызывать при ее помощи пакетные файлы абсолютно незаметно. Я ж говорю, я протестировал и GuiRunOnce (исполняется из соотв. ключа реестра при первом входе в систему) и RunOnceEx (примерно тоже самое). В обоих случаях все работает, вызывается hidec batch.cmd и все ок. Но в cmdlines.txt другой синтаксис. Команды перечисленные там передаются командному интерпретатору. Как передаются - хрен его знает. DOS команды там не работают, но виндовские приложения - да (REGEDIT и т.д). Но консольные окна hidec'ом не скрываются. Когда я говорю, что оин "мигают", я имею в виду, что у меня в самом батнике еще cmdow @ /HID со старых времен прописано, чтоб консольное окно не висело. В общем, я знаю, что у тебя много работы. Утилита же не задумывалась для cmdlines.txt. Будет время - что-нибудь придумаешь. Не будет - и так нормально. |
Вопрос мне в PM пришел
Цитата:
|
Вложений: 1
Possible. =)
И даже проще, чем обычный вариант. Не надо командную строку разбирать ;) Правда код придется новый катать. Предлагаю такой прототип: Код:
// Возвращает 0, если все ОК и не-0, если ошибка В принципе все готово, но еще не проверял. А мне утром доверять нельзя ;] Млин, во вложении почему-то оказался hidec[1].dll - на самом дело это зип-архив. Не верьте расширению! Updated! Добавил тестовое приложение. Кое-что подправил. |
Ух ну а все таки, где взять последнюю версию бинарника
и каков его синтаксис? |
На первой странице, либо здесь
|
Savant
А синтпксис каков, ибо я так понел сам код притерпел модификации и хотелось бы уточнить синтаксис командной строки |
Друзья!
А если использовать CreateWindowStation SetProcessWindowStation то пусть они все свои окна и открывают... но в другой Station... её же не видно... MSDN, короче... |
Когда мне нужно было скрыть консоль - я делал ShowWindow(..., SW_HIDE);
Вроде игры с настройками ярлыков помогали. |
Что-то ссылка на hidec.exe ( http://hasherfrog.narod.ru/RunHiddenConsole.exe ) битая.
|
domo22, см. Скрытие консольных окон
|
domo22, Ещё вариант - Как скрыть окно в котором выполняется пакетный файл (*.bat или *.cmd)?
|
Drongo, Прчел много и перепробовал на тему Как скрыть окно в котором выполняется пакетный файл (*.bat или *.cmd)? Ответа не нашел .Подскажите: без помощи дополнительных программ не реально запустить start.cmd для форматирования диска без окна консоли?
Код:
@ ECHO OFF format M: /FS:FAT32 /Y cmdow @ / HID del start.cmd |
Цитата:
А так же тема - [решено] Как скрыть консольное окно? -> Скрытие консольных окон |
Drongo, Большо спасибо!!! Все получилось.Каюсь виной всему моя невнимательность
|
Drongo, Не пойму в чем дело сейчас попробЫвал- опять выскакивает окно .Может что нета пишу
|
korsar77, Ваш скрипт вроде бы взаимодействует с пользователем, просит нажать на клавишу "Y". Приведите ваш скрипт целиком.
И главное. Цитата:
|
Drongo,
Код:
@echo off start FORMAT M: del start.cmd |
korsar77, Мне кажется, ничего в этом случае не выйдет, так как при выполнении этого батника, происходит запуск ещё консольной программы по форматированию - format.com
|
Drongo, По-большому счету это не так и актуально. но может помочь в определеной мере для общего развития.Вы можете предложить варианты для решения непосредственно для форматирования ?
|
Цитата:
|
Цитата:
Цитата:
Нашел ссылку на wiki, если кому надо, вот она, там и код и бинарник, хз какая версия, но кода там внушительно больше, чем здесь. |
Vadikan,
перечитал ваши посты и коллег в этой теме, также заинтересовало скрытие из guirunonce, вобщем правильно ли я сделал, использую hidcon, его положил в - oem - $$ - system32 в winnt.sif [GuiRunOnce] Command0="hidcon %windir%\Tweaks.cmd" все правильно? и самое интересное, скрытие окон из cmdlines, я так понял не решилось? тк hidcon там не прокатывает. |
Кто нибудь пробовал скрыть консоль в Windows 10? Утилиты hidec и hidcon в ней не работают, как и сторонние программы для скрытия консоли, теоретически скрыть консоль в Windows 10 можно, но передать команду выполнения на срытую таким образом консоль или выполнить bat или cmd файл через указанные утилиты невозможно.
|
Прошу извинения за предыдущее сообщение, утилиты hidec и hidcon прекрасно работают в Windows 10, проблема как оказалось заключалась исключительно в антивирусе Dr.Web после его установки в Windows 10, указанные утилиты как и некоторые системные настройки отказались правильно работать http://forum.drweb.com/index.php?sho...069&hl=windows
|
Vebserfer, Привет, я делал так, без сторонних программ типа hidcon, hidec, правда не в 10-ке, проверьте у себя, интересен результат.
Файл .cpp Код:
... Код:
... |
Доброго времени суток. А кто нибудь может подсказать, почему программа выполняет не всю строку? Есть CMD файл, который делает резервную копию некоторых программ:
Скрытый текст
Код:
7z a -ssw -mx9 -mmt=on -ms=on -y "d:\Install\!BackUp\Kodi_%date%.7z" "%APPDATA%\Kodi\" && 7z a -ssw -mx9 -mmt=on -ms=on -y "d:\Install\!BackUp\XBMC_Main_%date%.7z" "d:\Xbmc 13.6\" && 7z a -ssw -mx9 -mmt=on -ms=on -y "d:\Install\!BackUp\Bittorrent_%date%.7z" "%APPDATA%\BitTorrent\" Если в Планировщике Заданий создать задачу по запуску: Код:
hidec.exe Kodi_arc.cmd |
sNc-DAntES, для чего там вообще нужны «&&»?!
Цитата:
|
|
Цитата:
Код:
7z a -ssw -mx9 -mmt=on -ms=on -y "d:\Install\!BackUp\Kodi_%date%.7z" "%APPDATA%\Kodi\" Для совмещения нескольких команд в одной строке применяется один амперсанд «&», а использованный Вами «&&» используется для условного исполнения команд: последующая команда исполняется в том, и только в том случае, если предыдущая вернёт ненулевой код возврата. |
Iska, да, большое спасибо. Значит это я тормоз и всё забыл. Теперь через
Код:
hidec.exe Kodi_arc.cmd |
Скомпилируйте, пожалуйста, 64-битную версию.
|
Цитата:
А вы можете подсказать код который будет запускать тОлько robocopy.exe ? Подобная программа потенциально опасна т.к. может скрыть работу какой либо вредоносной программы, и поэтому хотелось бы адаптировать ее под определенную программу ( robocopy.exe - стандартная программа в windows 7, лежит в папке system32 ) т.е. ограничить.. |
wiznv, к сожалению, коллега hasherfrog три года, как не появлялся на форуме. Напишите ему письмо на почту (ссылка доступна из его профиля).
|
выложите кто-нибудь бинарник, пожалуйста.
|
|
Время: 09:19. |
Время: 09:19.
© OSzone.net 2001-