![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ловим сообщения программы [D7, XP]
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]при работе кода приложение повисло наглухо(