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

PreTranslateMessage WM_KEYDOWN 中如何区分大小写

hnicypb V-Checker 开发组长/高级工程师/技术专家  2010-07-30 12:10:56
在PreTranslateMessage中处理WM_KEYDOWN事件

输入字符的判断为 pMsg->wParam>32 && pMsg->wParam<128

但是字符貌似都是大写,不知道该如何判断字符是大写状态还是小写
...全文
532 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dahaiI0 2010-07-30
貌似还要看是否按下了SHIFT键``
回复
wltg2001 2010-07-30
[Quote=引用 5 楼 jasonm2008 的回复:]
大小写的ASCII 码不一样!
[/Quote]
好多说ASCII的,WM_KEYDOWN消息哪来的ASCII吗,都是虚拟键值。我发现大家都不看MSDN啊。
回复
jasonM2008 2010-07-30
大小写的ASCII 码不一样!
回复
wltg2001 2010-07-30
给段例子代码给你:
BOOL CCodeDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
CString work;
if(pMsg->message==WM_KEYDOWN && pMsg->wParam!=VK_CAPITAL)
{
if (GetKeyState(VK_CAPITAL))
AfxMessageBox(_T("大写键开"));
else
AfxMessageBox(_T("小写"));

}
return CDialog::PreTranslateMessage(pMsg);
}
回复
wltg2001 2010-07-30
直接用WM_KEYDOW的参数应该是不行的,用GetKeyState判断大小写锁定键的状态
回复
hahaking119 2010-07-30
大写不是65到90么,直接判断字符不就可以了,'A'~'Z'
回复
liyinlei 2010-07-30
大小写字母的ascii码值是不同的。大写A~Z 是 65~90 . 小写a~z 是 97~122
回复
hnicypb 2010-07-30
确实是不明智的做法。。。要控制的内容太多。大小写,中文字符,退格删除,选中删除,等等。。。

放弃了。。。另想他法

谢各位。。。
回复
hsc456 2010-07-30
易爷, 我来啦, 哈哈...

看老衲怎么教育你.

BOOL CTestaDlg::PreTranslateMessage(MSG* pMsg)
{
if(::GetDlgCtrlID(pMsg-> hwnd)==IDC_EDIT1 && pMsg-> message == WM_CHAR)
{
if(IsCharLower(pMsg-> wParam))
{
AfxMessageBox("小写");
}
if (IsCharUpper(pMsg-> wParam))
{
AfxMessageBox("大写");
}
}

return CDialog::PreTranslateMessage(pMsg);
}

注意 : WM_CHAR 和 WM_KEYDOWN 的区别.

01. WM_KEYDOWN响兴所有按键消息(Alt键///Print Screen SysRq截屏键不响兴)

02. WM_CHAR区分大小写和SHIFT+数字,而WM_KEYDOWN只返回大写字母没有SHIFT作用

03. WM_CHAR消息只响应字符按键和部分控制符
(有很多控制字符不响应 不响应的键如下:
Tab键///Caps Lock大小写切换键///ESC键///F1~F12///SHIFT///CTRL///ALT///方向键///方向键上方键盘区///Num Lock键)

msdn:
The WM_CHAR message is posted to the window with the keyboard focus when a WM_KEYDOWN message is translated by the TranslateMessage function. The WM_CHAR message contains the character code of the key that was pressed.

WM_CHAR是由WM_KEYDOWN消息translate()之后产生的,然后再发送给窗口过程。比如说按下E键后产生WM_KEYDOWN消息,经过translate()处理后产生变成WM_KEYDOW,WM_CHAR 2 个消息传递给窗口过程。
回复
lazy_2010 2010-07-30
使用 GetKeyState 或者 GetAsyncKeyState,参数,同时考虑 VK_SHIFT/VK_CAPITAL。
回复
BOOL CReerDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
CString str;
if(pMsg->message==WM_CHAR)
{
if(pMsg->wParam >= 'a' && pMsg->wParam <= 'z')
{
str.Format("小写,%d",pMsg->wParam);
AfxMessageBox(str);
}
else if(pMsg->wParam >= 'A' && pMsg->wParam <= 'Z')
{
str.Format("大写,%d",pMsg->wParam);
AfxMessageBox(str);
}
}
return CDialog::PreTranslateMessage(pMsg);
}
回复
liyinlei 2010-07-30
到WM_CHAR消息里判断不就行了。

在WM_KEYDOWN里做累不累
回复
小写字母是在 A的ascii上面加 32
但是winuser.h中的定义,这个值不是小写字母,是别的字符....
看到下面的字义了吗

#define VK_NUMPAD1 0x61
#define VK_NUMPAD2 0x62
#define VK_NUMPAD3 0x63
#define VK_NUMPAD4 0x64
#define VK_NUMPAD5 0x65
#define VK_NUMPAD6 0x66
#define VK_NUMPAD7 0x67
#define VK_NUMPAD8 0x68
#define VK_NUMPAD9 0x69
#define VK_MULTIPLY 0x6A
#define VK_ADD 0x6B
#define VK_SEPARATOR 0x6C
#define VK_SUBTRACT 0x6D
#define VK_DECIMAL 0x6E
回复
各位,还是那红猪说得对
各位看下面这个函数


BOOL CdemoDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message==WM_KEYDOWN)
{
TRACE("wParam==>%c\r\n",pMsg->wParam);
}
return CDialog::PreTranslateMessage(pMsg);
}


随便你怎么按键盘上面字母键 你能打印出 小写字母吗?
在 vs的 WinUser.h文件中的定义,有定义小写字母吗?只定义了大写字母...

/*
* VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39)
* 0x40 : unassigned
* VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A)
*/
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

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

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