Стандартный цикл обработки сообщений в Win32 выглядит примерно так (точнее, тут не весь цикл, а его тело):
if GetMessage(msg, NULL, 0, 0)
then begin
if not PreprocessMessage(msg) // Специфический фильтр, например, IsDialogMessage() и т.п.
then begin
// Каноническая обработка сообщения в Win32
TranslateMessage(msg);
DispatchMessage(msg);
end;
end;
Я не очень хорошо понимаю, что делает DispatchMessage. По документации, эта функция должна посылать сообщение нужному окну и возвращать результат обработки. Примерно то же самое делает SendMessage (я рассматриваю только случай, когда msg.hwnd не нулевой). Однако на практике (на примере сообщения WM_KEYDOWN) сталкиваюсь с ситуацией, когда SendMessage, посланный нужному окну, возвращает правильный результат (для WM_KEYDOWN это 0, если окно обработало сообщение и 1, если не обработало), а DispatchMessage всегда возвращает 0. Вероятно, эта функция, видя, что окно не обработало сообщение, передаёт его какому-то "обработчику по умолчанию", который его молча "съедает". Таким образом, после вызова DispatchMessage невозможно понять, обработалось ли сообщение.
Не может ли кто-нибудь просветить меня, почему так сложилось? Нет ли какого-либо способа узнать после DispatchMessage, обработалось ли сообщение в действительности, или же оно "съелось"?
Гугл мне не помог в этом вопросе. Видимо, как-то не так формулирую запрос.
Я обхожу эту проблему тем, что для конкретного сообщения WM_KEYDOWN вместо DispatchMessage вызываю SendMessage. Есть ли более стандартный или хотя бы более изящный способ её решить?