背景:
在看Windows编程时经常遇到这样的一个循环:
while(GetMessage(&Msg, NULL, 0, 0) > 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); }
不习惯可视化编程的我开始完全不理解,于是查看了相关资料,形成了一些自己的看法。
message loop(消息循环过程)调用GetMessage(&Msg, NULL, 0, 0)函数,在满足一定条件下对消息进行处理。
消息队列
每产生一个消息,该消息就会被送到消息队列,供系统处理。不考虑优先级时消息一般是先请求先服务。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统,而该窗口就处于等待状态,所以Windows可以同时进行多个任务。
TranslateMessage(&Msg)
通过查资料,我对这个函数的理解是:消息翻译函数,将msg结构传给Windows,进行一些键盘转换,将击键消息转换为字符消息。引用大牛的解释:从消息队列收到消息后,消息被传递给TanslateMessage,在那里进行一些处理,使消息更易于处理。例如,当按下了一个功能键,消息原以一种抽象的方式放在消息队列中。TranslateMessage函数进行了一些处理,使得这条消息便于理解。
DispatchMessage(&msg)
通过查资料,我对这个函数的理解是:应用程序接到消息后,它会把消息通过DispatchMessage(&msg)传递给窗口处理函数wndproc(此函数通常自己编写,函数名可变,在创建窗口类时就需定义窗口处理函数),窗口函数就会对照事先由程序编写好的消息对照表调用对应的方法来处理消息。
以下是百度百科解释:该函数分发一个消息给窗口程序。通常消息从GetMessage函数获得。消息被分发到回调函数(过程函数),作用是消息传递给操作系统,然后操作系统去调用我们的回调函数,也就是说我们在窗体的过程函数中处理消息。刚学WindowsAPI,不太明白!