8
votes

Les poignées de fenêtre (HWND) sont-elles uniques ou sont-elles réutilisées?

Je pense que s'il y a des poignées de la même valeur?

Pour clarifier ma question, disons que j'ouvre un bloc-notes, tapez dans un texte, sauvegardez-le, puis fermez le bloc-notes. Si je le répète mille fois (ou encore plus), aurai-je une chance de voir la même valeur de la fenêtre (HWND) utilisée pour la fenêtre principale de bloc-notes qui a été utilisée la première fois? Si oui, pourquoi?


3 commentaires

Je n'ai pas compris de quoi pouvez-vous expliquer quelle est votre question ???


Merci pour votre message, c'est OKe si vous ne comprenez pas, veuillez ignorer et lire ce que les gens postent s'il vous apporte des idées intéressantes. Je suis sûr que vous serez connecté bientôt :-d


@Serious: "C'est OKe si tu ne comprends pas" ?! Non, ce n'est pas le cas: si vous postez une question bonne question sur le débordement de la pile, qui ajoute de la valeur à une grande ressource de programmation. Si vous postez une question irrégulière ou incompréhensible, sur le débordement de la pile, qui sera effectivement blessé la pile d'utilité de la pile de pile (même si juste un peu). Alors s'il vous plaît, faites-vous des efforts pour formuler vos questions aussi bien que vous le pouvez, pour le bien de la communauté! (J'ai édité votre question un peu, BTW.)


5 Réponses :


7
votes

Oui. Il n'y a qu'un nombre fini de valeurs qu'une poignée peut être représentée par des fenêtres pour les réutiliser finalement.

Une fois qu'une poignée est fermée, il est parti, vous ne pouvez rien faire avec elle, cela n'existe pas, et vous ne devriez même pas le regarder.

et si vous ouvrez ultérieurement une autre poignée , il est possible que Windows réutilisera la valeur de la poignée.


3 commentaires

Merci, existe-t-il un mécanisme pour livrer la poignée à ouvrir la fenêtre? Qu'est-ce que si vous pouviez partager?


J'aimerais savoir s'il y a un moyen de fournir une valeur de la poignée à chaque fenêtre ouverte? Je n'ai aucune intention d'obtenir la poignée de la fenêtre droite. Ma connaissance sur Windows n'est pas bonne, je fais des questions.


Non - aucun gui manche a un compteur de référence. Donc, il n'y a qu'une seule valeur de la poignée et vous ne pouvez pas faire quelque chose comme "Duplicatedhandle", c'est un bogue de conception de la même manière que l'UNIX utilise des valeurs d'identité de processus.



2
votes

par le Pigeonhole Principal , oui, ils ne peuvent pas être uniques.

En raison de la compatibilité avec les processus 32 bits (WOW64), les poignées ne peuvent pas utiliser les 64 bits entiers, même sur un système d'exploitation 64 bits - pensent à un processus de 64 bits qui passent une poignée à un enfant 32 bits, ou Obtenir une poignée à une fenêtre ouverte par un processus 32 bits. Cela rend leur véritable espace assez petit et réutiliser donc très probablement.


10 commentaires

Merci ybungalabill, c'est exactement ce que j'aimerais savoir. Pour ce que je voudrais savoir!


Seule une partie de cette réponse est vraie. Les poignées de fenêtre font pas Conservez la compatibilité avec des fenêtres 16 bits. Ce sont des pointeurs, ce qui signifie que leur taille est dépendante de l'architecture. Sur les versions de 64 bits de Windows, elles sont des valeurs de 64 bits. Sur les versions 32 bits de Windows, elles sont des valeurs 32 bits. Vérifiez les fichiers d'en-tête Windows pour plus de détails.


Le type n'est pas un typedef pour vide * plus; Il a été ans Depuis c'était le cas. Les parties de la documentation MSDN n'ont pas été mises à jour depuis lors, mais cela ne rend pas l'hypothèse moins incorrecte. De plus, ce n'est même pas ce que l'article que vous avez lié à dit. Il est seulement dit qu'il existe une limite de 65 536 poignées d'utilisateurs par session. Cela ne dit rien sur le type de données utilisé pour stocker les poignées. Vous tirez des conclusions qui ne sont pas explicitement énoncées et sont assez injustifiées.


Si vous utilisez toujours les en-têtes fournis avec VC 6, vous êtes désespérément obsolète. Je ne suis pas sûr de quoi d'autre de vous dire. Ce n'est pas défini comme une version moderne du SDK. Je ne comprends pas vraiment ce que vous voulez de MSDN. Vous voulez un lien qui dit que MSDN ne va pas de MSDN? Désolé, ça ne va pas arriver. Toutes les pages de la documentation en ligne ne sont pas mises à jour régulièrement, et même lorsque les mises à jour font se produisent, des trucs sont manqués. Raymond Chen écrit tout un blog à ce sujet. Vous avez fourni un lien vers un article non pertinent sur les poignées GDI, qui n'a rien à voir avec les valeurs hwnd .


