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

Компьютерный форум 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. Есть. Тут пока лежит.

Q. Что это ты такой добрый? Вирус, наверное, хочешь впарить...
A. Просто интересы совпали. А потом,

Q. Можно использовать в моих программах куски текста?
A. Да, сделано специально для посетителей www.oszone.net

Q. У меня ещё вопросы...
A. Задавайте здесь, я отвечу.
Это сообщение посчитали полезным следующие участники:

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

 

Новый участник


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

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


Отличная утилитка, спасибо!
Реально ли сделать так, что бы скрытое окно можно было просмотреть, скажем, по нажатию сочетания клавиш?

Отправлено: 02:25, 20-01-2005 | #2



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

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


Аватара для hasherfrog

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


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

Профиль | Отправить 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...
...
Программа hidec, вызванная с параметром /W будет ждать выполнения "своего" процесса.
Надеюсь, кому-то пригодится. Готовый (скомпилёный) вариант екзешника: тут (22K, сжато в зип до 11К)
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:07, 27-06-2005 | #3


(*.*)


Administrator


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

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


hasherfrog
Спасибо! Я так понял, что /W - case sensitive?

Добавлено: хм, почему-то timestamp файла забежал в будущее... Архив с нормальным временем, а файл внутри 6/27/05 14:58. У меня сейчас 14:13

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


Отправлено: 23:09, 27-06-2005 | #4


Аватара для hasherfrog

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


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

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


Vadikan
>> /W - case sensitive?
Да. Лень было писать нормальную разборку синтаксиса :-( Теоретически можно было написать ((lpszCmd[1]|0x40) == 'W') - стал бы инсенситив. Только я спешил очень. Если надо, завтра перекомпилю. Но тут вопрос такой... Понимаешь, это всё равно кривой разбор строки. Например, пара пробелов вместо одного - и ничего не запустится :-( Соответственно, в инструкции по эксплуатации я должен был бы написать: "Внимательно формируйте командную строку!!!" - и этим снять с себя обязательства за AS IS. Или написать нормальный парсер, а это не улыбается (сегодня, так-то он у меня где-то валяется; или стандартный можно подцепить, правда, за счёт увеличения размера файла).

>> хм, почему-то timestamp файла забежал в будущее...
Ты забыл, где ты, а где я? :-)
А таймстамп у архива получился нормальный, потому что он (как скачанный файл) получил время окончания скачки. Это в настройках браусвера где-то, емнип.

Отправлено: 02:48, 28-06-2005 | #5


Аватара для hasherfrog

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


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

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


Vadikan
:] К вопросу о размере... Savant'у есть что предложить :]
Сейчас только разберёмся с ключиками...

Отправлено: 10:10, 28-06-2005 | #6


Аватара для Savant

Старожил


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

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


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

Код зазипован вместе с бинарником

Компиляция из ком. строки:
Код: Выделить весь код
cl hidec.cpp /GA /O1 /link /subsystem:windows kernel32.lib advapi32.lib user32.lib
Исправленная версия (28.06.05, 14:30)

Последний раз редактировалось Savant, 28-06-2005 в 14:30.

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:31, 28-06-2005 | #7


(*.*)


Administrator


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

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


Насчет timestamp я потом уже догадался

Так, размер я вижу, значительно уменьшился и появилось окошко, об'ясняющее как юзать. Это хорошо. Только вот ключ стал /w. Вы либо сделайте нечувствительным к регистру, либо верните /W, а то путаница получается. Что же касается пробелов лишних, то это проблемы того, кто составляет батник. Нормальные люди ставят один пробел перед ключом, а остальным такая утилита не нужна

А почему такая разница в размерах, просветите?

P.S. Я тут по ходу дела протестировал утилиту не из батника, а из RunOnceEx - все работает и ключ тоже.

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


Отправлено: 13:26, 28-06-2005 | #8


Аватара для Savant

Старожил


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

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


Vadikan
Цитата:
А почему такая разница в размерах, просветите?
В этой теме подробнее, а в принципе просто отброшена Run-Time Library + объединены секции (экономия еще ~1кб).

Отправлено: 13:47, 28-06-2005 | #9


Аватара для hasherfrog

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


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

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


>> А почему такая разница в размерах, просветите?

Дык это недавно обсуждалось у нас тут :] Я же говорил, что у меня по аналогии "с кондачка" не получилось (с ключам компиляции/линковки запарка была), но Savant проявил мужество :] и довёл дело до конца.

***

ЗЫ. Упс, опоздал :]]]

***

Savant

>> замена memcpy - кстати, а зачем?
Как раз дабы устранить использование стандартных ненужных библиотек.

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



Компьютерный форум 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




 
Переход