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

WPF下拦截RadWindow的Windows消息实现自定义最小化功能遇到问题

问题根因

你抓不到SC_MINIMIZE消息的核心原因是:Telerik RadWindow默认使用自绘的自定义标题栏,而非系统原生标题栏,点击其自带的最小化按钮时,逻辑由Telerik内部控件自行处理,不会向系统发送WM_SYSCOMMAND的SC_MINIMIZE消息,因此Hook系统消息的方案无法生效。

可行解决方案

推荐直接使用RadWindow原生的命令拦截机制实现需求,不需要Hook系统消息,实现成本更低,兼容性更好:

步骤1:订阅RadWindow的PreviewCommand事件

该事件会在所有RadWindow内置命令执行前触发,你可以直接拦截最小化命令,阻止默认行为。

步骤2:编写自定义最小化/还原逻辑

代码示例如下:

public partial class YourCustomRadWindow : RadWindow
{
    // 存储窗口原始高度
    private double _originalWindowHeight;
    // 标记当前是否为仅保留标题栏的最小化状态
    private bool _isTitleOnlyMinimized = false;

    public YourCustomRadWindow()
    {
        InitializeComponent();
        // 订阅命令预览事件
        this.PreviewCommand += OnRadWindowPreviewCommand;
    }

    private void OnRadWindowPreviewCommand(object sender, WindowPreviewCommandEventArgs e)
    {
        // 拦截最小化命令
        if (e.Command == RadWindowCommands.Minimize)
        {
            // 取消默认最小化到左下角的逻辑
            e.Cancel = true;

            if (!_isTitleOnlyMinimized)
            {
                // 保存当前窗口原始高度
                _originalWindowHeight = this.ActualHeight;
                // 调整高度仅保留标题栏,可根据实际主题调整高度值,也可直接用this.TitleHeight属性
                this.Height = this.TitleHeight;
                // 可选:禁用最小化状态下的窗口大小调整
                this.ResizeMode = ResizeMode.NoResize;
                _isTitleOnlyMinimized = true;
            }
            else
            {
                // 还原窗口原始高度
                this.Height = _originalWindowHeight;
                // 可选:恢复窗口大小调整功能
                this.ResizeMode = ResizeMode.CanResize;
                _isTitleOnlyMinimized = false;
            }
            return;
        }

        // 可选:拦截还原命令,适配双击标题栏、点击还原按钮的场景
        if (e.Command == RadWindowCommands.Restore && _isTitleOnlyMinimized)
        {
            e.Cancel = true;
            this.Height = _originalWindowHeight;
            this.ResizeMode = ResizeMode.CanResize;
            _isTitleOnlyMinimized = false;
        }
    }
}
补充说明

如果你坚持要使用Hook系统消息的方案,需要先将RadWindow设置为使用系统原生标题栏,添加如下属性即可:

<telerik:RadWindow UseNativeWindow="True" WindowStyle="SingleBorderWindow">

该方案会丢失Telerik自定义标题栏的样式特性,不推荐使用。

内容的提问来源于stack exchange,提问作者User9995555

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:15:00