我遇到了问题,在发布一些WM_KEYDOWN / WM_KEYUP消息后,我需要使用Thread.Sleep至少200ms,然后再发布WM_LMOUSEDOWN / WM_LMOUSEUP消息。如果我不这样做,收件人首先处理鼠标点击,这意味着较早的击键会转到目标句柄的错误位置。 我不能使用SendMessage,因为收件人将那些忽略为WM_KEYDOWN / WM_KEYUP。
有没有办法等待处理PostMessage?
答案 0 :(得分:2)
有没有办法等待处理PostMessage?
不,没有。没有API允许您等到或收到其收件人已处理过邮件的通知。
答案 1 :(得分:0)
您可以将SetWindowsHookEx
与WH_GETMESSAGE
一起使用。
dll 中的CALLBACK
函数MsgProc
将通知您的应用程序有关目标应用程序和所有其他应用程序将要处理的任何消息。
您还可以使用VirtualAllocEx
和WriteProcessMemory
注入一些shellcode,这些shellcode通知您的应用程序有关目标应用程序将要处理的消息。
然后将SetWindowLongPtr
与GWLP_WNDPROC
一起使用,以修改窗口过程以指向注入的shell代码,并确保注入的shell代码最后CallWindowProc
指向返回值{{ 1}}和GetWindowLongPtr
。
很明显,应该先调用GWLP_WNDPROC
和GetWindowLongPtr
的{{1}}。
您的应用程序也可以GWLP_WNDPROC
到目标应用程序,并在SetWindowLongPtr
的{{1}}返回的地址处插入一个断点。
当目标应用程序调度消息并调用窗口过程时,目标应用程序到达断点,并通知您的应用程序目标应用程序已到达断点,然后目标应用程序被挂起。
这时,您的应用程序可以调用GWLP_WNDPROC
来检索到达断点的线程的堆栈帧上的四个参数。
这四个参数正是目标应用程序将要处理的消息。
如果目标应用程序中的DebugActiveProcess
和GetWindowLongPtr
都仅调用具有一个UINT参数的一个函数,并且如果您成功找到了这些函数的入口点,则将GWLP_WNDPROC
与{{ 1}}也可以工作。
答案 2 :(得分:-2)
是的:只使用SendMessage
而不是PostMessage
(请注意,SendMessage在被其他线程使用时会造成死锁风险,并且GUI线程因任何原因偶然等待此线程)
一般情况下:如果您需要伪造输入,则不应自行发布消息。相反,您应该使用SendInput()