Какими бы ни были разные причины того, что TranslateMessage может потерпеть неудачу ... ну, это вовсе не подразумевает (и, конечно, явно не указано), что сообщение не должно все еще доставляться в DispatchMessage.
Реальная проблема с предоставленным примером кода состоит в том, что в дополнение к 0, GetMessage может возвращать код ошибки -1. -1 означает, что вы не должны обрабатывать сообщение (поскольку сообщения нет - скорее всего, структура MSG либо неинициализирована, либо содержит данные предыдущего сообщения). Если вы не можете что-то сделать, чтобы «исправить» нарушенное условие, если GetMessage вернет -1, как только он, вероятно, вернет -1 при последующих вызовах - (вероятная) правильная стратегия - выйти из цикла сообщений.
Кроме того, неинициализированная структура MSG, безусловно, может быть причиной сбоя TranslateMessage и / или DispatchMessage.