响应键盘消息
一:首先介绍键盘消息
系统消息:ALT,F1,——F24等,是由系统内部处理的,程序本身就存在,比如F1是帮助键。
WM_SYSKEYDOWN
WM_SYSKEYUP
WM_SYSCHAR
非系统消息:
是由我们自己加上去的,
WM_KEYDOWN
WM_KEYUP
WM_CHAR
二、添加消息
(一般WM_KEYDOWN),在消息响应函数
OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
有三个变量,nChar这是虚拟键代码,另外两个不常用,用时参看MSDN。
如果要响应组合键,可以用GetAsyncKeyState()检测按键状态
如:
case VK_UP:
if (GetAsyncKeyState(VK_LSHIFT))
{
// 左shift+up
}
break;
三:OnKeyDown不响应的原因:
只是这个消息在到达窗体之前,已经被它的子控件捕获了,如果将窗体中的所有控件都删除,窗体就会捕获到这个消息,但要注意的是,MFC为了实现在窗体上切换子控件的焦点,已经将
VK_TAB,VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN进行了处理,同时VK_RETURN也被系统捕获用来处理相应的确定事件,所以即使窗体中没控件,这几个键还是无法捕获
也就是说,一个窗体仅在它没有可视和有效的控件时,才能响应OnKeyDown。
四:具体的解决方法(按键响应方法)
可以调用窗体的PreTranslateMessage函数来实现,具体代码如下:
BOOL
CMeetingDlg::PreTranslateMessage(MSG* pMsg)
{
if
(pMsg->message==WM_KEYDOWN)
{
switch
(pMsg->wParam)
{
case
VK_F1:
if
(::GetKeyState(VK_CONTROL)<0)
{
AfxMessageBox("ss");
}
break;
case VK_F2:
if (::GetKeyState(VK_CONTROL)<0)
{
AfxMessageBox("ss");
}
break;
}
}
return
CDialog::PreTranslateMessage(pMsg);
}
***********************************************************************************
在MFC(Microsoft Foundation Class)对响应消息进行了封装,
可以通过重载虚函数PreTranslateMessage()对所关心的消息进行截取与响应:
以下对截取与响应键盘 Enter 消息的截取与响应
这是对话框的响应键盘 Enter 消息方式:
BOOL
C**Dlg::PreTranslateMessage(MSG* pMsg)
{
//判断是否为键盘消息
if (WM_KEYFIRST <= pMsg->message
&& pMsg->message <=
WM_KEYLAST)
{
//判断是否按下键盘Enter键
if(pMsg->wParam==VK_RETURN)
{
return
TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
这是View视图类响应键盘 Enter 消息的方式:
BOOL C**View::PreTranslateMessage(MSG* pMsg)
{
if (WM_KEYFIRST <=
pMsg->message && pMsg->message <=
WM_KEYLAST)
{
if(pMsg->wParam==VK_RETURN )
{
return TRUE;
}
}
return
CFormView::PreTranslateMessage(pMsg);
}
在上面的代码中,首先将pMsg->message所表示的消息同WM_KEYFIRST 和WM_KEYLAST比较,确定是键盘消息,然后通过消息参数pMsg->wParam的值来判断是否是回车键(VK_RETURN,虚拟键码可以下面相关资料中查到)。
keybd_event FunctionSynthesizes a keystroke. The system can use such a synthesized keystroke to generate a WM_KEYUP or WM_KEYDOWN message. The keyboard driver's interrupt handler calls the keybd_event function.
Note This function has been superseded. Use SendInput instead.
貌似已经被SendInput取代了,呵呵,改天再研究吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现