双击标题禁用表单恢复

Disable form restoring on title doubleclick

  1. 创建一个空的 Delphi VCL 项目
  2. 删除主窗体的所有BorderIcons
  3. 将 WindowState 设置为 wsMaximized
  4. 运行申请。 Main window 显示为最大化。
  5. 双击 window 标题。 Main window 恢复它的大小并且不可能再次最大化它。

如何防止window在不隐藏标题栏的情况下双击标题恢复?

答案已编辑!

如果我没看错,您可能希望通过标题栏禁止 double-click 以防止将表格恢复到其原始大小。您可以通过拦截 WM_NCLBUTTONDBLCLK 来做到这一点。

在下面的示例中,我已经重写了主窗体的 WndProc 方法和挂钩上述消息。

procedure TForm1.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_NCLBUTTONDBLCLK:
      begin
        case TWMNCHitMessage(Message).HitTest of
          HTCAPTION:
            Exit
        else  // Another HitTest-codes are handled here
          Inherited WndProc(Message);
        end;
      end
  else
    Inherited WndProc(Message);
  end;
end;

重要提示

虽然现在不能通过double-clicking恢复maximized形式,但是移动它还是可以恢复的鼠标被标题栏捕获。至少,在 Windows 7 上呈现了这种效果。
重现步骤:

  • 运行申请;
  • 将鼠标悬停在标题栏上时按下鼠标左键;
  • 不要松开 LMB 并轻轻移动鼠标 - 现在表单会恢复其大小。

附录

修复了错误处理另一个 non-client HitTest-codes 除了 HTCAPTION 的错误(感谢用户 Dsm 指出了这一点!)。

您可以通过拖动标题来拦截恢复和移动系统命令以防止恢复。

type
  TForm1 = class(TForm)
  protected
    procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;

...

procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
  case Message.CmdType and $FFF0 of
    SC_MOVE, SC_RESTORE: Exit;
  end; 
  inherited;
end;

我测试了一些解决方案,有效的是:

  1. Align 属性 设置为 alClient;
  2. BorderIcons 中删除 biMaximize 属性;
  3. WindowState wsNormal(默认)。