![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов внешней программы и работа с ней [D6, WinXP]
prorok2 © (2002-11-04 12:34:00)Добрый день!
Подскажите, как мне вызвать из своей программы какую то внешнюю программу (блокнот, калькулятор, например), набрать текст или понажимать клавиши, внести текст в строку ввода и т.п. и потом закрыть это приложение.
Song (2002-11-04 13:46:00) [1]2prorok2 (04.11.02 12:45)
Вы поймите что нет универсального кода, который бы мог "нажимать кнопочки", "вводить символы" в любых внешних приложениях. Каждое приложение устроено по разному. Откройте WinSight и посмотрите иерарихю объектов АПИ внутри любого приложения. Везде разные объекты с разным расположением. А посылать сообщение WM_SETTEXT например надо на конкретный объект, а как узнать где именно он находится?
Поэтому для каждого конкретного внешнего файла надо отдельный алгоритм посылки (точнее алгоритм определения результирующего окна).
prorok2 (2002-11-04 13:42:00) [2]Спасибо большое
Guellirro (2002-11-04 13:39:00) [3]вот тебе небольшой примерчик :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShellApi;
type
TForm1 = class(TForm)
btnOpen: TButton;
btnFill: TButton;
btnClose: TButton;
procedure btnOpenClick(Sender: TObject);
procedure btnFillClick(Sender: TObject);
procedure btnCloseClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btnOpenClick(Sender: TObject);
{ открываем блокнот }
begin
if FindWindow("NotePad",nil) < 32 then ShellExecute(Handle,nil,"notepad",nil,nil,SW_SHOWNORMAL);
end;
procedure TForm1.btnFillClick(Sender: TObject);
{ вставляем строку }
Const
Text = "Hello World !";
var
H, WND : HWND;
I : Integer;
begin
WND := FindWindow("notepad",nil);
if WND > 32 then
begin
H := FindWindowEx(WND,0,"edit",nil);
If H > 32 then for I := 1 to Length(Text) do SendMessage(H,WM_CHAR,Ord(Text[I]),0);
end;
end;
procedure TForm1.btnCloseClick(Sender: TObject);
{ закрываем блокнот }
var
WND : HWND;
begin
WND := FindWindow("notepad",nil);
if WND > 32 then SendMessage(WND,WM_SYSCOMMAND,SC_CLOSE,0)
end;
end.
prorok2 (2002-11-04 12:45:00) [4]Ну так я и прошу кинуть хотя бы небольшой код, который посылает сообщения (я так понимаю с помощью функции SendMessage?) кнопке и строке ввода и собственно нажимает и вводит текст. Буду очень благодарен.
Skier (2002-11-04 12:42:00) [5]>prorok2
> а как понажимать на кнопки и вводить текст в строку ввода?
Если во внешней программе, то - сообщения помогут.
Нонадо знать что и как посылать.
prorok2 (2002-11-04 12:40:00) [6]Я так понимаю, что это функции вызова программы, а как понажимать на кнопки и вводить текст в строку ввода?
Skier (2002-11-04 12:35:00) [7]>prorok2
WinExec(...)
ShellExecute(...)
ShellExecuteEx(...)
CreateProcess(...)