Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法等待收件人处理PostMessage?_C#_Winapi_Message Queue - Fatal编程技术网

C# 有没有办法等待收件人处理PostMessage?

C# 有没有办法等待收件人处理PostMessage?,c#,winapi,message-queue,C#,Winapi,Message Queue,我遇到的问题是,在发布一些WM_KEYDOWN/WM_keydup消息之后,我需要使用Thread.Sleep至少200毫秒,然后再发布WM_LMOUSEDOWN/WM_LMOUSEUP消息。如果我不这样做,收件人将首先处理鼠标单击,这意味着先前的击键将转到目标句柄的错误位置。 我无法使用SendMessage,因为收件人忽略了WM_KEYDOWN/WM_keydup等内容 有没有办法等待处理PostMessage 有没有办法等待处理PostMessage 不,没有。没有API允许您等待或收到收

我遇到的问题是,在发布一些WM_KEYDOWN/WM_keydup消息之后,我需要使用Thread.Sleep至少200毫秒,然后再发布WM_LMOUSEDOWN/WM_LMOUSEUP消息。如果我不这样做,收件人将首先处理鼠标单击,这意味着先前的击键将转到目标句柄的错误位置。 我无法使用SendMessage,因为收件人忽略了WM_KEYDOWN/WM_keydup等内容

有没有办法等待处理PostMessage

有没有办法等待处理PostMessage


不,没有。没有API允许您等待或收到收件人已处理已发布消息的通知

是有:只需使用
SendMessage
而不是
PostMessage
(请注意,SendMessage在被其他线程使用时会造成死锁风险,GUI线程出于任何原因偶然会等待此线程)


一般来说:如果你需要伪造输入,你不应该自己发布消息。相反,您应该使用
SendInput()

您可以将
SetWindowsHookEx
WH\u GETMESSAGE
一起使用

CALLBACK
函数
MsgProc
dll中将通知您的应用程序目标应用程序和所有其他应用程序将要处理的任何消息

您还可以使用
VirtualAllocEx
WriteProcessMemory
注入一些外壳代码,通知应用程序目标应用程序将要处理的消息

然后使用
SetWindowLongPtr
GWLP\u WNDPROC
修改窗口过程,以指向注入的shell代码,并确保注入的shell代码最后
CallWindowProc
返回值为
GetWindowLongPtr
GWLP\u WNDPROC

显然,在使用
GWLP\u WNDPROC
设置windowlongptr之前,应该首先调用
GetWindowLongPtr
GWLP\u WNDPROC

您的应用程序还可以
DebugActiveProcess
启动目标应用程序,并使用
GWLP\u WNDPROC
GetWindowLongPtr
返回的地址插入断点

当目标应用程序分派消息并调用窗口过程时,目标应用程序将到达断点,通知您的应用程序目标应用程序已到达断点,然后目标应用程序将挂起

此时,应用程序可以调用
GetThreadContext
,以检索到达断点的线程堆栈帧上的四个参数

这四个参数正是目标应用程序将要处理的消息


如果目标应用程序中的
WM_KEYDOWN
WM_keydup
都只调用一个函数和一个UINT参数,并且如果您成功找到了这些函数的入口点,那么
CreateRemoteThread
WaitForSingleObject
也可以工作。

为什么必须伪造输入,对于UI自动化,有UIAutomationNo,我正在编写的应用程序应该能够与任何gui一起工作,例如flash或java应用程序。。为什么这一点如此重要?有人想知道,为什么目标应用程序会处理无序的排队消息。这就是为什么我要问这个问题。然而,有一个基本上是这样做的。即使消息没有被发布(并因此移动到输入队列的前面),对于目标应用程序来说,跨线程使用时的效果是相同的。调用
GetMessage
不会从队列中检索第一条消息,而是在继续从消息队列中检索第一条消息之前,分派从其他线程发送的所有排队消息。@IInspectable它实际上不可比较。发送的消息直接发送到窗口过程。通过调用
GetMessage
,可以提取已发布的消息,并在消息循环中进行处理。它通常(但不一定)调用
TranslateMessage
,然后调用
DispatchMessage
。很难确定目标应用是什么或正在做什么。当
SendMessage
跨越线程时,发送的消息将作为所有消息排队。它们不会立即被调度,并且还需要调用
GetMessage
/
PeekMessage
才能被调度。跨线程时,
SendMessageNotify
(或
SendMessageCallback
)和
PostMessage
几乎相同。@我的意思是,如果目标应用程序直接处理某些输入消息,而不是调用
DispatchMessage
,则不可检测,如果发送而不是发布输入消息,则该代码将不会执行。当跨线程时,发送的消息将排队,并作为调用
GetMessage
/
PeekMessage
的一部分进行调度。这可能会导致不希望发送某些(输入)消息的应用程序失败,而发送的消息将得到正确处理。您对效果的解释是正确的,但导致它的复杂程度有点不准确。正如我所写的,它需要是PostMessage,因为目标应用程序忽略了SendMessage。这不是答案,SendMessage不好,可能会导致内存问题等。(它没有等待任何其他消息)@vtz SendMessage工作正常。它是Win32的重要组成部分。您遇到的任何问题都是由于您自己的代码中的缺陷、SendMessage的误用等造成的。@DavidHeffernan您是对的,关于我的问题,问题不是使用SendMessage和字符串变量,当我使用char text buffer更改它时,然后使用SendMessage是我所需要的。谢谢我已经有一段时间没有放弃这个问题了,因为我不想使用复杂的黑客技术。我没有