layout | title | permalink |
---|---|---|
page |
Q133308: PRB: WM_HELP Message Not Received When F1 Pressed on Menu |
/kb/133/Q133308/ |
{% raw %}
Article: Q133308
Product(s): Microsoft C Compiler
Version(s): winnt:
Operating System(s):
Keyword(s): kbcode kbnokeyword kbMenu kbMFC kbVC210 kbVC220 kbprb kbGrpDSMFCATL
Last Modified: 29-AUG-2001
-------------------------------------------------------------------------------
The information in this article applies to:
- The Microsoft Foundation Classes (MFC), used with:
- *EDITOR Please do not choose this product*Microsoft Visual C++ 32-bit Edition* use 241, 265, 225, versions 2.1, 2.2
-------------------------------------------------------------------------------
SYMPTOMS
========
Windows 95 and Windows NT version 3.51 support a new Windows message, WM_HELP.
If a menu is active when F1 is pressed, WM_HELP should be sent to the window
associated with the menu by Windows. However, with an MFC application, the
WM_HELP message never gets sent.
This problem does not occur in Visual C++ 4.0 or later
CAUSE
=====
MFC defines default handling of the F1 key to bring up help for menu items. For
more information about F1 help within an MFC application, please see MFC
Technote #28 and the Scribble Tutorial.
The F1 key is handled by the CWinThread::ProcessMessageFilter() function. It
causes the MFC function OnCommandHelp() to be called, which brings up help for
the currently selected menu item.
RESOLUTION
==========
To work around this behavior, either use the help system provided by MFC, or
override ProcessMessageFilter() for your CWinApp-derived class to by-pass the
MFC processing of the F1 key. For example, the code might look like this:
static BOOL AFXAPI IsHelpKey(LPMSG lpMsg)
// return TRUE only for non-repeat F1 keydowns.
{
return lpMsg->message == WM_KEYDOWN &&
#ifndef _MAC
lpMsg->wParam == VK_F1 &&
#else
lpMsg->wParam == VK_HELP &&
#endif
!(HIWORD(lpMsg->lParam) & KF_REPEAT) &&
GetKeyState(VK_SHIFT) >= 0 &&
GetKeyState(VK_CONTROL) >= 0 &&
GetKeyState(VK_MENU) >= 0;
}
BOOL CYourApp::ProcessMessageFilter(int code, LPMSG lpMsg)
{
if (IsHelpKey(lpMsg))
return FALSE; // pass on to Windows to do WM_HELP
// processing - don't use default MFC
// help processing
return CWinApp::ProcessMessageFilter(code, lpMsg);
}
REFERENCES
==========
For more information about adding F1 help to your application, please see the
following references:
- MFC Technote#28 in the online documentation
- Scribble tutorial in the online documentation
- The MFC Encyclopedia under the "Help" topic
Additional query words: 2.10 2.20 3.1 3.10 3.2 3.20 4.00 Win95
======================================================================
Keywords : kbcode kbnokeyword kbMenu kbMFC kbVC210 kbVC220 kbprb kbGrpDSMFCATL
Technology : kbAudDeveloper kbMFC
Version : winnt:
Issue type : kbprb
=============================================================================
{% endraw %}