2009-10-30 6 views
1

클래스 마법사에 의해 생성 된 메시지 루프는 종종TranslateAccelerator 반환 값

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

같은 TranslateAccelerator 문서를 말한다 반면 보인다.
함수가 실패하면 반환 값은 0입니다. 확장 된 오류 정보를 얻으려면 GetLastError를 호출하십시오.

내 테스트에서 TranslateAccelerator가 실패한 유일한 이유가이 특정 메시지에 대해 액셀러레이터를 찾지 못했을 때 GetLastError가 0 == ERROR_SUCCESS를 반환했습니다.

다른 이유가있어서 TranslateAccelerator가 실패 할 때 현실적인 조건이 있습니까? 이 아닌은 &으로 번역되어야합니다.

미리 감사드립니다.

답변

1

예. 메시지는 IsDialogMessage()과 같은 다른 메시지 필터링 API를 통과 할 수 있습니다. MSDN에서

다음 IsDialogMessage 기능이 필요한 번역 및 메시지 발송은 TranslateMessage 또는 DispatchMessage 함수로 전달되지 않아야 IsDialogMessage 처리 메시지를 행한다

때문에.

1

TranslateMessage가 실패 할 수있는 여러 가지 이유가 무엇이든 ... 메시지가 DispatchMessage에 전달되지 않아야 함을 전혀 암시하지 않습니다.

제공된 코드 샘플의 실제 문제는 0 이외에 GetMessage가 -1의 오류 코드를 반환 할 수 있다는 것입니다. -1은 메시지를 처리하지 말아야한다는 것을 의미합니다 (메시지가 없으므로 MSG 구조체는 초기화되지 않았거나 이전 메시지의 데이터가있을 가능성이 큽니다). GetMessage가 -1을 반환하면 후속 호출에서 -1을 반환 할 것이므로 깨진 상태를 '고칠'수있는 작업을 수행하지 않는 한 - (가능한) 올바른 전략은 메시지 루프를 종료하는 것입니다.

또한 초기화되지 않은 MSG 구조체가 TranslateMessage 및/또는 DispatchMessage가 실패하는 원인이 될 수 있습니다.