Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Вниз

Как передать консольному приложению нажатие кнопки Enter?   Найти похожие ветки 

 
kay ©   (2005-10-20 14:59) [0]

Есть консольное приложение, с которого нужно получить информацию, но оно для выхода требует нажатия кнопки Enter. Т.е. чтобы функция завершилась - нужно нажать Enter или любую клавишу. Как бы передать эту любую клавишу?

http://www.delphikingdom.ru/asp/viewitem.asp?UrlItem=/treasury/std_memo.htm
Данную статью читал, пример приложения использовал, но ничего не получается. Приложение как висело, так и висит, пока не нажмёшь в самом приложении любую клавишу, а затем уже информация передаётся в TMemo или куда надо.


 
Ботвин Дмитрий   (2005-10-20 15:03) [1]

Попробуй по-аналогии с тем как описано тут:
http://delphimaster.net/view/4-1129785264/


 
Anatoly Podgoretsky ©   (2005-10-20 15:03) [2]

Смотри тему в справке Console Functions


 
kay ©   (2005-10-20 15:18) [3]

что-то не врубаюсь я каким образом в теме http://delphimaster.net/view/4-1129785264/ создаётся приложение?
Поясните как получить хэндл созданного мною процесса?
procedure ExecConsoleApp(CommandLine: AnsiString; Output: TStringList; Errors:
 TStringList);
var
 window:integer;
 sa: TSECURITYATTRIBUTES;
 si: TSTARTUPINFO;
 pi: TPROCESSINFORMATION;
 hPipeOutputRead: THANDLE;
 hPipeOutputWrite: THANDLE;
 hPipeErrorsRead: THANDLE;
 hPipeErrorsWrite: THANDLE;
 Res, bTest: Boolean;
 env: array[0..100] of Char;
 szBuffer: array[0..256] of Char;
 dwNumberOfBytesRead: DWORD;
 Stream: TMemoryStream;
begin
 sa.nLength := sizeof(sa);
 sa.bInheritHandle := true;
 sa.lpSecurityDescriptor := nil;
 CreatePipe(hPipeOutputRead, hPipeOutputWrite, @sa, 0);
 CreatePipe(hPipeErrorsRead, hPipeErrorsWrite, @sa, 0);
 ZeroMemory(@env, SizeOf(env));
 ZeroMemory(@si, SizeOf(si));
 ZeroMemory(@pi, SizeOf(pi));
 si.cb := SizeOf(si);
 si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
 si.wShowWindow := SW_NORMAL;
 si.hStdInput := 0;
 si.hStdOutput := hPipeOutputWrite;
 si.hStdError := hPipeErrorsWrite;

 (* Remember that if you want to execute an app with no parameters you nil the
    second parameter and use the first, you can also leave it as is with no
    problems.                                                                 *)
 Res := CreateProcess(nil, pchar(CommandLine), nil, nil, true,
   CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, @env, nil, si, pi);

 // Procedure will exit if CreateProcess fail
 if not Res then
 begin
   CloseHandle(hPipeOutputRead);
   CloseHandle(hPipeOutputWrite);
   CloseHandle(hPipeErrorsRead);
   CloseHandle(hPipeErrorsWrite);
   Exit;
 end;
 CloseHandle(hPipeOutputWrite);
 CloseHandle(hPipeErrorsWrite);

 //Read output pipe
 Stream := TMemoryStream.Create;
 try
   while true do
   begin
     PostMessage(hPipeOutputRead, WM_KEYDOWN, Ord("a"), MOD_CONTROL);
     bTest := ReadFile(hPipeOutputRead, szBuffer, 256, dwNumberOfBytesRead,
       nil);
     if not bTest then
     begin
       break;
     end;
     Stream.Write(szBuffer, dwNumberOfBytesRead);
   end;
   Stream.Position := 0;
   Output.LoadFromStream(Stream);
 finally
   Stream.Free;
 end;

 //Read error pipe
 Stream := TMemoryStream.Create;
 try
   while true do
   begin
     bTest := ReadFile(hPipeErrorsRead, szBuffer, 256, dwNumberOfBytesRead,
       nil);
     if not bTest then
     begin
       break;
     end;
     Stream.Write(szBuffer, dwNumberOfBytesRead);
   end;
   Stream.Position := 0;
   Errors.LoadFromStream(Stream);
 finally
   Stream.Free;
 end;

 WaitForSingleObject(pi.hProcess, INFINITE);
 CloseHandle(pi.hProcess);
 CloseHandle(hPipeOutputRead);
 CloseHandle(hPipeErrorsRead);
end;


 
Ботвин Дмитрий   (2005-10-20 15:32) [4]

Нужен хэндл окна, а не процесса.


 
kay ©   (2005-10-20 15:41) [5]

а как получить handle окна?
yandex не ответил


 
kay ©   (2005-10-20 15:57) [6]

нет, надо именно handle процесса, т.к. приложение у меня запускается как
si.wShowWindow := SW_HIDE;


 
Leonid Troyanovsky ©   (2005-10-20 16:08) [7]


> kay ©   (20.10.05 15:57) [6]
> нет, надо именно handle процесса, т.к. приложение у меня
> запускается как
> si.wShowWindow := SW_HIDE;


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

--
Regards, LVT.


 
Ботвин Дмитрий   (2005-10-20 16:13) [8]

HWnd:=FindWindow("Класс окна","Заголовок окна")
Класс окна можно узнать программой WS32.EXE из каталога:

"<Диск>:\Program Files\Borland\Delphi7\Bin\WS32.EXE"


 
Leonid Troyanovsky ©   (2005-10-20 16:16) [9]


> kay ©   (20.10.05 15:57) [6]
> нет, надо именно handle процесса, т.к. приложение у меня


Для консольного приложения нужен хендл консоли,
однако, если консоль не наследуется дочерним процессом,
(detached) и это не пригодится.

Для некоторых процессов может получится запись в пайп
стандартного ввода - hPipeOutputWrite.

Ну, а в худшем случае - посылка SendMessage окну консоли,
либо SendInput.

--
Regards, LVT.


 
kay ©   (2005-10-21 12:57) [10]

спасибо, всё получилось



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.013 c
1-1132823354
Wolferio
2005-11-24 12:09
2005.12.18
Команды печати


2-1133603114
Glex
2005-12-03 12:45
2005.12.18
HexToBin - pozhalujsta, o4en nuzhno


2-1133180810
PeaK
2005-11-28 15:26
2005.12.18
Какая компонента подходит для ввода Unicode-текста с клавиатуры?


2-1133392267
Alloc
2005-12-01 02:11
2005.12.18
IniFiles


2-1133442664
Pil
2005-12-01 16:11
2005.12.18
Можно ли обратиться к свойствам компонента через форму?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский