[ anon68680 @ 20.10.2008. 20:36 ] @
Dakle uspeo sam da dobijem handle nekog programa, recimo notepada, preko PID-a. Sad hocu da u taj notepad upisem neki text. Koristeci WinDowse zakljucio sam da se klasa u koju se upisuje text u notepad zove "Edit". Znaci to treba ovako nekako da izgleda:

var
handle, handle2: THandle;
begin
//dodeljivanje PIDa
Handle:=OpenProcess(PROCESS_ALL_ACCESS, BOOL(0),pid);
handle2:=FindWindowEx(handle,0,pchar('Edit'),nil);
SendMessage(handle2,WM_SETTEXT,sizeof(str1),integer(str1));
//zatvaranje handle-a
end;

Medjutim, ovo ne radi. U cemu bi mogao da bude problem?
[ kiklop74 @ 21.10.2008. 14:21 ] @
Citat:
krza:
Code:

var
handle, handle2: THandle;
begin
//dodeljivanje PIDa
Handle:=OpenProcess(PROCESS_ALL_ACCESS, BOOL(0),pid);
handle2:=FindWindowEx(handle,0,pchar('Edit'),nil);
SendMessage(handle2,WM_SETTEXT,sizeof(str1),integer(str1));
//zatvaranje handle-a
end;


Medjutim, ovo ne radi. U cemu bi mogao da bude problem?


Ti nigde ne proveravas sta ti vracaju API funkcije. Kako znas da je OpenProcess uspeo? Kako znas da je FindWindowEx nasao handle itd.

Druga stvar su standardne windows klase. Nije Edit vec EDIT. Dakle nesto kao ovako:

Code:

var
handle, handle2: THandle;
begin
//dodeljivanje PIDa
handle:=OpenProcess(PROCESS_ALL_ACCESS, BOOL(0),pid);
if handle <> nil then begin
  handle2:=FindWindowEx(handle,0,pchar('EDIT'),nil);
  if  handle2 <> nil then begin
    SendMessage(handle2,WM_SETTEXT,sizeof(str1),integer(str1));
  end;
  //zatvaranje handle-a
end;

end;


Informisi se o standardnim klasama

http://msdn.microsoft.com/en-us/library/ms632679(VS.85).aspx
[ anon68680 @ 21.10.2008. 17:09 ] @
ne mogu da koristim handle <> nil jer je THandle: Longword, tako da bi onda ako vec hocu da uporedjujem bilo handle <> 0 mada sam hteo samo primer da dam. Ali bez obzira na to kod ne radi. Verujem da je problem ili u FindWindowEx ili u SendMessage jer sam koristio TerminateProcess() za handle i radilo je.

update:
Problem je u FindWindowEx jer vraca vrednost 0...
[ X Files @ 21.10.2008. 18:51 ] @
Pogledaj par ovih threadova:

/* uklonjeni neispravni linkovi */

... ili bas insistiras na OpenProcess i FindWindowEx ?


[Ovu poruku je menjao X Files dana 21.10.2008. u 21:05 GMT+1]
[ anon68680 @ 21.10.2008. 19:59 ] @
X Files:
za svaki od tih linkova izbaci error: Session timed out, please resubmit your search
[ X Files @ 21.10.2008. 20:04 ] @
Ah da:

http://www.tamaracka.com/search.htm

Keywords: SendMessage send text to notepad

Dace dovoljno rezultata.
[ savkic @ 22.10.2008. 08:42 ] @
Za početak kao što bi rekao naš nekadašnji Ministar inostranih poslova, you can't mix grandmothers and frogs ;)
FindWindowEx za prvi parametar očekuje HWND parent prozora ne Handle procesa u kome se prozor nalazi.
Do handla željenog prozora možeš doći iz nekoliko koraka:
1) Treba dobiti HWND parent prozora, ako je to top-level window (ili neki njegov predak jeste) onda se to lako radi pomoću EnumWindows i upoređivanjem rezultata funkcije GetWindowThreadProcessId i procesa koji ti već imaš. Ako nije TopLevel onda se mora ići okolnim putem, prvo se nađu svi thredovi datog procesa a onda se gledaju svi prozori tih threadova preko EnumThreadWindows dok se ne dođe do parenta.
2) Pozoveš EnumChildWindows za dobijeni HWND dok ne pronađeš željeni handle.

Možda postoji i lakši način, zavisno od organizacije (hijerarhije) prozora u tom programu, ali bez detaljnijih informacija ne može se reći. Primere upotrebe svih gore navedenih funkcija možeš naći u JCL biblioteci ili MSNDu.