Winapi 捕获鼠标时SendMessage(WM_SYSCOMMAND)失败

Winapi 捕获鼠标时SendMessage(WM_SYSCOMMAND)失败,winapi,Winapi,我正在使用win32sdk,但在通过调用SetCapture()捕获鼠标时,某些消息将无法按预期工作,例如: case WM_LBUTTONDOWN: SetCapture(hWnd); SendMessage(hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0); ReleaseCapture(); return 0; 窗口将不会最大化。但是为什么呢? 附加, 1.如果我改为使用PostMessage(),它会工作。 2.如果我改用Post

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

case WM_LBUTTONDOWN:
    SetCapture(hWnd);
    SendMessage(hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
    ReleaseCapture();
    return 0;
窗口将不会最大化。但是为什么呢?
附加,
1.如果我改为使用
PostMessage()
,它会工作。
2.如果我改用
PostMessage()
并删除
ReleaseCapture()语句,它将不再工作。

通常:

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

我没有找到任何有关此的信息,但请阅读此处:


“当鼠标被捕获时,菜单热键和其他键盘加速器不工作。”我想WM_SYSCOMMAND也因为这个限制而没有被处理。也许这样做是为了保持协调一致。

正如诺雷霍夫所说,当鼠标被捕获时,菜单热键不起作用。当捕捉到鼠标时,用户可以采取的唯一操作将导致发送
WM_SYSCOMMAND
消息,即使用系统菜单热键

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

ShowWindow(hWnd, SW_SHOWMAXIMIZED);

在这种情况下,它不会显示为用户命令,因此不会被忽略,因为鼠标已被捕获。

1-PostMessage是异步的,在处理WM_SYSCOMMAND之前调用ReleaseCapture()。所以你只有一个问题:如果鼠标被捕获,为什么不能最大化?顺便说一句,如果你想在捕获前最大化窗口,只需在捕获前调用SendMessage。是的,也许这就是原因。我正在完成一个DirectUI库。当按下按钮时,我调用SetCapture()。由于某些原因,窗口有时会丢失捕获,这并不是因为button up消息,所以我在收到WM_CAPTURECHANGED消息时通知UI更改其捕获状态。问题是当我按下按钮时,我什么时候调用ReleaseCapture()函数?1.在UI进程之前。由于UI的捕获状态已更改,因此它不会响应按钮消息。2.在UI进程之后。是的,这是我上面问的问题。也许我应该用另一种逻辑来解释这件事。谢谢我调用SetCapture()并将消息重定向到事件处理程序,它试图最大化窗口,结果失败。:)现在我知道我更喜欢使用ShowWindow。