|
Message Loop
A simple message loop consists of one function call to each of these three
functions: GetMessage, TranslateMessage, and DispatchMessage.
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
The GetMessage function retrieves a message from the queue and copies it to a structure of
type MSG. It returns TRUE unless it encounters the WM_QUIT message, in which case it returns FALSE and ends the loop. In a
single-threaded application, ending the message loop is often the first step in closing the
application. An application can end its own loop by using the PostQuitMessage function, typically in response to the WM_DESTROY message in the window procedure of the application's main window.
If you specify a window handle as the second parameter of GetMessage, only messages for the specified window are retrieved from the queue. GetMessage can also filter messages in the queue, retrieving only those messages that
fall within a specified range. For more information about filtering messages, see Message Filtering.
A thread's message loop must include TranslateMessage if the thread is to receive character input from the keyboard. Windows
generates virtual-key messages (WM_KEYDOWN and WM_KEYUP) each time the user presses a key. A virtual-key message contains a
virtual-key code that identifies which key was pressed, but not its character value. To
retrieve this value, the message loop must contain TranslateMessage, which translates the virtual-key message into a character message (WM_CHAR) and places it back into the application message queue. The character message
can then be removed upon a subsequent iteration of the message loop and
dispatched to a window procedure.
The DispatchMessage function sends a message to the window procedure associated with the window
handle specified in the MSG structure. If the window handle is HWND_TOPMOST, DispatchMessage sends the message to the window procedures of all top-level windows in the
system. If the window handle is NULL, DispatchMessage does nothing with the message.
An application's main thread starts its message loop after initializing the
application and creating at least one window. Once started, the message loop
continues to retrieve messages from the thread's message queue and to dispatch them
to the appropriate windows. The message loop ends when the GetMessage function removes the WM_QUIT message from the message queue.
Only one message loop is needed for a message queue, even if an application
contains many windows. DispatchMessage always dispatches the message to the proper window; this is because each
message in the queue is an MSG structure that contains the handle of the window to which the message
belongs.
You can modify a message loop in a variety of ways. For example, you can
retrieve messages from the queue without dispatching them to a window. This is
useful for applications that post messages not specifying a window. You can also
direct GetMessage to search for specific messages, leaving other messages in the queue. This is
useful if you must temporarily bypass the usual FIFO order of the message
queue.
An application that uses accelerator keys must be able to translate keyboard
messages into command messages. To do this, the application's message loop must
include a call to the TranslateAccelerator function. For more information about accelerator keys, see Keyboard Accelerators.
If a thread uses a modeless dialog box, the message loop must include the IsDialogMessage function so that the dialog box can receive keyboard input.
Related Links
Software for Delphi and C++ Builder developers
Software for Visual Studio .NET developers
Software for Visual Basic 6 developers
Delphi Tips&Tricks
MegaDetailed.NET
TMS Scripter Studio Pro components for Delphi/C++Builder
More Online Helps
Win32 Multimedia Programmer's Reference (mmedia.hlp)
OLE Programmer's Reference (ole.hlp)
Microsoft Windows Pen API Programmer's Reference (penapi.hlp)
Microsoft Windows Sockets 2 Reference (sock2.hlp)
Microsoft Windows Telephony API (TAPI) Programmer's Reference (tapi.hlp)
Unix Manual Pages
|