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

PreTranslateMessage捕获组合键不能得问题

sfzhaolv 2010-07-20 07:39:56
代码如下:

BOOL CkeydemoDlg::PreTranslateMessage(MSG * pMsg)
{
if(WM_KEYDOWN == pMsg->message )
{
char nchar = pMsg->wParam;
BOOL bCtrl=::GetKeyState(VK_CONTROL)&0xF0000000;
BOOL bShift=::GetKeyState(VK_SHIFT)&0xF0000000;
BOOL bAlt=::GetKeyState(VK_MENU)&0xF0000000;


CString cszHotkey;
cszHotkey.Format(_T("%s%s%s%c"),bShift?_T("SHIFT + "):_T(""),
bCtrl?_T("CTRL +"):_T(""),bAlt ? _T("ALT + ") : _T(""),pMsg->wParam);

return true;
}
return false;
}

如果按下的是单个键,这样做是没有问题的。
如果按下的是组合键,比如“ctrl + x”,就只有ctrl会触发消息,也就是说pMsg->wParam的值是ctrl的虚拟键码。
请大家帮忙下,在此谢过。
...全文
578 点赞 收藏 14
写回复
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hustlaofan 2010-10-13
BOOL CADlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(WM_KEYDOWN == pMsg->message && _T('X') == pMsg->wParam)
{
if(GetKeyState(VK_CONTROL) < 0&&GetKeyState(_T('X')) < 0 )
{
AfxMessageBox(_T("Ctrl+X"));
}
}
return CDialog::PreTranslateMessage(pMsg);
}

回复
sfzhaolv 2010-07-21
悲剧了……,看错了,11楼的方法也不行。
到现在为止我来发一下我的测试结果。

楼上诸位说的
BOOL ctrlDown=GetAsyncKeyState(VK_CONTROL)<0;
来判断按键状态时没有问题的。
用wparam来判断也是没有问题的。
所有的前提是,我按下的是一个键的时候。
如果我按下 ctrl + F 这样的组合键,就失灵了。
包括:

short int statusCtrl=GetKeyState(VK_CONTROL);
short int statusX =GetKeyState('X');
if((statusCtrl & 0x80) == 0x80 && (statusX & 0x80) == 0x80)

表现是:他只能识别ctrl这一个键。
其它 alt + f 等也一样的,也只能识别alt键。
我用的vs2005 进行调试的,系统环境是xp sp3。
继续求高人指点。。
回复
sfzhaolv 2010-07-21
[Quote=引用 11 楼 visualeleven 的回复:]

C/C++ code


BOOL CADlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(WM_KEYDOWN == pMsg->message && _T('X') == pMsg->wPara……
[/Quote]
我发现要确实要用unicode来比较才行。看来是启用了unicode宏的缘故了
回复
Eleven 2010-07-20


BOOL CADlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(WM_KEYDOWN == pMsg->message && _T('X') == pMsg->wParam)
{
if(GetKeyState(VK_CONTROL) < 0)
{
AfxMessageBox(_T("Ctrl+X"));
}
}
return CDialog::PreTranslateMessage(pMsg);
}
回复
freelaxy 2010-07-20
我这样用:
BOOL ctrlDown=GetAsyncKeyState(VK_CONTROL)<0;
.....
回复
xingpacer 2010-07-20
帮忙顶一个,明天再看~
回复
sfzhaolv 2010-07-20
[Quote=引用 6 楼 dahaii0 的回复:]
固定某个组合键可以这样,以ctrl+F9为例
char nchar = pMsg->wParam;
if(nChar==VK_F9 && ((GetAsyncKeyState( VK_LCONTROL ) & 0x8000)))
{
MessageBox("ctrl+f9");
}
[/Quote]
实际上我本来就是采用的这种做法——但亲自实践后发现,这种做法是不行的。
但很奇怪,网上都是这么写的……
不知道有没有达人出来解释一下
回复
JoeBlackzqq 2010-07-20
学习了
回复
dahaiI0 2010-07-20
固定某个组合键可以这样,以ctrl+F9为例
char nchar = pMsg->wParam;
if(nChar==VK_F9 && ((GetAsyncKeyState( VK_LCONTROL ) & 0x8000)))
{
MessageBox("ctrl+f9");
}
回复
nbabest23 2010-07-20
BOOL CRF_CalibratorDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN)
{
short int statusCtrl=GetKeyState(VK_CONTROL);
short int statusX =GetKeyState('X');
if((statusCtrl & 0x80) == 0x80 && (statusX & 0x80) == 0x80)
{
//按组合键的代码
}
}
return CDialog::PreTranslateMessage(pMsg);
}
此代码绝对没有问题,我的就是这么写的
回复
fishion 2010-07-20
你用一个标志位来标记吧,如当按下按键时就m_bCtrlKey=TRUE,放开时就m_bCtrlKey=FALSE
回复
sfzhaolv 2010-07-20
WM_KEYDOWN 的lParam参数做判断?
还是没有看明白怎么用lparam做判断……
还请更详细的指点一下
回复
zyq5945 2010-07-20
WM_KEYDOWN 的lParam参数做判断
回复
zyq5945 2010-07-20
用这个试试
lParam
Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in the following table.
0-15
Specifies the repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative.
16-23
Specifies the scan code. The value depends on the OEM.
24
Specifies whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
25-28
Reserved; do not use.
29
Specifies the context code. The value is always 0 for a WM_KEYDOWN message.
30
Specifies the previous key state. The value is 1 if the key is down before the message is sent, or it is zero if the key is up.
31
Specifies the transition state. The value is always zero for a WM_KEYDOWN message.
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

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

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