建一个记事本,写几个字符进去,按Ctrl+S保存,用spyxx获取了记事本的子窗口的消息,
然后写个代码,也发送这样的消息,spyxx的截取效果和按键的结果一样,但是无法保存。见截图,上面两行是按键的结果,下面两行是用postmessage发送按键消息的结构,按键代码如下
SetForegroundWindow(hCurrent) ‘hcurrent为窗口句柄
Dim CtrlSCode As Int32 = MapVirtualKey(VK_LCONTROL, 0)
Dim SSCode As Int32 = MapVirtualKey(Keys.S, 0)
Dim CtrlDnLparam As Int32, CtrlUpLparam As Int32
Dim SDnLparam As Int32, SUpLparam As Int32
CtrlDnLparam = CtrlSCode * &H10000 + 1
PostMessage(hCurrent, WM_KEYDOWN, VK_LCONTROL, CtrlDnLparam)
SDnLparam = SSCode * &H10000 + 1
PostMessage(hCurrent, WM_KEYDOWN, Keys.S, SDnLparam)
SUpLparam = &H80000000 + &H40000000 + SSCode * &H10000 + 1
PostMessage(hCurrent, WM_KEYUP, Keys.S, SUpLparam)
CtrlUpLparam = &H80000000 + &H40000000 + CtrlSCode * &H10000 + 1
PostMessage(hCurrent, WM_KEYUP, VK_LCONTROL, CtrlUpLparam)
如果先用keybd_event函数把ctrl键按下去,然后再给窗口发送s的按键消息,则可以保存。用psyxx监控未发现窗口接受到按下ctrl的消息。就是说窗口只收到一个s的按键消息,就会保存。窗口应该能感觉到,ctrl已经被设置成按下的状态了。其中奥妙,谁能说说?