VC控件响应键盘按键问题

时间:2023-02-19 23:47:21
VC控件响应键盘按键问题

如上图,我有10个button控件。当前选中的是第一个按钮,如果我按键盘上的向右键(VK_RIGHT),这时光标会选中第二个按钮。同样如果我按向下键(VK_DOWN),希望光标能移到第二排,但实际上光标又向右移了一位,而不是向下移。
请问有什么方法可以实现按向下键(VK_DOWN)光标能移到第二排的功能呢?

10 个解决方案

#1


WM_CHAR消息,你可以看一下

#2


在初始化时记录当前 为焦点的按键
在WN_CHAR消息里面,判断按下的键值
如果是 VK_DOWN 按下 则 利用SetFocus()改变对应的 按键焦点。
这样做 你需要 建立虚拟的  坐标系统,还要判断 是否到达最下面的按键 或最右边的按键。
等等~~~~ VC控件响应键盘按键问题

#3


顶一下~ VC控件响应键盘按键问题

#4


在 WM_KEYDOWN 消息中处理。 根据消息参数 nChar 就可以判断按了哪个方向键盘:
if(nChar == VK_LEFT)
{

}
else if(nChar == VK_RIGHT)
{

}
...
WM_KEYDOWN 在按住键盘的时候连续发生事件,也可以考虑 WM_KEYUP 中处理,仅当抬起按键时发生。 建议使用 WM_KEYDOWN

#5


引用 2 楼 dufanfance1115 的回复:
在初始化时记录当前 为焦点的按键
在WN_CHAR消息里面,判断按下的键值
如果是 VK_DOWN 按下 则 利用SetFocus()改变对应的 按键焦点。
这样做 你需要 建立虚拟的  坐标系统,还要判断 是否到达最下面的按键 或最右边的按键。
等等~~~~


谢谢回复,可是在我当前选中一个button的情况下,我的窗口类不能再接收到WM_CHAR消息了,这个消息应该是被CButton类获取到了吧,那我应该在哪里去获取WM_CHAR消息或者WM_KEYDOWN消息?

#6


引用 4 楼 fairsoft 的回复:
在 WM_KEYDOWN 消息中处理。 根据消息参数 nChar 就可以判断按了哪个方向键盘:
if(nChar == VK_LEFT)
{

}
else if(nChar == VK_RIGHT)
{

}
...
WM_KEYDOWN 在按住键盘的时候连续发生事件,也可以考虑 WM_KEYUP 中处理,仅当抬起按键时发生。 建议使用 WM_KEY……

疑问同上,谢谢!

#7


不知你这到底是什么程序。
如果MFC的话就很好办了,可以重载 PreTranslateMessage

BOOL CdlgtmpDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(pMsg->message == WM_KEYDOWN)
{
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
方法其实很多的,比如用钩子、子类处理、重写按钮类等。 在适当的位置截取消息即可。

#8


引用 7 楼 fairsoft 的回复:
不知你这到底是什么程序。
如果MFC的话就很好办了,可以重载 PreTranslateMessage

BOOL CdlgtmpDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(pMsg->message == WM_KEYDOWN)
{
return TRUE;
}
r……

谢谢,问题已解决,可以用PreTranslateMessage拦截消息,但是在界面有按钮时WM_CHAR和WM_KEYDOWN都无法获取到键盘按下的值。经过测试,当界面上有按钮控件时WM_CHAR和WM_KEYDOWN消息没有响应,但如果将按钮全部都移除时,这时可以响应WM_CHAR和WM_KEYDOWN消息。所以我猜应该是有控件的时候,该消息被投递到该控件类去处理了,而没有交给当前窗口。

#9


恩恩,不错。受教了!

#10


键盘和鼠标消息是发给具有焦点的窗口的。当对话框中有控件时,一般控件具有焦点。
可以调用 SetFocus 函数更改焦点。   

#1


WM_CHAR消息,你可以看一下

#2


在初始化时记录当前 为焦点的按键
在WN_CHAR消息里面,判断按下的键值
如果是 VK_DOWN 按下 则 利用SetFocus()改变对应的 按键焦点。
这样做 你需要 建立虚拟的  坐标系统,还要判断 是否到达最下面的按键 或最右边的按键。
等等~~~~ VC控件响应键盘按键问题

#3


顶一下~ VC控件响应键盘按键问题

#4


在 WM_KEYDOWN 消息中处理。 根据消息参数 nChar 就可以判断按了哪个方向键盘:
if(nChar == VK_LEFT)
{

}
else if(nChar == VK_RIGHT)
{

}
...
WM_KEYDOWN 在按住键盘的时候连续发生事件,也可以考虑 WM_KEYUP 中处理,仅当抬起按键时发生。 建议使用 WM_KEYDOWN

#5


引用 2 楼 dufanfance1115 的回复:
在初始化时记录当前 为焦点的按键
在WN_CHAR消息里面,判断按下的键值
如果是 VK_DOWN 按下 则 利用SetFocus()改变对应的 按键焦点。
这样做 你需要 建立虚拟的  坐标系统,还要判断 是否到达最下面的按键 或最右边的按键。
等等~~~~


谢谢回复,可是在我当前选中一个button的情况下,我的窗口类不能再接收到WM_CHAR消息了,这个消息应该是被CButton类获取到了吧,那我应该在哪里去获取WM_CHAR消息或者WM_KEYDOWN消息?

#6


引用 4 楼 fairsoft 的回复:
在 WM_KEYDOWN 消息中处理。 根据消息参数 nChar 就可以判断按了哪个方向键盘:
if(nChar == VK_LEFT)
{

}
else if(nChar == VK_RIGHT)
{

}
...
WM_KEYDOWN 在按住键盘的时候连续发生事件,也可以考虑 WM_KEYUP 中处理,仅当抬起按键时发生。 建议使用 WM_KEY……

疑问同上,谢谢!

#7


不知你这到底是什么程序。
如果MFC的话就很好办了,可以重载 PreTranslateMessage

BOOL CdlgtmpDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(pMsg->message == WM_KEYDOWN)
{
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
方法其实很多的,比如用钩子、子类处理、重写按钮类等。 在适当的位置截取消息即可。

#8


引用 7 楼 fairsoft 的回复:
不知你这到底是什么程序。
如果MFC的话就很好办了,可以重载 PreTranslateMessage

BOOL CdlgtmpDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(pMsg->message == WM_KEYDOWN)
{
return TRUE;
}
r……

谢谢,问题已解决,可以用PreTranslateMessage拦截消息,但是在界面有按钮时WM_CHAR和WM_KEYDOWN都无法获取到键盘按下的值。经过测试,当界面上有按钮控件时WM_CHAR和WM_KEYDOWN消息没有响应,但如果将按钮全部都移除时,这时可以响应WM_CHAR和WM_KEYDOWN消息。所以我猜应该是有控件的时候,该消息被投递到该控件类去处理了,而没有交给当前窗口。

#9


恩恩,不错。受教了!

#10


键盘和鼠标消息是发给具有焦点的窗口的。当对话框中有控件时,一般控件具有焦点。
可以调用 SetFocus 函数更改焦点。