Перейти к содержанию

Как скрыть окно консоли


Рекомендуемые сообщения

пишу прогу на C++ Builder. нужно вызвать вешний exe'шник с параметрами, чтобы произвести распаковку ресурсов.

нужно чтобы моя программа ждала пока выполняются действия по распаковке, поэтому использую функцию spawnlp с параметром P_WAIT. но вылазящее окно консоли портит вид программы. как его скрыть?

p.s.: ShellExecute, WinExec и прочее не подходит, так как нужно, чтобы программа ждала пока выполняются действия в консоли.

Ссылка на комментарий

мм Думается лучше использовать Win32 API. CreateProcess - создаст процесс, потом WaiForSingleObject - будет ждать завершения. А по поводу консоли надо посмотреть в сторону ConsoleAttach/ConsoleDetach, либо найти дескриптор окна консоли и его скрыть, а ещё можно попробовать перенаправить стандартный вывод при создании в CreateProcess.

Вообщем API вещ мощная и многогранная, но в вашем случае удобнее будет использовать библиотеки для архивации (вроде zlib, или boost::iostream :rock:), благо их пруд-пруди.

Ссылка на комментарий
т.е. ты запускаешь внешний архиватор ?

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

а что мешает отследить его завершение ?

т.е. создаешь процесс и ловишь потом его завершение

мешает то, что CreateProcess + WaiForSingleObject делают все как надо, но окно консоли все равно вылазит.

ConsoleAttach/ConsoleDetach, либо найти дескриптор окна консоли и его скрыть

непонял где это если использую CreateProcess, в справке не нашел.

а ещё можно попробовать перенаправить стандартный вывод при создании в CreateProcess.

а как?

Добавлено спустя 16 минут 58 секунд:

все. разобрался вроде. 0xDEADBEEF, спасибо.

сделал так:

    STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW; //вот оно!
si.wShowWindow = SW_HIDE; //вот оно!

CreateProcess
( NULL,
"some_command_line",
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
π
);

WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );

Ссылка на комментарий
к сожалению это не архивирование...это распаковщик ресурсов игры

ИМХО, врятли кто-то будет придумывать свой формат ресурсов, скорей всего там тупо архивы. Сжатие в любом случае идет по стандартному алгоритму, нужно только узнать по какому, допустим по заголовку.

Непонял где это если использую CreateProcess

Если вы пользуетесть встроенной спарвкой, то там этого и очень многого другого нет, лучше взять MSDN там исчерпывающая информация.

На API не писал года 2, а с подобной проблемой сталкивался лишь единожды.

1. В API есть функции работы с консолью (ConsoleXXX), настройки и т.п. ConsoleDetach помоему действовать может только от лица текущего процесса.

2. Это впринципе стандартый прием и наверно самый действенный, ишем дескриптор окна процесса, и скрываем это окно. Для всего есть API функции, какие не скажу - гугл вам в помощь.

3. По умолчанию CreateProcess наследует дескрипторы родителя, в том числе и стандартный ввод/вывод. А ещё можно с флагами поигратся.

Жаль нет под рукой винды со справкой, так бы сказал точно.

Еще полезно было бы почитать Рихтера, он до костей разбирает API ядра.

P.S. Сорри, не заметил

Ссылка на комментарий
ИМХО, врятли кто-то будет придумывать свой формат ресурсов, скорей всего там тупо архивы. Сжатие в любом случае идет по стандартному алгоритму, нужно только узнать по какому, допустим по заголовку.

игра 1993 года выпуска. и я достоверно точно знаю что там не тупо архивы. в нете можно нарыть формат этих ресурсов, но разбираться с этим нудно, а главное ненужно.

да и решилась же уже проблема.

Ссылка на комментарий

смотрите что мне на стбур'овском форуме посоветовали))

function GetConsoleHwnd():HWND;
const
BufSize=1024;
var
FoundHwnd: HWND;
NewWindowTitle, OldWindowTitle: PChar;
begin
OldWindowTitle:='';
GetConsoleTitle(OldWindowTitle, BufSize);

NewWindowTitle:=PChar(IntToStr(GetTickCount())+IntToStr(GetCurrentProcessId()));

SetConsoleTitle(NewWindowTitle);

Sleep(40);

FoundHwnd:=FindWindow(nil, NewWindowTitle);

SetConsoleTitle(OldWindowTitle);

Result:=FoundHwnd;
end;

procedure Main();
var
WindowHwnd: HWND;
begin
WindowHwnd:=GetConsoleHwnd;
ShowWindow(WindowHwnd, SW_HIDE);
SomeLoop();
end;

Ссылка на комментарий

Этот код скрывает консоль текущего процесса.

Либо я нуб, лино нахрена менять заголовок, чтобы получить дескриптор окна? Поясните пожалуйста ктонибудь в чем здесь скрытый смысл? А зачем sleep, и откуда это магическое число 40 и 1024?

C CreateProcess вариант лучше, к томуже он решает поставленную задачу.

Ссылка на комментарий
Этот код скрывает консоль текущего процесса.

Либо я нуб, лино нахрена менять заголовок, чтобы получить дескриптор окна? Поясните пожалуйста ктонибудь в чем здесь скрытый смысл? А зачем sleep, и откуда это магическое число 40 и 1024?

C CreateProcess вариант лучше, к томуже он решает поставленную задачу.

это вот тут http://forum.stbur.ru/index.php?showtopic=17907&st=0&gopid=286444entry286444 если интересно, то спроси назанечение магических чисел у самого хатабыча)

Ссылка на комментарий

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...