这段代码主要实现了一种灵活、强大的截图方法,允许用户通过 hWnd_to_hBmp
函数截取屏幕的不同区域,包括全屏、指定窗口、窗口客户区、或者自定义区域。
功能概述
hWnd_to_hBmp
是一个核心的截图函数,使用了 Windows API 来实现高效的图像捕获,返回一个位图句柄(hBitmap
),供后续操作(如保存为文件或进一步处理)。
hWnd_to_hBmp( -1 ) ; Fullscreen capture. hWnd_to_hBmp() ; Same as above hWnd_to_hBmp( WinExist("A") ) ; Capture active window hWnd_to_hBmp( WinExist("A"), True ) ; Capture active window. Client area hWnd_to_hBmp( WinExist("A"), True, [0,0,64,64] ) ; Capture active window. Part of client area ; https://www.autohotkey.com/boards/viewtopic.php?f=6&t=67778 ; Capturing owner window in fullscreen mode WinGetPos, X, Y, W, H, PSPad Array := [X,Y,W,H] hBM := hWnd_to_hBmp(-1, False, Array ) ; Capturing secondary monitor SysGet, X, MonitorWorkArea, 2 Array := [XLEFT, XTOP, XRIGHT-XLEFT, XBOTTOM-XTOP] hBM := hWnd_to_hBmp( -1, False, Array ) Return hWnd_to_hBmp( hWnd:=-1, Client:=0, A:="", C:="" ) { ; By SKAN C/M on D295|D299 @ bit.ly/2lyG0sN ; Capture fullscreen, Window, Control or user defined area of these A := IsObject(A) ? A : StrLen(A) ? StrSplit( A, ",", A_Space ) : {}, A.tBM := 0 Client := ( ( A.FS := hWnd=-1 ) ? False : !!Client ), A.DrawCursor := "DrawCursor" hWnd := ( A.FS ? DllCall( "GetDesktopWindow", "UPtr" ) : WinExist( "ahk_id" . hWnd ) ) A.SetCapacity( "WINDOWINFO", 62 ), A.Ptr := A.GetAddress( "WINDOWINFO" ) A.RECT := NumPut( 62, A.Ptr, "UInt" ) + ( Client*16 ) If ( DllCall( "GetWindowInfo", "Ptr",hWnd, "Ptr",A.Ptr ) && DllCall( "IsWindowVisible", "Ptr",hWnd ) && DllCall( "IsIconic", "Ptr",hWnd ) = 0 ) { A.L := NumGet( A.RECT+ 0, "Int" ), A.X := ( A.1 <> "" ? A.1 : (A.FS ? A.L : 0) ) A.T := NumGet( A.RECT+ 4, "Int" ), A.Y := ( A.2 <> "" ? A.2 : (A.FS ? A.T : 0 )) A.R := NumGet( A.RECT+ 8, "Int" ), A.W := ( A.3 > 0 ? A.3 : (A.R - A.L - Round(A.1)) ) A.B := NumGet( A.RECT+12, "Int" ), A.H := ( A.4 > 0 ? A.4 : (A.B - A.T - Round(A.2)) ) A.sDC := DllCall( Client ? "GetDC" : "GetWindowDC", "Ptr",hWnd, "UPtr" ) A.mDC := DllCall( "CreateCompatibleDC", "Ptr",A.sDC, "UPtr") A.tBM := DllCall( "CreateCompatibleBitmap", "Ptr",A.sDC, "Int",A.W, "Int",A.H, "UPtr" ) DllCall( "SaveDC", "Ptr",A.mDC ) DllCall( "SelectObject", "Ptr",A.mDC, "Ptr",A.tBM ) DllCall( "BitBlt", "Ptr",A.mDC, "Int",0, "Int",0, "Int",A.W, "Int",A.H , "Ptr",A.sDC, "Int",A.X, "Int",A.Y, "UInt",0x40CC0020 ) A.R := ( IsObject(C) || StrLen(C) ) && IsFunc( A.DrawCursor ) ? A.DrawCursor( A.mDC, C ) : 0 DllCall( "RestoreDC", "Ptr",A.mDC, "Int",-1 ) DllCall( "DeleteDC", "Ptr",A.mDC ) DllCall( "ReleaseDC", "Ptr",hWnd, "Ptr",A.sDC ) } Return A.tBM }
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)