这是我用spy++捕捉到 用键盘按下alt+backpace键的消息 然后我照着写了个代码如下:
                  ::PostMessage(gHWndForMousePoint,WM_SYSKEYDOWN,VK_MENU,
                                  ((MapVirtualKey(VK_MENU,0))<<16)|0x20000001);//这是按下alt的消息                  ::PostMessage(gHWndForMousePoint,WM_SYSKEYDOWN,VK_BACK,
                                  ((MapVirtualKey(VK_BACK,0))<<16)|0x20000001);//这是按下<- 的消息
                
                ::PostMessage(gHWndForMousePoint,WM_SYSCHAR,0X08,
                                  ((MapVirtualKey(VK_BACK,0))<<16)|0x20000001);//这是发送系统字符                ::PostMessage(gHWndForMousePoint,WM_SYSKEYUP,VK_BACK,
                                  ((MapVirtualKey(VK_BACK,0))<<16)|0xE0000001);//这是释放<- 的消息                ::PostMessage(gHWndForMousePoint,WM_KEYUP,VK_MENU,
                                  ((MapVirtualKey(VK_MENU,0))<<16)|0xC0000001);//这是释放alt的消息
用spy++捕捉到的消息如下图可以看到这段代码调试发现多发了一个WM_SYSCHAR 消息  怎么回事?
   而且protel并没有执行撤销动作。键盘上按下alt+back 时第4个消息也可以是这样的  取决于释放alt键的速度  但是protel都可以执行撤销动作的

解决方案 »

  1.   

    你应该发送WM_CHAR消息或者或者用keybd_event来模拟按键。
      

  2.   

    感谢回复  版主头像小女孩超可爱      我一直很奇怪用vc开发软件的人大把,相信这个问题对他们来说是小菜一碟,不知道为什么不肯指导下后学。在提这个问题前我上网查了好久,也有一些人公布了他们的代码,我也测试过了一些代码,根本行不通 很多代码lparam都是直接赋值0的  这种代码肯定不是出自工作在一线的工程师。因为就算这些代码能用也是不可取的 。因为大部分软件都是要判断你是单击还是 连击键的 就是通过31:30两位来识别 00按下 01长按  长按后进入连按态 释放后11 ,。顺便说下我觉得我顶楼提到的发送消息应该是不合理。虽然我只发一个KEYDOWN消息 也能把字符发出去。正确的做法应该 是先发 首次按下消息 跟着发字符消息
    最后发个释放键的消息  用spy++验证也是正确的  打开记事本也只是收到了一个字符。当然可能发送发送WM_CHAR也是正确的  但是我更倾向于前者。希望新手在发送消息时还是把参数填正确,扫描码和按键“态”还是需要的  
    hWnd=::WindowFromPoint(lpPoint);
    hWnd = GetAncestor(hWnd, GA_ROOT);
    if(gHWndForMousePointRoot==hWnd)
    {
    LPARAM scanCode;
    if(d>0xaaa)
    {
    scanCode=MapVirtualKey(VK_PRIOR,0); //获取扫描码
        scanCode<<=16;
        scanCode++;
    ::PostMessage(gHWndForMousePointRoot,WM_KEYDOWN,VK_PRIOR,scanCode);//这是按下VK_PRIOR的消息
           ::PostMessage(gHWndForMousePointRoot,WM_KEYUP,VK_PRIOR,scanCode|0xc0000000);
    }
    else
    {
    scanCode=MapVirtualKey(VK_NEXT,0); //获取扫描码
        scanCode<<=16;
        scanCode++;
    ::PostMessage(gHWndForMousePointRoot,WM_KEYDOWN,VK_NEXT,scanCode);//这是按下VK_NEXT的消息
        ::PostMessage(gHWndForMousePointRoot,WM_KEYUP,VK_NEXT,scanCode|0xc0000000);
    }
    }