IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Comment trouver le handle de la fenêtre associée à une région Windows ?


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut Comment trouver le handle de la fenêtre associée à une région Windows ?
    Bonjour,

    J'ai l'habitude de créer et de manipuler des régions Windows, pour découper mes fenêtres ou en changer les formes. Je n'ai aucun problème avec cela. Je fais tout cela en Delphi 6 PE, en utilisant directement les APIs.

    Maintenant, pour sécuriser mon code, je voudrais introduire une vérification sur le handle (l'identifiant) d'une région que je passe en paramètre à mes fonctions. Je voudrais vérifier si une région visée est associée à une fenêtre Windows. Pour cela, à partir du handle de la région, je voudrais trouver le handle de la fenêtre. Et je n'ai pas trouvé du tout comment faire. Est-ce que vous auriez une solution, en Delphi 6 PE ?

    Le contexte: dans mon application, j'utilise des régions complexes Windows pour "doubler" la forme de sprites qui évoluent dans un environnement graphique de deux dimensions. Je crée les régions à partir d'un masque en noir et blanc, représentant les parties non transparentes de mes sprites. Et ainsi, je peux faire faciement un test de collusion, en vérifiant simplement que l'intersection entre deux régions n'est pas vide. Bien sûr, lorsque les sprites sont supprimés, ou en fin de programme, je voudrais supprimer les régions utilisées pour chaque sprite concerné, afin de récupérer les ressources système. La suppression ne pose aucun problème, mais je voudrais être sûr qu'il s'agit de régions pour des sprites et non servant de support à une fenêtre.

    Merci de votre aide !

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 938
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 938
    Par défaut
    Tu n'es pas censé conserver de trace de cette région (mémoriser son handle) après l'avoir appliquée à la fenêtre par SetWindowRgn, elle appartient au système.

    Et si tu ne la mémorise pas, impossible de se tromper, non ?

  3. #3
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Je vois ce que tu veux dire. En fait, une région affectée à une fenêtre par SetWindowRgn sera gérée directement par Windows, et je ne suis pas supposé y toucher par la suite. Très bien.

    Il se trouve qu'en pratique, je manipule simultanément toute une série de régions. Certaines sont destinées à être affectées à des fenêtres, mais avant cela, elles servent de "briques" pour constituer des régions complexes, en plusieurs opération de jonctions, intersections etc. Pour finir, la région résultante sera affectée à une fenêtre, et les régions intermédiaires supprimées par DeleteObject.

    D'autres régions servent à "habiller" des sprites et ne seront jamais affectées à des fenêtres. Elles ne servent qu'à des fins de calcul de colluslion, en utilisant un test sur l'intersection de deux régions de type "sprite". Si l'intersection est noon vide, il y a collusion. C'est ce que j'ai trouvé de plus simple pour détecter des collusions précises sur des sprites à forme irrégulière, et non seulement sur le rectangle englobant le sprite.

    Mon programme marche très bien, je me demandais juste, par précaution, avant de supprimer une région, s'il y a un moyen de savoir si la région est affectée à une fenêtre ou non.

    Certes, d'après ta remarque, la question est purement académique, car il suffit d'oublier en quelque sorte les identifiants des régions réellement affectées à des fenêtres, tout en gardant les autres, et je ne cours plus de risque. Très bien. C'est juste intellectuellement frustrant...

  4. #4
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Je voulais en avoir le coeur net. J'ai volontairement supprimé une région par DeleteObject, après l'avoir affecté à une fenêtre par SetWindowRgn. Résultat ? La fenêtre "disparaît", mais continue d'exister pour Windows !

    Cela montre que le handle de la région reste valable et utilisable, même après SetWindowRgn , mais que son utilisation est, disons, compliqué. Et la suppression est évidemment hors de question.

    Et c'est même pire: l'API DeleteObject supprime réellement, quelque soit l'objet. Certes, vous me direz que le rpogrammeur doit savoir ce qu'il fait et prendre ses précautions en amont. D'accord. Je voudrais néanmoins savoir s'il est possible de savoir si un handle choisi pour suppression est bien celui d'une région, d'une part, et si cette région est affectée à une fenêtre, d'autre part. Cela me permettrait de coder queques sécurités élémentaires.

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 938
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 938
    Par défaut
    Citation Envoyé par KlausGunther Voir le message
    J'ai volontairement supprimé une région par DeleteObject, après l'avoir affecté à une fenêtre par SetWindowRgn. Résultat ? La fenêtre "disparaît", mais continue d'exister pour Windows !
    Et c'est logique, tu n'altères que la façon dont est rendu la fenêtre, pas la fenêtre elle-même.
    C'est pas parce que tu éteins la lumière que les meubles n’existent plus

    Citation Envoyé par KlausGunther Voir le message
    Cela montre que le handle de la région reste valable et utilisable, même après SetWindowRgn
    Oui mais pendant combien de temps ? C'est cela qu'on ne maîtrise pas.

    Citation Envoyé par KlausGunther Voir le message
    Je voudrais néanmoins savoir s'il est possible de savoir si un handle choisi pour suppression est bien celui d'une région
    Il n'y a aucune API pour cela.

  6. #6
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Merci pour tes commentaires. C'est bien ainsi que je comprends les choses.

    Quoique - et pour sourire un peu, selon l'incertitude de Schrödinger, est-ce que les meubles seront toujours là lorsqu'on rallume la lumière ? Ou est-ce que le fait de rallumer change l'état des choses ? (Désole, je n'ai pas pu résiter !)

    Il n'y a aucune API pour cela.
    Là, c'est plus sérieux. Et c'est bien dommage. J'ai trouvé une API permettant d'avoir des informations sur un "objet", mais cela ne concerne que des PEN, BRUSH etc. Pas des REGION. La seule chose que j'aie trouvée, c'est une API donnant la structure de la région, avec la liste des rectangles la composant - et encore, il n'est pas fait mention des sous-régions en forme d'éllipse ou bitmap qui peuvent composer une région. Ou est-ce qu'un interne, tout cela est transformé en une multiple piste de minuscules rectangles ? C'est étrange, en tout cas. Et frustrant.

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 938
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 938
    Par défaut
    Un handle n'est qu'une forme de pointeur (mais sur de la mémoire dynamique). Tu ne peux pas déterminer le type d'un objet sur un simple pointeur procedure Proc(p :pointer).

    J'avais donné un exemple de manipulation de régions (de forme quelconque) qui pourrait t'intéresser

  8. #8
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Oui, je sais bien que le handle n'est qu'une forme de pointeur, et qui ne pointe même pas forcément sur la structure concernée, mais quelques fois, le handle pointe simplement sur une entrée dans un tabeau ou ule liste d'objet de même nature, et on trouve là, en-dehors de quelques informations réduites, un pointeur vers la même structure.

    Non, je pensais à une API de type GetRegionData. La fonction GetObjectType permet de savoir s'il s'agit bien d'une région, par opposition à d'autres types d'objets. Mais je n'ai rien trouvé pour savoir si la région visée est affectée à une fenêtre.

    Sinon, en ce qui concerne la manipulation des régions, leurs combinaisons multiples ou intersections, découpages etc pour créer des régions complexes ne me pose pas de problème - je le fais couramment. Même la création de régions à partir d'une bitmap avec une couleur de transparence - c'est acquis.

    La fonction DeleteObject marche sur "logical pen, brush, font, bitmap, region, or palette", selon MSDN. Sauf que pour tous ces objets hormis la région, il y a des informations précises qu'on peut obtenir. Pour une région, j'ai seulement trouvé GetRegionData qui donne la structure de la région, mais en aucune façon l'indication si la région est affectée à une fenêtre.

    En attendant, je sécurise au moins en vérifiant par GetObjectType qu'il s'agit vraiment d'une région...

Discussions similaires

  1. Réponses: 9
    Dernier message: 08/12/2015, 14h44
  2. Réponses: 0
    Dernier message: 29/01/2009, 10h43
  3. Comment trouver le nombre de classe dans d'une image
    Par takfa2008 dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 24/11/2008, 16h26
  4. Comment trouver les équivalents Linux de type de variable c++ windows ?
    Par petitclem dans le forum Applications et environnements graphiques
    Réponses: 10
    Dernier message: 07/08/2008, 09h14
  5. comment trouver le jour de la semaine d'une date ?
    Par mon_proj dans le forum wxPython
    Réponses: 2
    Dernier message: 13/04/2008, 22h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo