Handle fenetre precise [Résolu]

yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention - 25 févr. 2008 à 20:36 - Dernière réponse : yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention
- 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
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 28 févr. 2008 à 23:12
3
Merci
j'ai fait une petite source qui repondra a ta question je pense.
tu la retrouvera ici :
http://www.delphifr.com/codes/RECHERCHER-FENETRE-CLASSE-PARTIE-SON-TITRE_45895.aspx

Merci Guillemouze 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de Guillemouze
Meilleure réponse
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 3 mars 2008 à 22:39
3
Merci
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;

Merci Guillemouze 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de Guillemouze
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 25 févr. 2008 à 22:19
0
Merci
la classe de ta fenetre a le meme nom que celle de nero?!
Avec quoi a tu recuperé la classe de ta fenetre?
Commenter la réponse de Guillemouze
yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention - 26 févr. 2008 à 15:56
0
Merci
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.
Commenter la réponse de yannfrance
yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention - 27 févr. 2008 à 21:30
0
Merci
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.
Commenter la réponse de yannfrance
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 28 févr. 2008 à 09:55
0
Merci
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
Commenter la réponse de Guillemouze
yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention - 28 févr. 2008 à 18:11
0
Merci
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.
Commenter la réponse de yannfrance
yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention - 3 mars 2008 à 19:18
0
Merci
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.
Commenter la réponse de yannfrance
yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention - 4 mars 2008 à 16:12
0
Merci
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.
Commenter la réponse de yannfrance
yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention - 11 mars 2009 à 16:49
0
Merci
Commenter la réponse de yannfrance
yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention - 11 mars 2009 à 16:57
0
Merci
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.
Commenter la réponse de yannfrance
yannfrance 50 Messages postés mardi 18 septembre 2007Date d'inscription 1 décembre 2010 Dernière intervention - 11 mars 2009 à 19:33
0
Merci
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.
Commenter la réponse de yannfrance

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.