求助一个桌面截取展示的问题

搞定了!
使用效果:
说明2

可以把任意显示器或跨显示器的特定区域,动态地显示在一个窗口,并显示在最上.
放大倍数从十六分之一到十六倍可调
和OnTopReplica不同,显示的是物理屏幕的特定区域,而不是某个窗口的特定区域.

使用快捷键 win+x 来使投影位置不跟随鼠标
其他快捷键为原始脚本自带快捷键,用不上

OnExit handle_exit

  Gui,  +AlwaysOnTop  +Owner +Resize +ToolWindow ; window for the dock
  Gui, Show, NoActivate w400 h400 x300 y50 , PrintScreen
  Gui, Add, DDL, vzoom  y0, 0.0625|0.125|0.25|0.5|1||2|4|8|16 
  Gui, Add, Checkbox, y0 x150 vantialize Checked, 去锯齿
  Gui, Add, Slider, vdelay x210 y0  Range15-200
  Gui, Add, Text, x340 y0 w80  vdelay2
  
  WinGet PrintScreenID, id  ,PrintScreen  ; 
  WinSet, Transparent , 254, PrintScreen
 
  ;retrieve the unique ID number (HWND/handle) of that window
  WinGet, PrintSourceID, id 
 
  hotkey , #+x           , toggle_follow
  hotkey , #x           , toggle_fix
  hotkey , +$LButton    , click_through
 
  toolbar_def:=20
  toolbar := toolbar_def
  follow :=0
  
  fixxy:=0
 
  hdd_frame := DllCall( "GetDC", UInt, PrintSourceID )
  hdc_frame := DllCall( "GetDC", UInt, PrintScreenID )
 
  hdc_buffer := DllCall("gdi32.dll\CreateCompatibleDC", UInt,  hdc_frame)  ; buffer
  hbm_buffer := DllCall("gdi32.dll\CreateCompatibleBitmap", UInt,hdc_frame, Int,A_ScreenWidth, Int,A_ScreenHeight)
  
  Gosub, Repaint
return 
 
toggle_follow: 
    follow := 1 - follow
  
    if follow = 1 
    {
        WinSet Region, 0-0  W%ww% H%wh% E  , PrintScreen
        toolbar := -32 ; height of window title
        GuiControl, Hide, zoom
    }
    else
    {
        WinSet Region,, PrintScreen
        toolbar :=toolbar_def
        GuiControl, Show, zoom
    }
Return
 
toggle_fix:
    if fixxy
      fixxy := 0
    else
    {
    fixxy := 1
    MouseGetPos, fix_x, fix_y
    }

Return

click_through:
    if follow = 1
    {
      Gui, Hide
      Send, {Click}
      SetTimer, Repaint , Off
      Sleep, 100
      Gui, Show
      SetTimer, Repaint, %delay%
    }
Return
 
Repaint: 
 
   CoordMode, Mouse, Screen                
   MouseGetPos, start_x, start_y             ;  position of mouse
   Gui, Submit, NoHide                       ; needed to read the dropdown and slidervalue
   GuiControl,, delay2 , delay %delay% ms
   WinGetPos, wx, wy, ww, wh , PrintScreen
 
   wh2 := wh - toolbar
  
    if fixxy
      {
            DllCall( "gdi32.dll\SetStretchBltMode", "uint", hdc_frame, "int", 4 * antialize )  ; Halftone better quality with stretch
   
    DllCall("gdi32.dll\StretchBlt", UInt,hdc_frame, Int,0, Int,toolbar, Int,ww, Int,wh - toolbar
          , UInt,hdd_frame, Int
          , fix_x-(ww / 2 / zoom)
          , Int,fix_y -( wh2 / 2/zoom), Int,ww / zoom, Int,wh2 / zoom ,UInt,0xCC0020) ; SRCCOPY
 
   if follow = 1
     WinMove, PrintScreen, ,fix_x -ww/2 , fix_y-wh/2 
   
  SetTimer, Repaint , %delay% 
      }
    else
    {
          DllCall( "gdi32.dll\SetStretchBltMode", "uint", hdc_frame, "int", 4 * antialize )  ; Halftone better quality with stretch
   
    DllCall("gdi32.dll\StretchBlt", UInt,hdc_frame, Int,0, Int,toolbar, Int,ww, Int,wh - toolbar
          , UInt,hdd_frame, Int
          , start_x-(ww / 2 / zoom)
          , Int,start_y -( wh2 / 2/zoom), Int,ww / zoom, Int,wh2 / zoom ,UInt,0xCC0020) ; SRCCOPY
 
   if follow = 1
     WinMove, PrintScreen, ,start_x -ww/2 , start_y-wh/2 
   
  SetTimer, Repaint , %delay% 
    }
  

Return
 
GuiClose:
handle_exit:
   DllCall("gdi32.dll\DeleteObject", UInt,hbm_buffer)
   DllCall("gdi32.dll\DeleteDC", UInt,hdc_frame )
   DllCall("gdi32.dll\DeleteDC", UInt,hdd_frame )
   DllCall("gdi32.dll\DeleteDC", UInt,hdc_buffer)
ExitApp
2 个赞