高手请进 谢谢回答

huanyun 2003-09-11 07:54:31
如果在WM_KEYDOWN消息处理中得到 WM_CHAR消息的nChar值
需要考虑 大小写 SHIFT等
...全文
37 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
huanyun 2003-09-13
  • 打赏
  • 举报
回复
但是好象是wm_keydown wm_keyup两个消息都需要::TranslateMessage(pMsg);
谢谢大家的回答 结贴
ruihuahan 2003-09-12
  • 打赏
  • 举报
回复
bcpl(林平之,感冒中..) 说的有理
WM_CHAR是用TranslateMessage(...)对WM_KEYDOWN进行翻译处理后,系统发送给窗口的消息。
WM_KEYDOWN只包含代表按健的虚健码,不包含代表字符的nchar信息。
nonocast 2003-09-11
  • 打赏
  • 举报
回复
大小写应该不难
做一个switch就可以了
case 'A':
case 'a':
...
break;

GetKeyState()就可以了
和楼上想的一样
呵呵

May you succeed!
  • 打赏
  • 举报
回复
查询特殊键状态
::GetKeyState(VK_SHIFT/VK_CONTRL)<0,Shift/Ctrl被按下。
::GetKeyState(VK_MENU)<0,或查询nFlags参数,或接收WM_SYSKEYDOWN得到Alt.
::GetKeyState(L/M/RBUTTON)<0来检验鼠标被按下。
::GetKeyState(VK_NUMLOCK)&0x01 !=0被锁定。
此时只检验最后一位,必须屏蔽掉前面的位
::GetAsyncKeyState是检验现在的状态(新的),上边的指消息产生时(旧的)。
techlibin 2003-09-11
  • 打赏
  • 举报
回复
GetKeyState()函数可以试试看
bcpl 2003-09-11
  • 打赏
  • 举报
回复
假设是对话框,如果在PreTranslateMessage里处理

BOOL CYourDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
CDialog::PreTranslateMessage(pMsg);
::TranslateMessage(pMsg);
MSG msg;
PeekMessage(&msg, m_hWnd, 0, 0, PM_NOREMOVE);
if(msg.message == WM_CHAR)
{
CString sInfo;
sInfo.Format("WM_CHAR: nChar = %d", msg.wParam);
AfxMessageBox(sInfo);
}
return TRUE;
}

return CDialog::PreTranslateMessage(pMsg);
}

如果在WM_KEYDOWN里处理

void CYourDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
MSG msg;
msg.message = WM_KEYDOWN;
msg.wParam = nChar;
msg.lParam = MAKELPARAM(nRepCnt, nFlags);

::TranslateMessage(&msg);
PeekMessage(&msg, m_hWnd, 0, 0, PM_NOREMOVE);
if(msg.message == WM_CHAR)
{
CString sInfo;
sInfo.Format("WM_CHAR: nChar = %d", msg.wParam);
AfxMessageBox(sInfo);
}

CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
应该适用于所有CWnd对象,自己试一试
huanyun 2003-09-11
  • 打赏
  • 举报
回复
toascii()好象可以 但总觉得取得的SHIFT键的状态不可靠
huanyun 2003-09-11
  • 打赏
  • 举报
回复
在WM_KEYDOWN里面已经有WM_CHAR的虚拟键值 以及部分状态信息
虽然不可以直接映射到nChar但是 是可以通过某种方式得到nChar的
cgsw12345 2003-09-11
  • 打赏
  • 举报
回复
學習!
whoishere 2003-09-11
  • 打赏
  • 举报
回复
WM_CHAR只会响应普通按键和CTRL+普通按键的消息,
如果按下SHIFT或者ALT,是不会发送WM_CHAR消息的

afx_msg void OnChar( UINT nChar, UINT nRepCnt, UINT nFlags );
其中nChar对应的按键的ASCII码
(对CTRL+按键也是一样,就是CTRL+按键的ASCII码,例如CTRL+a的ASCII码即为1)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

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