使用CBTProc钩子固定窗口尺寸,最小化时HCBT_MOVESIZE触发异常如何解决
问题原因
- 第一个低级错误:代码中定义的RECT指针变量名为
rect,但后续修改矩形参数时误用了未定义的rc指针,直接访问非法内存导致抛出异常。 - 第二个逻辑错误:
IsRectEmpty()无法过滤窗口最小化的场景:窗口最小化时系统传入的RECT坐标通常为(-32000, -32000),宽高仍为正值,IsRectEmpty()会返回FALSE,代码仍会进入判断逻辑,你没有跳过最小化/最大化状态下的尺寸修改操作。 - 第三个遗漏点:HCBT_MOVESIZE触发时wParam就是当前操作的窗口句柄,你没有借助该句柄先判断窗口状态。
修复方案
- 首先修正指针变量名的笔误
- 先通过
IsIconic()判断窗口是否处于最小化状态,IsZoomed()判断是否处于最大化状态,两种状态下直接跳过尺寸修改逻辑 - 可以额外增加指针有效性校验,避免访问非法地址
修复后的代码示例:
case HCBT_MOVESIZE: // 窗口即将被移动或调整大小 { HWND hWnd = reinterpret_cast<HWND>(wParam); // 跳过最小化、最大化状态的处理 if (IsIconic(hWnd) || IsZoomed(hWnd)) { return 0; } RECT* rect = reinterpret_cast<RECT*>(lParam); // 可选:增加指针可读校验,避免访问非法内存 if (IsBadReadPtr(rect, sizeof(RECT)) || IsRectEmpty(rect)) { return 0; } int left = rect->left; int top = rect->top; int right = rect->right; int bottom = rect->bottom; int width = right - left; int height = bottom - top; if (width != 1000 || height != 600) { rect->right = left + 1000; rect->bottom = top + 600; } return 0; }
内容的提问来源于stack exchange,提问作者user16932694
相关产品推荐
相关产品推荐

