Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.15;
Скачать: CL | DM;

Вниз

Как нажать кнопку и получить текст. Пример   Найти похожие ветки 

 
Cara ©   (2004-07-01 11:00) [0]

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


 
ZrenBy ©   (2004-07-01 12:13) [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(hCalc<>0)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.



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

Текущий архив: 2004.08.15;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.037 c
1-1091044443
CrMhs
2004-07-28 23:54
2004.08.15
Как удалить из файла запись


3-1089992515
MORA
2004-07-16 19:41
2004.08.15
DataSet.Locate()


4-1089042434
Epifun
2004-07-05 19:47
2004.08.15
Изменения в файловой системе....


11-1078914623
Андрей_
2004-03-10 13:30
2004.08.15
Можно ли (и как) с помощью KOL/MCK создать ActiveX control...


11-1078834965
Ricko
2004-03-09 15:22
2004.08.15
StayOnTop