Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как нажать кнопку и получить текст. Пример [D7, WinXP]


Cara ©   (2004-07-01 11:00:00) 

Добрый день.
Как в чужой программе нажать на определённую кнопку.
Желательно пример.
Например в стандартном Windows калькуляторе нажать на 2 + 2 = (c моей программы)а результат вывести в ShowMessage.


ZrenBy   (2004-07-01 12:13:00) [1]

unit Main;
//Нажимаем кнопки и меню в чужом приложении
//Игрушки с калькулятором
//!!! Работает только с русским калькулятором
interface

uses Windows,Messages,Classes,Forms,Controls,StdCtrls,SysUtils,PSAPI;

type TfMain = class(TForm)
    Button1 : TButton;
    procedure FormCreate  (Sender: TObject);
    procedure FormShow    (Sender: TObject);
    procedure FormClose   (Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
 private
    hCalc     : HWND;
    hEdit     : HWND;
    slCommand : TStringList;
 public
end;

function  U_ECWProc  (hW:HWND; lP:LPARAM):Boolean;stdcall;
procedure U_ViewMenu (hM:HMENU;lP:LPARAM);

var fMain: TfMain;

implementation

{$R *.dfm}

procedure TfMain.FormCreate(Sender: TObject);
begin
 hCalc     := 0;
 hEdit     := 0;
 slCommand := TStringList.Create;
end;

procedure TfMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 slCommand.Clear; slCommand.Free;
 if(hCalc0)then PostMessage(hCalc,WM_QUIT,0,0);
end;

procedure TfMain.FormShow(Sender: TObject);
begin
 slCommand.Clear;
 WinExec('calc.exe',SW_SHOWNORMAL);
 Sleep(100);

 hCalc := FindWindow(nil,LPSTR('Калькулятор'));
 if(hCalc=0)then raise Exception.Create('...');

 U_ViewMenu(GetMenu(hCalc),LPARAM(slCommand));
 //Переводим в инженерный вид
 SendMessage(hCalc,WM_COMMAND,StrToInt(slCommand.Values['Инженерный']),0);

 //Если вид меняется, надо перебрать по-новой
 hCalc := FindWindow(nil,LPSTR('Калькулятор'));
 if(hCalc=0)then raise Exception.Create('...');

 slCommand.Clear;
 U_ViewMenu(GetMenu(hCalc),LPARAM(slCommand));
 EnumChildWindows(hCalc,@U_ECWProc,LPARAM(slCommand));
end;

procedure U_ViewMenu(hM:HMENU;lP:LPARAM);
var i,j,k:Integer; S:String; wID:WORD;
begin
 if(hM=0)then Exit;
 k := GetMenuItemCount(hM);
 for i:=0 to(k-1)do begin
    SetLength(S,255);
    GetMenuString(hM,i,LPTSTR(S),254,MF_BYPOSITION);
    S := PChar(S);
    try
      wID := GetMenuItemID(hM,i);
      while True do begin
        j := Pos('&',S); if(j=0)then Break;
        Delete(S,j,1);
      end;
      TStringList(lP).Add(S+'='+IntToStr(wID));
    except end;
    U_ViewMenu(GetSubMenu(hM,i),lP);
 end;
end;

function U_ECWProc(hW:HWND;lP:LPARAM):Boolean;stdcall;
var S1,S2:String; wID:WORD;
begin
 SetLength(S1,SendMessage(hW,WM_GETTEXTLENGTH,0,0)+1);
 SetLength(S1,SendMessage(hW,WM_GETTEXT,Length(S1),LPARAM(S1)));

 SetLength(S2,255); GetClassName(hW,LPTSTR(S2),254); S2 := PChar(S2);
 wID := LOWORD(GetWindowLong(hW,GWL_ID));
 if((S1'')and(S2='Button'))then begin
   if(S1='=')then S1 := 'Enter';
   TStringList(lP).Add(S1+'='+IntToStr(wID));
 end;
 if(S2='Edit')then begin
   fMain.hEdit := hw;
 end;
 Result := True;
end;

procedure TfMain.Button1Click(Sender: TObject);
var S:String;
begin
 SendMessage(hCalc,WM_COMMAND,StrToInt(slCommand.Values['2']),0);
 SendMessage(hCalc,WM_COMMAND,StrToInt(slCommand.Values['+']),0);
 SendMessage(hCalc,WM_COMMAND,StrToInt(slCommand.Values['3']),0);
 SendMessage(hCalc,WM_COMMAND,StrToInt(slCommand.Values['Enter']),0);
 SendMessage(hCalc,WM_COMMAND,StrToInt(slCommand.Values['*']),0);
 SendMessage(hCalc,WM_COMMAND,StrToInt(slCommand.Values['1']),0);
 SendMessage(hCalc,WM_COMMAND,StrToInt(slCommand.Values['2']),0);
 SendMessage(hCalc,WM_COMMAND,StrToInt(slCommand.Values['3']),0);
 SendMessage(hCalc,WM_COMMAND,StrToInt(slCommand.Values['Enter']),0);
 //Это не совсем правильно, но работает

 SetLength(S,SendMessage(hEdit,WM_GETTEXTLENGTH,0,0)+1);
 SetLength(S,SendMessage(hEdit,WM_GETTEXT,Length(S),LPARAM(S)));
 Application.MessageBox(PChar(S),'Результат',0);
end;

end.


Наверх

Титульная страница Поиск, карта сайта Написать письмо