Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - Example | Скрываем чужую консоль

Ответить
Настройки темы
Разное - Example | Скрываем чужую консоль

Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85


Конфигурация

Профиль | Отправить PM | Цитировать


Данная малюсенькая прога призвана решить проблему, описанную здесь. Действительно, иногда "болтающееся" черное окно консоли раздражает. Поэтому мы напишем хитрую "обертку" для конcольных приложений, которые запускают программу, но прячут её основное консольное окно.

Код: Выделить весь код
#include <process.h> 
#include <stdio.h> 
#include <windows.h> 
 
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lpszCmd,int nCmd) 
{ 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 
 
    /* create process with new console */ 
    memset(&si,0,sizeof(si)); 
    si.cb = sizeof(si); 
    si.dwFlags = STARTF_USESHOWWINDOW; 
    si.wShowWindow = SW_HIDE; 
    if( CreateProcess( NULL, lpszCmd, 
                       NULL, NULL, FALSE, CREATE_NEW_CONSOLE, 
                       NULL, NULL, &si, &pi ) ) 
    { 
        CloseHandle( pi.hProcess ); 
        CloseHandle( pi.hThread ); 
    } 
 
    /* terminate this */ 
    return 0; 
}
Скачать

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. Задавайте здесь, я отвечу.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:40, 29-06-2004

 

(*.*)


Сообщения: 36541
Благодарности: 6689

Профиль | Сайт | Отправить PM | Цитировать


Добавлю новым постом. В общем, говорить о том, что совсем не работает
Код: Выделить весь код
[Commands]
"hidec.exe batch.cmd"
некорректно. Оно работает, но консольные окна не скрываются. У меня было два батника, оба отработали, но и оба окна я видел.

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 08:05, 11-07-2005 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


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
fil2.cmd
file3.bat
ничего не даст, но вызов batch.cmd
Код: Выделить весь код
hidec file1.exe
hidec fil2.cmd
hidec file3.bat
именно то, что нужно.

Надеюсь, объяснил.



Отправлено: 09:09, 11-07-2005 | #22


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


hasherfrog
Но в таком случае окно batch.cmd будет висеть все время выполнения внутренних команд...

Отправлено: 09:12, 11-07-2005 | #23


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Savant
Ну да. Поэтому для "полной заглушки" нужно ещё и hidec batch.cmd. Более того, в большинстве стандартных случаев (например, при выполнении батника с системными командами типа cls, dir и т.д.; а также при выполнении консольных приложений, которые довольствуются родительской консолью, а не открывают свою) достаточно одного вызова hidec'а, на собственно batch.cmd. Но в случае с cmdlines.txt очевидно, что процесс, отвечающий за отработку команд оттуда (из cmdlines.txt) вынимает команды по очереди и каждое очередное приложение не имеет родительской консоли, потому что консоль предыдущего приложения из очереди закрылось всесте с самим приложением.

Наверное, так. Чего-то я уже запутываюсь.

Отправлено: 09:28, 11-07-2005 | #24


(*.*)


Сообщения: 36541
Благодарности: 6689

Профиль | Сайт | Отправить PM | Цитировать


Цитата Savant:
Но в таком случае окно batch.cmd будет висеть все время выполнения внутренних команд...
Именно! В этом все и дело.

hasherfrog
Я понимаю как пользоваться утилитой, и как вызывать при ее помощи пакетные файлы абсолютно незаметно. Я ж говорю, я протестировал и GuiRunOnce (исполняется из соотв. ключа реестра при первом входе в систему) и RunOnceEx (примерно тоже самое). В обоих случаях все работает, вызывается hidec batch.cmd и все ок.

Но в cmdlines.txt другой синтаксис. Команды перечисленные там передаются командному интерпретатору. Как передаются - хрен его знает. DOS команды там не работают, но виндовские приложения - да (REGEDIT и т.д). Но консольные окна hidec'ом не скрываются. Когда я говорю, что оин "мигают", я имею в виду, что у меня в самом батнике еще cmdow @ /HID со старых времен прописано, чтоб консольное окно не висело.

В общем, я знаю, что у тебя много работы. Утилита же не задумывалась для cmdlines.txt. Будет время - что-нибудь придумаешь. Не будет - и так нормально.

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 09:30, 11-07-2005 | #25


(*.*)


Сообщения: 36541
Благодарности: 6689

Профиль | Сайт | Отправить PM | Цитировать


Вопрос мне в PM пришел
Цитата:
I like to integrate this great utility into a application build with Uniface, a 4GL toolbox. Therefor I need a dll-version of this program. I that possible? I'm not really into c++ and compiling stuff. Perhaps you can tell me how I can compile a dll-version

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 21:51, 18-07-2005 | #26


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Вложения
Тип файла: zip hidec.dll.zip
(4.2 Kb, 174 просмотров)

Possible.
И даже проще, чем обычный вариант. Не надо командную строку разбирать Правда код придется новый катать. Предлагаю такой прототип:
Код: Выделить весь код
// Возвращает 0, если все ОК и не-0, если ошибка
int RunHiddenConsole(char* lpszCmdLine, BOOL bWait);
Добавлено:
В принципе все готово, но еще не проверял. А мне утром доверять нельзя ;]

Млин, во вложении почему-то оказался hidec[1].dll - на самом дело это зип-архив. Не верьте расширению!

Updated!
Добавил тестовое приложение. Кое-что подправил.

Последний раз редактировалось Savant, 19-07-2005 в 11:14.


Отправлено: 22:03, 18-07-2005 | #27


Аватара для SyCraft

Старожил


Сообщения: 342
Благодарности: 10

Профиль | Сайт | Отправить PM | Цитировать


Ух ну а все таки, где взять последнюю версию бинарника
и каков его синтаксис?

-------
Мой блог: Сделай то что хочешь из того что нравится!
----
Помощь проектам развивающихся в рамках OSZone.net


Отправлено: 10:51, 20-12-2005 | #28


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


На первой странице, либо здесь

Отправлено: 18:47, 20-12-2005 | #29


Аватара для SyCraft

Старожил


Сообщения: 342
Благодарности: 10

Профиль | Сайт | Отправить PM | Цитировать


Savant
А синтпксис каков, ибо я так понел сам код притерпел модификации и хотелось бы уточнить синтаксис командной строки

-------
Мой блог: Сделай то что хочешь из того что нравится!
----
Помощь проектам развивающихся в рамках OSZone.net


Отправлено: 09:39, 22-12-2005 | #30



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - Example | Скрываем чужую консоль

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Консоль Windows Sweet_Lady Хочу все знать 13 27-03-2009 21:28
Прочее - [решено] last login..(консоль) slaine Общий по Linux 2 24-11-2008 18:21
[решено] консоль ММС и удаленное управление nedrug Microsoft Windows 2000/XP 6 20-03-2007 16:21
[решено] Консоль с добиванием табом как в Linux? andrey_tor Microsoft Windows 2000/XP 5 23-02-2006 12:32
Delphi - Delphi: как закрыть чужую прогу pvr30 Программирование и базы данных 13 06-08-2003 19:15




 
Переход