哪些消息由DefWindowProc处理?

有什么文件哪些消息由DefWindowProc处理,以及如何?

我最近偶然发现WM_SETFONT / WM_GETFONT没有被处理,我不知道如果我的代码有错误,或者如果这是预期的行为,所以我尝试了下面的WinMain:


WNDCLASSEX wcx = { sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, DefWindowProc, 0, 0, // class/wnd extra bytes hInstance, 0, LoadCursor(0, IDC_ARROW), 0, 0, _T("some class"), 0 }; ATOM a = RegisterClassEx(&wcx); _ASSERTE(a != 0); HWND wnd = CreateWindowEx(0, wcx.lpszClassName, NULL, WS_POPUP, 0,0,0,0, GetDesktopWindow(), 0, hInstance, 0); _ASSERTE(wnd != 0); HFONT font = (HFONT) GetStockObject(ANSI_VAR_FONT); _ASSERTE(font != 0); SendMessage(wnd, WM_SETFONT, (WPARAM) font, 0); HFONT font2 = (HFONT) SendMessage(wnd, WM_GETFONT, 0, 0); _ASSERTE(font2 == font); // **FAILS**, font2 is 0 

据我所知 – 不。 每个窗口消息都是一个罕见的独特的东西,可以通过很多方式来区分。 预计有些消息会被发送,其他消息会被发送。

有些消息是通知用户窗口proc,其他的是DefXXXWindowProc处理程序的命令 – DefWindowProc,DefDlgProc,DefMDIChildProc等。

有些在对话框和窗口过程中处理相同,有些必须以不同的方式处理。

WM_SETTEXT和WM_SETREDRAW实际上是DefWindowProc用来修改WND结构中内部数据结构的命令。

WM_SIZE只是一个通知 – 由DefWindowProc发送到自己的窗口 – 响应WM_WINDOWPOSCHANGED。

WM_MOUSExxx消息需要被发送,从不发送,因为窗口经常进入模态状态,在消息使用GetMessage / PeekMessage读取和直接处理,而不是张贴。

许多消息看起来像通知,但必须始终传递给DefWindowProc,因为它们“秘密”用于实现窗口管理器。 (WM_ACTIVATE和朋友)。

大多数消息可以在对话框中通过返回FALSE(或TRUE)来处理,一些有意义的结果需要使用SetDlgResult,其他的则自动处理(WM_CTLCOLOR *),因为对话框过程知道 DialogProc的非零结果对应于LRESULT返回。

有些(WM_SYSCOMMAND)根本不是真正的窗口消息,只是由DefWindowProc处理窗口管理器类型的东西(平铺桌面等)

官方文件没有真正的尝试来分类这些差异。


要特别解决WM_SET/GETFONT问题, WM_SETFONT ,而定义的消息,不由DefwindowProc处理,因此不处理的窗口类,不明确支持它。 控件(编辑,静态等)和对话框支持WM_SETFONTWM_GETFONT 。 要在应用程序注册类中支持它,需要提供一个实际的自定义WindowProc并在那里处理消息。