Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> А как сделать MDI форму из чужого окна? допустим .... 
:(
    Опции темы
Гость_ГОСТЬ
Дата 19.4.2004, 05:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Допустим у меня из программы выполняеться
ShellExecute(h, 'open', 'ping.exe', ....
запускаеться стандартное cmd окно винды, как его бы сделать типа MDI окошко, чтобы можно было им на главной форме управлять....
Возможно вообще такое?
  Вверх
x77
Дата 19.4.2004, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: -1
Всего: 22



возможно, только геморройно. нижеприведённый код запускает досовскую прогу в мемо-контроле (т.е. весь выход, всё, что она генерит, выводится не в смд, а в мемо). а уже само это мемо размещай где хочешь, в т.ч. и в mdi-форме.

Код

procedure RunInMemo;
const
 bufsize = 2000;
var
 sa: TSecurityAttributes;
 si: TStartupInfo;
 pi: TProcessInformation;
 rp, wp: THandle;
 buf: pchar;
 ec: dword;
 bread: dword;
begin
 with sa do begin
   nLength := SizeOf (TSecurityAttributes);
   bInheritHandle := TRUE;
   lpSecurityDescriptor := nil;
 end;
 if CreatePipe (rp, wp, @sa, 0) then begin
   FillChar (si, SizeOf (TStartupInfo), #0);
   with si do begin
     cb := SizeOf (si);
     hStdInput := rp;
     hStdOutput := wp;
     dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
     wShowWindow := SW_HIDE;
   end;
   buf := AllocMem (bufsize + 1);
   try
     if CreateProcess (nil, pchar (Cmd), @sa, @sa, TRUE, NORMAL_PRIORITY_CLASS, nil, nil, si, pi) then begin
       repeat
         ec := WaitForSingleObject (pi.hProcess, 500);
       until ec <> WAIT_TIMEOUT;
       bread := 0;
       repeat
         ReadFile (rp, buf [0], bufsize, bread, nil);
         buf [bread] := #0;
         OemToAnsi (buf, buf);
         Memo.Text := Memo.Text + string (buf);
         Application.ProcessMessages;
       until bread < bufsize;
     end;
   finally
     FreeMem (buf);
     CloseHandle(pi.hProcess);
     CloseHandle(pi.hThread);
     CloseHandle(rp);
     CloseHandle(wp);
   end;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 RunInMemo ('C:\WINNT\system32\netstat', Memo1);
end;


если это дело слегка изменить:
Код

       ...
       repeat
         ec := WaitForSingleObject (pi.hProcess, 500);
         ReadFile (rp, buf [0], bufsize, bread, nil);
         buf [bread] := #0;
         OemToAnsi (buf, buf);
         Memo.Text := Memo.Text + string (buf);
         Application.ProcessMessages;
       until ec <> WAIT_TIMEOUT;
       ...


то результат будет выводиться в рантайм, а не после окончания вывода. частота обновления при этом будет регулироваться последним параметром, передаваемым в WaitForSingleObject.

но здесь перехватывается только вывод. по идее, можно заморочиться, чтобы перехватывался и ввод, по тому же принципу.
Добавлено @ 09:39
изначально этот код мне попался с комментариями на то ли испанском, то ли итальянском, и глючил он безбожно. я тебе привёл отрывок уже из своего проекта, многократно правленный. но там тоже есть заморочки, например, у меня стабильно всё валится в эксепшн, если WaitForSingleObject передавать интервал меньше 100. почему - я до сих пор не понимаю.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Гость_ГОСТЬ
Дата 20.4.2004, 01:06 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











x77
спасибо конечно, так я делал , но геморойно ......., особенно если ping в окошке запускать, а если тарссировку то вообще кердык smile.gif
вот если бы можно было запихнуть в MDI окошко, может кто знает ????
HELP ME!!!!!
baaa.gif

  Вверх
x77
Дата 20.4.2004, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: -1
Всего: 22



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


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
z-END
Дата 20.4.2004, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 1
Всего: 102



еще можно такой вариант попробывать:
Windows.SetParent (ханд окна "ping.exe", хандл того контрола в который ее надо засунуть)


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Гость_Гость
Дата 26.4.2004, 02:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











nJIaKca.spb благодарю тебя !!!
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0438 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.