L'ancien nouveau win32api
Cette page fournit une liste de liens au sous-ensemble de publications du célèbre blog de Raymond Chen, The Old New Thing . Le sous-ensemble est limité principalement à Win32API et à certaines choses liées à la com.
La raison pour laquelle je maintiens cette page est qu'elle fournit souvent des informations qui manquent sur MSDN ou qui y sont décrites de manière cryptique, et aussi parce que le blog n'est pas facilement consultable.
Les liens ici sont classés par leur sujet au lieu d'un ordre chronologique. Parfois, le cas échéant, un seul poste peut être placé dans plusieurs catégories.
Dans certains cas (assez rares), des liens vers d'autres sources sont inclus s'ils sont jugés utiles.
Avertissement: Je ne demande pas la paternité de contenu lié. Il s'agit uniquement d'une organisation utile, espérons-le, des grands articles que Raymond a écrits au fil des ans.
Table des matières
- Processus et threads
- Processus
- Threads
- Piscines de fil
- Affinité thread des objets
- Pile de filetage
- Fibres
- Synchronisation
-
WaitOnAddress()
-
WaitForMultipleObjects()
et parents - Modèles sans serrures
- DLL
- Ressources
- Bitmap et Ressources d'icônes
- Modèles de dialogue
- Modèles de menu et ressources d'accélérateur
- Cordes
- Modèles de version
- Données et ressources personnalisées
- Application (dans son ensemble)
- Ligne de commande
- Barre des tâches
-
HWND
(point de vue général)- Hiérarchie Windows
- Styles de fenêtre
- Classes de fenêtres
- Fenêtres de niveau supérieur
- Cadre de fenêtre et légende
- Dwm
- Dialogue
- Dialogues imbriquées et intégrées
- Dialogues communes
- Navigation de contrôle
- Gestionnaire de dialogue
- Modalité
- Feuilles de propriété
- Commandes
- Contrôles d'animation
- Boutons
- Boîtes combinées
- Modifier les contrôles
- Vues de liste
- Contrôles de texte riche
- Barres de défilement
- Commandes statiques
- Barres d'outils
- Infractions
- Barres de piste
- Vues de la liste des arbres
- Traitement des messages
- Messages spécifiques
- Notifications
- Construction et destruction des fenêtres
- Messages de géométrie des fenêtres
- Messages de peinture à la fenêtre
- Messages de mise au point des fenêtres
- Messages du clavier
- Messages de souris
- Messages de dialogue
- Autres messages de fenêtre
- Messages système
- GDI
- Curseurs
- Brosses
- Enclos
- Bitmaps
- Gamin
-
LockWindowUpdate()
- Peinture des éléments standard
-
UXTHEME.DLL
- Multiples moniteurs
- Accessibilité
- Com
- Déclarer les interfaces COM
- Appartements de com
- COM Initialisation
- COM STATIQUE STATIQUE
- Com marécageux
- COM Gestion des erreurs
- Com interfaces asynchrones
- Gâchis
- Commandes
- COM Variants
-
IUnknown
-
IMoniker
-
ICallback
-
IContextMenu
-
IFileDialog
-
IMultiLanguage
-
INamespaceWalk
-
IStream
-
IVirtualDesktopManager
- Presse-papiers
- Faire glisser et laisser tomber
- Énumération
- Coquille
- Des trucs com non classés
- Mémoire
- Entrée et sortie
- Entrée et sortie asynchrones
- Fichiers et répertoires
- ACL
- Autorisation de sécurité, attributs et identifiants
- Enregistrement
- Cordes et lieux
- Services NT
- Non classé
Processus et threads
Processus
-
CreateProcess
n'attend pas que le processus commence - Pourquoi la fonction
CreateProcess
modifie-t-elle sa ligne de commande d'entrée? - Pourquoi les gens se verrouillent-ils autour des appels
CreateProcess
? - Désactivation de la boîte de dialogue de crash du programme
- Comment transmettre beaucoup de données à un processus lors de leur démarrage?
- Quel était le but du paramètre
hPrevInstance
de WinMain
? -
RunAsInvoker
est-il un paramètre UAC secret, encore plus élevé? - Comment puis-je empêcher un processus d'enfant d'afficher la boîte de dialogue Windows Error Reporting?
- Comment se fait-il que
WriteProcessMemory
réussit à écrire dans la mémoire en lecture seule? - Est-ce une bonne idée de permettre
WriteProcessMemory
de gérer la protection de la page pour moi? - Comment puis-je lancer un processus non éliminé à partir de mon processus élevé, Redux
- Comment puis-je vérifier le niveau d'intégrité de mon processus?
- Est-il vrai que l'élevage d'une exception structurée à partir d'un gestionnaire d'exceptions structuré met fin au processus?
- Une manière plus directe et sans erreur de créer un processus dans un objet de travail
Threads
- ID de thread et de processus non valide
- Pourquoi mon fil gère-t-il soudainement mal? Tout ce que j'ai fait, c'était attendre dessus!
- Que se passe-t-il si vous retournez simplement du rappel de thread transmis à
_beginthread
et _beginthreadex
? - Pourquoi tu ne devrais jamais suspendre un fil
- Les dangers de dormir sur un fil d'interface utilisateur
- Dans la poursuite de la file d'attente de messages
- Énumération des fils dans un processus
- Le travail d'interface utilisateur Win32 est intrinsèquement unique
- À quel point est-il mauvais de retarder la fermeture d'une poignée de fil pendant longtemps après la sortie du fil?
- Si j'appelle
GetExitCodeThread
pour un fil que je sais avec certitude, pourquoi dit-il toujours STILL_ACTIVE
? - Y a-t-il un problème avec
CreateRemoteThread
sur les systèmes 64 bits? - La fonction
TerminateThread
est-elle synchrone? - Supprimer le
TerminateThread
du code qui attend qu'un objet de travail vide - Quel est l'intérêt de
FreeLibraryAndExitThread
? - Que se passe-t-il si je donne des valeurs contradictoires pour la réserve de validation et de pile de pile?
Piscines de fil
- Que signifie exactement le paramètre
msWindowLength
pour SetThreadpoolTimer
? - Quelle est la différence entre
CreateTimerQueueTimer
et SetThreadpoolTimer
? - Comment éviter d'accéder à la mémoire libérée lors de l'annulation d'un rappel de pool de threads
- Éviter les blocs de bloces lors de l'annulation d'un rappel de pool de threads, partie 1: données de rappel externes
- Éviter les blocs de non-blocs lors de l'annulation d'un rappel de pool de threads, partie 2: se référant à l'objet contenant
- Gotcha: une minuterie périodique de threadpool n'attendra pas que la coche précédente se termine
- Pourquoi est-ce que je reçois une exception du pool de threads lors de l'arrêt du processus?
- Qu'arrive-t-il à la valeur renvoyée de la fonction transmise à
QueueUserWorkItem
? - Le modèle mental pour
StartThreadpoolIo
- Comment puis-je détecter qu'un article de travail de pool de fil prend trop de temps?
- Comment puis-je fermer un pool de fils et annuler tous les travaux qui y avaient été en file d'attente?
Affinité thread des objets
- Affinité thread des objets d'interface utilisateur, partie 1: poignées de fenêtre
- Affinité thread des objets d'interface utilisateur, partie 2: contextes de périphérique
- Affinité thread des objets d'interface utilisateur, partie 3: menus, icônes, curseurs et tables d'accélérateur
- Affinité thread des objets d'interface utilisateur, partie 4: objets GDI et autres notes sur l'affinité
- Affinité thread des objets d'interface utilisateur, partie 5: Nettoyage des objets
- Affinité thread des objets d'interface utilisateur: addendum
Pile de filetage
- Comment puis-je étendre la pile de mon fil au moment de l'exécution?
- Utilisation des fibres pour étendre la pile d'un thread au moment de l'exécution, partie 1
- Utilisation des fibres pour agrandir la pile d'un thread au moment de l'exécution, partie 2
- Utilisation des fibres pour étendre la pile d'un thread au moment de l'exécution, partie 3
- Utilisation des fibres pour étendre la pile d'un thread au moment de l'exécution, partie 4
- Utilisation des fibres pour agrandir la pile d'un thread au moment de l'exécution, partie 5
- Utilisation des fibres pour étendre la pile d'un thread au moment de l'exécution, partie 6
- Comparaison des fibres aux fils dans le but d'élargir la pile d'un thread à l'exécution
- Déterminer approximativement la quantité d'espace de pile disponible, partie 1
- Déterminer approximativement la quantité d'espace de pile disponible, partie 2
Fibres
- Qu'arrive-t-il aux fibres qui fonctionnaient sur un fil lorsque le thread sort?
- C'est bien d'utiliser les fibres, mais tout le monde doit être à bord avec le plan
- Les fibres ne sont plus utiles pour beaucoup; Il n'y a qu'un coin qui reste utile pour une raison sans rapport avec les fibres
Synchronisation
- Comprendre les conséquences de
WAIT_ABANDONED
- Événements à clé Windows, sections critiques et nouvelles fonctionnalités de synchronisation Vista
- Combinant la file d'attente de travaux d'événements distincts, ordre non important, avec un événement automatique à réinitialisation
- À quel point les serrures SRW sont-elles justes, en particulier lorsqu'il y a des lecteurs et des écrivains?
- Vous pouvez également utiliser un fichier comme objet de synchronisation
- Puis-je attendre qu'un événement de noyau devienne non signé ?
- Si le Slim Reader / Writer Lock (
SRWLOCK
) ne se souvient pas de qui est le propriétaire de serrure partagée, cela signifie-t-il qu'il est normal de l'acquérir récursivement?
WaitOnAddress()
-
WaitOnAddress
vous permet de créer un objet de synchronisation à partir de toute variable de données, même un octet - Implémentation d'une barrière de synchronisation en termes de
WaitOnAddress
- Implémentation d'une section critique en termes de
WaitOnAddress
- Étendre notre section critique basée sur
WaitOnAddress
pour soutenir les délais d'attente - Comparaison
WaitOnAddress
avec Futexes (Futexi? Futexen?) - Création d'un sémaphore à partir de
WaitOnAddress
- Création d'un sémaphore avec un nombre maximum de
WaitOnAddress
- Création d'un événement manuel-réinitialisation de
WaitOnAddress
- Création d'un événement de réinitialisation automatique de
WaitOnAddress
WaitForMultipleObjects()
et parents
-
MsgWaitForMultipleObjects
et l'état de file d'attente - Vous pouvez appeler
MsgWaitForMultipleObjects
avec zéro poignées - Pomper des messages en attendant une période de temps
- Attendre toutes les poignées avec
MsgWaitForMultipleObjects
est un bug qui attend de se produire - Pourquoi
WaitForMultipleObjects
renvoie-t-il ERROR_INVALID_PARAMETER
lorsque tous les paramètres me semblent valables? - Si plus d'un objet provoque un retour à
WaitForMultipleObjects
, comment puis-je découvrir les autres? - Quel est l'intérêt de passer un événement jamais signalé à
MsgWaitForMultipleObjects
?
Modèles sans serrures
- Verrouillez les modèles gratuits de plusieurs producteurs / monoconsumers: une file d'attente de travail avec des tâches fusionnées
- Verrouillez les modèles gratuits de plusieurs producteurs / monoconsumers: une file d'attente de travail où le dernier gagne
- Verrouillez les modèles gratuits de plusieurs producteurs / monoconsumers: une file d'attente de travail d'événements identiques non coaluscables
- Verrouillez les modèles gratuits de plusieurs producteurs / monoconsumers: une file d'attente de travail d'événements distincts, l'ordre n'est pas important
- Verrouillez les modèles gratuits de plusieurs producteurs / monoconsumers: une file d'attente de travail d'événements distincts, FIFO
- Verrouillez les modèles gratuits de plusieurs producteurs / monoconsumers: une file d'attente de travail d'événements distincts, commande non importante, question de suivi
DLL
- Ne faites pas confiance à l'adresse de retour
- Pourquoi ne puis-je pas
GetProcAddress
une fonction que je dllexport? - Quelle est la différence entre
HINSTANCE
et HMODULE
? - Accéder à
HINSTANCE
du module actuel à partir d'une bibliothèque statique -
LoadLibraryEx(DONT_RESOLVE_DLL_REFERENCES)
est fondamentalement défectueux - Pourquoi les DLL sont-elles déchargées dans le "mauvais" ordre?
- Comment les fonctions DLL sont-elles exportées dans des fenêtres 32 bits?
- Fonctions exportées qui sont vraiment des transitaires
- Repenser la façon dont les exportations de DLL sont résolues pour les fenêtres 32 bits
- Les noms de la bibliothèque d'importation sont décorés pour une raison
- Que se passe-t-il lorsque vous vous trompez Dllimport?
- Problèmes liés à la création d'un talon pour une fonction importée
- Allouer et libérer la mémoire entre les limites du module
- Le transfert de DLL n'est pas le même que le chargement de retard
- Qu'est-ce que la DLL Import Hinting?
- Qu'est-ce que la liaison d'importation DLL?
- Quel est l'intérêt de
FreeLibraryAndExitThread
? - Une bibliothèque chargée via
LOAD_LIBRARY_AS_DATAFILE
(ou des drapeaux similaires) ne peut jouer dans aucun jeu de module de renne - Pourrait-il y avoir des problèmes avec l'appel
GetModuleFileNameEx
sur votre propre processus? - Comment puis-je spécifier que ma DLL devrait résoudre une dépendance DLL du même répertoire dans lequel la DLL est?
- Après avoir réalisé ma DLL à chargement une autre DLL, ma DLL a commencé à s'écraser dans son code de détachement de processus
- Les différents types de plantation de DLL
- Pourquoi
GetModuleInfo
ne produit pas un point d'entrée pour les exécutables? - Que signifie la
SizeOfImage
dans la structure MODULEINFO
? - Comment supprimer la boîte d'erreur qui apparaît lorsqu'un
LoadLibrary
échoue?
DllMain()
- Quelques raisons de ne rien faire d'effrayant dans votre
DllMain
- Une autre raison de ne rien faire d'effrayant dans votre
DllMain
: une impasse inadvertante - Certaines raisons de ne rien faire d'effrayant dans votre
DllMain
, partie 3 - Le fil qui obtient la notification
DLL_PROCESS_DETACH
n'est pas nécessairement celle qui a obtenu la DLL_PROCESS_ATTACH notification
- Comment vous pourriez charger une DLL pendant
DLL_PROCESS_DETACH
sans même s'en rendre compte - Lorsque
DLL_PROCESS_DETACH
vous dit que le processus est sorti, votre meilleur pari est juste de revenir sans rien faire
Ressources
- Le compilateur de ressources par défaut est par défaut
CP_ACP
, même face à des indices subtils que le fichier est UTF-8 - La relation entre les ressources du module et les objets dérivés des ressources dans des fenêtres 32 bits
- Quelle est la différence entre
FreeResource
et, disons, DestroyAcceleratorTable
- Les ressources PE doivent être alignées sur 4 octets, mais cela n'empêche pas les gens d'essayer d'autres alignements
- Comment puis-je dire que quelqu'un a utilisé la macro
MAKEINTRESOURCE
pour faire passer enbout un entier à l'intérieur d'un pointeur? - Gotcha horriblement méchant:
FindResource
et FindResourceEx
Bitmap et Ressources d'icônes
- Pourquoi les bitmaps indépendants de l'appareil sont-ils à l'envers?
- Le format des ressources bitmap
- Le format des ressources icônes
- Le format des ressources icônes, revisité
- L'évolution du format de fichier ICO, partie 1: Début du monochrome
- L'évolution du format de fichier ICO, partie 2: maintenant en couleur!
- L'évolution du format de fichier ICO, partie 3: images alpha-mélangées
- L'évolution du format de fichier ICO, partie 4: images PNG
- Comment définir le canal alpha d'un bitmap GDI sur 255?
Ressources de chaîne de message
- Pourquoi
FormatMessage
dit-il que %0
met fin au message sans nouvelle ligne de fuite? Ajoute-t-il secrètement Newlines?
Modèles de dialogue
- Sur la difficulté d'obtenir la disposition parfaite des pixels dans les modèles de dialogue Win32
- L'évolution des modèles de dialogue - modèles classiques 32 bits
- L'évolution des modèles de dialogue - modèles étendus 32 bits
- L'évolution des modèles de dialogue - Résumé
- Le compilateur de ressources ajoutera utilement les styles de fenêtre pour vous, mais si vous construisez vous-même un modèle de dialogue, vous n'obtenez pas cette aide
Modèles de menu et ressources d'accélérateur
- L'évolution des modèles de menu: Introduction
- L'évolution des modèles de menu: menus classiques 32 bits
- L'évolution des modèles de menu: menus étendus 32 bits
- Le format des ressources de table accélérateur
Cordes
- Le format des ressources de cordes
-
LoadString
peut charger des chaînes avec des nuls intégrés, mais votre fonction de wrapper pourrait ne pas
Modèles de version
- L'évolution des ressources de version - Ressources de version 32 bits
- L'évolution des ressources de version - Ressources de version 32 bits corrompues
Données et ressources personnalisées
- Le format des données et des ressources personnalisées
Application (dans son ensemble)
- Quelles fenêtres apparaissent dans la liste
Alt+Tab
? - Windows Vista a légèrement modifié l'ordre
Alt+Tab
- Le travail d'interface utilisateur Win32 est intrinsèquement unique
- Quand
STARTF_USESHOWWINDOW
remplace-t-il le paramètre transmis à ShowWindow
? -
WaitForInputIdle
devrait vraiment être appelé WaitForProcessStartupComplete
-
WaitForInputIdle
attend n'importe quel fil, qui pourrait ne pas être le fil qui vous tient à cœur - Quelles sont les conventions pour gérer les poignées standard?
- Les poignées standard sont vraiment destinées aux programmes à thread unique
- Si seuls les DLL peuvent obtenir des notifications
DllMain
, comment un EXE peut-il recevoir une notification lors de la création d'un thread (par exemple)?
Ligne de commande
- Le premier mot sur la ligne de commande est le nom du programme uniquement par convention
- Comment la fonction
CommandLineToArgvW
est-elle destinée à être utilisée? - Quoi de neuf avec l'étrange traitement des guillemets et des barreaux de barreaux par
CommandLineToArgvW
Barre des tâches
- Comment puis-je empêcher les utilisateurs d'épingler mon programme à la barre des tâches?
- Au lieu de créer quelque chose et d'essayer de le cacher, ne le créez pas simplement en premier lieu (icône du plateau)
- Que se passe-t-il si mon application est vraiment deux applications regroupées dans un seul fichier, et que je veux qu'ils soient collectés en deux groupes dans la barre des tâches de Windows 7?
- Comment personnaliser comment mes fenêtres d'application sont regroupées dans la barre des tâches?
- Afficher une superposition sur le bouton de la barre des tâches
- Boutons de contrôle d'affichage sur votre fenêtre d'aperçu de la barre des tâches
- Affichez une miniature personnalisée pour votre application (et pendant que vous y êtes, un aperçu en direct personnalisé)
- Comment puis-je interroger l'emplacement de la barre des tâches sur les moniteurs secondaires?
- Comment ce programme a-t-il réussi à se comporter dans ma barre des tâches lorsque je l'ai installée?
- Et si j'ai deux programmes logiquement une seule application, et que je veux qu'ils soient traités comme un groupe unique dans la barre des tâches?
- Pourquoi l'icône de la barre des tâches pour les fenêtres groupées passe-t-elle à quelque chose de bizarre?
HWND
(point de vue général)
- Qu'est-ce que cela signifie pour une fenêtre d'être Unicode?
- Comment puis-je obtenir l'adresse de procédure de fenêtre réelle et non un thunk?
- Quelles sont ces valeurs étranges renvoyées de
GWLP_WNDPROC
? - Les octets de fenêtre bonus sur
GWLP_USERDATA
- Quelle est la différence entre
WM_DESTROY
et WM_NCDESTROY
? - Envoi d'une fenêtre Un message
WM_DESTROY
est comme une farce d'appeler quelqu'un qui faisait semblant d'être la police - La vie secrète de
GetWindowText
- Pourquoi les règles pour
GetWindowText
sont-elles si bizarres? - Peinture uniquement lorsque votre fenêtre est visible à l'écran
- Déterminer si votre fenêtre est couverte
- Obtention de la taille et de la position d'une fenêtre pendant qu'elle est minimisée
- Pourquoi l'appel
SetForegroundWindow
suivi immédiatement de GetForegroundWindow
ne renvoie-t-il pas la même fenêtre? - Comment Windows décide-t-il si une fenêtre nouvellement créée doit utiliser la disposition LTR ou RTL?
Hiérarchie Windows
- Qu'est-ce qui est si spécial dans la fenêtre de bureau?
- Quelle est la limite de nidification de la fenêtre?
- Quelle est la différence entre
HWND_TOP
et HWND_TOPMOST
? - Une fenêtre peut avoir un parent ou un propriétaire mais pas les deux
- Pourquoi mon contrôle envoie-t-il ses notifications à la mauvaise fenêtre après l'avoir réparée?
-
WindowFromPoint
, ChildWindowFromPoint
, RealChildWindowFromPoint
, quand tout cela se terminera-t-il? -
GetParent
, tout aussi déroutant EnumClaw
, mais c'est une fonction réelle! ( GetAncestor()
, GetWindow()
) - Avoir une fenêtre de propriétaire d'un autre processus est délicat, mais c'est parfois la bonne chose à faire
- Quelle est la documentation de
SetParent
qui essaie de me parler de la synchronisation de l'état de l'interface utilisateur? - Démontrer ce qui se passe lorsqu'une fenêtre parent et enfant a des états d'interface utilisateur différents
- Obtenir une fenêtre parent et enfant pour avoir les mêmes états d'interface utilisateur
Styles de fenêtre
- Quels bits de style fenêtre appartiennent à qui?
- Comment puis-je indiquer que je veux que ma fenêtre suive les règles de mise en page de droite à gauche?
- Pourquoi mon contrôle statique transparent n'est-il pas transparent? (
WS_EX_TRANSPARENT
) - Comme le gâteau,
WS_EX_TRANSPARENT
est un mensonge, ou du moins pas toute la vérité - J'ai utilisé
WS_EX_COMPOSITED
pour me débarrasser de mon scintillement de rediffusion, mais cela a entraîné une réponse lente - Comment puis-je utiliser
WS_CLIPCHILDREN
et encore pouvoir dessiner un contrôle avec un arrière-plan transparent?
Classes de fenêtres
- À quoi servait la
HINSTANCE
à CreateWindow
et RegisterClass
? - Utiliser la mauvaise
HINSTANCE
dans RegisterClass
est comme un vol d'identité - Si la fonction
RegisterClass
s'approprie de la brosse d'arrière-plan personnalisée, pourquoi fuit-elle? - La modification d'une classe de fenêtres affecte toutes les fenêtres qui appartiennent à cette classe
- Que fait
CS_SAVEBITS
? - Que fait le style de classe
CS_OWNDC
? - Que fait le style de classe
CS_CLASSDC
? - La modification du style
CS_NOCLOSE
affecte toutes les fenêtres de la classe, mais pas nécessairement d'une manière immédiatement perceptible - Pourquoi
PrintWindow
déteste-t- CS_PARENTDC
? Parce que tout le monde déteste CS_PARENTDC
! - Pourquoi
PrintWindow
déteste-t- CS_PARENTDC
? redux - Sous-classe plus sûre
- Cours privés, superclasserie et sous-classe mondiale
- Qu'est-ce qui rend
RealGetWindowClass
tellement plus réel que GetClassName
? - Pourquoi
CreateWindowEx
prend-il le paramètre de style étendu comme premier paramètre au lieu de son dernier? - Quand dois-je utiliser
CS_GLOBALCLASS
? - À quel point le paramètre UIDSubClass doit-il être unique lorsque j'appelle
SetWindowSubclass
?
Fenêtres de niveau supérieur
Cadre de fenêtre et légende
- Obtenir un menu de clic droit personnalisé pour l'icône de légende
- Dessiner une légende d'aspect actif même lorsqu'il n'est pas actif
- Comment supprimer la gueule de fenêtre complète / redimensionner pour une seule fenêtre?
- Comment puis-je basculer une fenêtre entre normal et plein écran?
- Comment activer et désactiver les boutons minimiser, maximiser et fermer dans ma barre de légende?
- Obtenir l'emplacement du bouton Fermer dans la barre de titre
- Obtenir l'emplacement du bouton Fermer dans la barre de titre, à partir de Windows 2000 ou de Windows XP
- Pourquoi les dimensions d'une fenêtre maximisée sont-elles plus grandes que le moniteur?
- Création d'une fenêtre qui ne peut être redimensionnée dans une seule direction
- Pourquoi ne transmettez-vous pas
WM_GETMINMAXINFO
et ne serrez-vous pas les résultats?
Dwm
- Pourquoi mon programme ne reçoit-il pas le message
WM_DWMSENDICONICTHUMBNAIL
lorsque je demande une représentation emblématique? - Le paramètre
MARGINS
de la fonction DwmExtendFrameIntoClientArea
contrôle à quel point la trame s'étend dans la zone du client - Comment puis-je supprimer l'animation par défaut qui se produit lorsque je me cache ou affiche une fenêtre?
- Affichez une miniature personnalisée pour votre application (et pendant que vous y êtes, un aperçu en direct personnalisé)
- Comment puis-je détecter que ma fenêtre a été supprimée de l'écran par la coquille? ("Cours de fenêtre")
Dialogue
- Pourquoi ne puis-je pas créer ma boîte de dialogue? Erreur de recrue n ° 1
- Pourquoi ne puis-je pas créer ma boîte de dialogue? Erreur de recrue n ° 2
- Retour des valeurs d'une procédure de dialogue
- Un type de procédure de dialogue différent
- Un autre type de procédure de dialogue différent
- La réponse par défaut à chaque boîte de dialogue est "Annuler"
- Faire tourner l'ordre z
- Utilisation de la touche
TAB
pour naviguer dans les non-dialogues - Utilisation de la touche
TAB
pour naviguer dans les non-dialogues, redux - Empêcher la modification du texte de contrôle d'être automatiquement élu dans une boîte de dialogue
- Ceux qui ne comprennent pas le gestionnaire de dialogue sont condamnés à le réimplémenter, mal
- D'autres astuces avec
WM_GETDLGCODE
-
GetDialogBaseUnits
est un mijoteuse - Pourquoi la boîte de dialogue
MapDialogRect
n'est-elle pas des rectangles de dialogue? - Pourquoi les boîtes de dialogue sont-elles initialement créées cachées?
- Quel est le problème avec le drapeau
DS_SHELLFONT
? - Pourquoi
DS_SHELLFONT = DS_FIXEDSYS | DS_SETFONT
? - Comment définir l'accent dans une boîte de dialogue
- Ne laissez jamais l'accent sur un contrôle handicapé
- Une subtilité dans la restauration de la position de fenêtre précédente
- Des choses que vous savez déjà: comment attendre que ma boîte de dialogue s'affiche avant de faire quelque chose?
- Que fait
TranslateAccelerator
? - Si j'ai une boîte de dialogue sans modes avec des accélérateurs personnalisés, que dois-je appeler en premier:
IsDialogMessage
ou TranslateAccelerator
- Rappel doux: sur une boîte de dialogue, ne donnez pas les accélérateurs OK et annulez
- Pourquoi les accélérateurs pour les contrôles cachés sont-ils toujours actifs?
- Comment puis-je faire en sorte que mes accélérateurs s'appliquent uniquement lorsqu'ils sont utilisés dans la fenêtre principale et non lorsque l'utilisateur utilise une boîte de dialogue sans modes?
- Pourquoi la clé
TAB
ne fonctionne-t-elle pas sur les contrôles que j'ai marqués comme WS_TABSTOP
? - Vous ne pouvez pas utiliser le message
WM_USER
dans une boîte de dialogue - Comment puis-je faire une boîte de dialogue droite à gauche au moment de l'exécution?
- Comment le gestionnaire de dialogue calcule-t-il la largeur moyenne d'un personnage?
Dialogues imbriquées et intégrées
- À quoi sert le style
DS_CONTROL
? - Plus de notes sur l'utilisation du style
DS_CONTROL
- Ce n'est pas une bonne idée de donner plusieurs commandes sur une boîte de dialogue le même ID
- Lorsque vous incorporez une boîte de dialogue à l'intérieur d'un autre, assurez-vous de ne pas créer accidentellement des ID de contrôle en double
- Lorsque le bouton-poussoir par défaut est invoqué, l'invoque va à la boîte de dialogue de niveau supérieur
Dialogues communes
- Pourquoi ma
MessageBox
ne s'enroule-t-elle au bon endroit? - Comment personnaliser la section des liens préférés de la boîte de dialogue ouverte du fichier?
- Pourquoi la boîte de dialogue de fichiers commune modifie-t-elle le répertoire actuel?
- Vous pouvez filtrer la boîte de dialogue de fichiers commune avec les caractères génériques
- Comment afficher la boîte de dialogue Find Imprimantes par programme?
- Pourquoi la liste des fichiers ouverts dans les dossiers partagés ne montre-t-il pas tous mes fichiers ouverts?
- Un contrôle commun pour les extensions d'association est bien en retard
- Filtrage des dossiers qui apparaissent dans la boîte de dialogue sur le dossier
- Ouverture de la boîte de dialogue Classic Folder Browser avec un dossier spécifique présélectionné
- Pourquoi la boîte de dialogue Enregistrement du fichier commun crée-t-elle un fichier temporaire puis le supprime?
- Personnaliser la boîte de dialogue standard de cueillette de couleur
- Comment définir le répertoire initial de la boîte de dialogue Open Fichier dans un répertoire virtuel?
- Lorsque je sélectionne plusieurs fichiers dans la boîte de dialogue Ouvrir le fichier, pourquoi le dernier élément vient-il en premier?
- Je définis l'option
OFN_NONETWORKBUTTON
dans la structure OPENFILENAME
, mais elle n'a aucun effet sur l'élément réseau dans le volet de navigation - Comment ajouter des contrôles personnalisés à la boîte de dialogue Open Open ou File Enregistrer le fichier commun?
- Comment puis-je faire en sorte que mon
FileSavePicker
s'ouvre dans le même dossier qui a été choisi par FileOpenPicker
ou FolderPicker
? (Win32 / com équivalent mentionné à la fin du post)
Navigation de contrôle
- Utilisation de la touche
TAB
pour naviguer dans les non-dialogues - Utilisation de la touche
TAB
pour naviguer dans les non-dialogues, redux - Gérer l'état d'interface utilisateur des accélérateurs et des rectangles de mise au point
- Navigation personnalisée dans les boîtes de dialogue, redux
- Les boîtes de dialogue renvoient la mise au point du contrôle qui a été concentrée lors de la dernière fois que vous avez changé; Comment puis-je entrer dans cette action pour mes propres fenêtres?
- Comment puis-je créer une commande d'onglet non circulaire ou un autre type de commande personnalisée dans ma boîte de dialogue Win32?
Gestionnaire de dialogue
- The Dialog Manager, partie 1: échauffements
- Le gestionnaire de dialogue, partie 2: Création de la fenêtre de trame
- The Dialog Manager, partie 3: Création des contrôles
- Le gestionnaire de dialogue, partie 4: la boucle de dialogue
- The Dialog Manager, partie 5: Convertissant une boîte de dialogue non modale en modal
- The Dialog Manager, partie 6: subtilités dans les boucles de message
- The Dialog Manager, partie 7: Plus de subtilités dans les boucles de message
- Le gestionnaire de dialogue, partie 8: navigation personnalisée dans les boîtes de dialogue
- The Dialog Manager, partie 9: Accélérateurs personnalisés dans les boîtes de dialogue
Modalité
- L'ordre correct pour la désactivation et l'activation des fenêtres
- Modalité, partie 1: Modalité UI vs modalité du code
- Modalité, partie 2: modalité de code vs modalité UI
- Modalité, partie 3: le message
WM_QUIT
- Modalité, partie 4: L'importance de définir le propriétaire correct pour l'interface utilisateur modale
- Modalité, partie 5: Définition du bon propriétaire pour l'interface utilisateur modale
- Modalité, partie 6: interagir avec un programme qui est devenu modal
- Modalité, partie 7: une
MessageBox
chronométrée, la version bon marché - Modalité, partie 8: une
MessageBox
chronométrée, la meilleure version - Modalité, partie 9: Définition du bon propriétaire pour l'interface utilisateur modale, examen pratique
- Les messages de fil sont mangés par des boucles modales
- Sauver les messages de threads de boucles modales via des filtres de message
Feuilles de propriété
- Quels autres effets
DS_SHELLFONT
a-t-il sur les pages de feuilles de propriété? -
PSM_ISDIALOGMESSAGE
est aux feuilles de propriété sans modes, car IsDialogMessage
est dans les boîtes de dialogue sans modes - Vous pouvez étendre la structure
PROPSHEETPAGE
avec vos propres données bonus - La notification
PSN_SETACTIVE
est envoyée à chaque fois que votre page d'assistant est activée - Ajout de la charge utile supplémentaire à une structure
PROPSHEETPAGE
- Comment transmettre un tableau de structures
PROPSHEETPAGE
de taille variable à PropertySheet?
Commandes
- Ce n'est pas parce que vous êtes un contrôle que vous êtes nécessairement dans une boîte de dialogue
Contrôles d'animation
- Limites du contrôle de l'animation de la coquille
- Pourquoi le contrôle d'animation de la version 6 n'utilise-t-il pas de thread d'arrière-plan?
Boutons
- À quoi sert le style de bouton
BS_PUSHLIKE
? (N'utilisez pas, c'est complètement obsolète de nos jours. Utilisez la case à cocher ou le bouton radio à la place.)
Boîtes combinées
- Accélération de l'ajout d'éléments à un ComboBox ou Listbox (
WM_SETREDRAW
)
Modifier les contrôles
- Quel est le problème avec le message
EM_SETHILITE
? - Empêcher la modification du texte de contrôle d'être automatiquement élu dans une boîte de dialogue
- Comment supprimer l'avertissement
CapsLock
sur les contrôles d'édition de mot de passe? - L'histoire précoce du style de contrôle
ES_NUMBER
Edit - Comment autoriser les nombres négatifs avec le style de contrôle
ES_NUMBER
Edit? - Comment puis-je permettre à un signe moins d'être entré dans mon contrôle de modification, mais seulement si c'est le premier personnage?
Vues de liste
- Vues positionnées sur ListView positionnées
- Affichage des infotips pour les éléments ListView pliés et dépliés
- Computing listview infotips en arrière-plan
- Quelle est la différence entre
LVM_HITTEST
et LVM_INSERTMARKHITTEST
? - Pourquoi y a-t-il une notification
LVN_ODSTATECHANGED
alors qu'il y a déjà une notification LVN_ITEMCHANGED
parfaitement? - Création d'une liste avec des cases à cocher sur certains éléments mais pas d'autres
- Comment puis-je redimensionner par programme une colonne ListView pour s'adapter à son contenu?
- Comment créer une case à cocher désactivée pour un élément ListView?
- Accélération de l'ajout d'éléments à un ComboBox ou Listbox (
WM_SETREDRAW
)
Contrôles de texte riche
L'histoire du contrôle riche en Murray Sargent (Le message n'est qu'un lien (cassé) vers https://blogs.msdn.microsoft.com/murrays/2006/10/19/some-richedit-history/)- Comment charger un fichier entier dans un contrôle de texte riche?
- Comment mettre plus de 32 000 caractères dans un contrôle de texte riche?
- Comment imprimer le contenu d'un riche contrôle de texte?
Barres de défilement
- Le programme à gratter
- Craquettes, partie 2
- Scrollbars, partie 3: Optimisation du cycle de peinture
- Crèche de défilement, partie 4: ajout d'une barre de défilement proportionnelle
- Problème partie 5: Accessibilité du clavier pour les barres de défilement
- Addendum à la partie 5: une subtilité dans le code du clavier
- Cartes de défilement Partie 6 - La roue
- Cartes de défilement Partie 7 - Int intégralité
- Scrollbars Part 8 - Redimensionnement interactif intégral
- Craches de défilement Partie 9 - Maintenir la métaphore
- Scrollbars Part 10 - Vers une compréhension plus profonde du message
WM_NCCALCSIZE
- Crèche de défilement Partie 11: Vers une compréhension encore plus profonde du message
WM_NCCALCSIZE
- Réponses à l'exercice des barres de défilement Partie 11
- Crèche de défilement Partie 12: Application de
WM_NCCALCSIZE
à notre échantillon de barre de défilement - Crèche Redux: Partie 12
- Il existe deux types de barres de défilement
- Pourquoi
WHEEL_DELTA
il été choisi pour être 120 au lieu d'une valeur beaucoup plus pratique comme 100 ou même 10? - Pourquoi la définition de la plage de barre de défilement horizontale pour la première fois définit-elle également la plage verticale, et vice versa?
- Autoscrolling sur la traînée, partie 1: implémentation de base
- Autoscrolling sur la traînée, partie 2: Pourquoi le défilement va-t-il plus vite si je remue la souris?
- Autoscrolling sur la traînée, partie 3: Autoscroll dynamique basé sur la position de la souris
- Autoscrolling sur la traînée, partie 4: Autoscroll dynamique basé sur la vitesse d'évasion
- AutoScrolling sur la traînée, partie 5: Ajout d'éclassement à uncroll pour échapper à la vitesse
Commandes statiques
- Quand le contrôle statique supprimera-t-il automatiquement l'image chargée et quand est-ce la responsabilité de l'application?
Commandes d'onglet
- Comment créer des contrôles dans ma boîte de dialogue qui a un contrôle d'onglet?
- Comment suis-je censé créer des enfants du contrôle de l'onglet Win32?
Barres d'outils
- Pourquoi y a-t-il à la fois
TBSTYLE_EX_VERTICAL
et CCS_VERT
? - Comment créer une barre d'outils qui se trouve dans la barre des tâches?
- Comment créer un bouton de barre d'outils alignés à droite?
- Création de tâches personnalisées sur une liste de sauts
Infractions
- Codage d'infiltrations sur place
- Utilisation du dessin personnalisé dans des infractions pour ajuster la police
- Multiplexage de plusieurs outils en un dans une info-bulle
- Génération du texte de l'info-bulle dynamiquement
- Pourquoi ne puis-je pas afficher une infraction pour une fenêtre désactivée?
- Over-documentation
TTM_RELAYEVENT
et pourquoi elle se traduit par une minuterie périodique d'une seconde fonctionnant tant que l'info-bulle est visible
Barres de piste
- Ajout d'un accélérateur de flèche
Ctrl
+ pour déplacer la barre de piste par une seule unité, partie 1: plongeon initial - Ajout d'un accélérateur
Ctrl
+ Arrow pour déplacer la barre de piste par une seule unité, partie 2: deuxième essai - Comment puis-je empêcher les utilisateurs d'utiliser la souris pour faire glisser le pouce de la barre de piste vers des positions qui ne sont pas des multiples de cinq? Partie 1: Recadre le problème
- Comment puis-je empêcher les utilisateurs d'utiliser la souris pour faire glisser le pouce de la barre de piste vers des positions qui ne sont pas des multiples de cinq? Partie 2: Couper la position du pouce
Vues de liste d'arbres
- Le style
TVS_CHECKBOXES
est excentrique, ce qui est une façon polie de dire que c'est fou - Méfiez-vous de la liste des images divulguées lorsque vous utilisez le style
TVS_CHECKBOXES
- Création des cases de vue d'arbre manuellement: une liste d'images de l'état simple
- Création des cases de vue d'arbre manuellement: Répondre aux clics
- Création des cases à cocher Afficher l'arbre manuellement: cases à cocher sur le thème
- Cherchez les cases Affichage de l'arborescence: une histoire sordide
- Affichage de l'arbre cases: la case à cocher prolongée états
Traitement des messages
- Quels numéros de message appartiennent à qui?
- Les différentes façons d'envoyer un message
- Diffusion des messages définis par l'utilisateur
- Quand un thread peut-il recevoir des messages de fenêtre?
- Quelle est la différence entre
GetKeyState
et GetAsyncKeyState
? - Les messages de fil sont mangés par des boucles modales
- Sauver les messages de threads de boucles modales via des filtres de message
- Les dangers de filtrage des messages de fenêtre
- Vous ne pouvez pas simuler la saisie du clavier avec
PostMessage
- Pomper des messages en attendant une période de temps
- Dans la poursuite de la file d'attente de messages
- Non, vraiment, vous devez transmettre tous les messages non gérés à
DefWindowProc
- Même si vous avez du code pour gérer un message, vous êtes autorisé à appeler
DefWindowProc
, parce que vous le faisiez de toute façon après tout - Pourquoi
Get/SetMessageExtraInfo
jamais utilisé? - Pourquoi
GetWindowLongPtr
renvoie-t-il une valeur à ordures sur des fenêtres 64 bits? -
TrackMouseEvent
suit les événements de souris dans votre fenêtre, mais seulement si les événements appartiennent à votre fenêtre - N'oubliez pas d'inclure la file d'attente de messages dans votre hiérarchie de verrouillage
- Qu'arrive-t-il à un message envoyé lorsque
SendMessageTimeout
atteint son délai d'expiration? - Pourquoi ne puis-je pas
PostMessage
le message WM_COPYDATA
, mais je peux SendMessageTimeout
avec un petit temps mort? - Même si des messages de souris, de peinture et de minuterie sont générés à la demande, il est toujours possible pour celui de se retrouver dans votre file d'attente
- Les messages publiés sont traités avant les messages d'entrée, même s'ils ont été publiés plus tard
- Quel type de messages une fenêtre de message uniquement peut-elle recevoir?
- Si les prototypes de
DispatchMessageA
et DispatchMessageW
sont identiques, pourquoi les deux? - Ceux qui ne comprennent pas le gestionnaire de dialogue sont condamnés à le réimplémenter, mal
- Comment puis-je déclencher un Recalc du curseur de la souris après avoir changé une partie de mon état d'interprétation interne?
- Comment puis-je déclencher un recalc du curseur de la souris après avoir changé une partie de mon état de demande interne?, Suivi
-
GetQueueStatus
et l'état de file d'attente
Accrochage
- À quoi servait la
HINSTANCE
à SetWindowsHookEx
? - Comment puis-je être informé lorsque le curseur change?
- What does the thread parameter to
SetWindowsHookEx
actually mean? - Why does
SetFocus
fail without telling me why?
Specific Messages
Notifications
- What's the difference between the
wParam
of the WM_NOTIFY
message and the idFrom
in the NMHDR
structure. - Restating the obvious about the
WM_COMMAND
message - Restating the obvious about the
WM_NOTIFY
message
Window Construction and Destruction
- What is the difference between
WM_DESTROY
and WM_NCDESTROY
? - How can I determine the reason why my window is closing? (
WM_CLOSE
)
Window Geometry Messages
- Use
WM_WINDOWPOSCHANGED
to react to window state changes - Use
WM_WINDOWPOSCHANGING
to intercept window state changes
Window Painting Messages
- Paint messages will come in as fast as you let them (
WM_PAINT
) - What happens if I don't paint when I get a
WM_PAINT
message? - What is the implementation of
WM_PRINTCLIENT
? - There's a default implementation for
WM_SETREDRAW
, but you might be able to do better - Speeding up adding items to a combobox or listbox (
WM_SETREDRAW
) - Using
WM_SETREDRAW
to speed up adding a lot of elements to a control
Window Focus Messages
-
WM_KILLFOCUS
is the wrong time to do field validation - The dangers of playing focus games when handling a
WM_KILLFOCUS
message - Why doesn't the
MoveWindow
function generate the WM_GETMINMAXINFO
message?
Keyboard Messages
- How do I respond to the
WM_MENUCHAR
message?
Mouse Messages
- Why is there no
WM_MOUSEENTER
message? - Why do I get spurious
WM_MOUSEMOVE
messages? - Sure, I can get spurious
WM_MOUSEMOVE
messages, but why do they keep streaming in? - How do I get mouse messages faster than
WM_MOUSEMOVE
? - Logical consequences of the way Windows converts single-clicks into double-clicks
- Implementing higher-order clicks
- How slow do you have to slow-double-click for it to be a rename?
- How can I prevent the mouse from moving in response to touch input?
Dialog Messages
- Those who do not understand the dialog manager are doomed to reimplement it, badly
- Managing the UI state of accelerators and focus rectangles (
WM_CHANGEUISTATE
, WM_QUERYUISTATE
and WM_UPDATEUISTATE
) - Untangling the confusingly-named
WM_UPDATEUISTATE
and WM_CHANGEUISTATE
messages - Who sends the initial
WM_UPDATEUISTATE
message? - How can I prevent the keyboard focus rectangle from appearing on a control I created?
- Other tricks with
WM_GETDLGCODE
- How do I prevent multi-line edit controls from eating the Enter key?
- Why do
DLGC_WANTALLKEYS
and DLGC_WANTMESSAGE
have the same value?
Other Window Messages
- The dangers of messing with activation when handling a
WM_ACTIVATE
message - Why does my window get a
WM_ACTIVATE
message when it isn't active? - A timed context menu (
WM_CANCELMODE
) - Pitfalls in handling the
WM_CONTEXTMENU
message ( WM_CONTEXTMENU
) -
WM_NCHITTEST
is for hit-testing, and hit-testing can happen for reasons other than the mouse being over your window - How likely is it that a window will receive a
WM_NULL
message out of the blue? ( WM_NULL
) - Why is there a special
PostQuitMessage
function? ( WM_QUIT
) - How does
PostQuitMessage
know which thread to post the quit message to? ( WM_QUIT
) - Who is responsible for destroying the font passed in the
WM_SETFONT
message? ( WM_SETFONT
) - When I send a
WM_GETFONT
message to a window, why don't I get a font? ( WM_GETFONT
) - If my
WM_TIMER
handler takes longer than the timer period, will my queue fill up with WM_TIMER
messages? - Killing a window timer prevents the
WM_TIMER
message from being generated for that timer, but it doesn't retroactively remove ones that were already generated
System Messages
- If one program blocks shutdown, then all programs block shutdown (
WM_QUERYENDSESSION
, WM_ENDSESSION
) - Why do I have to return this goofy value for
WM_DEVICECHANGE
? ( WM_DEVICECHANGE
) - Windows doesn't close windows when a user logs off; that's your call (
WM_ENDSESSION
) - Once you return from the
WM_ENDSESSION
message, your process can be terminated at any time ( WM_ENDSESSION
)
GDI
- Why are
RECT
s endpoint-exclusive? - Can you create an information context for the display?
- What does the
CS_OWNDC
class style do? - What does the
CS_CLASSDC
class style do? - How do you detect "Large Fonts"? (DPI)
- Drawing a monochrome bitmap with transparency
- Let GDI do your RLE compression for you
- The mysterious stock bitmap: There's no way to summon it, but it shows up in various places
- Why is my icon being drawn at the wrong size when I call
DrawIcon
? - You must flush GDI operations when switching between direct access and GDI access, and direct access includes other parts of GDI
- How do I get the dimensions of a cursor or icon?
- What are the dire consequences of not selecting objects out of my DC?
- Of what use is the
RDW_INTERNALPAINT
flag? - Functions that return GDI regions rarely actually return regions
- Color-aware ClearType requires access to fixed background pixels, which is a problem if you don't know what the background pixels are, or if they aren't fixed
- What is the correct way of using
SaveDC
and RestoreDC
? - How are
BitBlt
raster opcodes calculated? - Notes on
DrawText
and tab stops - Why doesn't
GetTextExtentPoint
return the correct extent for strings containing tabs? - Why are there trivial functions like
CopyRect
and EqualRect
? - More on trivial functions like
CopyRect
and EqualRect
- What are the consequences of increasing the per-process GDI handle limit?
- The focus rectangle says, “I'm not orange. I'm just drawn that way.”
Cursors
- The effect of
SetCursor
lasts only until the next SetCursor
- What can or should I do with the cursor handle returned by
SetCursor
? - What is the deal with the
SM_CXCURSOR
system metric? - How do I find out the size of the mouse cursor?
Brushes
- The hollow brush
- Other uses for bitmap brushes
- What is the DC brush good for?
- I know I can change the color of the DC pen, but what about the other attributes?
- How can I extract the color from a solid color GDI brush?
Pens
- Is there a difference between creating a null pen with
CreatePen
and just using the stock null pen?
Bitmaps
- How do I set the alpha channel of a GDI bitmap to 255?
DIB
- A survey of the various ways of creating GDI bitmaps with predefined data
- Blitting between color and monochrome DCs
- Manipulating the DIB color table for fun and profit
- Using DIB sections to perform bulk color mapping
- The fun and profit of manipulating the DIB color table can be done without having to modify it
- Separating the metadata from the DIB pixels: Precalculating the
BITMAPINFO
- Separating the metadata from the DIB pixels: Changing the raster operation
- The disembodiment of DIBs from the DIB section
- What is the
hSection
parameter to CreateDIBSection
for?
LockWindowUpdate()
- What does
LockWindowUpdate
do? - How is
LockWindowUpdate
meant to be used? - With what operations is
LockWindowUpdate
meant to be used? - With what operations is
LockWindowUpdate
not meant to be used? - Final remarks on
LockWindowUpdate
Painting Standard Elements
- Rendering standard Windows elements
- Rendering menu glyphs is slightly trickier
- What states are possible in a
DRAWITEMSTRUCT
structure?
UXTHEME.DLL
-
BeginBufferedPaint
: It's not just for buffered painting any more - How do
IsThemeActive
, IsAppThemed
, and IsCompositionActive
differ? - How do I get the tabbed dialog effect on my own custom tabbed dialog?
- How do I revert a control back to its default theme?
Multiple Monitors
- For better performance, set all your monitors to the same color format
- How do I get a handle to the primary monitor?
- Why does the primary monitor have
(0,0)
as its upper left coordinate? - How do I get the color depth of the screen?
- How does the window manager adjust
ptMaxSize
and ptMaxPosition
for multiple monitors?
Accessibilité
- Accessibility is not just for people with disabilities
- How to retrieve text under the cursor (mouse pointer)
- How do I set an accessible name on an unlabeled control?
- How can I get notified when some other window is destroyed?
- Using accessibility to monitor windows as they come and go
- How can I write a program that monitors another window for a title change?
- How can I write a program that monitors another window for a change in size or position?
Com
Declaring COM Interfaces
- The macros for declaring COM interfaces, revisited: C version
- The macros for declaring COM interfaces, revisited: C++ version
- The macros for declaring COM interfaces, revisited: C++ implementation
- The oracle always tells the truth, even when it is wrong: COM method calls with a user-defined type as a return value (on problems of COM interfaces called from C code)
- The COM interface contract rules exist for a reason
- Giving a single object multiple COM identities, part 1
- Giving a single object multiple COM identities, part 2
- Giving a single object multiple COM identities, part 3
- Giving a single object multiple COM identities, part 4
- How do I consume raw COM interfaces from a Windows Runtime metadata file?
COM Apartments
- The dreaded "main" threading model
- A slightly less brief introduction to COM apartments (but it's still brief)
- Yo dawg, I hear you like COM apartments, so I put a COM apartment in your COM apartment so you can COM apartment while you COM apartment
- What kind of apartment is the private apartment I created via
CLSID_ContextSwitcher
? - Setting up private COM contexts to allow yourself to unload cleanly
- How do you get into a context via
IContextCallback::ContextCallback
? - Using contexts to return to a COM apartment later
- What do the output values from
CoGetApartmentType
mean? - User interface code + multi-threaded apartment = death
- Other problems traced to violating COM single-threaded apartment rules in the shell
- What's the point of
APTTYPE_CURRENT
? I mean, of course I'm current. - How do I get a foothold in the neutral apartment?
- What is so special about the Application STA?
- What does it mean when a call fails with
0x8000001F = RO_E_BLOCKED_CROSS_ASTA_CALL
?
COM Initialization
- What does the
COINIT_SPEED_OVER_MEMORY
flag to CoInitializeEx
do? - Crashing in COM after I call
CoUninitialize
, how can COM be running after it is uninitalized?
COM Static Store
- The COM static store, part 1: Introduction
- The COM static store, part 2: Race conditions in setting a singleton
- The COM static store, part 3: Avoiding creation of an expensive temporary when setting a singleton
- The COM static store, part 4: Aggregating into a single object
- The COM static store, part 5: Using COM weak references
- The COM static store, part 6: Using C++ weak references
COM Marshaling
- What is COM marshaling and how do I use it?
- On proper handling of buffers in COM and RPC methods
- What are the rules for
CoMarshalInterThreadInterfaceInStream
and CoGetInterfaceAndReleaseStream
? - What are the rules for
CoMarshalInterface
and CoUnmarshalInterface
? -
CoGetInterfaceAndReleaseStream
does not mix with smart pointers - The COM marshaller uses the COM task allocator to allocate and free memory
- Why do I get a
QueryInterface(IID_IMarshal)
and then nothing? - We batched up our COM requests and return a single stream of results, but the performance is still slow
- What are the various usage patterns for manually-marshaled interfaces?
- An initial look at the mechanics of how COM marshaling is performed
- https://devblogs.microsoft.com/oldnewthing/20220616-00/?p=106757
- Writing a marshal-by-value marshaler, part 1
- Writing a marshal-by-value marshaler, part 2
- Writing a compound marshaler
- Understanding the marshaling flags: The free-threaded marshaler
COM Error Handling
- What happens to my COM server-side object when clients die unexpectedly?
- Why does COM require output pointers to be initialized even on failure?
- How do I convert an
HRESULT
to a Win32 error code? - How can I tell the WIL
RETURN_IF_FAILED
macro that some errors are ignorable? - Do not overload the
E_NOINTERFACE
error - What does it mean when a call fails with
0x8000001F = RO_E_BLOCKED_CROSS_ASTA_CALL
? - What does it mean when my cross-thread COM call fails with
RPC_E_SYS_CALL_FAILED
? - Understanding a mysterious
RPC_E_WRONGTHREAD
exception when we're on the right thread
COM Asynchronous Interfaces
- COM asynchronous interfaces, part 1: The basic pattern
- COM asynchronous interfaces, part 2: Abandoning the operation
- COM asynchronous interfaces, part 3: Abandoning the operation after a timeout
- COM asynchronous interfaces, part 4: Doing work while waiting for the asynchronous operation
- COM asynchronous interfaces, part 5: The unreliable server
- COM asynchronous interfaces, part 6: Learning about completion without polling
- COM asynchronous interfaces, part 7: Being called directly when the operation completes
- COM asynchronous interfaces, part 8: Asynchronous release, the problems
- COM asynchronous interfaces, part 9: Asynchronous release, assembling a solution
GUIDs
- What's the difference between
UuidFromString
, IIDFromString
, CLSIDFromString
, GUIDFromString
... - What is the difference between
UuidToString
, StringFromCLSID
, StringFromIID
, and StringFromGUID2
? - Why are there four functions for parsing strings into GUIDs, and why are they in three different DLLs?
- Why does COM express GUIDs in a mix of big-endian and little-endian? Why can't it just pick a side and stick with it?
COM Strings
- Why is there a
BSTR
cache anyway? - Raymond's complete guide to
HSTRING
semantics - What is the correct way of using the string buffer returned by the
WindowsPreallocateStringBuffer
function?
COM Variants
- What's the difference between
VARIANT
and VARIANTARG
? - Nasty gotcha:
VarCmp
vs VariantCompare
- Why can't
VarDateFromStr
parse back a Hungarian date that was generated by VarBstrFromDate
?
IUnknown
- The layout of a COM object
- Under what conditions will the
IUnknown::AddRef
method return 0? - The ways people mess up
IUnknown::QueryInterface
- The ways people mess up
IUnknown::QueryInterface
, episode 2 - The ways people mess up
IUnknown::QueryInterface
, episode 3 - The ways people mess up
IUnknown::QueryInterface
, episode 4 - COM object destructors are very sensitive functions
- Avoiding double-destruction when an object is released
- I'd like an
IUnknown
, I know you have many, I'll take any of them - A very brief introduction to patterns for implementing a COM object that hands out references to itself
- Giving a single object multiple COM identities, part 1
- Giving a single object multiple COM identities, part 2
- Giving a single object multiple COM identities, part 3
- Giving a single object multiple COM identities, part 4
- Reducing chattiness by querying for multiple interfaces at once, part 1
- Reducing chattiness by querying for multiple interfaces at once, part 2
IMoniker
- Pidls and monikers do roughly the same thing, just backwards
ICallback
- A very brief introduction to patterns for implementing a COM object that hands out references to itself
IContextMenu
- Why an object cannot be its own enumerator
- How to host an
IContextMenu
, part 1 - Initial foray - How to host an
IContextMenu
, part 2 - Displaying the context menu - How to host an
IContextMenu
, part 3 - Invocation location - How to host an
IContextMenu
, part 4 - Key context - How to host an
IContextMenu
, part 5 - Handling menu messages - How to host an
IContextMenu
, part 6 - Displaying menu help - How to host an
IContextMenu
, part 7 - Invoking the default verb - How to host an
IContextMenu
, part 8 - Optimizing for the default command - How to host an
IContextMenu
, part 9 - Adding custom commands - How to host an
IContextMenu
, part 10 - Composite extensions - groundwork - How to host an
IContextMenu
, part 11 - Composite extensions - composition - Simplifying context menu extensions with
IExecuteCommand
- How do I launch a file as if it were a text file, even though its extension is not
.txt
? - Do not access the disk in your
IContextMenu
handler, no really, don't do it - Sure, we do that: Context menu edition
- Psychic debugging: Why your
IContextMenu::InvokeCommand
doesn't get called even though you returned success from IContextMenu::QueryContextMenu
- Don't forget to implement canonical names for verbs in your shell context menu extension
IFileDialog
- The
SetClientGuid
method of the common file and folder dialogs lets you give names to those dialogs, too (multiple contexts for open/save dialogs) - How can I get my
FileSavePicker
to open in the same folder that was picked by the FileOpenPicker
or FolderPicker
? (win32/COM equivalent mentioned at the end of the post) - Why does IFileDialog still show non-filesystem folders when I pass
FOS_FORCEFILESYSTEM
?
IMultiLanguage
- Converting between
LCID
s and RFC 1766 language codes - Feel free to stop using
IMultiLanguage2::DetectInputCodepage
INamespaceWalk
- How can I control which parts of the shell namespace the
INamespaceWalk::Walk
operation will walk into? - How can I cancel the
INamespaceWalk::Walk
operation? - Cancelling the
INamespaceWalk::Walk
operation a little faster
IStream
- The subtleties of
CreateStreamOnHGlobal
, part 1: Introduction and basic usage - The subtleties of
CreateStreamOnHGlobal
, part 2: Suppressing the deletion of an unknown HGLOBAL
- The subtleties of
CreateStreamOnHGlobal
, part 3: Suppressing the deletion of a shared HGLOBAL
- The subtleties of
CreateStreamOnHGlobal
, part 4: Non-movable memory - A practical use for
GetHGlobalFromStream
when sharing was never your intention
IVirtualDesktopManager
- Virtual desktops are an end-user window management feature, not a programmatic one
Clipboard
- How ownership of the Windows clipboard is tracked in Win32
- What happens when applications try to copy text by sending
Ctrl+C
- How do I make it so that users can copy static text on a dialog box to the clipboard easily?
- What is the proper handling of
WM_RENDERFORMAT
and WM_RENDERALLFORMATS
? - Copying a file to the clipboard so you can paste it into Explorer or an email message or whatever
- Printing the contents of the clipboard as text to
stdout
- Improving the performance of
CF_HDROP
by providing file attribute information - What's up with the
CF_SYLK
and CF_DIF
clipboard formats? - How can I wait more than 30 seconds for a delay-rendered clipboard format to become rendered?
Drag and Drop
- What a drag: Dragging text
- What a drag: Dragging a Uniform Resource Locator (URL)
- What a drag: Dragging a Uniform Resource Locator (URL) and text
- What a drag: Dragging a virtual file (
HGLOBAL
edition) - What a drag: Dragging a virtual file (
IStream
edition) - What a drag: Dragging a virtual file (
IStorage
edition) - You can drag multiple virtual objects, you know
- Reading a contract from the other side: Simulating a drop
- Simulating a drop, part two
- What happens if I drag the mouse by exactly the amount specified by
SM_CXDRAG
? - How do I accept files to be opened via
IDropTarget
instead of on the command line? - How do I accept files to be opened via
IDropTarget
instead of on the command line? - bonus content - Using Explorer's fancy drag/drop effects in your own programs
- Drag/drop effects: The little drop information box
- Why isn't my shell namespace extension getting every single
DragOver
mouse message? - Why doesn't my program get fancy drag/drop effects in high contrast mode with
CLSID_DragDropHelper
?
Énumération
- Using fibers to simplify enumerators, part 1: When life is easier for the enumerator
- Using fibers to simplify enumerators, part 2: When life is easier for the caller
- Using fibers to simplify enumerators, part 3: Having it both ways
- Using fibers to simplify enumerators, part 4: Filtering
- Using fibers to simplify enumerators, part 5: Composition
Coquille
- When does
SHLoadInProc
unload a DLL? - What does
SHGFI_USEFILEATTRIBUTES
mean? - What's the difference between
SHGetMalloc
, SHAlloc
, CoGetMalloc
, and CoTaskMemAlloc
- Querying information from an Explorer window
- Execute a file as if it were a program, even though its extension is not
EXE
- How do I launch a file as if it were a text file, even though its extension is not
.txt
? - What does the
SEE_MASK_UNICODE
flag in ShellExecuteEx
actually do? - Simple things you can do with the
ShellExecuteEx
function - What were
ShellExecute
hooks designed for? - Why does
ShellExecute
return SE_ERR_ACCESSDENIED
for nearly everything? - How do I
ShellExecute
a file, but with a specific program instead of the default program? - What is the difference between
CSIDL_DESKTOP
and CSIDL_DESKTOPDIRECTORY
? -
SHCIDS_CANONICALONLY
is the moral equivalent in the shell namespace of the Unicode ordinal comparison - Don't forget to double-null-terminate those strings you pass to
SHFileOperation
- Why does
SHFileOperation
have internal error codes for DVD? - Why do non-folders in my shell namespace extension show up in the folder tree view?
-
SHAutoComplete
giveth, and SHAutoComplete
taketh away - What is the
lpClass
member of SHELLEXECUTEINFO
used for? - Some known folders cannot be moved, but others can, and you'll just have to accept that
- One possible reason why
ShellExecute
returns SE_ERR_ACCESSDENIED
and ShellExecuteEx
returns ERROR_ACCESS_DENIED
- Why does
SHGetSpecialFolderPath
take such a long time before returning a network error? - How do you obtain the icon for a shortcut without the shortcut overlay? (
SHGetFileInfo()
) - How can I get information about the items in the Recycle Bin?
- Modernizing our simple program that retrieves information about the items in the Recycle Bin
- Invoking commands on items in the Recycle Bin
- How do I perform shell file operations while avoiding shell copy hooks?
- Command line tool to manage Windows 7 Libraries, with source code (
IShellLibrary
) -
IShellFolder::BindToObject
is a high-traffic method; don't do any heavy lifting - Obtaining the parsing name (and pidl) for a random shell object
- Creating a simple pidl: For the times you care enough to send the very fake
- Creating a simple shell item, just as fake as a simple pidl
- Displaying a property sheet for multiple files
- How do I get a high resolution icon for a file?
- How do I extract an icon at a nonstandard size if
IExtractIcon::Extract
tells me to go jump in a lake? - How do I read the "Double-click to open an item (single-click to select)" setting in Folder Options?
- The wonderful world of shell bind context strings
- Helper functions to make shell bind contexts slightly more manageable
- Customizing item enumeration with
IShellItem
- Customizing item enumeration with
IShellItem
, the old-fashioned way - How do I create an
IShellItemArray
from a bunch of file paths? - How do I invoke a verb on an
IShellItemArray
? - How does a shell namespace extension provide icons for virtual items that track the standard icons set by the user's file associations?
- How do I get the user-customed name of My Computer or Recycle Bin?
- How do I get the user-customized name of a mapped network drive?
- Enumerating all the programs that can open a particular file extension
- Enumerating all the programs that can launch a particular protocol
- How do I register a command on the desktop background context menu? (And how do I remove one I don't like?)
- How can I get the canonical name for a known folder?
- Peeking inside an
IShellItem
to see what it's made of - Why does
SHGetKnownFolderPath
return E_FAIL
for a known folder? - Why does
SHGetKnownFolderPath
fail when impersonating? - Why can't I use
SHSetKnownFolderPath
to change the location of FOLDERID_LocalAppData
? - How do I programmatically add a folder to my Documents library?
- Why doesn't
SHGetFileInfo
give me customized folder icons? - How can I detect that a shell item refers to a virtual folder, or to a file system inside a file?
- Why is there a limit of 15 shell icon overlays?
- The case of the
SHGetFolderPath(CSIDL_COMMON_DOCUMENTS)
that returned ERROR_PATH_NOT_FOUND
- Why is the
HSHELL_WINDOWDESTROYED
notification raised when a window is hidden, even if it hasn't been destroyed? - Why am I receiving
HCNE_UPDATEDIR
notifications that my code never generates? - Why am I receiving
SHCNE_UPDATEDIR
notifications that my code never generates? - How can I get the original target of a shortcut without applying any 32-bit adjustments?
- How does Explorer calculate the “Date” of a file?
Uncategorized COM Stuff
- The macros for declaring and implementing COM interfaces
- An introduction to COM connection points
- Dispatch interfaces as connection point interfaces
- Adjustor thunks
- What is the underlying object behind a COM interface pointer?
- How to turn off the exception handler that COM "helpfully" wraps around your server
- Shortcuts are serializable objects, which means that they can be stored in places other than just a file
- Why does
IFileOperation
skip junctions even though I passed FOFX_NOSKIPJUNCTIONS
? - Nasty gotcha:
STGM_READ | STGM_WRITE
does not grant read/write access - How can I get the list of programs the same way that Programs and Features gets it?
- How do I obtain the computer manufacturer's name via C++? (
IWbemClassObject
) - The stream pointer position in
IDataObject::GetData
and IDataObject::GetDataHere
is significant - The sad implementation history of COM component categories and why it means you have to click twice to see your newly-installed taskbar toolbar
- How do I request that my out-of-process COM server run unelevated?
- How can a desktop app use a Windows Runtime object that infers UI context from its thread? The
IInitializeWithWindow
pattern ( IInitializeWithWindow
) - How do I protect myself against a COM call that can hang? I'm already running the server out-of-process.
- What can I do about timer build-up when waiting for COM outbound calls to complete?
- Manipulating the positions of desktop icons
- A reminder about the correct way of accessing and manipulating the position of icons on the desktop
- The oracle always tells the truth, even when it is wrong: COM method calls with a user-defined type as a return value (on problems of COM interfaces called from C code)
- Notes on COM aggregation: Obtaining a pointer to your aggregated partner without introducing a reference cycle
- Notes on COM aggregation: How do you implement tear-offs in an aggregated object?
- The theory behind the
IHttpFilter
interface
Mémoire
- Stupid memory-mapping tricks
- Creating a shared memory block that can grow in size
- Why do I have to pass a valid page protection value to
VirtualAlloc
even if it ignores it? - How can I include/exclude specific memory blocks in user-mode crash dumps?
-
IsBadXxxPtr
should really be called CrashProgramRandomly ( IsBadWritePtr()
et al.) - A closer look at the stack guard page
- The case of the stack overflow exception when the stack is nowhere near overflowing
- How to allocate address space with a custom alignment or in a custom address region
Input and Output
- Mount points, volumes, and physical drives, oh my!
- What's the difference between an asynchronous
PIPE_WAIT
pipe and a PIPE_NOWAIT
pipe? - Be careful when redirecting both a process's
stdin
and stdout
to pipes, for you can easily deadlock - Looking at the problem at the wrong level: Closing a process's
stdin
-
ReadDirectoryChangesW
reads directory changes, but what if the directory doesn't change? - How do
FILE_FLAG_SEQUENTIAL_SCAN
and FILE_FLAG_RANDOM_ACCESS
affect how the operating system treats my file? - I used
FILE_FLAG_SEQUENTIAL_SCAN
but it didn't seem to speed up my sequential scanning - You can use an
OVERLAPPED
structure with synchronous I/O, too - We're currently using
FILE_FLAG_NO_BUFFERING
and FILE_FLAG_WRITE_THROUGH
, but we would like our WriteFile
to go even faster - On using
ILE_FLAG_WRITE_THROUGH
and FILE_FLAG_NO_BUFFERING
for memory-mapped files - On the interaction between the
FILE_FLAG_NO_BUFFERING
and FILE_FLAG_WRITE_THROUGH
flags - Why does my synchronous overlapped
ReadFile
return FALSE
when the end of the file is reached? - Why does
SetFileValidData
fail even though I enabled the SE_MANAGE_VOLUME_NAME
privilege? - Is
GENERIC_ALL
equivalent to GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE
? -
CancelIoEx
can cancel I/O on console input, which is kind of nice -
CancelIoEx
can cancel synchronous I/O, which is kind of nice - Why does
IsPathRelative
return FALSE
for paths that are drive-relative? - The security check happens at the acquisition of the handle
- Taking a shortcut: You can query properties from a volume, and it will forward to the physical drive
- https://devblogs.microsoft.com/oldnewthing/20201023-00/?p=104395
- How do I disassociate a thread from an I/O completion port?
- Is it okay to call
MapViewOfFile
on the same mapping handle simultaneously from different threads? - What are these dire multithreading consequences that the
GetFullPathName
documentation is trying to warn me about? - How can I force a
WriteFile
or ReadFile
to complete synchronously or hang, in order to test something? - How can I perform a
CopyFile
, but also flush the file buffers before the destination handle is closed?
Asynchronous Input and Output
- Developing the method for taking advantage of the fact that the
OVERLAPPED
associated with asynchronous I/O is passed by address - Ready... cancel... wait for it! (part 1)
- Ready... cancel... wait for it! (part 2)
- Ready... cancel... wait for it! (part 3)
- If you're waiting for I/O to complete, it helps if you actually have an I/O to begin with
- Why does my asynchronous I/O complete synchronously?
- If an asynchronous I/O completes synchronously, is the
hEvent
in the OVERLAPPED
structure signaled anyway? - You can use an
OVERLAPPED
structure with synchronous I/O, too - Why does my synchronous overlapped
ReadFile
return FALSE
when the end of the file is reached? - If I issue a second overlapped I/O operation without waiting for the first one to complete, are they still guaranteed to complete in order?
- Why are my file write operations synchronous, even though I opened the file as
FILE_FLAG_OVERLAPPED
? - File-extending writes are not always synchronous, which is entirely within the contract
- Why you might need additional control over the secret event hiding inside the file object
- Why doesn't my asynchronous read operation complete when I close the handle?
- The mental model for
StartThreadpoolIo
- How can I force a
WriteFile
or ReadFile
to complete synchronously or hang, in order to test something? - If I issue multiple overlapped I/O requests against the same region of a file, will they execute in the order I issued them?
- What are the potentially-erroneous results if you don't pass
NULL
as the lpNumberOfBytesRead
when issuing overlapped I/O?
Files and Directories
- The Definitive Guide on Win32 to NT Path Conversion
- How can I tell that a directory is really a recycle bin?
- How can I tell that a directory is weird and should be excluded from the user interface?
- How do I get information about the target of a symbolic link?
- How do I access a file without updating its last-access time?
- How do I show the contents of a directory while respecting the user's preferences for hidden and super-hidden files as well as the user's language preferences?
- You can use a file as a synchronization object, too
- How can I append to a file and know where it got written, even if the file is being updated by multiple processes?
- The
FILE_FLAG_DELETE_ON_CLOSE
flag applies to the handle, also known as the file object, which is not the same as the file - How long do I have to keep the
SECURITY_ATTRIBUTES
and SECURITY_DESCRIPTOR
structures valid after using them to create a file? - How do I create a directory where people can create subdirectories but cannot mess with those created by other users?
- How can I tell whether a file is on a removable drive, a fixed drive, or a remote drive?
- How can I tell whether a file is on an SSD?
- Why does a non-recursive
ReadDirectoryChangesW
still report files created inside subdirectories? - The early history of Windows file attributes, and why there is a gap between System and Directory
- Even if you open a file with GUID, you can still get its name, or at least one of its names (
GetFinalPathNameByHandle()
) - How do I get from a file path to the volume that holds it?
- How do I get from a volume to the physical disk that holds it?
- Renaming a file is a multi-step process, only one of which is changing the name of the file
- How can I recognize file systems that don't support 64-bit unique file identifiers?
- How can I recognize whether two handles refer to the same underlying file?
ACL
- The
MoveSecurityAttributes
policy affects only how Explorer recalculates ACLs when a file is moved; everybody else is on their own - How to create a folder that inherits its parent's ACL, and then overrides part of it
Security Permissions, Attributes and Identifiers
- The security check happens at the acquisition of the handle
- What is the default security descriptor?
- How do I convert a SID between binary and string forms?
- What are these SIDs of the form
S-1-15-2-xxx
? - What are these SIDs of the form
S-1-15-3-xxx
? - An easy way to determine whether you have a particular file permission
- What are the access rights and privileges that control changing ownership of an object?
- How do the names in the file security dialog map to access control masks?
- If you ask for
STANDARD_RIGHTS_REQUIRED
, you may as well ask for the moon - A user's SID can change, so make sure to check the SID history
- Detecting whether a SID is well-known SID
- SIDs are really just another a fancy way of creating unique IDs in a decentralized way
- What's the point of giving my unnamed object proper security attributes since unnamed objects aren't accessible outside the process anyway (or are they?)
- Is a SID with zero subauthorities a valid SID? It depends whom you ask
- What's the difference between duplicating the handle to a token and duplicating a token?
- I called
AdjustTokenPrivileges
, but I was still told that a necessary privilege was not held - I called
AdjustTokenPrivileges
, but I was still told that a necessary privilege was not held, redux - The history of the
EncodePointer
function for obfuscating pointers - Additional helpful pseudo-handles: The process token, the thread token, and the effective token
- How can I tell whether my process is running as SYSTEM?
- A brief summary of the various versions of the Security Descriptor Definition Language (SDDL)
- How do I free the pointers returned by functions like
GetTokenInformation
? - A clarification on the multithreading constraints of the
EncryptMessage
function
Enregistrement
- Beware of non-null-terminated registry strings
- The performance cost of reading a registry key
- So how bad is it that I'm calling
RegOpenKey
instead of RegOpenKeyEx
? - If I simply want to create a registry key but don't intend to do anything else with it, what security access mask should I ask for?
- How can I programmatically inspect and manipulate a registry hive file without mounting it?
- Why doesn't
RegSetKeySecurity
propagate inheritable ACEs, but SetSecurityInfo
does? - Why does
RegNotifyChangeKeyValue
stop notifying once the key is deleted? - How can I emulate the
REG_NOTIFY_THREAD_AGNOSTIC
flag on systems that don't support it? part 1 - How can I emulate the
REG_NOTIFY_THREAD_AGNOSTIC
flag on systems that don't support it? part 2 - How can I emulate the
REG_NOTIFY_THREAD_AGNOSTIC
flag on systems that don't support it? part 3 - How can I emulate the
REG_NOTIFY_THREAD_AGNOSTIC
flag on systems that don't support it? part 4 - How can I emulate the
REG_NOTIFY_THREAD_AGNOSTIC
flag on systems that don't support it? part 5 - The history of passing a null pointer as the key name to
RegOpenKeyEx
- On the failed unrealized promise of
RegOverridePredefKey
(ie don't use it.)
Strings and Locales
-
TEXT
vs. _TEXT
vs. _T
, and UNICODE
vs. _UNICODE
- The sad history of Unicode
printf
-style format specifiers in Visual C++ - Nasty gotcha:
SetThreadUILanguage
cannot be used to restore the thread UI language - How can
CharUpper
and CharLower
guarantee that the uppercase version of a string is the same length as the lowercase version? (use LCMapStringEx()
in any new code) - Is there a code page that matches ASCII and can round trip arbitrary bytes through Unicode?
- A consequence of being the first to adopt a standard is that you may end up being the only one to adopt it: The sad story of Korean jamo
- The
activeCodePage
manifest element can be used for more than just setting UTF-8 as the active code page - Feel free to stop using
IMultiLanguage2::DetectInputCodepage
- On the proper care and feeding of the enigmatic
GetDistanceOfClosestLanguageInList
function - How can I get
WideCharToMultiByte
to convert strings encoded in UTF-16BE?
NT Services
- Calling
ShutdownBlockReasonCreate
from my service doesn't stop the user from shutting down - What does it mean when my attempt to stop a Windows NT service fails with
ERROR_BROKEN_PIPE
? - How can I configure my Windows NT service to autostart when the system gains Internet access?
- On the confusing names for the Windows service SID types
Non classé
- How do I determine the processor's cache line size? (
GetLogicalProcessorInformation()
) - Why are structure sizes checked strictly?
- What's the difference between
CreateMenu
and CreatePopupMenu
? - Why are
HANDLE
return values so inconsistent? - How to retrieve text under the cursor (mouse pointer)
- How to detect programmatically whether you are running on 64-bit Windows
- A timed context menu
- The importance of passing the
WT_EXECUTELONGFUNCTION
flag to QueueUserWorkItem
- If your callback fails, it's your responsibility to set the error code
- The double-click time tells the window manager how good your reflexes are
- The cursor isn't associated with a window or a window class; it's associated with a thread group
- Menu item states are not reliable until they are shown because they aren't needed until then
- How can I display a live screenshot of a piece of another application?
- Converting from a UTC-based
SYSTEMTIME
directly to a local-time-based SYSTEMTIME
- Programmatically uploading a file to an FTP site
- How can you use both versions 5 and 6 of the common controls within the same module?
- How can I tell if Windows Update is waiting for the system to reboot?
- How do I call
SetTimer
with a timer ID that is guaranteed not to conflict with any other timer ID? - A window can't have two timers with the same ID, so how do I assign an ID that nobody else is using?
- What does it mean when a display change is temporary?
- How do I obtain the comment for a share?
- How accurate are the various Windows time-querying functions?
- How can I detect whether the user is logging off?
- Why are timer IDs and dialog control IDs 64-bit values on 64-bit Windows? Did you really expect people to create more than 4 billion timers or dialog controls?
- If you suppress GDI+ background thread, then you are expected to pump messages yourself
- If one program blocks shutdown, then all programs block shutdown (
WM_QUERYENDSESSION
, WM_ENDSESSION
) - When I ask the
GetIpAddrTable
function to sort the results, how are they sorted? - How can I detect that the system is no longer showing a UAC prompt? (
EVENT_SYSTEM_DESKTOPSWITCH
) - How can I get the number of processors in the system, when there are more than 64?
- Why are some system functions exported as stubs instead as forwarders?
- How can I check whether the user has disconnected from the session?
- Why does
PF_VIRT_FIRMWARE_ENABLED
return false even when virtualization is enabled in the firmware? - How can I convert between IANA time zones and Windows registry-based time zones?
- The focus rectangle says, “I'm not orange. I'm just drawn that way.”
- Why does the precise point at which I get a stack overflow exception change from run to run? (structured exception handling aka SEH)
- How do I programmatically reposition monitors in a multiple-monitor system? (
ChangeDisplaySettingsEx()
) - How do I upgrade a 32-bit tick count to a 64-bit one?
- The error code you get might not be the one you want
- How can I find out which processor architectures are supported via emulation by the current system?
- How can I detect whether the system has a keyboard attached? On the
GetRawInputDeviceList
function - Filtering out fake keyboards from the
GetRawInputDeviceList
function - How expensive is
PssCaptureSnapshot
? À quelle vitesse est-ce? How much memory does it consume? - What is the
CreateExplorerShellUnelevatedTask
scheduled task? - Under what conditions can I modify the memory that I received in the form a
STGMEDIUM
? - Is it true that raising a structured exception from a structured exception handler terminates the process?
- Why are many Windows user interface elements positioned at multiples of 4 or 8 pixels? (DPI,
DEVICE_SCALE_FACTOR
) - A history of the
fd_set
, FD_SETSIZE
, and how it relates to WinSock - How can I detect programmatically whether Windows is an N or KN version?
- How should I interpret the various values of
NLM_CONNECTIVITY
? - How can I find out the last time a user logged on from C++?
- How can I specify icons for my app to use on the Start menu in high contrast mode?
- How can I add an environment variable to a process launched via
ShellExecuteEx
or IContextMenu
? - Functions that return the size of a required buffer generally return upper bounds, not tight bounds