禁用窗体关闭按钮(使用GetWindowLong修改GWL_STYLE)

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了禁用窗体关闭按钮(使用GetWindowLong修改GWL_STYLE)相关的知识,希望对你有一定的参考价值。

一般我们不想让窗体能够关闭, 首先想到的是在OnCloseQuery事件里设置CanClose := False, 不过在某些情况下这个会和程序关闭窗体的业务逻辑产生冲突

所以写了下面这个函数, 可以设置窗体上的部分控制按钮禁用和启用, 仅仅是按钮显示及对鼠标键盘的响应, 按钮功能方面不影响

 

复制代码
type
  TSetWinButtons = set of (swb_Close, swb_Minimize, swb_Maximize);

  {设置窗体关闭按钮状态}
procedure SetWindowButton(AButtons: TSetWinButtons; AEnabled: Boolean;
  AWindowHandles: array of THandle);
var
  i: Integer;
  nHasMenu, nHasWinLong: Boolean;
  nMValue: UINT;
  nWinLong: NativeInt;
begin
  if Length(AWindowHandles) = 0 then
    Exit;

  nHasMenu := swb_Close in AButtons;
  nHasWinLong := (swb_Minimize in AButtons) or (swb_Maximize in AButtons);

  if nHasMenu then
  begin
    if AEnabled then
      nMValue := MF_BYCOMMAND or MF_ENABLED
    else
      nMValue := MF_BYCOMMAND or MF_DISABLED or MF_GRAYED;
  end;

  for i := Low(AWindowHandles) to High(AWindowHandles) do
  begin
    if nHasMenu then
      EnableMenuItem(GetSystemMenu(AWindowHandles[i], FALSE), SC_CLOSE, nMValue);

    if nHasWinLong then
    begin
      nWinLong := GetWindowLong(AWindowHandles[i], GWL_STYLE);

      if AEnabled then
      begin
        if swb_Minimize in AButtons then
          nWinLong := nWinLong or WS_MINIMIZEBOX;
        if swb_Maximize in AButtons then
          nWinLong := nWinLong or WS_MAXIMIZEBOX;
      end
      else
      begin
        if swb_Minimize in AButtons then
          nWinLong := nWinLong and not WS_MINIMIZEBOX;
        if swb_Maximize in AButtons then
          nWinLong := nWinLong and not WS_MAXIMIZEBOX;
      end;

      SetWindowLong(AWindowHandles[i], GWL_STYLE, nWinLong);
    end;
  end;
end;



//调用方式 SetWindowButton([swb_Close, swb_Minimize, swb_Maximize], False, [Application.Handle, Handle]);
复制代码

 

http://www.cnblogs.com/hs-kill/p/4650684.html

以上是关于禁用窗体关闭按钮(使用GetWindowLong修改GWL_STYLE)的主要内容,如果未能解决你的问题,请参考以下文章

如果我输入一个新的注册号删除按钮应该在 C# windows 窗体应用程序中被禁用 [关闭]

WinForm禁用窗体自带的关闭功能

WINFORM如何去掉窗体上的关闭按钮?

禁用“离开网站?”关闭 Orbeon 窗体窗口时弹出

C# winform 父窗口子窗口按钮控制

Delphi 窗体函数GetWindowLong-获取指定窗口的信息