高分求解 一个关于“响应键盘消息的问题”

时间:2021-07-02 07:55:56
我在编写一个基于对话框的程序时,需要处理键盘的消息,我添加的是WM_KEYDOWN消息,处理代码如下:
    void CChessDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
     MessageBox("keydown");
     CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
   但是,不管我怎样按键盘都没有执行这段程序;后我将程序生成的按钮和静态文本框都删除,再测试程序发现执行了这段代码。
   请问这是怎么回事?怎样解决这个问题? 谢谢!

9 个解决方案

#1


我倒,MESSAGEBOX可以么写吗?
我没见过

#2


在CChessDlg::PretranslateMessage里处理


BOOL CChessDlg::PreTranslateMessage(MSG* pMsg) 
{
if(pMsg->message == WM_KEYDOWN)
{
 MessageBox("keydown");
}
return CDialog::PreTranslateMessage(pMsg);
}

#3


CWnd::MessageBox可以这么写。

#4


是不是因为输入焦点在button上,所以dialog认为keydown消息是属于button的,所以传递给button处理。
但是,我用SetFocus()尝试过,发现dialog不能拥有输入焦点,输入焦点还是在button上。
那么,当没有button的时候,dialog为什么又认为keydown消息是属于自己的了,它可是没有输入焦点的东东啊?

#5


同意bcpl(林平之)的做法,在基于对话框的程序中,若要响应键盘消息,就要在PreTranslateMessage()响应键盘消息。我也不知道为什么,但是这样就可行的。

#6


WM_KWYDOWN应该是被拥有输入焦点控件截获了,但是控件都有自己的窗口过程,这个窗口过程会把WM_KEY翻译成通知消息发送给父窗口,所以不会执行到你在dialog类中定义的消息处理函数。PreTranslageMessage()是由CWinAPP在把消息发送给窗口过程之前执行的,所以会截获任何消息。
不知道说明白了没有。

#7


PreTranslateMessage是消息必经之路(sendmessage方式消息的除外),而CYourWnd::OnKeyDown是特定于该窗口的消息才被调用,当对话框上有可以获取焦点的子窗口时,总有一个子窗口作为焦点子窗口,消息被送到当前焦点子窗口,只有找不到可以焦点子窗口时才直接调用父窗口的OnKeyDown

#8


同意 bcpl(林平之) 的做法,
同意  ruihuahan(飞不起来的笨鸟) 的解释

#9


多谢了!

#1


我倒,MESSAGEBOX可以么写吗?
我没见过

#2


在CChessDlg::PretranslateMessage里处理


BOOL CChessDlg::PreTranslateMessage(MSG* pMsg) 
{
if(pMsg->message == WM_KEYDOWN)
{
 MessageBox("keydown");
}
return CDialog::PreTranslateMessage(pMsg);
}

#3


CWnd::MessageBox可以这么写。

#4


是不是因为输入焦点在button上,所以dialog认为keydown消息是属于button的,所以传递给button处理。
但是,我用SetFocus()尝试过,发现dialog不能拥有输入焦点,输入焦点还是在button上。
那么,当没有button的时候,dialog为什么又认为keydown消息是属于自己的了,它可是没有输入焦点的东东啊?

#5


同意bcpl(林平之)的做法,在基于对话框的程序中,若要响应键盘消息,就要在PreTranslateMessage()响应键盘消息。我也不知道为什么,但是这样就可行的。

#6


WM_KWYDOWN应该是被拥有输入焦点控件截获了,但是控件都有自己的窗口过程,这个窗口过程会把WM_KEY翻译成通知消息发送给父窗口,所以不会执行到你在dialog类中定义的消息处理函数。PreTranslageMessage()是由CWinAPP在把消息发送给窗口过程之前执行的,所以会截获任何消息。
不知道说明白了没有。

#7


PreTranslateMessage是消息必经之路(sendmessage方式消息的除外),而CYourWnd::OnKeyDown是特定于该窗口的消息才被调用,当对话框上有可以获取焦点的子窗口时,总有一个子窗口作为焦点子窗口,消息被送到当前焦点子窗口,只有找不到可以焦点子窗口时才直接调用父窗口的OnKeyDown

#8


同意 bcpl(林平之) 的做法,
同意  ruihuahan(飞不起来的笨鸟) 的解释

#9


多谢了!