Raymond Chen 2009年01月05日
即使你有处理消息的代码,你仍然可以调用 DefWindowProc,因为你本来就在这么做
仅仅因为你写了 case WM_SOMETHING:
,并不意味着你必须处理 WM_SOMETHING
消息的所有可能参数。你仍然可以调用 DefWindowProc
函数。毕竟,当你没有 case WM_SOMETHING:
语句的时候,你本来就这么做。
switch (uMsg) {
case WM_CHAR:
OnChar(…);
return 0;
default:
return DefWindowProc(…);
}
上述代码片段根本没有处理 WM_SOMETHING
消息。假设 WM_SOMETHING
消息使用 wParam
参数来指定发生的某种类型的事情,而你只想在 wParam
的值为 4 时覆盖默认处理。其他值你该怎么办呢?
switch (uMsg) {
case WM_CHAR:
OnChar(…);
return 0;
case WM_SOMETHING:
if (wParam == 4) { DoSomething4(…); }
else … ????? …
return 0;
default:
return DefWindowProc(…);
}
如果值是 4,那么你进行你的特殊“某事 4”处理,但其他值呢?你如何处理它们?
那么,想想看:你之前是如何处理的?在你添加 WM_SOMETHING
处理器之前的原始代码,等同于以下代码:
switch (uMsg) {
case WM_CHAR:
OnChar(…);
return 0;
case WM_SOMETHING:
return DefWindowProc(…);
default:
return DefWindowProc(…);
}
在原始代码中,由于没有 WM_SOMETHING
消息的显式处理器,控制权转移到 default
案例处理器,它只是调用了 DefWindowProc
函数。
如果你真的想,你可以将案例稍微扩展一些:
switch (uMsg) {
case WM_CHAR:
OnChar(…);
return 0;
case WM_SOMETHING:
if (wParam == 4) return DefWindowProc(…);
else return DefWindowProc(…);
default:
return DefWindowProc(…);
}
因为如果 wParam
是 4,原始代码只是调用了 DefWindowProc
。如果 wParam
是 4 以外的其他值,原始代码仍然只是调用了 DefWindowProc
。
当然,我以这种方式扩展了代码块,以便它与我们开始编写 WM_SOMETHING
方法时的案例相匹配。以这种方式写出来,很明显该如何填写问号部分。
switch (uMsg) {
case WM_CHAR:
OnChar(…);
return 0;
case WM_SOMETHING:
if (wParam == 4) { DoSomething4(…); }
else return DefWindowProc(…);
return 0;
default:
return DefWindowProc(…);
}
仅仅因为你有一个 case WM_SOMETHING
语句,并不意味着你必须处理所有情况;你可以在你不想要处理的案例中仍然调用 DefWindowProc
。
掌握了这些信息,你可以帮助评论者 Norman Diamond 在他的 WM_SYSKEYDOWN
消息处理器中处理 VK_F10
键,而无需开始处理“我真的不想麻烦的一堆系统键。”