2

这里大家都知道,从WinXP到user32.dll都出现了MessageBoxTimeout API。

但现在不是使用未记录的 MessageBoxTimeout,而是使用已记录的 MessageBox:

所以这是一个巧合,在 WinXP 中对于任何 MessageBox - PostMessage (WM_TIMER, 0,0) 等同于 PostMessage (WM_CLOSE, 0,0)。

向内部人员提问 MS:这是一个错误还是一个功能?

4

1 回答 1

3

这不是巧合。事实证明,这是通过传递超时值的MessageBox调用实现的。使用调试器来辨别这是微不足道的。事实证明,对话框通过关闭对话框来响应消息。这就是实现超时的方式。MessageBoxTimeout0xFFFFFFFFMessageBoxTimeoutWM_TIMERMessageBoxTimeout

因此,如果您将WM_TIMER消息发布到对话框,您实际上是在将MessageBox其发布到MessageBoxTimeout对话框,因此您确实会关闭它。

这当然不是一个错误,因为MessageBox它根本没有承诺它将如何响应接收到的WM_TIMER消息。它不是一个特性,因为它没有记录。这只是当前实现的一个奇怪的副作用MessageBox

当然,所有这些都是实现细节,可能会发生变化等。

于 2013-04-09T15:02:03.503 回答