A resposta para sua pergunta é sim / NÃO.
Embora o sistema operacional Windows possa e faça poll de aplicativos com eventos na Fila do Windows Messaging, os programas não têm absolutamente nenhuma obrigação de vincular-se ao WinAPI ou de manipular / responder a Fila do Windows. Mesmo responder a uma mensagem na fila não informa ao Windows se o programa foi "bloqueado" ou não. É um indicador, mas é tudo o que é. A resposta real é um pouco mais complicada.
A verdadeira resposta
As pessoas estão se protegendo da resposta real aqui. Determinar se um programa "não está respondendo" é uma variante do " problema de parada ", formalmente indecidível na ciência da computação. A breve explicação é que o processador não pode atuar como um terceiro observando-se para determinar se uma sub-rotina está presa em um loop infinito, não fazendo nada contra incrementar um contador que terminará em algum número normal fixo. Ambos podem ser considerados como loops bem fechados. Um pára, o outro nunca terminará. Mesmo você, como pessoa, não sabe se um programa está realmente respondendo ou não, especialmente se estiver em um loop bem fechado - você só sabe se acha que deveria (responder).
Do ponto de vista do Windows, esses dois loops são "não respondendo" . É por isso que o Windows lhe dá a opção de esperar ou finalizar, porque não é possível dizer.
Portanto, o corolário é "por que o Windows sabe que um processo está respondendo?" A resposta é bastante inteligente. Quando um processo é compilado em um & multi-threaded & sistema operacional multi-processo, às vezes até em loops bem fechados, o compilador pode adicionar um comando yield () , que fornece uma notificação conveniente ao processador que pode alternar para outros processos em execução. Ele "desiste" do processador e um "switch de contexto" (como é chamado) acontece e permite que o SO (Windows incluído) responda a outros eventos na pilha, alguns dos quais incluem rastreamento de que o processo tem respondeu.
** Isso não significa que um processo de resposta terminará . **
Um processo dentro de um loop infinito pode render o processador, permitindo que o Windows processe outros eventos.
Em alguns programas do Windows, o programa lidará com os sinais do sistema operacional Windows, que podem dizer ao SO que ele está "respondendo", mas nenhum programa tem qualquer obrigação de fazê-lo. Você pode escrever programas simples e sem terminação de CPU, mesmo dentro de linguagens de alto nível no Windows, como perl, php, python, e o Windows pode não detectar que não está encerrando e não está respondendo. Nesse ponto, o Windows depende de heurísticas - carga da CPU, memória, quantas interrupções o processador processou enquanto o programa estava sendo executado para "adivinhar". Novamente, nesse ponto, o Windows tem que pedir para você terminar, porque ele realmente não sabe se deveria.
Veja também a resposta (correta) de Viktor. Ignore os comentários sobre se "não responder" não é o mesmo que um loop infinito. Existem todos os tipos de mensagens, interrupções, loops que um aplicativo pode ou não manipular sem informar a fila de mensagens do Windows. O manuseio da fila de mensagens é apenas um dos muitos tipos de eventos que o SO mantém em contadores para tentar adivinhar se um processo está suspenso.