这里大家都知道,从WinXP到user32.dll都出现了MessageBoxTimeout API。
但现在不是使用未记录的 MessageBoxTimeout,而是使用已记录的 MessageBox:
所以这是一个巧合,在 WinXP 中对于任何 MessageBox - PostMessage (WM_TIMER, 0,0) 等同于 PostMessage (WM_CLOSE, 0,0)。
向内部人员提问 MS:这是一个错误还是一个功能?
这里大家都知道,从WinXP到user32.dll都出现了MessageBoxTimeout API。
但现在不是使用未记录的 MessageBoxTimeout,而是使用已记录的 MessageBox:
所以这是一个巧合,在 WinXP 中对于任何 MessageBox - PostMessage (WM_TIMER, 0,0) 等同于 PostMessage (WM_CLOSE, 0,0)。
向内部人员提问 MS:这是一个错误还是一个功能?
这不是巧合。事实证明,这是通过传递超时值的MessageBox
调用实现的。使用调试器来辨别这是微不足道的。事实证明,对话框通过关闭对话框来响应消息。这就是实现超时的方式。MessageBoxTimeout
0xFFFFFFFF
MessageBoxTimeout
WM_TIMER
MessageBoxTimeout
因此,如果您将WM_TIMER
消息发布到对话框,您实际上是在将MessageBox
其发布到MessageBoxTimeout
对话框,因此您确实会关闭它。
这当然不是一个错误,因为MessageBox
它根本没有承诺它将如何响应接收到的WM_TIMER
消息。它不是一个特性,因为它没有记录。这只是当前实现的一个奇怪的副作用MessageBox
。
当然,所有这些都是实现细节,可能会发生变化等。