SetWindowPos()之后未重新绘制WinAPI客户端区域

SetWindowPos()之后未重新绘制WinAPI客户端区域,winapi,resize,redraw,Winapi,Resize,Redraw,我正在尝试使用以下代码调整另一个应用程序(ipoker客户端窗口)的窗口大小: SetWindowPos(hwnd, HWND_NOTOPMOST, x, y, width, height, SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER); 现在,这会正确调整窗口大小,但客户端区域不会被重新绘制(这意味着它只是被剪裁以适应新窗口区域)。它应该是这样的: 但实际情况是这样的: 因此,我用Spy++检查

我正在尝试使用以下代码调整另一个应用程序(ipoker客户端窗口)的窗口大小:

SetWindowPos(hwnd, HWND_NOTOPMOST, x, y, width, height, SWP_ASYNCWINDOWPOS | SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER);
现在,这会正确调整窗口大小,但客户端区域不会被重新绘制(这意味着它只是被剪裁以适应新窗口区域)。它应该是这样的: 但实际情况是这样的:

因此,我用Spy++检查了窗口在通过鼠标调整大小时收到的消息(这很好),并尝试使用SendMessage(..)将所有消息发送到窗口,但也没有任何运气

WINDOWPOS wpos;
wpos.hwnd = hWnd;
wpos.x = x;
wpos.y = y;
wpos.cx = nWidth;
wpos.cy = nHeight;
wpos.flags = SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE | 1000;

NCCALCSIZE_PARAMS params;
params.lppos = &wpos;
params.rgrc[0] = { x, y, width, height};
params.rgrc[1] = rcWindow; // rect of the window before resize
params.rgrc[2] = rcClient; // rect of the client before resize

SendMessage(hWnd, WM_WINDOWPOSCHANGED, 0, LPARAM(&wpos));

wpos.flags = SWP_NOZORDER | SWP_NOACTIVATE;
SendMessage(hwnd, WM_SIZE, SIZE_RESTORED, MAKELPARAM(nWidth, nHeight));
SendMessage(hwnd, WM_WINDOWPOSCHANGING, 0, LPARAM(&wpos));

wpos.flags = SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE | 1800;
SendMessage(hwnd, WM_NCCALCSIZE, WPARAM(TRUE), LPARAM(&params));

你知道为什么这一切都不起作用吗?是否没有办法子类化窗口(我没有这方面的经验)?我也尝试过使用placemint(一种窗口定位工具)调整窗口大小,但结果发现它也有同样的问题。我发现,强制它重画的唯一方法是手动调整大小。

消息和/或
重画窗口
调用是否有效?您向受害者窗口抛出的假消息不起作用。它们是由系统响应调整大小而生成的通知,以及所有必要的内部处理和簿记(您正在跳过)。它们用于通知应用程序窗口的几何图形已更改,以防需要执行任何自定义操作。如果
SetWindowPos
没有达到预期效果,您需要联系应用程序的供应商,让他们为您修复。请改用MoveWindow()。为什么子类化会有帮助?它只允许您处理应用程序显然不想处理的消息。这不会改变任何事情。您也可以建议使用多线程。或者钩子。这些都是开发人员提出的潜在解决方案,他们还不明白自己的问题到底是什么。啊,另一个程序员想在网上扑克上作弊。唉。