Ecrir dans un Fenetre etrangere ? [Résolu]

Messages postés
69
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
29 juillet 2008
- - Dernière réponse : Delphiturbo
Messages postés
69
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
29 juillet 2008
- 1 juin 2008 à 18:46
Salut

je voudrais ercrir dans cet Fenedere etrangere
et avec Winspy j ai fai comme ca :

var

  wnd: HWND;

begin

  wnd := FindWindow('#32770',' Text ');


  wnd := FindWindowEx(wnd, 0, 'RichEdit20A', nil);


  if wnd <> 0 then

  begin

   //  ShowMessage('Window found. Handle: ' + IntToStr(wnd));

     //writeln('Window found. Handle: ' + IntToStr(wnd));

     


SendMessage(wnd, WM_SetText, 0, LongInt(PChar(Edit1.Text)));


  end;

end.

mais ne marche pas!
Afficher la suite 

9 réponses

Meilleure réponse
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
3
Merci
Salut,

Bacterius -> Remarque sur ton premier post la "première instruction" sert à récupérer un handle sur la fenêtre "Text". Ce handle est ensuite passé en paramètre à FindWindowEx. Donc la première ligne sert effectivement à quelque chose.

DelphiTurbo -> Sous Windows, les fenêtres sont des objets avec lesquels on peut interragir en les désignant par un handle (Un numéro codé sur 32 bits). De plus, tous les composants (Boutons, zones de texts) sont composés de une ou plusieurs fenêtres (En fait certaines librairies ne se servent plus de ce système de fenêtres, mais bon restons simples.)

Ton application peut récupérer un handle sur une autre fenêtre, puis s'en utiliser des fonctions de Windows en leurs passant ce handle en paramètre pour dire à Windows que tu veux interagir avec cette fenêtre et pas une autre. Les handles sont valide dans une instance d'application qui seulement (Exception exceptées... restons encore une fois simple).

Ca c'était pour la théorie que tu connaissais peut être déjà.

Ici :

Windows.ShowWindow(FindWindow(nil,PChar('Texteinstellungen')),SW_HIDE);

tu récupères un handle sur la fenêtre principal de l'application. Tu peux effectivement afficher/cacher cette fenêtre, modifier le titre de cette fenêtre...

Mais ce qui t'intéresse, ce n'est pas cette fenêtre, mais celle qui s'occupe de la zone de texte un peu plus bas.
Il faut donc que tu récupères un handle sur cette fenêtre.

Sous Windows, les fenêtres forment une arborescence qu'il faut que tu parcours pour parvenir à la bonne fenêtre.

C'est un peu ce que tu fais dans ton premier post dans lequel tu récupère d'abord un handle de fenêtre principale pour ensuite chercher une autre fenêtre fille de celle-ci avec FindWindowEx.

Il faut que tu procède de la même manière. Tu auras peut être à réaliser plusieurs FindWindowEx en fonction de la profondeur de l'arboresence des fenêtres. A la place de FindWindowEx, tu peux aussi passer par GetWindow ou encore EnumChildWindows.

Dans tout les cas, il va falloire que tu récupère un maximum d'informations sur l'architecture de l'application cible : par exemple le nom et la classe de toutes les fenêtres parentes de la zone de texte. On voit que la zone de text est dans l'équivalent d'une TabSheet de Delphi. Peut être que la fenêtre de TabSheet est parente de celle de la zone de fenêtre. Peut être pas.

Pour le savoir facilement, il faudrait que tu utilise un logiciel capable de t'afficher ce type de données.
Si tu as Visual Studio, tu as Spy++.
Sinon, tu peux utiliser ce logiciel.

Tu peux aussi coder ton propre logiciel en Delphi pour afficher toute l'arbo dans un TreeView.

A la fin, ton code risque de ressembler à ça :

wnd := FindWindow(nil,'Texteinstellungen');
if wnd  = 0 thenTraitement erreur
wnd := FindWindowEx(wnd, 0, 'PageControl', nil );
if wnd  = 0 thenTraitement erreur
wnd := FindWindowEx(wnd, 0, 'TabSheet', 'Text');
if wnd  = 0 thenTraitement erreur
wnd := FindWindowEx(wnd, 0, 'TextBox', nil );
if wnd  = 0 thenTraitement erreur

