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

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

Ловим сообщения программы [D7, XP]


Страницы:   1 2 3

cruiser ©   (2008-09-30 17:06:00) 

Здравствуйте уважаемые Мастера! Вопрос:
Как можно реализовать на Delphi отлов сообщений некоторой программы, которые она выдает в окно командной строки после её запуска из командной строки? Например, в окне cmd пишется: удаление произведено. А как мне отловить это сообщение и например поместить в showmessage моей программы?


Leonid Troyanovsky   (2008-10-02 14:52:00) [1]


> cruiser ©   (01.10.08 20:31) [53]

> и последняя строка  полная.  
> Где проблема?

Сделай цикл таким

   repeat
     Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 10);
     ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);
     if BytesRead = 0 then
       Continue;
     Buffer[BytesRead] := #0;
     OemToAnsi(Buffer, Buffer);
     len := AMemo.Perform(WM_GETTEXTLENGTH, 0, 0);
     AMemo.Perform(EM_SETSEL, len, len);
     AMemo.SelText := Buffer;
     AMemo.Perform(EM_SCROLLCARET, 0,0);
     Application.ProcessMessages;
   until (Apprunning <> WAIT_TIMEOUT) or Application.Terminated;

--
Regards, LVT.


cruiser   (2008-10-01 20:31:00) [2]

Проверил всё что мне сказали + совместил всё с кодом от Сергея М. В итоге, получается, что в моём коде строки в memo заполняются быстрее (т.е. не заметна склейка). Это вот что по окночании дочернего процесса в memo:

Îáìåí ïàêåòàìè ñ 127.0.0.1 ïî 32 áàéò:

Îòâåò îò 127.0.0.1: ÷èñëî áàéò=32 âðåìÿ


cruiser   (2008-10-01 15:37:00) [3]

Спасибо, учту.


Leonid Troyanovsky   (2008-10-01 15:23:00) [4]


> cruiser ©   (01.10.08 14:28) [44]

>  что в CreateProcess в hStdInput и hStdOutput переданы концы
> hRead и hWrite одного пайпа!"
> Не могу понять, может в моем коде это тоже наблюдается?

Наблюдается. Строку
start.hStdInput := ReadPipe; - убрать

Кроме того, вместо OemToAnsi(Buffer, Buffer) надо

if BytesRead > 0 then
 begin
   OemToAnsi(Buffer, Buffer);
   ..
end;

--
Regards, LVT.


cruiser   (2008-10-01 14:37:00) [5]


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

Да. Именно так.


cruiser   (2008-10-01 14:36:00) [6]

А кто-нибудь может проверить работу кода с winrar.exe (запуск с параметрами). Будет ли нормально отрабатывать код?


Сергей М.   (2008-10-01 14:35:00) [7]


> может в моем коде это тоже наблюдается?


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

Значит это не твой случай, т.е. тот самый "недостаток" конкретно твоего случая не касается.


Leonid Troyanovsky   (2008-10-01 14:33:00) [8]


> brother ©   (01.10.08 14:31) [46]

> RunDosInMemo('dir c:\', Memo1);

'cmd /c dir c:\'

--
Regards, LVT.


brother   (2008-10-01 14:31:00) [9]

RunDosInMemo('dir c:\', Memo1);
не отрабатывает(


brother   (2008-10-01 14:30:00) [10]

сделал так:
...
const
  ReadBuffer = 240;

...

     Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 100);
    sleep(50);
     if Apprunning <> WAIT_TIMEOUT then Break;

заработал) поигрался даже:
 RunDosInMemo('ping 127.0.0.1', Memo1);
и
 RunDosInMemo('cmd /?', Memo1);


cruiser   (2008-10-01 14:28:00) [11]

Хорошо. Попробую привести конкретный пример, но позже. Кстати, наткнулся тут на один форум и там вот такую фразу прочитал: "....все серьезно обсуждали недостатки метода - когда консольная программа хочет получить от запустившео какие-либо дополнительные данные, то вся система виснет.И никто не обратил внимания, что в CreateProcess в hStdInput и hStdOutput переданы концы hRead и hWrite одного пайпа!"
Не могу понять, может в моем коде это тоже наблюдается?


Сергей М.   (2008-10-01 14:19:00) [12]


> cruiser ©   (01.10.08 14:17) [42]


Приводи конкретныйпример - будем посмотреть)


cruiser   (2008-10-01 14:17:00) [13]

А вчем тогда может быть разница? Почему перехват сообщений ping.exe нормально происходит и вовремя записывается в memo1, а с тем же кодом , но с другим консольным приложением почему-то коряво отрабатывает код?


Сергей М.   (2008-10-01 14:05:00) [14]


> cruiser ©   (01.10.08 14:02) [40]


> работает именно ping... или какое-то другое приложение?


Именно ping.

А с другим приложением нужно разбираться индивидуально.


Leonid Troyanovsky   (2008-10-01 14:02:00) [15]


> brother ©   (01.10.08 13:57) [36]

> ( хотелось бы заценить рабочий...

Он, во-ще, рабочий, но хромает.

Сделай ReadBuffer = 240

--
Regards, LVT.


cruiser   (2008-10-01 14:02:00) [16]

Сергей М., а работает именно ping... или какое-то другое приложение? Я спрашиваю, потому что как раз ping это не показатель. С ping у меня и мой первый код работал.
За "Консольному процессу, очевидно, следует посылать CTRL_C_EVENT
" спасибо, попробую реализовать.


Сергей М.   (2008-10-01 14:00:00) [17]


> brother ©   (01.10.08 13:57) [36]


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


Сергей М.   (2008-10-01 13:59:00) [18]


> cruiser ©   (01.10.08 13:48) [34]


Консольному процессу, очевидно, следует посылать CTRL_C_EVENT


brother   (2008-10-01 13:57:00) [19]

этоя про:
> код чудесно работает

( хотелось бы заценить рабочий...


brother   (2008-10-01 13:53:00) [20]

при работе кода приложение повисло наглухо(


Страницы:   1 2 3

Наверх

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