Handle fenetre precise

Résolu
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010 - 25 févr. 2008 à 20:36
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010 - 11 mars 2009 à 19:33
Bonsoir,

Je souhaiterais récuperer le handle d'une fenêtre bien precise.

Si je fais :
Code :

monhandle := FindWindow(nil, ma_fenetre);

-FinWindow va bien retourner le numero de handle pour ma_fenetre.
Ok, mais le problème est que le titre de ma barre de dialogue change de nom souvent, donc, je ne peut pas de cette façon.

Je peut recuperer aussi un handle via le Classe Name :
Code :

monhandle := FindWindow('#32770', nil)

Ok, mais le problème est que la classe est #32770 et que cette classe me renvoie le handle de Nero, donc, ce n'est pas une solution non plus.

Donc, premiere question, comment puis-je recuperer le handle de cette fenêtre?
Deuxieme question et suggestion, le nom de la barre de dialogue est jamais identique, cepandant ,les derniers mot, eux le sont.
Donc, ne peut-ont pas identifier le handle via le classe name #32770 et une partie du nom de la boite de dialogue (je dis bien une partie du texte) ?

Merci beaucoup, cela me seras d'une grande utilité et un grand soulagement aussi

11 réponses

Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
3 mars 2008 à 22:39
selon delphiprog (dans les commentaires de la source), le ifthen est apparu avec delphi 6 (perso je l'ai compilé avec D7).
sinon, cette fonction est tres simple. Son implementation doit ressembler a qqchose pret a ca :

function IfThen(const Condition: Boolean: const ValueIfTrue, ValueIfFalse: string): string;
begin
    if Condition then
       ValueIfTrue
    else
        ValueIfFalse;
end;
3
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
25 févr. 2008 à 22:19
la classe de ta fenetre a le meme nom que celle de nero?!
Avec quoi a tu recuperé la classe de ta fenetre?
0
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
26 févr. 2008 à 15:56
Bonjour,

Oui, je repete, la classe name est la même que nero #32770
Je l'ai récuperer avec :
-WindowsSpy
-Puis un scruteur de processus assez pousser qui utilise GetClassName pour récuperer les classes (classique).
Donc, pas de doute, la classe est #32770 .
Par consequent, il ne reste plus 36 solutions pour retrouver le handle de ma fenêtre, il me faut :
Donner le classe name #32770 puis une partie seulement du texte que contient la barre de titre pour identifier le handle de cette fenêtre.

Merci beaucoup pour votre aide.
0
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
27 févr. 2008 à 21:30
Bonsoir,

D'apres une longue recherche, ce serais faisable avec la fonction pos
function Pos(Substr: string; S: string): Integer;

Description

La fonction Pos recherche une sous-chaîne, Substr, à l'intérieur d'une chaîne S. Substr et S sont des expressions de type chaîne.

Je ne vois pas comment l'adapter a ce que je veux faire.
En attendant, je vais encore chercher.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
28 févr. 2008 à 09:55
var

monHandle: THandle;
MonBuffer: array[0..1024] of char;
begin
monHandle := findwindow(MonClassName, nil);
GetWindowText(monHandle, MonBuffer, 1024);
if Pos('La Chaine dans mon titre', string(MonBuffer)) <> 0 then
  C'est ok, la fenetre contient la sous chaine
0
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
28 févr. 2008 à 18:11
Bonjour,

Merci pour la réponse que tu m'ai apporter.
je ne sais pas si je m'y prend mal ou bien, mais ce code ne me retourne pas le handle que souhaite.

procedure TForm1.Button1Click(Sender: TObject);
var
monHandle: THandle;
MonBuffer: array[0..1024] of char;
begin
monHandle := findwindow('#32770', Nil);
GetWindowText(monHandle, MonBuffer, 1024);
if Pos('la chaine', string(MonBuffer)) <> 0 then
begin
  memo1.Text := IntToHex(monHandle, 8)+' - '+MonBuffer;

end;
 end;
end.

Merci.

Ps, si je met <> 1 then il me retourne le handle de nero.
0
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
3 mars 2008 à 19:18
Bonjour

Merci pour le source, c'est exactement ce dont je chercher, ça fonctionne.
Cependant, quand j'essai de l'integrer à mon projet, il me met une erreur:
Non déclarer 'Ifthen'
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

    const
  WM_CHERCHETOI = WM_USER + 1;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  CurrWindow: THandle;
  Buffer: array[0..1024] of char;
  CestMoi: Boolean;
  DemanderDeSeChercher: Boolean;
begin
  //recherche l'instance de la classe dans la liste des fenetre windows
  //Si DemanderDeSeChercher est true, on envoie un message aux autres pour qu'ils se recherchent

  Memo1.Lines.Clear;

  CurrWindow := FindWindowEx(0, 0, PChar('#32770'), nil); //premiere fenetre
  while CurrWindow <> 0 do
  begin
    //lecture du caption de la fenetre
    GetWindowText(CurrWindow, Buffer, 1024);
    //verification que le titre contient mon handle
    CestMoi := Pos('Chat', string(Buffer)) <> 0;
    Memo1.Lines.Add(Format('[%s] %d "%s"', [IfThen(CestMoi, '  MOI  ', 'PAS MOI'), CurrWindow, Buffer]));
    //envoie de la demande de se rechercher si ce n'est pas moi
    if (DemanderDeSeChercher) and (not CestMoi) then
      PostMessage(CurrWindow, WM_CHERCHETOI, 0, 0);

    //fenetre suivante
    CurrWindow := FindWindowEx(0, CurrWindow, PChar('#32770'), nil);
  end;
end;

Il me met une erreur sur cette ligne :
Memo1.Lines.Add(Format('[%s] %d "%s"', [IfThen(CestMoi, '  MOI  ', 'PAS MOI'), CurrWindow, Buffer]));

En m'informant que IfThen n'est pas déclarer.
Merci beaucoup pour ce source, exelent.
J'ai chercher pendant plus d'une semaine à la recherche d'informations comme ce source, et je n'ai pas trouver, pourtant, j'ai beaucoup chercher.
0
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
4 mars 2008 à 16:12
Bonjour,

Merci beaucoup, en faite, ça fonctionne, c'est juste que j'ai oublier de déclarer Math, StrUtils; dans uses.

Bon, par contre, comme je te l'ai dit plus haut, sans ton aide, je n'aurais jamais trouver.
j'ai chercher pendant une grosse semaine sans relâche.
Ou as tu trouver les informations necessaire pour créer cet exelent source?
Merci beaucoup.
0
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
11 mars 2009 à 16:49
0
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
11 mars 2009 à 16:57
Bonjour,

excusez moi pour le vide si dessus, mon post n'as pas été poster correctement ? si un modo pouvais le supprimer, merci.

Bon, je n'arrive pas à modifier le code citer sur la premiere page.
le résultat est stocker dans le memo1.lines sous cette forme:

[PAS MOI] 394466 "Gestionnaire des tâches de Windows"
[ MOI ] 197332 "Camfrog Video Chat"
[PAS MOI] 131726 "Historique des appels Camfrog"
[PAS MOI] 393840 "Filtre-IM"

ce qui m'interresse, c'est [MOI] avec son numero de handle uniquement.
je n'arrive pas à modifier le source de façon à obtenir que le numero de handle (197332) dans mon cas.
Si j'obtiendrais uniquement le numero, je pourrais le sauvegarder dans un fichier pour l'utiliser.
Si quelqu'un à une idée, je suis prenneur.
merci à vous, en attendant, je retourne bidouiller.
0
yannfrance Messages postés 48 Date d'inscription mardi 18 septembre 2007 Statut Membre Dernière intervention 1 décembre 2010
11 mars 2009 à 19:33
Re Excusez moi, mais c'est bon, j'ai trouver autrement.
Désoler de donner du travail aux moderateurs, si vous pouviez supprimer ces deux posts qui ne ne servent à rien, merci et encore désoler d'avoir déranger.
0
Rejoignez-nous