Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2008, 13:07   #1
EVO-X
 
Регистрация: 02.05.2008
Сообщений: 5
По умолчанию Вставка в поле Edit

Мне нужно чтобы в программе при нажатии на кнопку вставлялись указанные мною, цифры и буквы, в другю программу(она уже будет запущена) в поле Edit. Ну например при установки какойлибо проги которая требует ввести ключ, т.е. запустилась установка проги, требуется ввести серийник и я нажимаю в своей проге на кнопку, а она уже вставляет серийник, чтобы не вводить самому. Начало я знаю как делать, надо найти окно в которое ввести серийник, потом нужно както найти поле в которое ввести серийник и вставить в найденное поле, но как найти поле и вставить я незнаю. Кто знает помогите мне. Заранее благодарен.
EVO-X вне форума Ответить с цитированием
Старый 06.07.2008, 13:24   #2
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Тема уже была.
Например, данный код записывает текст в Edit Калькулятора Windows:
Код:
var
  h,sh: HWND;
begin
  h:=FindWindow('SciCalc','Калькулятор');
  sh:=FindWindowEx(h,0,'Edit',nil);
  SendMessage(sh,WM_SETTEXT,0,LParam(PChar('MyTeeeeeeeext')));
_Dmitry вне форума Ответить с цитированием
Старый 06.07.2008, 14:21   #3
EVO-X
 
Регистрация: 02.05.2008
Сообщений: 5
По умолчанию

Спасибо, получилось. Но проблема в том, что вставляется только в первое поле, а мне нужно чтобы вставлялось в 5 полей.
EVO-X вне форума Ответить с цитированием
Старый 06.07.2008, 16:33   #4
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

Эта функция ищет Edit
Код:
 sh:=FindWindowEx(h,0,'Edit',nil);
Ищите следующие и заполняйте.
Например, следующая программа ищет в окне 5 Edit-ов и нумерует их
Код:
var
  i: integer;
  h,sh: HWND;   
begin   
  h:=FindWindow('TForm1','Form1');
  sh:=0;
  for i:=1 to 5 do
  begin
    sh:=FindWindowEx(h,sh,'TEdit',nil);
    SendMessage(sh,WM_SETTEXT,0,LParam(PChar(IntToStr(i))));
  end;
_Dmitry вне форума Ответить с цитированием
Старый 06.07.2008, 17:12   #5
EVO-X
 
Регистрация: 02.05.2008
Сообщений: 5
По умолчанию

Огромное спасибо Вам _Dmitry, все получилось!
EVO-X вне форума Ответить с цитированием
Старый 08.07.2008, 11:24   #6
terminadoor
Пользователь
 
Регистрация: 26.06.2008
Сообщений: 86
По умолчанию

А можно в консольное приложение вставить, и считать результат?
TerMinAdoOR
terminadoor вне форума Ответить с цитированием
Старый 08.07.2008, 12:49   #7
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

Цитата:
Как запустить консольное приложение и перехватить вывод?
Код:
procedure ExecCmdine(const CmdLine: string; CmdResult: TStrings);

var

Output: PIOFile;

Buffer: PChar;

TempString: string;

Line: string;

BytesRead: Integer;

 

const

BufferSize: Integer = 1000;

 

begin

Output := popen(PChar(CmdLine), 'r');

GetMem(Buffer, BufferSize);

if Assigned(Output) then

try

   while feof(Output) = 0 do

   begin

     BytesRead := Libc.fread(Buffer, 1, BufferSize, Output);

     SetLength(TempString, Length(TempString)+BytesRead);

     memcpy(@TempString[length(TempString)-(BytesRead-1)], Buffer, BytesRead);

     while Pos(#10, TempString) > 0 do

     begin

       Line := Copy(TempString, 1, Pos(#10, TempString)-1);

       if CmdResult<>nil then CmdResult.Add(Line);

       TempString := copy(TempString, Pos(#10, TempString)+1, Length(TempString));

     end;

   end;

finally

   Libc.pclose(output);

   wait(nil);

   FreeMem(Buffer,BufferSize);

end;

end;
Примечание - под отладчиком Kylix код может не работать. Надо запускать приложение не под Kylix для того чтобы удостовериться что код работает. Кроме того некоторые консольные приложения, типа top не совсем стандартно используют консоль, поэтому я наблюдала такое явление, что top можно запустить только если запускать готовое приложение в терминале.

©Drkb::04625

Автор: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
из drkb www.drkb.ru
Роман Радер вне форума Ответить с цитированием
Старый 08.07.2008, 13:00   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Роман Радер код под UNIX.
B_N вне форума Ответить с цитированием
Старый 08.07.2008, 13:24   #9
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

да, точно...
я не разобрался, просто увидел код и тема та что надо...
Роман Радер вне форума Ответить с цитированием
Старый 08.07.2008, 13:48   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Для Винды вот так:
Код:
 procedure ExecConsoleApp(CommandLine: AnsiString; Output: TStrings=nil; Errors:
  TStrings=nil);
var
  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_HIDE;
  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
  if Output<> nil then begin
  Stream := TMemoryStream.Create;
  try
    while true do
    begin
      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;
  end;
  //Read error pipe
  if Errors <>nil then begin
  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;
   end;
  WaitForSingleObject(pi.hProcess, INFINITE);
  CloseHandle(pi.hProcess);
  CloseHandle(hPipeOutputRead);
  CloseHandle(hPipeErrorsRead);
end;
А вызывать примерно так:
Код:
ExecConsoleApp('dir *',listbox1.items);
По окончанию работы консоли, все что было в ней будет в ЛистБоксе

P.S. Не я автор, просто под себя приспособил. Хотя мелкомягкие могли бы облегчить такие проблемы...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставка текста в активное поле Dj_smart Общие вопросы Delphi 6 11.08.2008 18:11
Как создать поле Edit Д'якон Win Api 1 02.03.2008 01:30
Вставка записи в поле графического типа Bibigul БД в Delphi 3 10.04.2007 16:07