2013-04-09 2 views
2

Все здесь знают, что из WinXP в user32.dll появился API MessageBoxTimeout.MessageBox & WM_TIMER (после Win2k)

Но сейчас речь не об использовании недокументированных MessageBoxTimeout, но использование документированной MessageBox:

так вот совпадение, что из WinXP для любого MessageBox - PostMessage (WM_TIMER, 0,0) эквивалентно PostMessage (WM_CLOSE , 0,0).

Вопрос к инсайдерам MS: это ошибка или функция?

+0

Это не обязательно ошибка, это может быть 'MessageBox' API конкретных внутренней реализации. Почему вы хотите разместить событие таймера в окне, которое вы даже не владеете? –

+0

@ Roman R .: ну, может быть, мне просто интересно? И это не худшее из моих грехов: в 2011 году через PostMessage (GetAncestor (FindWindowEx (HWND_MESSAGE, 0,0,0), GA_PARENT), WM_SYSCOMMAND, SC_MINIMIZE, 0) получил BSOD (исправлено в 2012 году: KB2641653 - CVE-2012-0157) ... – kero

ответ

3

Это не случайно. Оказывается, что MessageBox реализован по вызову MessageBoxTimeout, который передает значение таймаута 0xFFFFFFFF. Это тривиально, чтобы распознать использование отладчика. И также получается, что диалоговые окна MessageBoxTimeout отвечают на сообщения WM_TIMER, закрывая диалог. Вот как MessageBoxTimeout использует таймаут.

Итак, если вы разместили сообщение WM_TIMER в диалоговом окне MessageBox, вы действительно разместите его в диалоговом окне MessageBoxTimeout, и вы действительно его закроете.

Это, конечно, не ошибка, потому что MessageBox не дает никаких обещаний относительно того, как он ответит на получение сообщений WM_TIMER. И это не функция, потому что она не документирована. Это всего лишь любопытный побочный эффект текущей реализации MessageBox.

Конечно, все это детали реализации, изменения и т.д. и т.п.

+0

Спасибо, Дэвид! И, конечно же, я знал, что это не совпадение :-) – kero

Смежные вопросы