Et rien de tout cela n'a vraiment rien à voir avec quoi que ce soit. Nous ne parlons pas de tables GDI. Le point est que les poignées de fenêtre ne sont pas compatibles avec les versions de fenêtres de 16 bits. Si vous déclarez le type hwnd en tant que bref int , les choses ne vont pas fonctionner correctement. Ce n'est pas une valeur de 16 bits.


Hmm, rappelez-vous que strict est défini par défaut maintenant et est depuis des années. Vous devez regarder la mauvaise branche du #if . Et cet article parle de poignées GDI, pas de poignées de fenêtre. Vous devez lire le tout, pas seulement la partie qui convient à votre argument. Je ne discute pas avec le fait que les valeurs seront réutilisées. Je conteste la réclamation spécieuse que les poignées de fenêtre conservent une compatibilité avec des fenêtres de 16 bits.


@Cody: Excusez-moi, mais je ne vais pas discuter avec vous plus loin si vous ne faites même pas un effort minimal pour vérifier que la poignée est typée à un pointeur vide lorsque strict est défini et à un entier sinon. À moins que vous fassiez un effort minimal pour examiner la table dans l'article, je suis lié à l'endroit où il est écrit que Windows sont des objets utilisateur, et que l'article parle d'objets utilisateur (vous venez de décider qu'il "parle de poignées GDI").


N'oubliez pas que nous ne parlons pas de gérer . Nous parlons de hwnd . Je ne comprends pas pourquoi vous continuez à parler de choses qui sont complètement non pertinentes, telles que les poignées GDI et le type . Le titre de la question dit très clairement "Poignées de fenêtre". Je ne fais pas ça. Et j'ai déjà abordé que la table est assez pertinente pour cette discussion. Et enfin, nous arrivons au cœur réel de votre argument, qui est totalement et totalement incorrect. Win16 applications ne fonctionnera pas sur des versions de Windows 64 bits. Fin de l'histoire.


Il est mentionné dans MSDN : Typedef Poignée HWND; , Typef Pvoid ​​Poignée; , Typef Void * Pvoid; . Et les objets utilisateur Article mentionne < Code> hwnd , pas d'objets GDI. Objets GDI ont séparé Article répertorié dans la navigation. Enfin, un peu référence au Table de poignée .


@Yakovgalka Le type de poignée est pvoïde , un pointeur vide de 64 bits. Ceci est générique, il peut s'agir d'une adresse 64 bits ou d'un index dans une table de poignée ou peut être une pseudohandle, en fonction de la poignée.



1
votes

Je vous conseillerais de ne faire absolument aucune hypothèse sur les valeurs de la poignée.

Vous ne devriez pas avoir à penser à des valeurs de poignée concrètes à toutes fins pratiques. Une poignée doit être considérée comme un espace réservé opaque pour autre chose. Vous pouvez transmettre la poignée pour vous référer à quelque chose (par exemple une fenêtre) sans avoir une référence à la vraie chose, mais vous ne devriez jamais avoir à regarder la poignée elle-même . Le fait qu'il s'agisse d'une valeur numérique doit être considéré comme un détail de mise en œuvre, c'est-à-dire. pas important (à moins que vous puissiez peut-être une programmation de systèmes de bas niveau).

Cela étant dit, je soutiendrais la réponse de Jalf: les valeurs de la poignée pourraient être réutilisées. Si je devais faire une hypothèse de cela, je supposerais qu'une valeur de la poignée pourrait être réutilisée à tout moment .



2
votes

Oui, les poignées de fenêtre sont réutilisées.

Documentation à Iswindow fonction dit:

Un thread ne doit pas utiliser Iswindow pour une fenêtre qu'il n'a pas créé car la fenêtre pourrait être détruite après l'appel de cette fonction. En outre, parce que les poignées de fenêtre sont recyclées la poignée pourrait même indiquer une fenêtre différente .


1 commentaires

Ma réponse est basée sur Le Commentaire par @codygray. Je voulais juste faire ce fait plus important.



3
votes

théoriquement oui. En pratique - la probabilité de ceci (contrairement au processus et à un identificateur de thread, qui est fréquemment réutilisé) est presque zéro.

Dans la mise en œuvre actuelle Basse 16 bits de hwnd utilisé comme index dans la table de poignée de Windows - de sorte que les fenêtres maximales maximales de 64k peuvent être créées. Les 16 prochains bits utilisés comme indice de réutilisation. Lorsqu'une cellule est utilisée pour la première fois que cet index est 1.Quand cette cellule est réutilisée, l'index est augmenté de 1. et ainsi de suite. En conséquence pour obtenir le même hwnd sur la fenêtre Besoin de la manière dont le minimum de 64K Windows doit être créé et détruit. Mais ce n'est que si toutes ces fenêtres seront utilisées la même cellule. Mais nous avons 64k cellules. Tellement réel minimum beaucoup plus élevé pour cela. pas exactement 2 ^ 32 mais assez grand.

Et même si la mise en œuvre a changé, je ne pense pas que la nouvelle implémentation apportera hwnd moins unique que courant.


0 commentaires