Microsoft KB Archive/104460: Difference between revisions

From BetaArchive Wiki
m (Text replacement - ">" to ">")
m (Text replacement - "&" to "&")
 
Line 82: Line 82:
<pre class="codesample"> // Message loop for an OLE server.
<pre class="codesample"> // Message loop for an OLE server.
  //  
  //  
  while (GetMessage(&amp;msg, NULL, NULL))
  while (GetMessage(&msg, NULL, NULL))
     {
     {
     if (m_fInplaceActive)  // If currently active in place.
     if (m_fInplaceActive)  // If currently active in place.
         if (msg.message >= WM_KEYFIRST &amp;&amp; msg.message <= WM_KEYLAST)
         if (msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST)
             // If it is a "keystroke" message.
             // If it is a "keystroke" message.
             if (OleTranslateAccelerator(...) == NOERROR)
             if (OleTranslateAccelerator(...) == NOERROR)

Latest revision as of 11:24, 21 July 2020

Knowledge Base


Article ID: 104460

Article Last Modified on 3/3/2005



APPLIES TO

  • Microsoft OLE 2.0
  • Microsoft OLE 4.0, when used with:
    • Microsoft Windows NT 4.0
    • Microsoft Windows NT 3.51 Service Pack 5
    • Microsoft Windows NT 4.0
    • Microsoft Windows 95
    • Microsoft Windows 2000 Standard Edition



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.


Additional query words: 2.00 3.50 4.00

Keywords: kbprogramming kbprb KB104460