<分区>
考虑以下代码片段,其中在 WM_TIMER 消息上显示消息框。
#define IDT_TIMER1 1001
INT_PTR CALLBACK DialogProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch(message) {
//...
case WM_INITDIALOG:
{
//...
SetTimer(hWnd, IDT_TIMER1, 1000, (TIMERPROC)NULL);
break;
}
case WM_TIMER:
{
int ret = MessageBox(hWnd, L"Cancel operation?", NULL, MB_YESNO);
if(ret == IDYES) {
EndDialog(hWnd, 0);
} else {
// no-op: keep going
}
break;
}
//...
default:
return FALSE;
}
return FALSE;
}
我希望这段代码在初始计时器滴答时显示一个消息框,并阻塞线程直到用户单击按钮。 实际发生的是,在每个计时器滴答时显示一个新消息框,即使用户没有点击任何的按钮。
当我检查线程的调用堆栈时,我看到对 DialogProc()
的多次调用,都卡在调用 MessageBox()
的行上(即所有等待用于用户输入)。
鉴于调用堆栈的状态,DialogProc()
怎么可能在MessageBox()
所在的相同 线程中不断被调用> 在上次调用 DialogProc()
时还没有返回吗?
附言请注意,我不是在询问如何完成所需的行为。我只是在寻找洞察力,以了解导致实际行为的“幕后”情况。