[ captPicard @ 13.01.2011. 10:37 ] @
Dakle, kao šta naslov kaže, kako da pošaljem text U EditBox neke eksterne aplikacije?

Pomoću EnumChildWindows dobijem slijedeće (dakle to su EditBoxovi u eksternoj aplikaciji):

ID: 1663, ClassName: Edit, Caption:
ID: 1664, ClassName: Edit, Caption:
ID: 1665, ClassName: Edit, Caption:
ID: 1666, ClassName: Edit, Caption:
ID: 1667, ClassName: Edit, Caption:


Kako da sada pomoću ID-a kontrole pošaljem tekst?

Hvala.
[ savkic @ 13.01.2011. 17:19 ] @
> Dakle, kao šta naslov kaže, kako da pošaljem text U EditBox neke eksterne aplikacije?
> Pomoću EnumChildWindows dobijem slijedeće (dakle to su EditBoxovi u eksternoj aplikaciji):

> ID: 1663, ClassName: Edit, Caption:
> ID: 1664, ClassName: Edit, Caption:
> Kako da sada pomoću ID-a kontrole pošaljem tekst?

Ako imaš kontrol ID možeš koristiti SetDlgItemText. Mada ako već koristiš EnumChildWindows po defaultu ti dobijaš Handle edit boxa i onda samo možeš poslati WM_SETTEXT poruku.
[ lan-mi @ 13.01.2011. 20:26 ] @
kako dobijes ID?
[ captPicard @ 14.01.2011. 07:55 ] @
Riješio sam ovako:

Code:
function FindWindowByTitle(WindowTitle: string): Hwnd;
var
  NextHandle: Hwnd;
  NextTitle: array[0..260] of char;
begin

  NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);
  while NextHandle > 0 do
  begin

    GetWindowText(NextHandle, NextTitle, 255);
    if Pos(WindowTitle, StrPas(NextTitle)) <> 0 then
    begin
      Result := NextHandle;
      Exit;
    end
    else

      NextHandle := GetWindow(NextHandle, GW_HWNDNEXT);
  end;
  Result := 0;
end;


Code:
procedure TForm1.Button1Click(Sender: TObject);
  function EnumChildProc(AHandle: THandle; AItems: TStrings): BOOL; stdcall;
  var
    buffer: array[0..255] of Char;
    caption: array[0..255] of Char;
  begin
    Result := True;
    GetClassName(AHandle, buffer, SizeOf(buffer) - 1);
    SendMessage(AHandle, WM_GETTEXT, 256, Integer(@caption));

    AItems.Add(Format('Handle: %d, Class: %s, Text: %s', [AHandle, buffer, caption]));
  end;

var
  wHnd: THandle;
begin
  wHnd := FindWindowByTitle('Program');
  ListBox1.Clear;

  EnumChildWindows(wHnd, @EnumChildProc, Integer(ListBox1.Items));

end;


Znači tu dobijem handle i onda

Code:
  SendMessage(handle, WM_SETTEXT, 0, Integer(PChar('tekst')));


I to radi, ali događa mi se jedna čudna stvar. U jednom od textboxova u koji upisujem, string se izbriše kada kliknem mišem na textbox, a vanjska aplikacija ga u obradi vidi kao praznog tj. kao da nema unosa. Ali to se ne događa na svim textboxovima već samo na određenima. Any advice?

@lan-mi

Pogledaj ovdje
[ savkic @ 14.01.2011. 12:03 ] @
> I to radi, ali događa mi se jedna čudna stvar. U jednom od textboxova u koji upisujem, string se izbriše kada kliknem mišem na textbox, a vanjska aplikacija
> ga u obradi vidi kao praznog tj. kao da nema unosa. Ali to se ne događa na svim textboxovima već samo na određenima. Any advice?

Verovatno taj program briše, možeš pokušati da povremeno proveravaš da li je setovan text, ako nije da ponoviš WM_SETTEXT. Takođe pokušaj dodelu teksta sa WM_PASTE (prebaci prethodno željeni sadržaj u Clipboard) ili sa simuliranjem pritisaka na tastaturu (fokusiraš tu kontrolu prethodno).
[ lan-mi @ 14.01.2011. 12:56 ] @
<@lan-mi
Pogledaj ovdje>

Kao sto sam i mislio, pomocu ID-a ne bi mogao ni da grebujes tekst posto se menja pri svakom startu aplikacije.

[ captPicard @ 14.01.2011. 13:35 ] @
Citat:
lan-mi: <@lan-mi
Pogledaj ovdje>

Kao sto sam i mislio, pomocu ID-a ne bi mogao ni da grebujes tekst posto se menja pri svakom startu aplikacije.


I handle se isto mijenja prilikom svakog starta aplikacije.
[ captPicard @ 14.01.2011. 13:37 ] @
Citat:
savkic: > I to radi, ali događa mi se jedna čudna stvar. U jednom od textboxova u koji upisujem, string se izbriše kada kliknem mišem na textbox, a vanjska aplikacija
> ga u obradi vidi kao praznog tj. kao da nema unosa. Ali to se ne događa na svim textboxovima već samo na određenima. Any advice?

Verovatno taj program briše, možeš pokušati da povremeno proveravaš da li je setovan text, ako nije da ponoviš WM_SETTEXT. Takođe pokušaj dodelu teksta sa WM_PASTE (prebaci prethodno željeni sadržaj u Clipboard) ili sa simuliranjem pritisaka na tastaturu (fokusiraš tu kontrolu prethodno).


Ali zanimljivo je da se to događa samo na nekim poljima (EditBox-ovima), a ima 10 identičnih. Također ako selektiram taj tekst, on ostaje, ali ako samo kliknem na polje onda se izbriše tekst.
Pokušati ću sa WM_PASTE. Kako da fokusiram kontrolu?

Hvala savkic.
[ lan-mi @ 14.01.2011. 13:47 ] @
SendMessage(hwnd,WM_SETFOCUS,0,0);