这是我用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都可以执行撤销动作的
最后发个释放键的消息 用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);
}
}