Witajcie,
jakoś nigdy nie miałem potrzeby łączenia się z zewnętrzną aplikacją aby pobierać z niej dane w sposób inny niż jakieś api czy system importu / eksportu. Niestety przydusiło mnie i potrzebuję pobrać dane z okienka edit, przeliczyć a następnie wynik wpisać w innym okienku edit tej samej formy.
Aby nie rzucać się na głęboką wodę, utworzyłem mikro projekt na którym jest kilka komponentów (edit, button, memo, listbox) oraz drugi projekt w którym łapię uchwyty do tych komponentów. Nie sprawia to dużego problemu ale jest oczywiście pewne ale.
Oczywiście, ideałem byłoby aby numer uchwytu był stały, niestety tak dobrze nie jest. Dlatego muszę znaleźć jakiś sposób aby "dobierać" się do interesującego mnie pola za każdym razem po uruchomieniu programów.
Jak pisałem, bez problemu odczytuję numer uchwytu, jego klasę oraz wartość jaka się w nim znajduje (jeśli istnieje). Nie potrafię jednak odczytać jakiejś jego unikalnej nazwy, id czy cokolwiek niezmiennego.
Czy znacie jakiś sposób odczytu tych danych?
Dla potomnych, czytam uchwyty takim prostym programikiem:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms,
Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Edit1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function EnumChildProc(AHandle: THandle; AItems: TStrings): BOOL; stdcall;
var
bufor: array[0..255] of Char;
caption: array[0..255] of Char;
begin
Result := True;
GetClassName(AHandle, bufor, SizeOf(bufor) - 1);
SendMessage(AHandle, WM_GETTEXT, 256, Integer(@caption));
AItems.Add(Format('Handle: %d, Class: %s, Text: %s', [AHandle, bufor, caption]));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
uchwyt: THandle;
aplikacja: PChar;
begin
aplikacja := PChar(Edit1.Text); // nazwa aplikacji z belki górnej
uchwyt := FindWindow(nil, aplikacja);
ListBox1.Clear;
EnumChildWindows(uchwyt, @EnumChildProc, Integer(ListBox1.Items));
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit1.Text <> '' then
Button1.Enabled := True
else
Button1.Enabled := False;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
Button1.Enabled := False;
end;
end.