Windows 如果事件是WM_MOVE,为什么我的线程在等待消息后恢复?
在Windows中,如果出现Windows 如果事件是WM_MOVE,为什么我的线程在等待消息后恢复?,windows,wine,Windows,Wine,在Windows中,如果出现WM\u MOVE或WM\u ACTIVATE消息,则睡在WaitMessage函数上的线程会恢复,即使这些消息没有排队(即,我不会使用PeekMessage获取它们) 问题在于此行为是否与文档一致,因为在Wine中运行时,我观察到的行为不同,如果线程处于睡眠状态,则会激活线程,但不会恢复,而是直接调用WinProc 编辑: 让我重新措辞,让问题变得更清楚: 我的线程发送WaitMessage 用户触摸应用程序窗口,因此该操作最终会触发VM\u MOVE 我认为有两种
WM\u MOVE
或WM\u ACTIVATE
消息,则睡在WaitMessage
函数上的线程会恢复,即使这些消息没有排队(即,我不会使用PeekMessage
获取它们)
问题在于此行为是否与文档一致,因为在Wine中运行时,我观察到的行为不同,如果线程处于睡眠状态,则会激活线程,但不会恢复,而是直接调用WinProc
编辑:
让我重新措辞,让问题变得更清楚:
WaitMessage
VM\u MOVE
WaitMessage
WndProc
激活,即在WaitMessage
PeekMessage
,是否应该得到任何信息
假设WM_MOVE
不是排队消息,并且WaitMessage
等待消息排队,那么线程是否应该被唤醒?如果是,它应该在WaitMessage
之后立即恢复,还是应该直接调用WndProc
我问这个问题的原因是因为我似乎在Windows和Wine中得到了两种不同的行为。在Windows中,线程在
WaitMessage
之后立即恢复,在Wine中,线程在WndProc
中被激活,因此当您在WaitMessage
返回后调用PeekMessage
时,PeekMessage
不会生成排队消息?发布您的代码。这是不应该发生的,也可能不是。你真的认为线程从当前堆栈帧“传送”到WndProc
是一件有效的事情吗?@Damon。不,我当然不认为这是正确的,而且我还没有在Windows中看到这种情况。然而,我已经能够在Wine中重现这一点,这就是为什么我要问这个问题。@BadZen我同意这在Windows中不会发生。然而,当我最大化窗口时,它发生在葡萄酒中。我检查了堆栈,发现直接调用了WnProc(即在WaitMessage
之后没有恢复)