我已经解决了问题!在程序的原始版本中,我在长循环中调用 PeekMessage(),使用 PM_REMOVE 过滤 WM_KEYDOWN 并检查 VK_ESCAPE。我收到反馈说我正在停止消息循环,因此我将 PeekMessage() 调用更改为根本不进行过滤,然后检查 WM_KEYDOWN 和 VK_ESCAPE。问题解决了。无论在调试模式还是非调试模式下,代码都不再冻结。
// Check for ESC pressed - Abort if so.
MSG msg;
if (!PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) continue;
if (msg.message != WM_KEYDOWN || msg.wParam != VK_ESCAPE) continue;
pCHashedFiles->Reset();
bEscapePressed = true;
break;
我保留原来的帖子,以供参考......
我在使用非模式对话框时遇到问题。我有一个循环扫描目录中的文件,将文件添加到链接列表类以供以后处理,使用无模式对话框作为进度框。当我使用调试器 F5 运行时,它工作正常。当我在没有调试器的情况下运行 Ctrl-F5 时,该框在五秒后停止更新,鼠标光标变为沙漏,窗口右上角的“X”按钮变为暗红色。这种情况一直持续到循环完成为止,此时程序将正常继续。
我已将代码合并为一个简单的示例,说明正在发生的情况,仅使用对话框和循环,它只是计数到 100,迭代之间有 100 毫秒的延迟。
这是我的全局变量...
HWND hwndDialog1;
HDC dc;
UINT_PTR upTimer;
int wmId;
HDC hdc;
这是 Windows 进程...
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
hwndDialog1 = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, NULL);
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case ID_TEST_FIRE:
dc = GetDC(hwndDialog1);
ShowWindow(hwndDialog1, SW_SHOW);
TCHAR sz[5];
for (int i = 1; i <= 100; ++i)
{
StringCchPrintf(sz, 5, _T("%d"), i);
SetBkColor(dc, RGB(240, 240, 240));
TextOut(dc, 50, 50, sz, lstrlen(sz));
Sleep(100);
}
upTimer = SetTimer(hWnd, 1, 2000, NULL);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_TIMER:
KillTimer(hWnd, upTimer);
ShowWindow(hwndDialog1, SW_HIDE);
break;
case WM_DESTROY:
DestroyWindow(hwndDialog1);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
我已经搜索了非模式对话框的文档,但找不到解释。奇怪的是,当我使用调试器运行时,代码可以正常工作,而当我不使用调试器运行时,代码会在五秒后冻结。请看一下我是否遗漏了什么。谢谢你。
问题已得到解答。详情请参阅问题正文。