PRB: Menu Mnemonics Not Working During In-Place Activation (104460)
The information in this article applies to:
- Microsoft OLE Libraries for Windows and Win32s 2.0
- Microsoft OLE Libraries, when used with:
- the operating system: Microsoft Windows NT 3.5
- the operating system: Microsoft Windows NT 3.51
- the operating system: Microsoft Windows NT 4.0
- the operating system: Microsoft Windows 95
- the operating system: Microsoft Windows 2000
This article was previously published under Q104460 SYMPTOMS
The menu mnemonics for an object do not operate properly, causing the
system to hang.
CAUSE
The server application is not calling OleTranslateAccelerator inside
of its message loop.
RESOLUTION
For menu commands to be dispatched properly during in-place editing,
OLE 2.0 needs to have the server application call
OleTranslateAccelerator, even if the server application does not have
accelerator support. This OLE application programming interface (API)
does the needed translation of key messages, and ensures that the
appropriate action occurs.
To be more efficient, a server application need only pass "keystroke"
messages to OleTranslateAccelerator. The following code demonstrates
what the message loop for an OLE server application should look like:
Sample Code
// Message loop for an OLE server.
//
while (GetMessage(&msg, NULL, NULL))
{
if (m_fInplaceActive) // If currently active in place.
if (msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST)
// If it is a "keystroke" message.
if (OleTranslateAccelerator(...) == NOERROR)
continue; // OLE handled the message
TranslateMessage(...);
DispatchMessage(...);
}
MORE INFORMATION
When the object's server is a stand-alone .EXE and the in-place active
object gets a keystroke message that is not a recognized accelerator,
the object must check to see if the message is one that the container
recognizes by calling the OleTranslateAccelerator function. If the
container does not want the keystroke, then the
OleTranslateAccelerator function will return FALSE. In this case, the
object should continue using its normal TranslateMessage and
DispatchMessage code.
If the container accepts the keystroke, OLE will call the container's
IOleInPlaceFrame::TranslateAccelerator member function to translate
the message. The container may call the Windows TranslateAccelerator
and/or TranslateMDISysAccel functions to process the accelerator key,
or do its own special processing.
Modification Type: | Minor | Last Reviewed: | 3/3/2005 |
---|
Keywords: | kbprb kbprogramming KB104460 |
---|
|