vserd
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Вопрос ї 1500Oтветить на вопрос Привет! Можно ли получить содержимое досовского окна? Нужно проанализировать его на наличие определенной строки Если можно ответ продублируйте на mike@oridon.donetsk.ua Ответов - 2 : Насчет всего окна не скажу, но перехват буфера вывода вполне возможен. См. параметры CreateProcess, в частности, флаги, касающиеся StdOutput. Yuri S. Zotov Аналогичную задачу решаю. Может что и не так, но вроде как работает. Будут вопросы - пишите. procedure TForm1.btn_RunDosClick(Sender: TObject); var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; OutText : array [0..255] of char; var buff : ARRAY [0..127] OF Char; buff2 : ARRAY [0..127] OF Char; var ToWCount, WCount : DWORD; ir : TINPUTRECORD; dw : DWORD; Begin AllocConsole; FillChar(StartupInfo, SizeOf(TStartupInfo), 0); StrPCopy(OutText, RSBServerName); with StartupInfo do begin cb := SizeOf(TStartupInfo); dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; wShowWindow := SW_SHOW; lpTitle := @OutText; // Мой заголовок окна end; StrPCopy(buff, Edit2.Text); // Edit2.Text - DOS - приложение StrPCopy(buff2, ExtractFileDir(Edit2.Text)); if CreateProcess( nil, // pointer to name of executable module buff, // pointer to command line string nil, // pointer to process security attributes nil, // pointer to thread security attributes False{False True},љљљ // handle inheritance flag NORMAL_PRIORITY_CLASS, // creation flags nil, // pointer to new environment block buff2{nil}, // pointer to current directory name StartupInfo, // pointer to STARTUPINFO љљљ ProcessInfoљљљљ // pointer to PROCESS_INFORMATION љљљ ) љ then љљљ DosHandle := ProcessInfo.hProcess љ else љ begin љљљ ShowMessage('Программа не найдена?'); љљљ Exit; љ end; љ ConsHndl:=GetStdHandle(STD_OUTPUT_HANDLE); End; procedure TForm1.ReadConsole(Sender: TObject); var љ ToWCount, WCountљљљљљљљљљљљ : DWORD; љ xy : TCOORD; љ i : Integer; љ OutText : array [0..255] of char; Begin љ tim_Esc.Enabled := False; љ Memo1.Clear; љ FillChar(ConsoleText, SizeOf(ConsoleText), 0); љ ToWCount:=80; љ for i := 0 to 24 do љ begin љљљ xy.X := 0; љљљ xy.Y := i; љљљ ReadConsoleOutputCharacter( љљљљљ ConsHndl, // handle of a console screen buffer љљљљљ @ConsoleText[i], // address of buffer to receive characters љљљљљ ToWCount, // number of character cells to read from љљљљљ xy, // coordinates of first cell to read from љљљљљ WCountљ // address of number of cells read from љљљ ); љљљ Memo1.Lines.Add(OemToAnsiStr(ConsoleText[i])); // содержимое экрана DOS-приложения љ end; љ case CheckConsoleText of љљљ Number: љљљљљ begin љљљљљљљ Edit1.Text := '998'; љљљљљљљ btn_SendKeys.Click; љљљљљљљ btn_SendEnter.Click; љљљљљљљ tim_Esc.Enabled := True; љљљљљ end; љљљ Password: љљљљљ begin љљљљљљљ Edit1.Text := 'mbr'; љљљљљљљ btn_SendKeys.Click; љљљљљљљ btn_SendEnter.Click; љљљљљљљ tim_Esc.Enabled := True; љљљљљ end; љљљ RunServer: љљљљљ begin љљљљљ end; љљљ NeedEscape: љљљљљ begin љљљљљљљ btn_SendEsc.Click; љљљљљљљ btn_SendEsc.Click; љљљљљљљ tim_Esc.Enabled := True; љљљљљ end; љ else љљљ if tim_Esc.Enabled = False then tim_Esc.Enabled := True; љ end; End; // function CheckConsoleText : Integer; var љ j, љ i : Integer; Begin љ for i := 0 to 24 do љ begin љљљ if Pos('ВВЕДИТЕ ВАШ НОМЕР', AnsiUpperCase(OemToAnsiStr(ConsoleText[i]))) > 0 then љљљ begin љљљљљ for j := 0 to 24 do љљљљљ begin љљљљљљљ if Pos('ВВЕДИТЕ ПАРОЛЬ', AnsiUpperCase(OemToAnsiStr(ConsoleText[j]))) > 0 then љљљљљљљ begin љљљљљљљљљ Result := Password; љљљљљљљљљ Exit; љљљљљљљ end; љљљљљ end; љљљљљ Result := Number; љљљљљ Exit; љљљ end; љљљ if Pos('ФАЙЛ ЗАХВАЧЕН', AnsiUpperCase(OemToAnsiStr(ConsoleText[i]))) > 0 then љљљ begin љљљљљ Result := NeedEscape; љљљљљ Exit; љљљ end; љ end; End; Лапшин М.А. |