BOOL   CDMSEdit::PreTranslateMessage(   MSG*   pMsg   )
{  
/**
*   编辑框快捷键操作
*/
if(pMsg-> message==WM_KEYDOWN   )
{  
if(   (   GetKeyState(   VK_CONTROL   )   &   0xFF00   )   ==0xFF00   )
{
/**
*   全选
*/
if(   pMsg-> wParam   == 'A'   ||   pMsg-> wParam   == 'a')
{
this-> SetSel(   0,   -1   );
...这一段是没有问题的,当ctrl键按下的时候,判断pMsg-> wParam  是不是等于 'A',没有问题
主要是想判断ctrl+c.ctrl+a之类的操作
但是,把检测放到WM_CHAR消息中的时候,
当按下ctrl+a,pMsg-> wParam的值是1
Ctrl+C,pMsg-> wParam值是3,我惶惑了

解决方案 »

  1.   

    用spy++看也是,WM_KEYDOWN中pMsg-> wParam是43,
    在wm_char中pMsg-> wParam是1
      

  2.   

    即使我知道了
    A对应的是1
    B对应的是2
    依此类推,那我也不想写
    if (nChar==1 || nChar == 3)
    这样,难道没给出宏/枚举之类的东西吗
      

  3.   

    我试过,不像楼主说的那样喔,我的情况是,如果是 WM_CHAR 的话,可以从 wParam 处得出按下字符的代码,例如按 a 是 97 , A 是 65
    但如果是 WM_KEYDOWN 的话,无论按 a 与 A ,wParam 都是 65
      

  4.   

    感觉lz在做组合快捷键哈
    你可以用
    if ( ( pMsg->wParam >= '0'
    && pMsg->wParam <= '9' )
    || ( pMsg->wParam >= VK_NUMPAD0
    && pMsg->wParam <= VK_NUMPAD9 )
    || ( pMsg->wParam == VK_RETURN ))
    这种通过x<y<z的形式来简化下。
      

  5.   

    我试的是按下ctrl再按A,你是不是直接按A呀
    ( GetKeyState( VK_CONTROL ) & 0xFF00 ) ==0xFF00
      

  6.   

    回6楼,是的,我是按shift而得出的结论.
    按control的话,的确是你说的那样看来要判断组合键就要用WM_KEYDOWN,而不是WM_CHAR才行.
      

  7.   

    我试了一下全选(ctrl+a)这个功能,是当a按下但未放开时,就生效的,那应该WINDOWS自身也是抓WM_KEYDOWN而非WM_CHAR.或WM_KEYUP的.
      

  8.   

    不是,不是你想的那样,
    WM_KEYDOWN里啥也没做
    在WM_CHAR里做了一些事,但是为了禁止输入字符,所以,像这样
    if(数字)
    {
    消息传递下去
    }else
    {
    啥也别做
    }
    这样就造成了ctrl+c失效,为了解决这个问题,当然得判断ctrl+c了