Windows 如果事件是WM_MOVE,为什么我的线程在等待消息后恢复?

Windows 如果事件是WM_MOVE,为什么我的线程在等待消息后恢复?,windows,wine,Windows,Wine,在Windows中,如果出现WM\u MOVE或WM\u ACTIVATE消息,则睡在WaitMessage函数上的线程会恢复,即使这些消息没有排队(即,我不会使用PeekMessage获取它们) 问题在于此行为是否与文档一致,因为在Wine中运行时,我观察到的行为不同,如果线程处于睡眠状态,则会激活线程,但不会恢复,而是直接调用WinProc 编辑: 让我重新措辞,让问题变得更清楚: 我的线程发送WaitMessage 用户触摸应用程序窗口,因此该操作最终会触发VM\u MOVE 我认为有两种

在Windows中,如果出现
WM\u MOVE
WM\u ACTIVATE
消息,则睡在
WaitMessage
函数上的线程会恢复,即使这些消息没有排队(即,我不会使用
PeekMessage
获取它们)

问题在于此行为是否与文档一致,因为在Wine中运行时,我观察到的行为不同,如果线程处于睡眠状态,则会激活线程,但不会恢复,而是直接调用
WinProc

编辑: 让我重新措辞,让问题变得更清楚:

  • 我的线程发送
    WaitMessage
  • 用户触摸应用程序窗口,因此该操作最终会触发
    VM\u MOVE
  • 我认为有两种可能性:

  • 线程在
    WaitMessage
  • 线程通过
    WndProc
    激活,即在
    WaitMessage
  • 这些描述了实际的行为吗?另外,在案例1中,如果我立即调用
    PeekMessage
    ,是否应该得到任何信息

    假设
    WM_MOVE
    不是排队消息,并且
    WaitMessage
    等待消息排队,那么线程是否应该被唤醒?如果是,它应该在
    WaitMessage
    之后立即恢复,还是应该直接调用
    WndProc


    我问这个问题的原因是因为我似乎在Windows和Wine中得到了两种不同的行为。在Windows中,线程在
    WaitMessage
    之后立即恢复,在Wine中,线程在
    WndProc

    中被激活,因此当您在
    WaitMessage
    返回后调用
    PeekMessage
    时,
    PeekMessage
    不会生成排队消息?发布您的代码。这是不应该发生的,也可能不是。你真的认为线程从当前堆栈帧“传送”到
    WndProc
    是一件有效的事情吗?@Damon。不,我当然不认为这是正确的,而且我还没有在Windows中看到这种情况。然而,我已经能够在Wine中重现这一点,这就是为什么我要问这个问题。@BadZen我同意这在Windows中不会发生。然而,当我最大化窗口时,它发生在葡萄酒中。我检查了堆栈,发现直接调用了WnProc(即在
    WaitMessage
    之后没有恢复)