避免使用Windows模态循环的解决方法是使用非模态对话框或使用消息循环。下面是两种解决方法的示例代码:
#include
#include
// 对话框过程
INT_PTR CALLBACK DialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_INITDIALOG:
// 初始化对话框
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
// 处理确定按钮点击事件
EndDialog(hwnd, IDOK);
return TRUE;
case IDCANCEL:
// 处理取消按钮点击事件
EndDialog(hwnd, IDCANCEL);
return TRUE;
}
break;
}
return FALSE;
}
int main()
{
// 创建对话框
DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG), NULL, DialogProc);
return 0;
}
#include
#include
// 主窗口过程
LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_CREATE:
// 创建控件
CreateWindowW(L"BUTTON", L"OK", WS_VISIBLE | WS_CHILD, 10, 10, 80, 30, hwnd, (HMENU)IDOK, NULL, NULL);
CreateWindowW(L"BUTTON", L"Cancel", WS_VISIBLE | WS_CHILD, 100, 10, 80, 30, hwnd, (HMENU)IDCANCEL, NULL, NULL);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
// 处理确定按钮点击事件
MessageBox(hwnd, L"OK clicked", L"Message", MB_OK);
break;
case IDCANCEL:
// 处理取消按钮点击事件
MessageBox(hwnd, L"Cancel clicked", L"Message", MB_OK);
break;
}
break;
case WM_DESTROY:
// 退出消息循环
PostQuitMessage(0);
break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
int main()
{
// 注册窗口类
WNDCLASS wc = {0};
wc.lpfnWndProc = WindowProc;
wc.hInstance = GetModuleHandle(NULL);
wc.lpszClassName = L"WindowClass";
RegisterClass(&wc);
// 创建窗口
HWND hwnd = CreateWindowW(L"WindowClass", L"Window Title", WS_OVERLAPPEDWINDOW, 100, 100, 300, 200, NULL, NULL, GetModuleHandle(NULL), NULL);
// 显示窗口
ShowWindow(hwnd, SW_SHOWDEFAULT);
// 消息循环
MSG msg = {0};
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
上述代码示例分别使用了非模态对话框和消息循环来避免使用Windows模态循环。你可以根据具体情况选择其中一种方法来替代使用Windows模态循环。