TranslateAccelerator возвращаемое значение - PullRequest
1 голос
/ 30 октября 2009

Цикл сообщений, генерируемый мастером классов, часто выглядит как

while( GetMessage() )
{
    if( !TranslateAccelerator() )
    {
        TranslateMessage();
        DispatchMessage();
    }
}

Принимая во внимание, что документация TranslateAccelerator гласит:
Если функция завершается успешно, возвращаемое значение отлично от нуля.
Если функция завершается ошибкой, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError.

В моих тестах, когда единственной причиной сбоя TranslateAccelerator не был найден ускоритель для этого конкретного сообщения, GetLastError вернул 0 == ERROR_SUCCESS.

Мне просто любопытно, есть ли реалистичные условия, когда TranslateAccelerator не работает по какой-то другой причине, и сообщение должно не быть переведено и отправлено?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 02 ноября 2009

Какими бы ни были разные причины того, что TranslateMessage может потерпеть неудачу ... ну, это вовсе не подразумевает (и, конечно, явно не указано), что сообщение не должно все еще доставляться в DispatchMessage.

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

Кроме того, неинициализированная структура MSG, безусловно, может быть причиной сбоя TranslateMessage и / или DispatchMessage.

1 голос
/ 31 октября 2009

Да. Сообщение может проходить через некоторый другой API фильтрации сообщений, такой как IsDialogMessage().

Из MSDN:

Поскольку функция IsDialogMessage выполняет все необходимые переводы и диспетчеризацию сообщений, сообщение, обработанное IsDialogMessage , не должно передаваться в функцию TranslateMessage или DispatchMessage.

...