shell13010
Messages postés73Date d'inscriptionmardi 3 avril 2007StatutMembreDernière intervention12 mai 2013
-
20 févr. 2010 à 15:59
delphinovice
Messages postés6Date d'inscriptionsamedi 12 avril 2008StatutMembreDernière intervention15 mars 2010
-
15 mars 2010 à 18:09
Bonjour a tous,
J'aimerais savoir comment récupérer le texte d'un Edit d'une autre application?
donc j'ai une fonction que j'ai modifier mais je pense qu'il est pas bon donc si vous pourriez donner votre avis sur la fonction sa serais bien ..
function GetEditText(const AppClass, EditClass: string; EditIndex: Integer; out Text: string): Boolean;
var hWndApp, hEdit: HWND;
buffer: array[0..4095] of char;
const BUF_SIZE = 4096;
begin
result := False;
hWndApp:= FindWindow(PChar('APP1'), nil); //ici l'Handle de l'application externe si je me trompe pas?
if (hWndApp<> 0) then
begin
hEdit := FoundChild(hWndWord, PChar('Edit'), nil, EditIndex); //ici je suppose que c'est l'Edit?
if (hEdit <> 0) then //ici teste si bon envoie...
begin
Sendmessage(hEdit,WM_GETTEXT, BUF_SIZE , Cardinal(@buffer));
result := True;
Text := buffer;
end;
end;
end;
Mais par contre j'ai 2 erreur que je n'arrive a déclarer les voici:
[Erreur] Unit2.pas(40): E2003 Identificateur non déclaré : 'FoundChild'
[Erreur] Unit2.pas(40): E2003 Identificateur non déclaré : 'hWndWord'
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 20 févr. 2010 à 20:49
Salut,
Effectivement, il y a des soucis dans ta fonction. Il te manque la fonction FoundChild et la déclaration de hWndWord... Mais je pense que c'est plutôt hWndApp qui devrait être là.
Il faut que tu code FoundChild, avec du EnumChildWindows par exemple.
shell13010
Messages postés73Date d'inscriptionmardi 3 avril 2007StatutMembreDernière intervention12 mai 20131 22 févr. 2010 à 20:12
Salut et merci pour ta reponse mais je n'arrive toujours pas a récupérer le contenu de l'Edit1 et enfin le recuperer dans l'APP :(
function FoundChild(Parent: THandle; const ClassName, WindowName: string; ChildIndex: Integer = 0): THandle;
var
HandleFound: THandle;
lpRes : array[0..256] of Char;
StrClass: string;
StrCaption: string;
iChild: Integer;
begin
Result := 0;
iChild := -1;
HandleFound := GetWindow(Parent, GW_CHILD);
while HandleFound > 0 do
begin
GetClassName(HandleFound, lpRes, SizeOf(lpRes));
StrClass := lpRes;
GetWindowText(HandleFound, lpRes, SizeOf(lpRes));
StrCaption := lpRes;
if ((ClassName 'Edit1') or SameText(ClassName, StrClass)) and ((WindowName 'APP') or SameText(WindowName, StrCaption)) then
begin
Inc(iChild);
if iChild >= ChildIndex then begin
Result := HandleFound;
Exit;
end;
end else
begin
Result := FoundChild(HandleFound, ClassName, WindowName, ChildIndex);
if Result > 0 then Exit;
end;
HandleFound := GetWindow(HandleFound, GW_HWNDNEXT);
end;
end;
Le probleme c'est que je n'arrive pas a utiliser cette fonction car pour moi elle et assez compliquer donc si une personne pourrez me dire le probleme je lui en serais reconnaissant surtout que je voudrais juste le recuperer dans mon Memo :(
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 23 févr. 2010 à 09:15
Le problème, c'est que le code dépend pas mal de l'arborescence de fenêtre de l'application dans laquelle tu veux récupérer un handle sur l'edit...
Il faut commencer par l'analyser avec un outil genre spy++ ou celui là.
Une fois que tu connais tous les détails sur l'edit et ses fenêtre parentes, en partant de la fenêtre principale et en utilisant GetWindow comme dans la fonction précédente, tu devrais parvenir à récupérer un handle sur ton edit.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Et si tu lisais l'aide liée à ton Delphi (Touche F1 ) plutot que de faire de simples copier/coller ? Ca te permettrait de comprendre.
Extrait de l'aide :
TObject.ClassName Renvoie une chaîne indiquant le nom du type de l'instance d'objet (par opposition au type de la variable transmise comme argument).
class function ClassName: ShortString;
Description
Utilisez la méthode ClassName pour connaître le nom (tel que 'TButton') d'un type d'un objet. Cela permet de différencier les instances d'objet affectées à une variable qui possède le type d'une classe ancêtre. ClassName renvoie une chaîne indiquant le type réel de l'objet et non le type déclaré de la variable.
Quand les erreurs de gestion des exceptions sont indiquées pour un objet particulier, l'instruction on utilise ClassName pour faire une comparaison de chaînes de classes.
Ainsi ClassName='Edit1' alors que ClassName='TEdit'
On le redira jamais assez : Apprendre les bases, lire des tutos, lire des bouquins avant toutes choses