Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MDI Child в роли досовой консоли


ssk ©   (2004-11-24 14:20:00) 

Всем привет! Кто-нибудь знает, как реализовать сабж или в принципе невозможно?

З.Ы. разного рода советы "кинь Memo & Edit" просьба не предлагать.


GuAV   (2004-11-29 18:39:00) [1]

Для MDI идея такая - на каждую ком. строку создавать MDI Child окно, у самой командной строки убирать заголовок и границу и вставлять его в это MDI Child окно, сообщения для Child типа WM_GETMINMAXINFO, SIZE пересылать окну ком. строки. Короче делается.

Различия 9х и ХР: WaitForInputIdle - в 9х вернёт когда все окна созданы, в ХР почему-то раньше. В ХР одно окно  'ConsoleWindowClass', а в 9х несколько окон.


GuAV   (2004-11-29 18:21:00) [2]

Кое что получилось. А именно - запуздырить коммандную строку в обычное SDI окно.
IMHO, ещё немного поэкспериментировать и будет сабж.

function EnumThreadWndProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
begin
 SetParent(hWnd, lParam);
 Result := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Wnd: HWND;
 SI: TStartupInfo;
 PI: TProcessInformation;
begin
 case SysUtils.Win32Platform of
   VER_PLATFORM_WIN32_WINDOWS: //  проверено в Win98
     begin
       FillChar(SI, SizeOf(SI), 0);
       SI.cb := SizeOf(SI);
       Win32Check(CreateProcess(nil, 'COMMAND.COM',
          nil, nil, False, 0, nil, nil, SI, PI));
       try
         WaitForInputIdle(PI.hProcess, INFINITE);
         EnumThreadWindows(PI.dwThreadId,
           @EnumThreadWndProc, Handle);
       finally
         CloseHandle(PI.hThread);
         CloseHandle(PI.hProcess);
       end;
     end;
   VER_PLATFORM_WIN32_NT:  //  проверено в WinXP
     begin
       FillChar(SI, SizeOf(SI), 0);
       SI.cb := SizeOf(SI);
       Win32Check(CreateProcess(nil, 'COMMAND.COM',
         nil, nil, False, 0, nil, nil, SI, PI));
       try
         WaitForInputIdle(PI.hProcess, INFINITE);
         repeat
           Wnd := FindWindow('ConsoleWindowClass', nil);
           Sleep(50);
         until Wnd <> 0;
         Windows.SetParent(Wnd, Handle);
       finally
         CloseHandle(PI.hThread);
         CloseHandle(PI.hProcess);
       end;
     end;
 end;
end;


ssk   (2004-11-24 15:06:00) [3]

Спасибо за ответы. Буду разбираться дальше.


TUser   (2004-11-24 14:57:00) [4]


> это не я придумал такую прихоть.

Сделай [3] (или через пайпы) - пусть заказчик/начальник/препод думает, что это ДОС-консоль.


ssk   (2004-11-24 14:56:00) [5]

>дурней не придумаешь - пытаться засандалить досову консоль в кач-ве доч.окна

согласен на все 100%, но надо сделать именно так. это не я придумал такую прихоть. так что если есть идеи - предлагайте.

>Вы уточните, что вам нужно:

есть MDIChild. в нем нужно реализовать полную работу командной строки, как в NT


Digitman   (2004-11-24 14:47:00) [6]

дурней не придумаешь - пытаться засандалить досову консоль в кач-ве доч.окна

никто не ограничивал пока еще назначение StdIn- и StdOut-дивайсов для ассоциированного с досовой консолью ввода/вывода


Rem   (2004-11-24 14:43:00) [7]

О какой "досовой" консоли идет речь?

Вы уточните, что вам нужно: консольное приложение, которое, на самом деле, к DOS не имеет никакого отношения, или командная строка*, которая к DOS тоже никакого отношения не имеет?

* Платформа NT


TUser   (2004-11-24 14:41:00) [8]


> З.Ы. разного рода советы "кинь Memo & Edit" просьба не предлагать.

А чего так?


Наверх

Титульная страница Поиск, карта сайта Написать письмо