今天跟踪一下SendMessage的实现。
用向导先创建一个Windows application。
向导生成了一个简单的窗口,如下。
在File菜单添加SendMessage,顺便添加一个PostMessage,点击菜单打开关于对话框,加入已下代码。
用WinDbg调试,点击SendMessage,程序断在IDM_ABOUT的时候查看堆栈。
原来SendMessage是通过内部调用SendMessageWorker通过InternalCallWinProc直接调用的WndProc!!
跟踪到调用InternalCallWinProc的地方看一下。
0x111就是WM_COMMAND,果然是直接把参数传给了InternalCallWinProc
不用说,InternalCallWinProc肯定是调用了WndProc
。。。。大概就是这么个流程,所以以后有人问SendMessage怎么实现,简单回单一句话就是直接调用WndProc,如下图。
注:只针对同线程调用。
所以将代码这样修改后,功能和SendMessage看起来并没有区别。