导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • VC/MFC界面
  • VC/MFC 进程
  • VC/MFC 数据库
  • VC++技术资源

怎么没有收不到键盘消息?

ffll 2001-05-27 12:15:00
我做了一个计算器,在里面定义了几个CBUTTON,一个CEDIT。可是奇怪的我想接收键盘消息,映射了WM_CHAR,WM_KEYDOWN,调试的时候发现按键盘根本不会调用消息映射函数?请问各位大侠怎么回事?
...全文
125 点赞 收藏 14
写回复
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
realgoodniuniu 2001-06-04
你遇到的情况我也遇到过的!!后来我使用钩子去解决的!
用一个键盘钩子去管理该进程的键盘消息!
方法如下:
HHOOK hHook;



hHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,NULL,GetCurrentThreadId());//设置钩子



LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam)
{
if(lParam&0x80000000)
{
switch(wParam)
{
case VK_LEFT:
...
break;

case VK_RIGHT:
....
break;

case VK_DOWN:
....
break;

case VK_UP:
....
break;
case .....:
break;

default: break;
}
}
return(CallNextHookEx(hHook,code,wParam,lParam));
}
回复
ffll 2001-05-31
PreTranslateMessage函数的作用是什么?为什么我的程序中,按下一个键不会触发OnKeyDown处理函数,只能在PreTranslateMessage中截获?
回复
realgoodniuniu 2001-05-31
用键盘hook!!!!
回复
joknan 2001-05-31
我程序上的,一点也没变的抓过来,参考一下吧.
回复
joknan 2001-05-31
BOOL CSF1Dlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
switch(pMsg->wParam)
{
case VK_DELETE:
{
int iState;
if(m_ListCtrl.GetSelectedCount()>=1)
{
for(m_iCurList=m_ListCtrl.GetItemCount()-1;m_iCurList>=0;m_iCurList--)
{
iState=m_ListCtrl.GetItemState(m_iCurList,LVIS_SELECTED);
if(iState!=0)
{
m_ListCtrl.DeleteItem(m_iCurList);
}
}
if(m_ListCtrl.GetItemCount()==0)
{
m_nFileTime=0;
}
}
return TRUE;
}
break;

case VK_RETURN:
return TRUE;
break;

case VK_ESCAPE:
return TRUE;
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
回复
fzzzf 2001-05-31
楼上的,能具体点吗?为什么我在此时改变pMsg->lParam的scan值,但显示的还是我敲的字符呢?如我敲1,显示的还是1,可明明我执行了pMsg->lParam +=0x00010000
回复
wangjue28 2001-05-27
可能是其他的按纽得不到输入焦点吧,按纽得到焦点没有把他还给父窗口
回复
ffll 2001-05-27
不行啊,重载之后程序什么消息都不响应了!
回复
iProgram 2001-05-27
在PreTranMessage中截获pMsg->message==WM_KEYDOWN
回复
wangyanjiangjjj 2001-05-27
是这样的:
BOOL CCalDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message == WM_KEYDOWN)
{
//判断当前的焦点所在位置,并进行相应处理
...
}
return CDialog::PreTranslateMessage(pMsg);
}
回复
ffll 2001-05-27
是这样吗?
BOOL CCalDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
pMsg->message=WM_KEYDOWN;
return CDialog::PreTranslateMessage(pMsg);
}

这样不行
回复
eggplant 2001-05-27
如果你是使用Dialog类作为CButton和CEdit控件的容器,那么必须在Dialog类的PreTranMessage函数中截获pMsg->message==WM_KEYDOWN 才行。
回复
seesi 2001-05-27
还要调用默认的基类的PreTranMessage函数
回复
飞行兔子 2001-05-27
是不是没有调用基类的PreTranMessage函数?
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……