我正在使用win32sdk,但是通过调用SetCapture()捕获鼠标时,某些消息将永远不会按预期工作,例如:
case WM_LBUTTONDOWN:
SetCapture(hWnd);
SendMessage(hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
ReleaseCapture();
return 0;
窗口不会最大化。但为什么呢?
另外,
1.如果我使用PostMessage()
代替它,它会起作用
2.如果我改为使用PostMessage()
并删除ReleaseCapture();
语句,则不再有效。
答案 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);
在这种情况下,它似乎不会成为用户命令,因此不会因为鼠标被捕获而被忽略。