![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создать невидимую консоль [D7, WinXP]
diMAN © (2003-11-04 08:30:00)
Я создаю новое консольное окно при помощи AllocConsole. Можно ли сделать так, чтобы это окно создавалось невидимым с последующим его отображением при помощи ShowWindow(GetConsoleWindow, SW_SHOW). Просто нужно изменить позицию и размер консольного окна, а также размер экранного буфера и не хотелось бы, чтобы пользователь видел, как это происходит.
FireHack (2003-11-04 14:03:00) [1]
создать - невозможно, а сделать уже существующее - легко
diMAN (2003-11-04 14:01:00) [2]
То есть мы пришли к тому, что в windows невозможно создать невидимое консольное окно, правильно я понял?
FireHack (2003-11-04 13:50:00) [3]
нет.
все-таки проще будет сделать EnumWindows...
diMAN (2003-11-04 13:33:00) [4]
> что значит, доступна?
Прежде всего необходимо иметь возможность использовать из родительского приложения по отношению к созданной в дочернем приложении консоли финкции GetConsoleTitle, SetConsoleTitle, GetStdHandle, SetConsoleWindowInfo, SetConsoleScreenBufferSize, одним словом работать с дочерней консолью тоа, как если бы она была создана в родительском приложении.
FireHack (2003-11-04 13:07:00) [5]
//А созданная таким образом консоль будет доступна из родительского приложения?
что значит, доступна?
поэкспериментируй со стандартными хэндлами косноли (не путать с хэндлом окна) см. ниже
typedef struct _STARTUPINFO { // si
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput; //<<=============
HANDLE hStdOutput; //<<=============
HANDLE hStdError; //<<=============
} STARTUPINFO, *LPSTARTUPINFO;
diMAN (2003-11-04 11:58:00) [6]
Спасибо. Со второй частью своего предыдущего вопроса я разобрался. Нужно в параметрах CreateProcess указать dwCreationFlags = CREATE_SUSPENDED, а вот что касается первой части своего вопроса, то я так и не нашёл способа получить доступ к консоли, которая создаётся в дочернем приложении из родительского, если в родительском приложении я предварительно не создал консоль с помощью AllocConsole: ни CREATE_NEW_CONSOLE, ни DETACHED_PROCESS не подходят.
FireHack (2003-11-04 11:28:00) [7]
на все ответ: Да!
читай хелпы по CreateProcess
diMAN (2003-11-04 11:22:00) [8]
А созданная таким образом консоль будет доступна из родительского приложения? И ещё можно ли при помощи CreateProcess создавать как-бы Suspended приложения. Т.е. только загрузить, что-то сделать, а затем продолжить выполнение дочерней программы.
FireHack (2003-11-04 10:51:00) [9]
Тогда, думаю, только с помощью стороннего загрузчика
lpStartupInfo.dwFlags:=STARTF_USESHOWWINDOW;
lpStartupInfo.wShowWindow:=SW_HIDE;
CreateProcess(....
diMAN (2003-11-04 10:01:00) [10]
> FireHack
При вызове функции AllocConsole создаётся ВИДИМОЕ консольное окно. Конечно я его могу после этого найти и спрятать, но мне нужно именно создавать уже НЕВИДИМОЕ, что бы оно не мелькало по экрану. В XP для получения хендла консольного окна есть более простой способ - функция GetConsoleWindow, поэтому можно не заморачиваться с enumwindows.
> Proton
Я пробовал поставить брекпоинт на вызов CreateWindow, CreateWindowEx, ShowWindow, SetWindowLong, но не один из этик "бряков" не сработал в момент вызова AllocConsole, к тому же AllocConsole экспортируется из kernel32.dll, а вот kernel32 в свою очередь не импортирует ни одной функции из user32.dll, во всяком случае в явном виде. Какие будут идеи?
FireHack (2003-11-04 09:26:00) [11]
уж сколько раз твердили миру....
enumwindows
GetWindowThreadProcessId
GetCurrentProcessId
Proton (2003-11-04 09:11:00) [12]
Думается что можно обработать ловушкой, зтап построения консольного окна, и как изменить его поведение.