O antigo novo win32api
Esta página fornece uma lista de links para subconjuntos de postagens do famoso blog de Raymond Chen, The Old New Thing . O subconjunto é limitado principalmente ao Win32API e algumas coisas relacionadas.
A razão pela qual mantenho esta página é que ela geralmente fornece informações que estão faltando no MSDN ou que são descritas lá de uma maneira enigmática, e também porque o blog não é facilmente pesquisável.
Os links aqui são categorizados por seu tópico, em vez de uma ordem cronológica. Às vezes, quando apropriado, uma única postagem pode ser colocada em várias categorias.
Em alguns casos (bastante raros), os links para outras fontes são incluídos se forem considerados úteis.
Isenção de responsabilidade: não estou reivindicando autoria de nenhum conteúdo vinculado. Trata -se de apenas uma organização esperada dos grandes artigos que Raymond escreveu ao longo dos anos.
Índice
- Processos e threads
- Processos
- Tópicos
- Piscinas de threads
- Afinidade do thread de objetos
- Pilha de thread
- Fibras
- Sincronização
-
WaitOnAddress()
-
WaitForMultipleObjects()
e parentes - Padrões livres de trava
- DLLS
- Recursos
- Recursos de bitmap e ícone
- Modelos de diálogo
- Modelos de menu e recursos do acelerador
- Recursos de String
- Modelos de versão
- Dados e recursos personalizados
- Aplicação (como um todo)
- Linha de comando
- Barra de tarefas
-
HWND
(ponto de vista geral)- Hierarquia do Windows
- Estilos de janela
- Classes de janela
- Windows de nível superior
- Quadro de janela e legenda
- Dwm
- Diálogos
- Diálogos aninhados e incorporados
- Diálogos comuns
- Navegação de controle
- Gerente de diálogo
- Modalidade
- Folhas de propriedade
- Controles
- Controles de animação
- Botões
- Caixas combinadas
- Editar controles
- Visualizações de lista
- Controles de texto ricos
- Barras de rolagem
- Controles estáticos
- Barras de ferramentas
- Dicas de ferramentas
- Trackbars
- Visualizações da lista de árvores
- Processamento de mensagens
- Mensagens específicas
- Notificações
- Construção e destruição de janelas
- Mensagens de geometria da janela
- Mensagens de pintura de janela
- Mensagens de foco da janela
- Mensagens de teclado
- Mensagens de mouse
- Mensagens de diálogo
- Outras mensagens de janela
- Mensagens do sistema
- GDI
- Cursores
- Pincéis
- Canetas
- Bitmaps
- DIB
-
LockWindowUpdate()
- Pintura elementos padrão
-
UXTHEME.DLL
- Vários monitores
- Acessibilidade
- Com
- Declarando interfaces com
- Com apartamentos
- COM Inicialização
- Com loja estática
- Com marechaling
- Com manuseio de erros
- Com interfaces assíncronas
- GUIDS
- Strings
- Com variantes
-
IUnknown
-
IMoniker
-
ICallback
-
IContextMenu
-
IFileDialog
-
IMultiLanguage
-
INamespaceWalk
-
IStream
-
IVirtualDesktopManager
- Praça de transferência
- Arraste e solte
- Enumeração
- Concha
- Com material com não categorizado
- Memória
- Entrada e saída
- Entrada e saída assíncronas
- Arquivos e diretórios
- ACL
- Permissões, atributos e identificadores de segurança
- Registro
- Cordas e locais
- NT Serviços
- Sem categoria
Processos e threads
Processos
-
CreateProcess
não espera o processo começar - Por que a função
CreateProcess
modifica sua linha de comando de entrada? - Por que as pessoas fazem uma trava em torno das chamadas
CreateProcess
? - Desativando a caixa de diálogo do programa
- Como faço para passar muitos dados para um processo quando ele inicia?
- Qual foi o objetivo do parâmetro
hPrevInstance
para WinMain
? -
RunAsInvoker
é um cenário segredo e ainda mais alto do UAC? - Como evito que um processo filho exiba a caixa de diálogo Relatórios de erro do Windows?
- Como é que
WriteProcessMemory
consegue escrever para a memória somente leitura? - É uma boa ideia deixar
WriteProcessMemory
gerenciar a proteção da página para mim? - Como posso lançar um processo não elevado do meu processo elevado, Redux
- Como posso verificar o nível de integridade do meu processo?
- É verdade que levantar uma exceção estruturada de um manipulador de exceção estruturado encerra o processo?
- Uma maneira mais direta e livre de erros de criar um processo em um objeto de emprego
Tópicos
- IDs de encadeamento e processo inválidos
- Por que minha manipulação de thread fica de repente? Tudo o que fiz foi esperar!
- O que acontece se você simplesmente retornar do retorno de chamada do thread passou para
_beginthread
e _beginthreadex
? - Por que você nunca deve suspender um tópico
- Os perigos de dormir em um tópico da interface do usuário
- Em busca da fila de mensagens
- Enumiando tópicos em um processo
- O trabalho da interface do usuário win32 é inerentemente threadned
- Quão ruim é atrasar o fechamento de uma alça de encadeamento por um longo tempo após a saída do thread?
- Se eu ligar para
GetExitCodeThread
para um thread que eu tenho com certeza saiu, por que ainda diz STILL_ACTIVE
? - Existe um problema com
CreateRemoteThread
em sistemas de 64 bits? - A função
TerminateThread
é síncrona? - Removendo o
TerminateThread
do código que aguarda um objeto de emprego esvaziar - Qual é o sentido da
FreeLibraryAndExitThread
? - O que acontece se eu der valores contraditórios para a reserva de comprometimento e pilha de pilha?
Piscinas de threads
- O que exatamente significa o parâmetro
msWindowLength
para SetThreadpoolTimer
? - Qual é a diferença entre
CreateTimerQueueTimer
e SetThreadpoolTimer
? - Como evitar acessar a memória libertada ao cancelar um retorno de chamada do pool de threads
- Evitando deadlocks ao cancelar um retorno de chamada do pool de threads, Parte 1: Dados de retorno de chamada externo
- Evitando deadlocks ao cancelar um retorno de chamada do pool de threads, parte 2: referindo -se ao objeto que contém
- Gotcha: um timer periódico Threadpool não esperará que o tick anterior seja concluído
- Por que estou recebendo uma exceção do pool de threads durante o desligamento do processo?
- O que acontece com o valor retornado da função passada para
QueueUserWorkItem
? - O modelo mental para
StartThreadpoolIo
- Como posso detectar que um item de trabalho do pool de threads está demorando muito?
- Como posso fechar um pool de threads e cancelar todo o trabalho que havia sido filmado para ele?
Afinidade do thread de objetos
- Afinidade do encadeamento de objetos de interface do usuário, Parte 1: alças de janela
- Afinidade de thread de objetos de interface do usuário, Parte 2: Contextos de dispositivo
- Afinidade do tópico de objetos de interface do usuário, parte 3: menus, ícones, cursores e tabelas de acelerador
- Afinidade do encadeamento de objetos de interface do usuário, Parte 4: Objetos GDI e outras notas sobre Afinidade
- Afinidade do tópico de objetos de interface do usuário, Parte 5: limpeza de objetos
- Afinidade do tópico de objetos de interface do usuário: adendo
Pilha de thread
- Como posso expandir a pilha do meu tópico em tempo de execução?
- Usando fibras para expandir a pilha de um tópico em tempo de execução, parte 1
- Usando fibras para expandir a pilha de um thread em tempo de execução, parte 2
- Usando fibras para expandir a pilha de um tópico em tempo de execução, parte 3
- Usando fibras para expandir a pilha de um tópico em tempo de execução, parte 4
- Usando fibras para expandir a pilha de um thread em tempo de execução, parte 5
- Usando fibras para expandir a pilha de um thread em tempo de execução, parte 6
- Comparando fibras com fios com o objetivo de expandir a pilha de um thread em tempo de execução
- Determinando aproximadamente quanto espaço de pilha está disponível, parte 1
- Determinando aproximadamente quanto espaço de pilha está disponível, parte 2
Fibras
- O que acontece com as fibras que foram executadas em um thread quando o thread sai?
- É bom usar fibras, mas todo mundo precisa estar a bordo com o plano
- As fibras não são mais úteis para muito mais; Há apenas um canto que permanece útil por um motivo não relacionado às fibras
Sincronização
- Compreendendo as consequências de
WAIT_ABANDONED
- Eventos com chave para Windows, seções críticas e novos recursos de sincronização do Vista
- Combinando a fila de trabalho de eventos distintos, ordem não importante, com um evento de reset automático
- Quão justos são os bloqueios SRW, principalmente quando existem leitores e escritores?
- Você pode usar um arquivo como um objeto de sincronização também
- Posso esperar que um evento de kernel não se sinta indignado ?
- Se o Slim Reader/Writer Lock (
SRWLOCK
) não se lembra de quem é o proprietário compartilhado da Lock, isso significa que não há problema em adquiri -lo recursivamente?
WaitOnAddress()
-
WaitOnAddress
permite criar um objeto de sincronização a partir de qualquer variável de dados, mesmo um byte - Implementando uma barreira de sincronização em termos de
WaitOnAddress
- Implementando uma seção crítica em termos de
WaitOnAddress
- Estendendo nossa seção crítica com base em
WaitOnAddress
para apoiar os tempos limite - Comparando
WaitOnAddress
com Futexes (Futexi? Futexen?) - Criando um semáforo a partir de
WaitOnAddress
- Criando um semáforo com uma contagem máxima de
WaitOnAddress
- Criando um evento de reset manual da
WaitOnAddress
- Criando um evento de retirada automática do
WaitOnAddress
WaitForMultipleObjects()
e parentes
-
MsgWaitForMultipleObjects
e o estado da fila - Você pode chamar
MsgWaitForMultipleObjects
com zero alças - Bombear mensagens enquanto espera por um período de tempo
- Esperando por todas as alças com
MsgWaitForMultipleObjects
é um bug esperando para acontecer - Por que
WaitForMultipleObjects
retorna ERROR_INVALID_PARAMETER
quando todos os parâmetros parecem válidos para mim? - Se mais de um objeto faz com que um
WaitForMultipleObjects
retorne, como faço para descobrir os outros? - Qual é o sentido de passar em um evento sem sinalização para
MsgWaitForMultipleObjects
?
Padrões livres de trava
- Bloquear padrões de muitos produtores/consumidores únicos: uma fila de trabalho com tarefas coalescentes
- Bloquear os padrões de muitos produtores/consumidores únicos: uma fila de trabalho onde o último ganha
- Bloquear padrões de muitos produtores/consumidores únicos: uma fila de trabalho de eventos não coalescáveis idênticos
- Bloquear os padrões de muitos produtores/consumidores únicos: uma fila de trabalho de eventos distintos, ordem não importante
- Bloquear os padrões de muitos produtores/consumidores únicos: uma fila de trabalho de eventos distintos, FIFO
- Bloquear os padrões de muitos produtores/consumidores únicos: uma fila de trabalho de eventos distintos, ordem não importante, pergunta de acompanhamento
DLLS
- Não confie no endereço de retorno
- Por que não consigo
GetProcAddress
uma função que eu não consigo? - Qual é a diferença entre
HINSTANCE
e HMODULE
? - Acessando o
HINSTANCE
do módulo atual de uma biblioteca estática -
LoadLibraryEx(DONT_RESOLVE_DLL_REFERENCES)
é fundamentalmente falho - Por que as DLLs são descarregadas na ordem "errada"?
- Como as funções DLL são exportadas em janelas de 32 bits?
- Funções exportadas que são realmente encaminhantes
- Repensando a maneira como as exportações de DLL são resolvidas para janelas de 32 bits
- Os nomes na biblioteca de importação são decorados por um motivo
- O que acontece quando você entende errado?
- Questões relacionadas à forçar um stub a ser criado para uma função importada
- Alocando e libertando memória nos limites do módulo
- O encaminhamento de DLL não é o mesmo que carregamento de atraso
- O que a DLL é a importação de impressão?
- O que é a ligação de importação da DLL?
- Qual é o sentido da
FreeLibraryAndExitThread
? - Uma biblioteca carregada via
LOAD_LIBRARY_AS_DATAFILE
(ou sinalizadores similares) não consegue jogar em nenhum jogo de módulo de rena - Poderia haver algum problema em chamar
GetModuleFileNameEx
em seu próprio processo? - Como posso especificar que minha DLL deve resolver uma dependência de DLL do mesmo diretório em que a DLL está?
- Depois que eu fiz minha DLL de atraso em outra DLL, minha DLL começou a travar em seu processo o Código
- Os diferentes tipos de plantio de DLL
- Por que
GetModuleInfo
não produz um ponto de entrada para executáveis? - O que significa o
SizeOfImage
na estrutura MODULEINFO
? - Como suprimir a caixa de erro que aparece quando uma
LoadLibrary
falha?
DllMain()
- Algumas razões para não fazer nada assustador em seu
DllMain
- Outro motivo para não fazer nada assustador em seu
DllMain
: impasse inadvertido - Algumas razões para não fazer nada assustador em seu
DllMain
, parte 3 - O tópico que recebe a notificação
DLL_PROCESS_DETACH
não é necessariamente aquele que recebeu a DLL_PROCESS_ATTACH notification
- Como você pode estar carregando uma DLL durante
DLL_PROCESS_DETACH
sem sequer perceber - Quando
DLL_PROCESS_DETACH
lhe diz que o processo está saindo, sua melhor aposta é apenas voltar sem fazer nada
Recursos
- O compilador de recursos padrão para
CP_ACP
, mesmo diante de dicas sutis de que o arquivo é UTF-8 - A relação entre recursos do módulo e objetos derivados de recursos em janelas de 32 bits
- Qual é a diferença entre
FreeResource
e, digamos, DestroyAcceleratorTable
- Os recursos do PE devem estar alinhados com 4 bytes, mas isso não impede as pessoas de tentar outros alinhamentos
- Como posso dizer que alguém usou a macro
MAKEINTRESOURCE
para contrabandear um número inteiro dentro de um ponteiro? - Horrivelmente desagradável Gotcha:
FindResource
e FindResourceEx
Recursos de bitmap e ícone
- Por que os bitmaps independentes do dispositivo estão de cabeça para baixo?
- O formato de recursos de bitmap
- O formato dos recursos do ícone
- O formato dos recursos do ícone, revisitado
- A evolução do formato do arquivo OIC, Parte 1: Beginnings monocromáticos
- A evolução do formato do arquivo OIC, parte 2: agora em cores!
- A evolução do formato de arquivo OIC, parte 3: imagens alfa misturadas
- A evolução do formato de arquivo OIC, Parte 4: Imagens PNG
- Como faço para definir o canal alfa de um bitmap GDI como 255?
Recursos da string de mensagens
- Por que
FormatMessage
diz que %0
encerra a mensagem sem uma nova linha de direita? Está adicionando secretamente as novas linhas?
Modelos de diálogo
- Sobre a dificuldade de obter o layout perfeito de pixels nos modelos de diálogo Win32
- A evolução dos modelos de diálogo - modelos clássicos de 32 bits
- A evolução dos modelos de diálogo - modelos estendidos de 32 bits
- A evolução dos modelos de diálogo - Resumo
- O compilador de recursos adicionará os estilos de janela útil para você, mas se você estiver construindo um modelo de diálogo, você não recebe essa ajuda
Modelos de menu e recursos do acelerador
- A evolução dos modelos de menu: Introdução
- A evolução dos modelos de menu: menus clássicos de 32 bits
- A evolução dos modelos de menu: menus estendidos de 32 bits
- O formato dos recursos da tabela de acelerador
Recursos de String
- O formato dos recursos da string
-
LoadString
pode carregar strings com nulos incorporados, mas sua função de wrapper pode não
Modelos de versão
- A evolução dos recursos da versão - recursos de versão de 32 bits
- A evolução dos recursos da versão - Recursos de versão de 32 bits corrompidos
Dados e recursos personalizados
- O formato de dados e recursos personalizados
Aplicação (como um todo)
- Quais janelas aparecem na lista
Alt+Tab
? - O Windows Vista mudou o pedido
Alt+Tab
ligeiramente - O trabalho da interface do usuário win32 é inerentemente threadned
- Quando
STARTF_USESHOWWINDOW
substitui o parâmetro passado para ShowWindow
? -
WaitForInputIdle
deve realmente ser chamado de WaitForProcessStartupComplete
-
WaitForInputIdle
espera por qualquer tópico, que pode não ser o tópico de que você se importa - Quais são as convenções para gerenciar alças padrão?
- As alças padrão são realmente destinadas a programas de thread único
- Se apenas as DLLs podem obter notificações
DllMain
, como um exe pode receber uma notificação quando um thread é criado (por exemplo)?
Linha de comando
- A primeira palavra na linha de comando é o nome do programa apenas por convenção
- Como a função
CommandLineToArgvW
destinada a ser usada? - O que há com o estranho tratamento de aspas e retrates por
CommandLineToArgvW
Barra de tarefas
- Como evito que os usuários fixem meu programa na barra de tarefas?
- Em vez de criar algo e depois tentar escondê -lo, simplesmente não o crie em primeiro lugar (ícone da bandeja)
- E se meu aplicativo for realmente dois aplicativos agrupados em um único arquivo, e eu quero que eles coletam em dois grupos na barra de tarefas no Windows 7?
- Como faço para personalizar como as janelas do meu aplicativo são agrupadas na barra de tarefas?
- Exibir uma sobreposição no botão da barra de tarefas
- Exibir botões de controle em sua janela de visualização da barra de tarefas
- Exiba uma miniatura personalizada para o seu aplicativo (e enquanto você estiver nisso, uma visualização ao vivo personalizada)
- Como posso consultar a localização da barra de tarefas em monitores secundários?
- Como esse programa conseguiu se fixar na minha barra de tarefas quando eu a instalei?
- E se eu tiver dois programas que são logicamente um único aplicativo, e quero que eles sejam tratados como um único grupo na barra de tarefas?
- Por que o ícone da barra de tarefas para o Windows agrupado muda para algo estranho?
HWND
(ponto de vista geral)
- O que isso significa para uma janela ser unicode?
- Como posso obter o endereço de procedimento da janela real e não um Thunk?
- Quais são esses valores estranhos retornados de
GWLP_WNDPROC
? - A janela de bônus bytes em
GWLP_USERDATA
- Qual é a diferença entre
WM_DESTROY
e WM_NCDESTROY
? - Enviar uma janela uma mensagem
WM_DESTROY
é como uma brincadeira que chama alguém fingindo ser a polícia - A vida secreta do
GetWindowText
- Por que as regras para
GetWindowText
são tão estranhas? - Pintando apenas quando sua janela está visível na tela
- Determinando se sua janela está coberta
- Obtendo o tamanho e a posição de uma janela enquanto ela é minimizada
- Por que a chamada de
SetForegroundWindow
imediatamente seguida por GetForegroundWindow
não retorna a mesma janela de volta? - Como o Windows decide se uma janela recém-criada deve usar o layout LTR ou RTL?
Hierarquia do Windows
- O que há de tão especial na janela da área de trabalho?
- Qual é o limite de nidificação de janelas?
- Qual é a diferença entre
HWND_TOP
e HWND_TOPMOST
? - Uma janela pode ter um pai ou um proprietário, mas não ambos
- Por que meu controle envia suas notificações para a janela errada depois de repará -la?
-
WindowFromPoint
, ChildWindowFromPoint
, RealChildWindowFromPoint
, quando tudo terminará? -
GetParent
, tão confuso quanto EnumClaw
, mas é uma função real! ( GetAncestor()
, GetWindow()
) - Ter uma janela do proprietário de outro processo é complicado, mas às vezes é a coisa certa a fazer
- Qual é a documentação para
SetParent
tentando me dizer sobre a sincronização do estado da interface do usuário? - Demonstrando o que acontece quando a janela dos pais e filhos tem estados diferentes de interface do usuário
- Conseguir a janela de um pai e filho para ter os mesmos estados da interface do usuário
Estilos de janela
- Quais pedaços de estilo de janela pertencem a quem?
- Como indico que quero que minha janela siga as regras de layout da direita para a esquerda?
- Por que meu controle estático transparente não é transparente? (
WS_EX_TRANSPARENT
) - Como o bolo,
WS_EX_TRANSPARENT
é uma mentira, ou pelo menos não toda a verdade - Eu usei
WS_EX_COMPOSITED
para me livrar do meu piscar de redefinição, mas isso resultou em resposta lenta - Como posso usar
WS_CLIPCHILDREN
e ainda conseguir controlar um fundo transparente?
Classes de janela
- Para que é o
HINSTANCE
transmitido para CreateWindow
e RegisterClass
usados? - Usar o
HINSTANCE
errado no RegisterClass
é como roubo de identidade - Se a função
RegisterClass
assumir a propriedade do pincel de fundo personalizado, por que está vazando? - Alterar uma classe de janela afeta todas as janelas que pertencem a essa classe
- O que
CS_SAVEBITS
faz? - O que o estilo de classe
CS_OWNDC
faz? - O que o estilo de classe
CS_CLASSDC
faz? - A modificação do estilo
CS_NOCLOSE
afeta todas as janelas da classe, mas não necessariamente de uma maneira imediatamente perceptível - Por que
PrintWindow
odeia CS_PARENTDC
? Porque todo mundo odeia CS_PARENTDC
! - Por que
PrintWindow
odeia CS_PARENTDC
? Redux - Subclasse mais segura
- Aulas particulares, superclassificação e subclasse global
- O que torna
RealGetWindowClass
muito mais real do que GetClassName
? - Por que
CreateWindowEx
pega o parâmetro de estilo estendido como seu primeiro parâmetro em vez de seu último? - Quando devo usar
CS_GLOBALCLASS
? - Quão exclusivo deve ser o parâmetro uidSubclass quando eu chamo
SetWindowSubclass
?
Windows de nível superior
Quadro de janela e legenda
- Obtendo um menu personalizado com o botão direito do mouse para o ícone da legenda
- Desenhando uma legenda de aparência ativa, mesmo quando não está ativo
- Como faço para suprimir a janela completa arrastar/redimensionar por apenas uma janela?
- Como trocar uma janela entre a tela normal e a full?
- Como ativar e desabilitar os botões Minimize, Maximize e Fechar na minha barra de legenda?
- Obtendo a localização do botão Fechar na barra de título
- Obtendo a localização do botão Fechar na barra de título, do Windows 2000 ou Windows XP
- Por que as dimensões de uma janela maximizada são maiores que o monitor?
- Criando uma janela que pode ser redimensionada em apenas uma direção
- Por que você não encaminha
WM_GETMINMAXINFO
e preenche os resultados?
Dwm
- Por que meu programa não recebe a mensagem
WM_DWMSENDICONICTHUMBNAIL
quando peço uma representação icônica? - O parâmetro
MARGINS
para a função DwmExtendFrameIntoClientArea
controla até que ponto o quadro se estende para a área do cliente - Como faço para suprimir a animação padrão que ocorre quando escondo ou mostro uma janela?
- Exiba uma miniatura personalizada para o seu aplicativo (e enquanto você estiver nisso, uma visualização ao vivo personalizada)
- Como posso detectar que minha janela foi suprimida da tela pelo shell? ("Claking de janela")
Diálogos
- Por que não posso criar minha caixa de diálogo? Erro novato #1
- Por que não posso criar minha caixa de diálogo? Erro novato #2
- Retornando valores de um procedimento de diálogo
- Um tipo diferente de procedimento de diálogo
- Outro tipo diferente de procedimento de diálogo
- A resposta padrão para cada caixa de diálogo é "Cancelar"
- Girando a ordem Z.
- Usando a tecla
TAB
para navegar em não dialogs - Usando a tecla
TAB
para navegar em não dialogs, Redux - Prevendo que o texto de controle de edição seja selecionado automaticamente em uma caixa de diálogo
- Aqueles que não entendem o gerente de diálogo estão condenados a reimplementá -lo, mal
- Outros truques com
WM_GETDLGCODE
-
GetDialogBaseUnits
é um barro - Por que
MapDialogRect
Mapping Dialog Retangles? - Por que as caixas de diálogo são criadas inicialmente escondidas?
- Qual é o problema com a bandeira
DS_SHELLFONT
? - Por que
DS_SHELLFONT = DS_FIXEDSYS | DS_SETFONT
? - Como definir o foco em uma caixa de diálogo
- Nunca deixe o foco em um controle desativado
- Uma sutileza na restauração da posição da janela anterior
- Coisas que você já sabe: como faço para esperar até que minha caixa de diálogo seja exibida antes de fazer alguma coisa?
- O que
TranslateAccelerator
faz? - Se eu tiver uma caixa de diálogo moda com aceleradores personalizados, que devo ligar primeiro:
IsDialogMessage
ou TranslateAccelerator
- Lembrete suave: em uma caixa de diálogo, não dê ok e cancelam aceleradores
- Por que os aceleradores para controles ocultos ainda estão ativos?
- Como faço para que meus aceleradores se apliquem apenas quando usados na janela principal e não quando o usuário está usando uma caixa de diálogo modificada?
- Por que a tecla
TAB
não funciona nos controles que eu marquei como WS_TABSTOP
? - Você não pode usar a mensagem
WM_USER
em uma caixa de diálogo - Como posso fazer uma caixa de diálogo da direita para a esquerda em tempo de execução?
- Como o gerenciador de diálogo calcula a largura média de um personagem?
Diálogos aninhados e incorporados
- Para que é o estilo
DS_CONTROL
? - Mais notas sobre o uso do estilo
DS_CONTROL
- Não é uma boa ideia dar vários controles em uma caixa de diálogo o mesmo id
- Ao incorporar uma caixa de diálogo dentro de outra
- Quando o botão padrão é invocado, o Invoke vai para a caixa de diálogo de nível superior
Diálogos comuns
- Por que minha
MessageBox
não envolve no local certo? - Como faço para personalizar a seção Links favoritos da caixa de diálogo aberta do arquivo?
- Por que a caixa de diálogo de arquivo comum altera o diretório atual?
- Você pode filtrar a caixa de diálogo de arquivo comum com curingas
- Como faço para exibir a caixa de diálogo Localizar impressoras programaticamente?
- Por que a lista de arquivos abertos nas pastas compartilhadas mostra todos os meus arquivos abertos?
- Um controle comum para associar extensões está bem vencido
- Filtrando as pastas que aparecem na caixa de diálogo Browse for Pouxer
- Abrindo a caixa de diálogo do navegador de pasta clássico com uma pasta específica pré -selecionada
- Por que a caixa de diálogo Salvar arquivo comum cria um arquivo temporário e a exclua?
- Customing a caixa de diálogo Padrão de Punto de Cores
- Como defino o diretório inicial da caixa de diálogo abrir o arquivo como um diretório virtual?
- Quando seleciono vários arquivos na caixa de diálogo Abrir arquivo, por que o último item vem primeiro?
- Defino a opção
OFN_NONETWORKBUTTON
na estrutura OPENFILENAME
, mas não tem efeito no item de rede no painel de navegação - Como adicionar controles personalizados ao arquivo comum aberto ou salvar o arquivo de diálogos?
- Como posso fazer com que meu
FileSavePicker
seja aberto na mesma pasta escolhida pelo FileOpenPicker
ou FolderPicker
? (Win32/Com o equivalente mencionado no final do post)
Navegação de controle
- Usando a tecla
TAB
para navegar em não dialogs - Usando a tecla
TAB
para navegar em não dialogs, Redux - Gerenciando o estado da interface dos aceleradores e os retângulos de foco
- Navegação personalizada em caixas de diálogo, Redux
- As caixas de diálogo retornam o foco ao controle que teve foco quando você mudou pela última vez; Como faço para entrar nessa ação para minhas próprias janelas?
- Como posso criar um pedido de guia não circular ou algum outro tipo de pedidos personalizados na minha caixa de diálogo Win32?
Gerente de diálogo
- O gerente de diálogo, parte 1: aquecimento
- O gerenciador de diálogo, parte 2: criando a janela do quadro
- O gerente de diálogo, parte 3: criando os controles
- O gerenciador de diálogo, parte 4: o loop de diálogo
- O gerenciador de diálogo, parte 5: convertendo uma caixa de diálogo não modal em modal
- O gerente de diálogo, parte 6: sutilezas em loops de mensagens
- O gerenciador de diálogo, parte 7: mais sutilezas em loops de mensagens
- O gerenciador de diálogo, parte 8: navegação personalizada em caixas de diálogo
- O gerente de diálogo, parte 9: aceleradores personalizados em caixas de diálogo
Modalidade
- A ordem correta para desativar e facilitar janelas
- Modalidade, Parte 1: modalidade da interface do usuário vs modalidade de código
- Modalidade, Parte 2: Modalidade de Código vs Modalidade de UI
- Modalidade, parte 3: a mensagem
WM_QUIT
- Modalidade, Parte 4: A importância de definir o proprietário correto para a interface do usuário modal
- Modalidade, Parte 5: Configurando o proprietário correto para a interface do usuário modal
- Modalidade, parte 6: interagindo com um programa que foi modal
- Modalidade, Parte 7: Uma
MessageBox
cronometrada, a versão barata - Modalidade, Parte 8: uma
MessageBox
cronometrada, a versão melhor - Modalidade, Parte 9: Definindo o proprietário correto para a interface do usuário modal, exame prático
- As mensagens de threads são comidas por loops modais
- Resgatar mensagens de threads de loops modais via filtros de mensagens
Folhas de propriedade
- Que outros efeitos
DS_SHELLFONT
tem nas páginas de folha de propriedades? -
PSM_ISDIALOGMESSAGE
é para folhas de propriedades modificadas como IsDialogMessage
é para caixas de diálogo modificadas - Você pode estender a estrutura
PROPSHEETPAGE
com seus próprios dados de bônus - A notificação
PSN_SETACTIVE
é enviada sempre que sua página de assistente é ativada - Anexando a carga útil adicional a uma estrutura de
PROPSHEETPAGE
- Como faço para passar por uma matriz de estruturas de
PROPSHEETPAGE
de tamanho variável para a propriedade de propriedades?
Controles
- Só porque você é um controle não significa que você está necessariamente dentro de uma caixa de diálogo
Controles de animação
- Limitações do controle de animação da concha
- Por que o controle de animação da versão 6 não usa um thread de fundo?
Botões
- Para que serve o estilo de botão
BS_PUSHLIKE
? (Não use, está completamente obsoleto hoje em dia. Use a caixa de seleção ou o botão de rádio.)
Caixas combinadas
- Acelerando adicionando itens a um ComboBox ou ListBox (
WM_SETREDRAW
)
Editar controles
- Qual é o problema com a mensagem
EM_SETHILITE
? - Prevendo que o texto de controle de edição seja selecionado automaticamente em uma caixa de diálogo
- Como faço para suprimir o aviso
CapsLock
nos controles de edição de senha? - A história inicial do estilo de controle de edição
ES_NUMBER
- Como permito números negativos com o estilo de controle de edição
ES_NUMBER
? - Como permito que um sinal de menos seja inserido no meu controle de edição, mas apenas se for o primeiro personagem?
Visualizações de lista
- Visualizações de ListView posicionadas versus não posicionadas
- Exibindo informações para itens de ListView dobrados e desdobrados
- Infotips de computação listView em segundo plano
- Qual é a diferença entre
LVM_HITTEST
e LVM_INSERTMARKHITTEST
? - Por que existe uma notificação
LVN_ODSTATECHANGED
quando já existe uma notificação perfeitamente boa LVN_ITEMCHANGED
? - Criando um ListView com caixas de seleção em alguns itens, mas não em outros
- Como posso redimensionar programaticamente uma coluna ListView para ajustar seu conteúdo?
- Como faço para criar uma caixa de seleção desativada para um item da ListView?
- Acelerando adicionando itens a um ComboBox ou ListBox (
WM_SETREDRAW
)
Controles de texto ricos
A história do controle de Richedit de Murray Sargent (A postagem é apenas um link (quebrado) para https://blogs.msdn.microsoft.com/murrays/2006/10/19/wome-richedit-history/)- Como carrego um arquivo inteiro em um rico controle de texto?
- Como coloco mais de 32.000 caracteres em um rico controle de texto?
- Como faço para imprimir o conteúdo de um rico controle de texto?
Barras de rolagem
- O programa de arranhões
- Barras de rolagem, parte 2
- Barras de rolagem, parte 3: otimizando o ciclo de tinta
- Barras de rolagem, Parte 4: Adicionando uma barra de rolagem proporcional
- Provável parte 5: acessibilidade do teclado para barras de rolagem
- Adendo à Parte 5: Uma sutileza no código do teclado
- ScrollBars Part 6 - a roda
- ScrollBars Part 7 - Integralidade
- ScrollBars Part 8 - Redimensionamento interativo integral
- ScrollBars Part 9 - Mantendo a metáfora
- ScrollBars Part 10 - Para uma compreensão mais profunda da mensagem
WM_NCCALCSIZE
- ScrollBars Part 11: Para uma compreensão ainda mais profunda da mensagem
WM_NCCALCSIZE
- Respostas ao exercício de barras de rolagem Parte 11
- ScrollBars Parte 12: Aplicando
WM_NCCALCSIZE
à nossa amostra de barra de rolagem - ScrollBars Redux: Parte 12
- Existem dois tipos de barras de rolagem
- Por que
WHEEL_DELTA
foi escolhido para ter 120 em vez de um valor muito mais conveniente, como 100 ou mesmo 10? - Por que a definição da faixa de barra de rolagem horizontal pela primeira vez também define a faixa vertical e vice -versa?
- Rolução automática no arrasto, parte 1: implementação básica
- Rolução automática no arrasto, parte 2: por que a rolagem é mais rápido se eu mexer o mouse?
- Rolução automática no arrasto, Parte 3: Dynamic AutoScroll com base na posição do mouse
- Rolução automática no arrasto, parte 4: Dynamic AutoScroll com base na velocidade de escape
- Rolução automática no arrasto, parte 5: Adicionando Wiggle-to-roll para escapar da velocidade
Controles estáticos
- Quando o controle estático excluirá automaticamente a imagem carregada nela e quando é de responsabilidade do aplicativo?
Controles de guia
- Como devo criar controles na minha caixa de diálogo que tenha um controle de guia?
- Como devo criar filhos do controle da guia Win32?
Barras de ferramentas
- Por que existem
TBSTYLE_EX_VERTICAL
e CCS_VERT
? - Como faço para criar uma barra de ferramentas que fica na barra de tarefas?
- Como faço para criar um botão da barra de ferramentas alinhada à direita?
- Criando tarefas personalizadas em uma lista de saltos
Dicas de ferramentas
- Codificação dicas de ferramentas no local
- Usando o desenho personalizado nas dicas de ferramentas para ajustar a fonte
- Multiplexando várias ferramentas em uma em uma dica de ferramenta
- Gerando texto dinâmico dinamicamente
- Por que não posso exibir uma dica de ferramenta para uma janela desativada?
- Documentação excessiva
TTM_RELAYEVENT
e por que isso resulta em um temporizador periódico de um segundo em execução enquanto a dica de ferramenta estiver visível
Trackbars
- Adicionando um acelerador de seta
Ctrl
+para mover o trackbar por apenas uma unidade, parte 1: mergulho inicial - Adicionando um acelerador de seta
Ctrl
+para mover o trackbar por apenas uma unidade, parte 2: segunda tentativa - Como impedir que os usuários usem o mouse para arrastar o polegar de trackbar para posições que não são múltiplas de cinco? Parte 1: Reforme o problema
- Como impedir que os usuários usem o mouse para arrastar o polegar de trackbar para posições que não são múltiplas de cinco? Parte 2: cutucando a posição do polegar
Vistas da lista de árvores
- O estilo
TVS_CHECKBOXES
é peculiar, o que é uma maneira educada de dizer que é loucura - Cuidado com a lista de imagens vazadas ao usar o estilo
TVS_CHECKBOXES
- Criando caixas de seleção de exibição de árvore manualmente: uma lista de imagens de estado simples
- Criando caixas de seleção de exibição de árvore manualmente: Respondendo aos cliques
- Criando caixas de seleção de exibição de árvores manualmente: caixas de seleção temáticas
- Caixas de seleção de vista da árvore: uma história sórdida
- Caixas de seleção de exibição de árvore: os estados da caixa de seleção estendida
Processamento de mensagens
- Quais números de mensagem pertencem a quem?
- As várias maneiras de enviar uma mensagem
- Transmitir mensagens definidas pelo usuário
- Quando um thread pode receber mensagens de janela?
- Qual é a diferença entre
GetKeyState
e GetAsyncKeyState
? - As mensagens de threads são comidas por loops modais
- Resgatar mensagens de threads de loops modais via filtros de mensagens
- Os perigos de filtrar mensagens de janela
- Você não pode simular a entrada do teclado com
PostMessage
- Bombear mensagens enquanto espera por um período de tempo
- Em busca da fila de mensagens
- Não, realmente, você precisa passar todas as mensagens não tratadas para
DefWindowProc
- Mesmo se você
DefWindowProc
código para lidar - Para que foi para
Get/SetMessageExtraInfo
já usado? - Por que
GetWindowLongPtr
está retornando um valor de lixo nas janelas de 64 bits? -
TrackMouseEvent
rastreia os eventos do mouse em sua janela, mas apenas se os eventos pertencem à sua janela - Não se esqueça de incluir a fila de mensagens em sua hierarquia de bloqueio
- O que acontece com uma mensagem enviada quando
SendMessageTimeout
atinge seu tempo limite? - Por que não posso
PostMessage
a mensagem WM_COPYDATA
, mas posso SendMessageTimeout
o tempo com um pequeno tempo? - Embora as mensagens de move, tinta e timer de mouse sejam geradas sob demanda, ainda é possível que alguém acabe na sua fila
- As mensagens publicadas são processadas antes das mensagens de entrada, mesmo que tenham sido postadas mais tarde
- Que tipo de mensagens uma janela somente de mensagem pode receber?
- Se os protótipos de
DispatchMessageA
e DispatchMessageW
são idênticos, por que os dois? - Aqueles que não entendem o gerente de diálogo estão condenados a reimplementá -lo, mal
- Como posso desencadear um recalc do cursor do mouse depois de alterar parte do meu estado de aplicação interno?
- Como posso desencadear um recalc do cursor do mouse depois que mudei parte do meu estado de aplicação interno?, Acompanhamento
-
GetQueueStatus
e o estado da fila
Entrando
- What is the
HINSTANCE
passed to SetWindowsHookEx
used for? - How can I get notified when the cursor changes?
- What does the thread parameter to
SetWindowsHookEx
actually mean? - Why does
SetFocus
fail without telling me why?
Specific Messages
Notificações
- 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?
Acessibilidade
- 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
Praça de transferência
- 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
?
Enumeração
- 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
Concha
- 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
Memória
- 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
Registro
- 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
Uncategorized
- 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
? How fast is it? 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