INF: Managing Per-Window Accelerator Tables

ID Number: Q82171

3.00 3.10

WINDOWS

Summary:

In the Windows environment, an application can have several windows,

each with its own accelerator table. This article describes a simple

technique requiring very little code that an application can use to

translate and dispatch accelerator key strokes to several windows. The

technique employs two global variables, ghActiveWindow and

ghActiveAccelTable, to track the currently active window and its

accelerator table, respectively. These two variables, which are used

in the TranslateAccelerator function in the application's main message

loop, achieve the desired result.

More Information:

The key to implementing this technique is to know which window is

currently active and which accelerator table, if any, is associated

with the active window. To track this information, process the

WM_ACTIVATE message that Windows sends each time an application gains

or loses activation. When a window loses activation, set the two

global variables to NULL to indicate that the window and its

accelerator table are no longer active. When a window that has an

accelerator table gains activation, set the global variables

appropriately to indicate that the accelerator table is active. The

following code illustrates how to process the WM_ACTIVATE message:

case WM_ACTIVATE:

if (wParam == 0) // indicates loss of activation

{

ghActiveWindow = ghActiveAccelTable = NULL;

}

else // indicates gain of activation

{

ghActiveWindow = <this window>;

ghActiveAccelTable = <this window's accelerator table>;

}

break;

The application's main message loop resembles the following:

while (GetMessage(&msg, // message structure

NULL, // handle of window receiving the msg

NULL, // lowest message to examine

NULL)) // highest message to examine

{

if (!TranslateAccelerator(ghActiveWindow, // active window

ghActiveAccelTable, // active accelerator

&msg))

{

TranslateMessage(&msg); // Translates virtual key codes

DispatchMessage(&msg); // Dispatches message to

// window procedure

}

}

Under Windows version 3.1, the WM_ACTIVATE message with the wParam set

to WA_INACTIVE indicates loss of activation.

Additional reference words: 3.00 3.10 3.x SR# G920316-105