Maison > Article > tutoriels informatiques > Que signifie une poignée de fenêtre moustiquaire ?
C'est facile à comprendre une fois que vous savez ce qu'est une poignée
Récupérez simplement le code d'identification de cette fenêtre
Un handle est un identifiant unique utilisé pour distinguer divers objets de mémoire. Il s'agit d'un entier de 32 bits.
Certains sont uniques à l'ensemble du système (comme les poignées de fenêtre), et d'autres sont uniques au processus ou au thread actuel
(comme le descripteur de fil, le global a un autre identifiant).
Les détails peuvent être divisés en plusieurs types, tous commençant par H. Lorsque vous l'utilisez en VB, utilisez tous Long.
Les plus courants incluent le handle de fenêtre (HWND), le handle de contexte de périphérique (HDC), le handle de mémoire (HMEM),
Descripteur de fichier, descripteur de processus, descripteur de fil, descripteur de type stylo (HPEN), descripteur de police (HFONT),
Possibilité de région (HRGN) et plus encore.
Lors de la demande de handle, les ressources sont occupées, qui sont divisées en trois catégories : SYSTÈME, UTILISATEUR et GDI.
Les ressources de WINDOWS sont fixes et n'augmentent pas avec l'extension de la mémoire, vous devez donc les libérer après utilisation
Rangez-le.
>
Si vous utilisez uniquement le propre code de VB, vous n'utiliserez généralement pas de handles, mais si vous utilisez des fonctions API,
La plupart des gens l'utiliseront.
Dans les systèmes Windows, les handles (je pense toujours que ce mot est très mal traduit) sont divisés en trois catégories : Kernel
Handle, UserHandle et Handle défini par l'application.
KernelHandle est en fait l'index de la table de pointeurs de l'objet Kernel dans le processus. Les objets du noyau incluent les processus et les fichiers
.Pièces, signaux, etc. Mais afin de cacher le fait, MS a généré une valeur dite Obsfucator au démarrage du système
(en fait, cela devrait être Obfuscator, MicrosoftBugs(R) :), après avoir généré le Handle, différenciez le Handle de cette valeur
ou revenez à l'application, donc les poignées que vous voyez sont des nombres volumineux et dénués de sens. Ceux-ci
Les objets handle et index sont gérés conjointement par KRNL32.DLL et VMM32.VXD, ils sont donc appelés Kernel
Poignée.
UserHandle est utilisé pour marquer des objets tels que des fenêtres et des contrôleurs de domaine. Ce sont de vrais pointeurs, mais ils ne pointent pas vers des objets
. Au début du, il y a un décalage. Encore une fois, ces objets sont gérés par USER32.DLL.
Le troisième type de handle n'est constitué que de quelques index personnalisés par l'application. La signification spécifique est liée à l'application
.1. Appelez GetConsoleTitle() pour enregistrer le titre actuel de la fenêtre de la console.
2. Appelez SetConsoleTitle() pour changer le titre de la console en un titre unique.
3. Appelez Sleep(40) pour vous assurer que le titre de la fenêtre a été mis à jour.
4. Appelez FindWindow(NULL, uniquetitle) pour obtenir HWND. Si l'opération échoue, NULL sera renvoyé.
5. À partir de l'étape 1, pour restaurer le titre de la fenêtre d'origine, récupérez la valeur, appelez SetConsoleTitle().
Le HWND du résultat doit être testé. Par exemple, vous pouvez tester si le HWND renvoyé correspond au processus actuel appelant GetWindowText() sur le HWND et comparer le résultat à GetConsoleTitle().
Exemple de code
La fonction suivante récupère le handle de fenêtre d'application console actuel (HWND). Si cette fonction réussit, la valeur de retour est un handle vers la fenêtre de console. Si cette fonction échoue, la valeur de retour est NULL. Certaines vérifications d'erreurs sont omises par souci de concision.
HWND GetConsoleHwnd(void)
{
#define MY_BUFSIZE 1024 // Taille du tampon pour les titres des fenêtres de la console.
HWND hwndFound; // C'est ce qui est renvoyé à l'appelant.
char pszNewWindowTitle[MY_BUFSIZE]; // Contient des produits fabriqués
// TitreFenêtre.
char pszOldWindowTitle[MY_BUFSIZE]; // Contient l'original
// TitreFenêtre.
// Récupérer le titre de la fenêtre actuelle.
GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
// Formater un NewWindowTitle "unique".
wsprintf(pszNewWindowTitle,"%d/%d",
GetTickCount(),
GetCurrentProcessId());
// Modifier le titre de la fenêtre actuelle.
SetConsoleTitle(pszNewWindowTitle);
// Assurez-vous que le titre de la fenêtre a été mis à jour.
Sommeil(40);
// Recherchez NewWindowTitle.
hwndFound=FindWindow(NULL, pszNewWindowTitle);
// Restaurer le titre original de la fenêtre.
SetConsoleTitle(pszOldWindowTitle);
retour(hwndFound);
}
#inclure
#inclure
en utilisant l'espace de noms std;
//Fonction de rappel pour EnumWindows
BOOL CALLBACK EnumProc(HWND hwnd,LPARAM lparam)
{
vecteur
pvec->push_back(hwnd);
retour VRAI ;
}
void main()
{
vecteur
EnumWindows(EnumProc,(LPARAM)&vec);
}
Ceci est écrit dans un projet de programme de console win32. Si vous souhaitez l'utiliser sous MFC, il vous suffit d'inclure
#include
EnumProc est défini devant, et la fonction de réponse du bouton. est ajouté dans la fonction principale, ces deux phrases feront l'affaire.
J'ai testé ici et j'ai obtenu 407 poignées
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!