捕获鼠标时SendMessage(WM_SYSCOMMAND)失败

时间:2014-08-22 11:54:06

标签: winapi

我正在使用win32sdk,但是通过调用SetCapture()捕获鼠标时,某些消息将永远不会按预期工作,例如:

case WM_LBUTTONDOWN:
    SetCapture(hWnd);
    SendMessage(hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
    ReleaseCapture();
    return 0;

窗口不会最大化。但为什么呢? 另外,
1.如果我使用PostMessage()代替它,它会起作用 2.如果我改为使用PostMessage()并删除ReleaseCapture();语句,则不再有效。

2 个答案:

答案 0 :(得分:0)

一般来说:

PostMessage是异步的,您在处理WM_SYSCOMMAND之前调用ReleaseCapture()。所以你只有一个问题:为什么你不能最大限度地捕获鼠标?

我还没有找到任何相关信息,但请阅读: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646262(v=vs.85).aspx

“捕获鼠标时,菜单热键和其他键盘加速器不起作用。”我认为由于这种限制,WM_SYSCOMMAND也没有被处理。可能是这样做是为了保持协调一致。

答案 1 :(得分:0)

正如norekhov所说,当鼠标被捕获时,菜单热键不起作用。捕获鼠标时,用户可以执行的唯一操作是导致发送WM_SYSCOMMAND消息,即使用系统菜单热键。

请注意,WM_SYSCOMMAND消息仅用于通知窗口用户启动的操作。当您将其发送到窗口时,您实际上是在尝试模仿用户的操作。在这种情况下,您不需要这样做。您可以告诉窗口直接最大化:

ShowWindow(hWnd, SW_SHOWMAXIMIZED);

在这种情况下,它似乎不会成为用户命令,因此不会因为鼠标被捕获而被忽略。