How to minimize a window by closing it?

余生长醉 提交于 2019-12-13 05:49:38

问题


I want to make a window only be minimized when any act of closing it is initiated (click the close button, Alt+F4). For AutoHotKey I think WinMinimize is needed, but I don't know how to detect a closing event. If you know a solution for PowerShell, please share too.


Related: Is it possible to catch the close button and minimize the window instead?


回答1:


#NoEnv
#SingleInstance Force

; Add the ahk_class of the windows you want  minimize by clicking on the close button in this array:
Classes := "Notepad,CabinetWClass,IEFrame" ; ...
Loop, parse, Classes, `,
    GroupAdd, GroupName, ahk_class %A_LoopField%

SetTimer CheckMouse, -300
return

CheckMouse:
    CoordMode, Mouse, Screen
    MouseGetPos, mX, mY, WindowUnderMouse
    WinGetPos, wX, wY, wW, wH, ahk_id %WindowUnderMouse%
        CloseButton := (mY > wY and mY < wY+50 and (mX > wX + (wW-50) and mX < wX+wW))
    SetTimer CheckMouse, -300
return

#If (CloseButton)

    ~LButton::
        MouseGetPos,,, WindowUnderMouse
        WinGetClass, Class, ahk_id %WindowUnderMouse%
        If Class in %Classes%
        {
            WinGet, id, ID, ahk_id %WindowUnderMouse%
            DISABLE_CloseButton(id)
            WinMinimize, ahk_id %WindowUnderMouse%
        }
    return


#If WinActive("ahk_group GroupName")

    !F4:: WinMinimize, A

#If ; turn off context sensitivity


DISABLE_CloseButton(id){ ;By RealityRipple at http://www.xtremevbtalk.com/archive/index.php/t-258725.html   
  menu:=DllCall("user32\GetSystemMenu","UInt",id,"UInt",0)
  DllCall("user32\DeleteMenu","UInt",menu,"UInt",0xF060,"UInt",0x0)
  WinGetPos,x,y,w,h,ahk_id %id%
  WinMove,ahk_id %id%,,%x%,%y%,%w%,% h-1
  WinMove,ahk_id %id%,,%x%,%y%,%w%,% h+1
}

ENABLE_CloseButton(id){ ;By Mosaic1 at http://www.xtremevbtalk.com/archive/index.php/t-258725.html  
  menu:=DllCall("user32\GetSystemMenu","UInt",id,"UInt",1)
  DllCall("user32\DrawMenuBar","UInt",id)
}

https://autohotkey.com/docs/commands/_If.htm




回答2:


This AHK script disables the close button in Notepad and minimizes Notepad by clicking on this button:

#NoEnv
#SingleInstance Force

SetTimer CheckMouse, -300
return

CheckMouse:
    CoordMode, Mouse, Screen
    WinGet, id, ID, ahk_class Notepad
        DISABLE_CloseButton(id)
    MouseGetPos, mX, mY, WindowUnderMouse
    WinGetPos, wX, wY, wW, wH, ahk_id %WindowUnderMouse%
        CloseButton := (mY > wY and mY < wY+50 and (mX > wX + (wW-50) and mX < wX+wW))
    SetTimer CheckMouse, -300
return

#If (CloseButton)

    ~LButton Up::
        MouseGetPos,,, WindowUnderMouse
        WinGetClass, Class, ahk_id %WindowUnderMouse%
        If (Class="Notepad")
            WinMinimize, ahk_id %WindowUnderMouse%
    return

#If WinActive("ahk_class Notepad")

    !F4:: WinMinimize, A

#If


DISABLE_CloseButton(id){ ;By RealityRipple at http://www.xtremevbtalk.com/archive/index.php/t-258725.html   
  menu:=DllCall("user32\GetSystemMenu","UInt",id,"UInt",0)
  DllCall("user32\DeleteMenu","UInt",menu,"UInt",0xF060,"UInt",0x0)
  WinGetPos,x,y,w,h,ahk_id %id%
  WinMove,ahk_id %id%,,%x%,%y%,%w%,% h-1
  WinMove,ahk_id %id%,,%x%,%y%,%w%,% h+1
}

ENABLE_CloseButton(id){ ;By Mosaic1 at http://www.xtremevbtalk.com/archive/index.php/t-258725.html  
  menu:=DllCall("user32\GetSystemMenu","UInt",id,"UInt",1)
  DllCall("user32\DrawMenuBar","UInt",id)
}


来源:https://stackoverflow.com/questions/53405915/how-to-minimize-a-window-by-closing-it

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!