Перехват консольного вывода.
|
|
chuxlo | Дата: Вторник, 26 Января 2016, 19:17 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Добрый день форумчане выручайте.Перехватываю вывод консоли.Все работает вывод перехватывается,но консоль перестает реагировать на отсылаемые ей клавиатурные сообщения.При обычном запуске все нормально консоль реагирует на клавиатурные сообщения.При запуске с перехватом указываю start.hStdInput := GetStdHandle(STD_INPUT_HANDLE) т.е не переназначать вход, так же приравнивал это значение нулю. Все равно консоль перестает реагировать на сообщения клавиатуры.Куда копать?
|
|
| |
Alexan-Dwer | Дата: Среда, 27 Января 2016, 21:43 | Сообщение # 2 |
почетный гость
Сейчас нет на сайте
| chuxlo, добавьте больше кода, что бы можно было лучше понять проблему, не все же только под консоль, и пишут
|
|
| |
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, или другие консоли тоже так реагируют, если да - есть ошибка в коде, нет - может у него какая-то защита или используются другие модули...
|
|
| |