PostMessage和SendMessage是我们比较常用的windows API,最近也探究这两个api在调用之后,执行的线程问题,发现如下结论:
- 仅仅是RegisterClass注册类之后,调用createwindow第一个参数通过:(const TCHAR*)baseClass.classAtom进行传参创建的窗口,并不执行消息循环,然后往这个窗口句柄进行PostMessage和SendMessage发现:PostMessage无效,Post的Message并不会被WndProc接收到,SendMessage可以正常被WndProc接收并处理,执行线程跟SendMessage当前线程为同一个线程。
- 在单独的线程RegisterClass注册类,然后createwindow,最后执行消息循环。然后往这个窗口句柄进行PostMessage和SendMessage发现:PostMessage和SendMessage可以正常被WndProc接收并处理,执行线程跟消息循环线程为同一个线程。
- 同时如果上面两个代码都同时执行,发现结果一样,也就是说创建的窗口(CreateWindow)在哪个线程,那么消息执行的线程也在该线程。也就是执行线程跟创建窗口的线程保持了一致,无论是SendMessage还是PostMessage。