SendMessage(wnd, WM_SetText, 0, LongInt(PChar(Edit1.Text)));

Ah vi, comme le dit Bacterius, il se peut que la fenêtre soit "portégée", ou que modifier son contenu ne donne pas le résultat escompté. Ces problèmes, bien que peu probables dans ton cas, serait contournable en simulant un utilisateur plutôt qu'en utilisant un message WM_SETTEXT. Dans tous les cas, tu devrais pouvoir afficher/cacher cette fenêtre (Cette text box...) comme tu l'as fait avec la fenêtre principale, pour vérifier que tu disposes bien du bon handle.

Bonne chance.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 222 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_rt15
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
6
0
Merci
Bonjour,
DelphiTurbo : je ne vois pas le contenu de Edit1.Text ...

Et aussi la variable WND est utilisée 2 fois : autrement dit le resultat de cette instruction "FindWindow('#32770',' Text ');" est stockée dans Wnd, mais cette valeur est ensuite écrasée par "wnd := FindWindowEx(wnd, 0, 'RichEdit20A', nil);".

Donc la première instruction ne sert à rien, puisqu'elle est écrasée ... essaye de faire 2 variables, puis :

if (wnd <> 0) and (wnd2 <> 0) then
  begin
            ....
   end;

Maintenant il est possible que la fenêtre soit également protégée .... et la tu ne peux rien faire !

Je n'y connais pas grand-chose en messages Windows, mais quelqu'un de plus experimenté viendra certainement à ton secours

J'espère néanmoins t'avoir aidé ...

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
6
0
Merci
Ah oui autre chose : j'ai un mauvais souvenir de mes tentatives sur les handles, avec les

if wnd <> 0 then

parfois cela ne veut rien dire : essaye d'enlever cette ligne (pour que le SendMessage s'éxecute forcément), car il ne s'execute peut être pas ...

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
69
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
29 juillet 2008
0
Merci
Salut

sa marche pas!
procedure TForm1.Button2Click(Sender: TObject);
var
  wnd1,wnd2: THandle;
begin
  wnd1 := FindWindow('#32770',' Text ');
  wnd2 := FindWindowEx(wnd2, 0, 'RichEdit20A', nil);
  if (wnd1 <> 0) and (wnd2 <> 0) then
  begin
  SendMessage(wnd2, WM_SetText, 0, LongInt(PChar(Edit1.Text)));
  end;

end;
Commenter la réponse de Delphiturbo
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
6
0
Merci
Ok ok ...

Ben la je ne peux vraiment plus t'aider ... désolé

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
69
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
29 juillet 2008
0
Merci
Salut
le code marche bien si l' autre Programe simple
si je fais le 2 Programmes avec Delphi. sa marche, mais si je etulise un autre Programme sa marche pas

voila 2 Examples
une fois sa marche
une fois sa marche pas

http://members.lycos.co.uk/forforums/01_upload/01/pic/findwindow_ok.jpg

http://members.lycos.co.uk/forforums/01_upload/01/pic/findwindow_nicht_ok.jpg
Commenter la réponse de Delphiturbo
Messages postés
69
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
29 juillet 2008
0
Merci
Mais je peut fassilment touver la Fenter metrev la visible et Invisible
la Fenter s' apelle Texteinstellungen

Windows.ShowWindow(FindWindow(nil,PChar('Texteinstellungen')),SW_show);

//..

Windows.ShowWindow(FindWindow(nil,PChar('Texteinstellungen')),SW_HIDE);
Commenter la réponse de Delphiturbo
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
6
0
Merci
Bonjour,
DelphiTurbo je ne peux pas t'aider (pas assez experimenté en Delphi), mais quelqu'un t'apportera de l'aide bientot, peut-être ce soir ou demain eventuellement !
Mais fais un petit effort sur l'écriture s'il te plait ... un minimum quoi ...
Merci :)

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
69
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
29 juillet 2008
0
Merci
Merci bien
sa marche tres bien maintenent

bey
Commenter la réponse de Delphiturbo