; 仅快速实现功能,不完善很正常,30分钟写代码,30小时才可能完善细节。
; 已知bug:对于父子窗口,当主窗口隐藏,子窗口从微缩中返回正常大小后,窗口会被隐藏,无法再次打开,需要重启窗口对应软件
; by 空
#NoEnv
SetBatchLines -1
CoordMode, Mouse, Screen
SysGet, SM_CXSIZEFRAME, 32
SysGet, SM_CYSIZEFRAME, 33
SM_CXSIZEFRAME:=SM_CXSIZEFRAME="" ? 0 : SM_CXSIZEFRAME
SM_CYSIZEFRAME:=SM_CYSIZEFRAME="" ? 0 : SM_CYSIZEFRAME
GuiLable:=0, Windows:={}
OnExit, ExitShrink
SetTimer, Repaint, 100  ; 定时刷新微缩显示


; 中键双击时触发
~MButton::
t:=-oldt+(oldt:=A_TickCount)
if (t<100 || t>400)
  Return
 else oldt:=0
MouseGetPos, x, y, Win
if (Windows.HasKey("h" Win))
  RestoreShrink("h" Win)
 else {
  zoom:=0.2  ; 缩放大小
  
  WinSet, ExStyle, +0x00000080, ahk_id %Win%
  WinSet, Transparent, 0,       ahk_id %Win%
  WinGetPos, , , sw, sh,        ahk_id %Win%
  
  ratio:=a_ sw/sh, dw:=sw*zoom, dh:=dw/ratio, GuiLable+=1
  Gui, %GuiLable%:+ToolWindow -Caption +AlwaysOnTop +Border +HwndShrinkID -DPIScale 
  
  Gui, %GuiLable%:Show, x%x% y%y% w%dw% h%dh%, 微缩窗口
  
  dest_hdc   := DllCall("GetDC", "UInt", ShrinkID)
  source_hdc := DllCall("GetWindowDC", "UInt", Win)
  DllCall("gdi32\SetStretchBltMode", "UPtr", dest_hdc, "Int", 4)
  
  Windows["h" ShrinkID, "GuiLable"]   := GuiLable
  , Windows["h" ShrinkID, "hwnd"]       := Win
  , Windows["h" ShrinkID, "source_hdc"] := source_hdc
  , Windows["h" ShrinkID, "dest_hdc"]   := dest_hdc
  , Windows["h" ShrinkID, "sw"]         := sw
  , Windows["h" ShrinkID, "sh"]         := sh
  , Windows["h" ShrinkID, "dw"]         := dw
  , Windows["h" ShrinkID, "dh"]         := dh
}
return

Repaint:
for k, v in Windows
  DllCall("gdi32.dll\StretchBlt", "UInt", v.dest_hdc, "Int", 0, "Int", 0, "Int", v.dw, "Int", v.dh, "UInt", v.source_hdc, "UInt", SM_CXSIZEFRAME, "UInt", 0, "Int", v.sw-2*SM_CXSIZEFRAME, "Int", v.sh-SM_CYSIZEFRAME, "UInt", 0xCC0020)
return

ExitShrink:
SetTimer, Repaint, Off
for k, v in Windows.Clone()
  RestoreShrink(k)
ExitApp
return

RestoreShrink(Win) {
  global Windows
  o:=Windows[Win], GuiLable:=o.GuiLable

  WinSet, ExStyle, -0x00000080, % "ahk_id " o.hwnd
  WinSet, Transparent, 255,     % "ahk_id " o.hwnd
  WinSet, Redraw, ,             % "ahk_id " o.hwnd
  WinActivate,                  % "ahk_id " o.hwnd

  DllCall("gdi32.dll\DeleteDC", "UInt", o.dest_hdc)
  DllCall("gdi32.dll\DeleteDC", "UInt", o.source_hdc)
  Gui, %GuiLable%:Destroy

  Windows.Delete(Win)
}

WM_LBUTTONDOWN(wParam, lParam, msg, hwnd) {
  static init := OnMessage(0x0201, "WM_LButtonDOWN")
  PostMessage, 0xA1, 2,,, A
}

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。