Пятница, 29 Мая 2020, 19:49

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Delphi/Pascal/Object Pascal » Перехват консольного вывода.
Перехват консольного вывода.
chuxloДата: Вторник, 26 Января 2016, 19:17 | Сообщение # 1
был не раз
Сейчас нет на сайте
Добрый день форумчане выручайте.Перехватываю вывод консоли.Все работает вывод перехватывается,но
консоль перестает реагировать на отсылаемые ей клавиатурные сообщения.При обычном запуске все нормально
консоль реагирует на клавиатурные сообщения.При запуске с перехватом указываю start.hStdInput := GetStdHandle(STD_INPUT_HANDLE) т.е не переназначать вход, так же приравнивал это значение нулю.
Все равно консоль перестает реагировать на сообщения клавиатуры.Куда копать?
Alexan-DwerДата: Среда, 27 Января 2016, 21:43 | Сообщение # 2
почетный гость
Сейчас нет на сайте
chuxlo, добавьте больше кода, что бы можно было лучше понять проблему, не все же только под консоль, и пишут smile
chuxloДата: Среда, 27 Января 2016, 21:59 | Сообщение # 3
был не раз
Сейчас нет на сайте
procedure RunDosInMemo(CmdLine: string;listbox:tListbox {AMemo: TMemo});
const
ReadBuffer = 2400;
var
Security: TSecurityAttributes;
PipeErr, ReadPipe, WritePipe: THandle;
start: TStartUpInfo;
ProcessInfo: TProcessInformation;
bu,WBuffer,Buffer: Pchar;
nr,BytesWrite,BytesRead: DWord;
Apprunning: DWord;
s:string;
sInternalBuff: AnsiString;
bread:cardinal;
begin
with Security do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if Createpipe(ReadPipe, WritePipe,@Security, 0) then begin
Buffer := AllocMem(ReadBuffer + 1);
FillChar(Start, Sizeof(Start), #0);
start.cb := SizeOf(start);
start.hStdOutput := WritePipe;
// start.hStdInput := GetStdHandle(STD_INPUT_HANDLE);// don't redirect stdin
//start.hStdInput :=ReadPipe;
// start.hStdInput :=0;
start.dwFlags := STARTF_USESTDHANDLES+STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;
// start.wShowWindow := SW_SHOW;
if CreateProcess(nil,
PChar(CmdLine),
@Security,
@Security,
true,{CREATE_NEW_CONSOLE or}
NORMAL_PRIORITY_CLASS,
nil,
nil,
start,
ProcessInfo) then begin
repeat
Apprunning := WaitForSingleObject
(ProcessInfo.hProcess, 100);
ReadFile(ReadPipe, Buffer[0],
ReadBuffer, BytesRead, nil);
Buffer[BytesRead] := #0;
OemToAnsi(Buffer, Buffer);
s:=copy(string(Buffer),pos('A:',string(Buffer))+2,25);
listbox.items.Strings[0]:=s;
Application.ProcessMessages;
sleep(800);
until (Apprunning <> WAIT_TIMEOUT);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
end;
Alexan-DwerДата: Среда, 27 Января 2016, 22:05 | Сообщение # 4
почетный гость
Сейчас нет на сайте
Вкратце, если суть проблемы - воспроизведение мультимедиа файла, то можно проблему решить другим способом...

Если нужен именно вариант с консолью (я с ней не работал сильно), могу подсказать только поиск по фрагменту кода который у вас ближе к ошибке.


Сообщение отредактировал Alexan-Dwer - Среда, 27 Января 2016, 22:17
chuxloДата: Среда, 27 Января 2016, 22:28 | Сообщение # 5
был не раз
Сейчас нет на сайте
Что именно в коде напоминает ошибку?
Alexan-DwerДата: Среда, 27 Января 2016, 22:32 | Сообщение # 6
почетный гость
Сейчас нет на сайте
chuxlo, нужно искать чужой рабочий код, примерно так:

Google, не забудьте нажать кнопку поиск ;)

И сравнивать с вашим, еще нужно тестировать на других консолях, может это ваша исходная, имеет специфичную защиту, или еще что-то...


Сообщение отредактировал Alexan-Dwer - Среда, 27 Января 2016, 22:36
chuxloДата: Среда, 27 Января 2016, 22:49 | Сообщение # 7
был не раз
Сейчас нет на сайте
Конкректно.Пытаюсь написать оболочку для Mplayer.exe (консольный плейер).При перехвате его вывода он перестает реагировать на отсылаемые ему клавиатурные комбинации.При запуске без перехвата на посылаемую клавиатуру
реагирует.Поэтому суть проблемы-нужен и перехват и реакция на ввод клавиатуры.
Alexan-DwerДата: Среда, 27 Января 2016, 22:54 | Сообщение # 8
почетный гость
Сейчас нет на сайте
chuxlo, я Вашу проблему понял, увы, я работой с консолью не занимался сильно, но, Вашу проблему, решал бы поиском чужого кода, который содержит фрагменты вашей программы, и сравнивал в чем отличие...

Проверьте еще, эта реакция только у Mplayer'a, или другие консоли тоже так реагируют, если да - есть ошибка в коде, нет - может у него какая-то защита или используются другие модули...
Форум игроделов » Программирование » Delphi/Pascal/Object Pascal » Перехват консольного вывода.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2020 Рейтинг