|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - Example | Скрываем чужую консоль |
|
Разное - Example | Скрываем чужую консоль
|
Старый параноик Сообщения: 2423 |
Профиль | Отправить 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 |
Новый участник Сообщения: 39
|
Профиль | Отправить PM | Цитировать Отличная утилитка, спасибо!
Реально ли сделать так, что бы скрытое окно можно было просмотреть, скажем, по нажатию сочетания клавиш? |
Отправлено: 02:25, 20-01-2005 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать Тут возник вопрос: как бы приостановить действие батника, содержащего несколько последовательных вызовов hidec? Дело в том, что в таком случае программы вызываются практически одновременно, а иногда надо подождать сначала завершения одного процесса, а затем выполнить вызов следующего приложения.
Вот ответ: #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; int bWait = 0; if ((lpszCmd[0] == '/')&&(lpszCmd[1] == 'W')&&(lpszCmd[2] == 0x20)) { bWait = 1; lpszCmd += 3; } /* 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 ) ) { if (bWait) WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); } /* terminate this */ return 0; } hidec.exe dontwaitme_1.exe hidec.exe dontwaitme_2.exe hidec.exe /W 1st_app_with_wait.exe @echo Stage 1 completed... ... hidec.exe /W 2nd_app_(also_wait).bat @echo Stage 2 completed... ... Надеюсь, кому-то пригодится. Готовый (скомпилёный) вариант екзешника: тут (22K, сжато в зип до 11К) |
Отправлено: 15:07, 27-06-2005 | #3 |
(*.*) Сообщения: 36539
|
Профиль | Сайт | Отправить PM | Цитировать hasherfrog
Спасибо! Я так понял, что /W - case sensitive? Добавлено: хм, почему-то timestamp файла забежал в будущее... Архив с нормальным временем, а файл внутри 6/27/05 14:58. У меня сейчас 14:13 |
------- Отправлено: 23:09, 27-06-2005 | #4 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать Vadikan
>> /W - case sensitive? Да. Лень было писать нормальную разборку синтаксиса :-( Теоретически можно было написать ((lpszCmd[1]|0x40) == 'W') - стал бы инсенситив. Только я спешил очень. Если надо, завтра перекомпилю. Но тут вопрос такой... Понимаешь, это всё равно кривой разбор строки. Например, пара пробелов вместо одного - и ничего не запустится :-( Соответственно, в инструкции по эксплуатации я должен был бы написать: "Внимательно формируйте командную строку!!!" - и этим снять с себя обязательства за AS IS. Или написать нормальный парсер, а это не улыбается (сегодня, так-то он у меня где-то валяется; или стандартный можно подцепить, правда, за счёт увеличения размера файла). >> хм, почему-то timestamp файла забежал в будущее... Ты забыл, где ты, а где я? :-) А таймстамп у архива получился нормальный, потому что он (как скачанный файл) получил время окончания скачки. Это в настройках браусвера где-то, емнип. |
|
Отправлено: 02:48, 28-06-2005 | #5 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать Vadikan
:] К вопросу о размере... Savant'у есть что предложить :] Сейчас только разберёмся с ключиками... |
Отправлено: 10:10, 28-06-2005 | #6 |
Старожил Сообщения: 300
|
Профиль | Сайт | Отправить PM | Цитировать |
Последний раз редактировалось Savant, 28-06-2005 в 14:30. Отправлено: 11:31, 28-06-2005 | #7 |
(*.*) Сообщения: 36539
|
Профиль | Сайт | Отправить PM | Цитировать Насчет timestamp я потом уже догадался
Так, размер я вижу, значительно уменьшился и появилось окошко, об'ясняющее как юзать. Это хорошо. Только вот ключ стал /w. Вы либо сделайте нечувствительным к регистру, либо верните /W, а то путаница получается. Что же касается пробелов лишних, то это проблемы того, кто составляет батник. Нормальные люди ставят один пробел перед ключом, а остальным такая утилита не нужна А почему такая разница в размерах, просветите? P.S. Я тут по ходу дела протестировал утилиту не из батника, а из RunOnceEx - все работает и ключ тоже. |
------- Отправлено: 13:26, 28-06-2005 | #8 |
Старожил Сообщения: 300
|
Профиль | Сайт | Отправить PM | Цитировать Vadikan
Цитата:
|
|
Отправлено: 13:47, 28-06-2005 | #9 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать >> А почему такая разница в размерах, просветите?
Дык это недавно обсуждалось у нас тут :] Я же говорил, что у меня по аналогии "с кондачка" не получилось (с ключам компиляции/линковки запарка была), но Savant проявил мужество :] и довёл дело до конца. *** ЗЫ. Упс, опоздал :]]] *** Savant >> замена memcpy - кстати, а зачем? Как раз дабы устранить использование стандартных ненужных библиотек. |
Отправлено: 13:51, 28-06-2005 | #10 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
[решено] Консоль 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 |
|