一 外设消息
win32系统中有一个系统系统消息队列,所有应用程序中都有一个消息队列。本处只讨论单线程应用程序,以下所说的应用程序均指单线程程序。一个应用程序可以有很多窗口,每个窗口都有自己的窗口过程函数,同一类窗口的窗口过程函数是一样的。
消息处理的步骤为:外设的驱动程序将外设产生的事件包装成消息的形式放入系统消息队列中,系统在把系统消息队列中的消息放入应用程序的消息队列中。应用程序一般用函数Getmessage将消息从自己的消息队列中取出来,然后将消息交给函数DispatchMessage,此函数根据消息中提供的句柄,找到此句柄对应的窗口的窗口过程函数,窗口过程函数才是处理消息的最终代码。
当发生键盘或鼠标事件时,键盘驱动只发一个击键消息,如果你想响应键盘事件,比如你想知道输入的字符到底是什么,那么你必须用函数Translatemessage处理击键消息(击键消息不提供字符击键的字符码),此函数被使用后,将给应用程序的消息队列放上一个其他消息,如WM_CHAR。相当于又转回去了,窗口的窗口过程函数现在通过处理WM_CHAR,就能得到具体的字符。
同样的,鼠标事件的处理也不是一蹴而就的。鼠标事件发生时,驱动只发来一个WM_CHITTEST,如果你想处理发生在应用程序窗口上的事件,那么你必须先将WM_CHITTEST交给DefWindowProc处理,此函数根据WM_CHITTEST将事件发生的屏幕坐标转换为窗口坐标,然后将一个数值代表此坐标,返回给系统,系统处理此坐标以后重新给应用程序一个消息,窗口的过程函数在处理此消息。如果一个窗口不把WM_CHITTEST交给DefWindowProc处理就相当于此窗口对鼠标事件不会有任何反映。
外设事件一定会被传入应用程序中,但应用程序可自己决定是否对这些事件做出处理。
以上只是自己的理解,可能有不对的地方。