为什么收不到WM_CHAR消息

WindyLotus 2005-07-13 10:18:36
我做了一个从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都能接受到。
请问是怎么回事,请赐教。
...全文
267 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wcmj 2005-07-13
  • 打赏
  • 举报
回复
如楼上所说,正确的话应该响应的
smartcomplier 2005-07-13
  • 打赏
  • 举报
回复
消息映射没有?

在类声明里有没有
DECLARE_MESSAGE_MAP ()

在类定义里有没有
BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
ON_WM_LBUTTONDOWN ()
ON_WM_CHAR()
END_MESSAGE_MAP ()
dirdirdir3 2005-07-13
  • 打赏
  • 举报
回复
要有文本输入的控件才能接受到WM_CHAR
dirdirdir3 2005-07-13
  • 打赏
  • 举报
回复
聚焦到窗口是没有办法收到按键的消息的,自己用PreTranslateMessage来处理。
快乐鹦鹉 2005-07-13
  • 打赏
  • 举报
回复
很奇怪的问题。不知道被哪个玩意截了
oyljerry 2005-07-13
  • 打赏
  • 举报
回复
用PreTranslateMessage捕获一下试试
goodboyws 2005-07-13
  • 打赏
  • 举报
回复
TranslateMessage的问题,不知道为什么会失败
flintstone_cai 2005-07-13
  • 打赏
  • 举报
回复
在PreTranslateMessage里面能不能获取呢?
另外,确认你是否有输入。因为在类似pocketPC的模拟器下面,输入在一些情况下就被屏蔽掉了。
你可以人为发一个按键事件试试看。
WindyLotus 2005-07-13
  • 打赏
  • 举报
回复
问题解决了,多谢各位了

在CTestWnd截获WM_GETDLDCODE就可以接收到了
UINT CTestWnd::OnGetDlgCode()
{
return CWnd::OnGetDlgCode() | DLGC_WANTCHARS ;
}

此消息决定了此窗口需要截获那些特殊消息,如TAB键消息。
goodboyws 2005-07-13
  • 打赏
  • 举报
回复
或者这样, 重载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;
}
goodboyws 2005-07-13
  • 打赏
  • 举报
回复
被对话框的IsDialogMessage截取了
建议在PreTranslateMessage判断如果是WM_KEYDOWN, WM_KEYUP
重新调用一下TranslateMessage

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