You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CBTProc钩子固定窗口尺寸,最小化时HCBT_MOVESIZE触发异常如何解决

问题原因

  • 第一个低级错误:代码中定义的RECT指针变量名为rect,但后续修改矩形参数时误用了未定义的rc指针,直接访问非法内存导致抛出异常。
  • 第二个逻辑错误:IsRectEmpty()无法过滤窗口最小化的场景:窗口最小化时系统传入的RECT坐标通常为(-32000, -32000),宽高仍为正值,IsRectEmpty()会返回FALSE,代码仍会进入判断逻辑,你没有跳过最小化/最大化状态下的尺寸修改操作。
  • 第三个遗漏点:HCBT_MOVESIZE触发时wParam就是当前操作的窗口句柄,你没有借助该句柄先判断窗口状态。

修复方案

  1. 首先修正指针变量名的笔误
  2. 先通过IsIconic()判断窗口是否处于最小化状态,IsZoomed()判断是否处于最大化状态,两种状态下直接跳过尺寸修改逻辑
  3. 可以额外增加指针有效性校验,避免访问非法地址

修复后的代码示例:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:54:05