SendMessage()和PostMessage()正确使用

时间:2014-11-22 17:37:51

标签: c++ winapi

我在使用SendMessage()和PostMessage()时遇到了问题。我正在尝试做的事情是在我的窗口过程中SendMessage(hWnd, WM_USER + 1, 0, 0);

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    // Parse the menu selections:
    switch (wmId)
    {
    case WM_CREATE:
        break;
    case IDM_ABOUT:
        DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
        break;
    case IDM_EXIT:
        DestroyWindow(hWnd);
        break;
    case WM_USER:
        break;
    case WM_USER + 1:
        break;
    default:
        if (grid.ProcessEvent(wmId, wmEvent))
        {
            SendMessage(hWnd, WM_USER + 1, 0, 0);
            break;
        }
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
case WM_DESTROY:
    PostQuitMessage(0);
    break;
default:
    return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

我不确定为什么它不起作用,也许有人可以提供帮助。我确定调用了SendMessage(...),但它不会影响我的参数运行WndProc。

2 个答案:

答案 0 :(得分:2)

案例标签case WM_USER + 1:嵌套在内部案例陈述中(开启wmId)。它需要移出switch (message) case语句,因此它与case WM_COMMAND:case WM_DESTROY:的嵌套级别相同。

以上内容也适用于case WM_USER:

答案 1 :(得分:0)

指定SendMessage在接收者窗口处理完消息之前不会返回 - 由于您在自己的WndProc中并且自己发送消息,因此无法执行此操作。这是您应该使用PostMessage的情况之一。