Odnajdowanie pól tekstowych otwartych aplikacji i wpisanie do nich wartości

0

Witam
Mam takie pytanie bo dawno temu miałem programik, który odnajdował wszystkie kontrolki uruchomionych aplikacji (niestety zaginęło mi źródło) i można było zmieniać właściwości wszystkich elementów np. automatycznie wpisać własny tekst w polu tekstowym innej uruchomionej aplikacji dezaktywować, ukrywać, aktywować przyciski.

Chodzi mi o podanie jakiegoś przykładu w Delphi /Lazarusie jak dostać się do okienka uruchomionego już programu i w jego polu tekstowym wpisać jakiś tekst ??

Dokładniej mam jakiś program X który ma 2 pola tekstowe 1 login 2 password chodzi mi żeby w tych polach moja aplikacja wpisała konkretny tekst.

0

Poszukaj pod kątem FindWindowEx

0

OK załóżmy że zlokalizowałem pola tekstowe, które chciałem teraz pytanko: chcę zmienić zawartość pola tekstowego więc muszę posłużyć się SendMessage.
Co muszę podać jako komunikat WM bo zapomniałem ??? drugi parametr SendMessage

1

Można też użyć funkcji SetWindowText

0

@elTwardy - najważniejsze jest odnalezienie tych komponentów i pobranie ich uchwytów; Jeśli już będziesz miał uchwyty, to nie ma większego znaczenia czy wyślesz do nich komunikat ręcznie przez SendMessage lub PostMessage, czy skorzystasz z funkcji WinAPI.

0

Znajdywanie kontrolek to wiadomo EnumWindows ewentualnie EnumChildWindows opisane na MSDNie plus mnóstwo stron do wygooglowania z przykładami, również w Delphi. Co do pobierania i ustawiania tekstu kontrolki typu Okno / Label / Edit / GroupBox to patrz poniżej.

Wersja ANSI (pochodzi ze źródel VCL Delphi 7):

function GetTextLen(AHandle : HWND) : Integer;
begin
  Result := SendMessage(AHandle, WM_GETTEXTLENGTH, 0, 0);
end;

function GetTextBuf(AHandle : HWND; Buffer : PChar; BufSize : Integer) : Integer;
begin
  Result := SendMessage(AHandle, WM_GETTEXT, BufSize, longint(Buffer));
end;

function GetText(AHandle : HWND) : string;
var
  Len : Integer;
begin
  Len := GetTextLen(AHandle);
  SetString(Result, PChar(nil), Len);
  if Len <> 0 then
  begin
    GetTextBuf(AHandle, Pointer(Result), Len + 1);
  end;
end;

procedure SetSelStart(Handle : HWND; Value : Integer);
begin
  SendMessage(Handle, EM_SETSEL, Value, Value);
end;

Wersja UNICODE (znalezione w Google lub ze źródeł TNT - nie pamiętam :)):

procedure SetWideText(ControlHandle : HWND; Text : Widestring);
begin
  SendMessageW(ControlHandle, WM_SETTEXT, 0, Integer(PWideChar(Text)));
end;

function GetWideText(ControlHandle : HWND) : WideString;
begin
  SetLength(Result, GetWindowTextLengthW(ControlHandle));
  GetWindowTextW(ControlHandle, PWideChar(Result), Succ(Length(Result)));
end;

Natomiast SetWindowText jest pewnie mniej uniwersalne bo raczej do okienek. Przynajmniej wiem, że zdarzało się mi iż GetWindowText nie pobrał tekstu z jakiejś kontrolki. Także pewni również raczej przewidziane tylko dla okien.

0

a jak odblokowac niekatywny button w innej aplikacji ( ktory ma disabled := true)?

0

Jeżeli ktoś się przed tym nie zabezpieczył na przykład sprawdzając warunku w wątku to można spróbować zrobić EnableWindow(UchwytKontrolki, True);. Jednak trzeba mieć na uwadze, że taki kombinowanie nie jest wskazane. Bo stosując kod, który był przewidziany przez autora przy spełnieniu pewnych warunków - możesz po prostu zawiesić program. Lub nagle go zakończyć błedem.

0
olesio napisał(a):

Natomiast SetWindowText jest pewnie mniej uniwersalne bo raczej do okienek. Przynajmniej wiem, że zdarzało się mi iż GetWindowText nie pobrał tekstu z jakiejś kontrolki. Także pewni również raczej przewidziane tylko dla okien.

hWnd [in]
Type: HWND
A handle to the window or control whose text is to be changed.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633546%28v=vs.85%29.aspx
i do unicode jest SetWindowTextW

1 użytkowników online, w tym zalogowanych: 0, gości: 1