Это не случайно. Оказывается, что MessageBox
реализован по вызову MessageBoxTimeout
, который передает значение таймаута 0xFFFFFFFF
. Это тривиально, чтобы распознать использование отладчика. И также получается, что диалоговые окна MessageBoxTimeout
отвечают на сообщения WM_TIMER
, закрывая диалог. Вот как MessageBoxTimeout
использует таймаут.
Итак, если вы разместили сообщение WM_TIMER
в диалоговом окне MessageBox
, вы действительно разместите его в диалоговом окне MessageBoxTimeout
, и вы действительно его закроете.
Это, конечно, не ошибка, потому что MessageBox
не дает никаких обещаний относительно того, как он ответит на получение сообщений WM_TIMER
. И это не функция, потому что она не документирована. Это всего лишь любопытный побочный эффект текущей реализации MessageBox
.
Конечно, все это детали реализации, изменения и т.д. и т.п.
Это не обязательно ошибка, это может быть 'MessageBox' API конкретных внутренней реализации. Почему вы хотите разместить событие таймера в окне, которое вы даже не владеете? –
@ 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