我做了一个从CWnd继承的类 CTestWnd,响应两个消息
void CTestWnd::OnLButtonDown(...)
{
   SetFocus() ;
}
void CTestWnd::OnChar( UINT nChar, UINT nRepCnt,UINT nFlags )
{
   MessageBox("hello") ;
}
在一个对话框中创建他的一个实例,并在OnInitDialog中创建:
BOOL CTestDlg::OnInitDialog()
{
   ...
   m_testWnd.Create( NULL , NULL , WS_CHILD | WS_VISIBLE | WS_TABSTOP ,rc, this , ID_TEST) ;
}当焦点到CTestWnd窗口后,按一个字符键,跟踪时发现根本没有进入CTestWnd::OnChar(),后来试了一下,WM_KEYDOWN和WM_KEYUP都能接受到。
请问是怎么回事,请赐教。

解决方案 »

  1.   

    在PreTranslateMessage里面能不能获取呢?
    另外,确认你是否有输入。因为在类似pocketPC的模拟器下面,输入在一些情况下就被屏蔽掉了。
    你可以人为发一个按键事件试试看。
      

  2.   

    TranslateMessage的问题,不知道为什么会失败
      

  3.   

    用PreTranslateMessage捕获一下试试
      

  4.   

    聚焦到窗口是没有办法收到按键的消息的,自己用PreTranslateMessage来处理。
      

  5.   

    要有文本输入的控件才能接受到WM_CHAR
      

  6.   

    消息映射没有?在类声明里有没有
     DECLARE_MESSAGE_MAP ()在类定义里有没有
    BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
        ON_WM_LBUTTONDOWN ()
        ON_WM_CHAR()
    END_MESSAGE_MAP ()
      

  7.   

    被对话框的IsDialogMessage截取了
    建议在PreTranslateMessage判断如果是WM_KEYDOWN, WM_KEYUP
    重新调用一下TranslateMessage
      

  8.   

    或者这样, 重载PreTranslateMessage
    BOOL CXXXXDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    BOOL bRet = CDialog::PreTranslateMessage(pMsg);
             if (pMsg->hwnd == m_testWnd.GetSafeHwnd())
                return FALSE;
             else
                return bRet;
    }
      

  9.   

    问题解决了,多谢各位了在CTestWnd截获WM_GETDLDCODE就可以接收到了
    UINT CTestWnd::OnGetDlgCode() 
    {
       return CWnd::OnGetDlgCode() | DLGC_WANTCHARS ;
    }此消息决定了此窗口需要截获那些特殊消息,如TAB键消息。