关于MFC实现键盘捕获的问题

cyywin 2010-04-19 03:38:06
不知道大家用过SSCOM32这个串口调试工具。
当选择16进制的时候会捕获键盘键盘的输入,如果输入值非0~9或a~f或A~F就会提示。
我的方法是重载PreTranslateMessage函数,加入判断语句
if(pMsg->message==WM_KEYDOWN)
{
if( pMsg->wParam<'0' || (pMsg->wParam>'9'&&pMsg->wParam<'A') || (pMsg->wParam>'F'&&pMsg->wParam<'a') || pMsg->wParam>'f' )
……
}
可是出现两个问题:
1。按下任何一个键盘都会进行判断,可是我只想捕获能输入编辑框的值进行判断。
2。小键盘输入的数字无法通过此判断语句。

我知道我的方法是错误的,请问正确的方法是什么。
...全文
350 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cyywin 2010-04-23
  • 打赏
  • 举报
回复
感谢大家的关注,经过一番尝试我自己弄好了。
程序在发送WM_KEYDOWN后,如果是字符消息还会接着发送WM_CHAR。
只要将判断语句中的WM_KEYDOWN改成WM_CHAR就能屏蔽大部分按键消息,应为它只捕获字符消息。
当然还有一些消息需要屏蔽,具体请看下面的代码吧:

if( (GetFocus()==GetDlgItem(IDC_EDIT)) &&
m_ctrlHexSend.GetCheck() &&
(pMsg->message==WM_CHAR)
)
{
switch (pMsg->wParam) {
case 0x08:
//backsapce,必须
break;
case 0x0A:
//linefeed(ctrl+Enter),必须
break;
case 0x1B:
//escape,由于先执行退出,实际不会到这里
break;
case 0x09:
//tab,由于先执行焦点转移, 实际不会到这里
break;
case 0x0D:
//carriage return(Enter),必须
break;
default://Process displayable characters
if( pMsg->wParam<'0' || (pMsg->wParam>'9'&&pMsg->wParam<'A') || (pMsg->wParam>'F'&&pMsg->wParam<'a') || pMsg->wParam>'f' )
{
AfxMessageBox("请输入十六进制数!");
return true;
}
break;
}
}
cyywin 2010-04-23
  • 打赏
  • 举报
回复
2楼的方法固然可以,能不能麻烦把系统键贴出来呢?
难道没有更好的方法吗,比如有没有属性来区别系统键和普通输入的键?
shanglihong 2010-04-19
  • 打赏
  • 举报
回复
友情帮顶,友情帮顶
muyiyj 2010-04-19
  • 打赏
  • 举报
回复
PreTranslateMessage 这个函数你是放在对话框中吗?
我的想法是,把这个PreTranslateMessage先写在app中,然后在对话框中也来接收PreTranslateMessage这个消息,然后通过判断如果焦点在编辑控件上,就处理PreTranslateMessage传来的按键。
小键盘没研究过,你在PreTranslateMessage函数入口处加断点,按小键盘,看看传来的消息是什么,添加进去就可以了。
Eleven 2010-04-19
  • 打赏
  • 举报
回复

BOOL CXXX:PreTranslateMessage(MSG* pMsg)
{
if(GetDlgItem(IDC_EDIT)->GetSafeHwnd() == pMsg->hwnd && WM_KEYDOWN == pMsg->message)
{
if((pMsg->wParam >= '0' && pMsg->wParam <= '9') || (pMsg->wParam >= 'a' && pMsg->wParam <= 'f') || (pMsg->wParam >= 'A' && pMsg->wParam <= 'Z'))
{
...

return TRUE;
}
}
return CXXX:PreTranslateMessage(pMsg);
}
z8y8x 2010-04-19
  • 打赏
  • 举报
回复
你可以把你不要的键屏蔽啊,如系统键等,直接return不进入判别就行了
switch(pMsg->wParam)
case VK_F1:
case VK_F2:
case VK_F3:
..........
bread;
................
类似的
soswaidao 2010-04-19
  • 打赏
  • 举报
回复
友情帮顶,友情帮顶

15,979

社区成员

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

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