想在打游戏、敲代码、分析数据、写报告……时候可以一边追剧看番。所以写了款小工具,功能不多,但是很实用,主要用来剪切其他窗口的画面并投放:
1.界面很简洁
2.自动调节画面大小
3.支持缩放
4.支持透明度调节
5.支持鼠标穿透
……
以上动图,具体代码如下,还有很多未完善内容,如有更好的建议欢迎指出,供娱乐 😉
;~ 快捷键说明: ;~ WIN+鼠标左键:按住win键的同时按住鼠标左键框选需要剪切播放的画面区域 ;~ WIN+`:win键加q左上角的按键,主要用于切换功能,在仅置顶->置顶并支持鼠标穿透->返回原画面->置顶……间循环。 #SingleInstance, Force OnExit, LiveClose CoordMode, ToolTip, Screen ListLines, Off tp:=16 ,VarSetCapacity(buf, 16) ,NumPut(1, buf) ,NumPut(VarSetCapacity(bi, 40), bi) ,NumPut(A_ScreenHeight, NumPut(A_ScreenWidth, bi, 4, "UInt")) ,NumPut(32, NumPut(1, bi, 12, "UShort")) Sourcehwnd:=DllCall("Gdiplus\GdiplusStartup", "UIntP", 0, "UInt", &buf, "UInt", 0) hDIBSection := DllCall("CreateDIBSection", "UInt", 0, "UInt", &bi, "UInt", 0, "UInt", 0, "UInt", 0, "UInt", 0) hCompatibleDC:=DllCall("CreateCompatibleDC", "UInt", DllCall("GetDC", "UInt", 0)) hObject:= DllCall("SelectObject", "UInt", hCompatibleDC, "UInt", hDIBSection) DllCall("Gdiplus\GdipCreateFromHDC", "UInt", hCompatibleDC, "UIntP", pGdip) DllCall("Gdiplus\GdipCreatePen1", "UInt", 0xFF00FF00, "Float", 2, "Int", 2, "PtrP", pPen) return #LButton:: if !selectionFlag { Gui, Live: +HwndLivehwnd +AlwaysOnTop +LastFound -Caption +Resize -Border Gui, Live: Color, 66CCFF WinSet, Transparent, 255 Gui, Selection: +E0x80000 +AlwaysOnTop +ToolWindow -DPIScale hwndSelectionhwnd CoordMode, Mouse, Relative MouseGetPos, o_x, o_y CoordMode, Mouse, Screen MouseGetPos, r_x, r_y, Sourcehwnd Gui, Selection: Show, NA Loop { if !GetKeyState("LButton", "P") break MouseGetPos, r_xx, r_yy DllCall("Gdiplus\GdipDrawRectangle", "UInt", pGdip, "UInt", pPen, "Float", Min(r_x, r_xx), "Float", Min(r_y, r_yy), "Float", Abs(r_xx - r_x), "Float", Abs(r_yy - r_y)) DllCall("UpdateLayeredWindow", "UInt", Selectionhwnd, "UInt", 0, "UInt", &Temppt , "UInt64*", A_ScreenWidth|A_ScreenHeight<<32, "UInt", hCompatibleDC, "UInt64*", 0, "UInt", 0 , "UInt*", 255<<16|1<<24, "UInt", 2) DllCall("Gdiplus.dll\GdipGraphicsClear", "Ptr", pGdip, "UInt", 0x00FFFFFF) } CoordMode, Mouse, Relative MouseGetPos, o_xx, o_yy o_w:=Abs(o_xx-o_x), o_h:=Abs(o_yy-o_y), o_p:=o_w/o_h WinGetPos, ow_x, ow_y, ow_w, ow_h, ahk_id %Sourcehwnd% WinMove, ahk_id %Sourcehwnd%, , A_ScreenWidth, A_ScreenHeight WinSet, ExStyle, ^0x80, ahk_id %Sourcehwnd% Gui, Selection: Destroy Gui, Live: Show, % "w"o_w " h"o_h " x"r_x " y"r_y, Live WinSet, ExStyle, -0x20, ahk_id %Livehwnd% hWindowDC:= DllCall("GetWindowDC", "UInt", Sourcehwnd) hLiveDC:= DllCall("GetDC", "UInt", Livehwnd) DllCall("Gdi32\SetStretchBltMode", "UInt", hLiveDC, "UInt", 4) OnMessage(0x201, "WIN_MOVE") OnMessage(0x203, "WM_LBUTTONDBLCLK") OnMessage(0x206, "WM_RBUTTONDBLCLK") OnMessage(0x6, "WM_ACTIVATE") SetTimer, BitBlt, 10 selectionFlag:=1 ToolTip 仅置顶, % r_x + o_w, % r_y + o_h SetTimer, RemoveToolTip, -1000 } return #`:: Flag := (!Flag || Flag = 3) ? 1 : Flag + 1 if (Flag = 1) { WinGetPos, r_x, r_y, , , ahk_id %Livehwnd% WinSet, ExStyle, +0x20, ahk_id %Livehwnd% ToolTip 置顶+鼠标穿透, % r_x + w, % r_y + h SetTimer, RemoveToolTip, -1000 } else if (Flag = 2) { WinGetPos, r_x, r_y, , , ahk_id %Livehwnd% Gui, Live: Hide WinMove, ahk_id %Sourcehwnd%, , ow_x, ow_y, ow_w, ow_h WinSet, ExStyle, -0x80, ahk_id %Sourcehwnd% WinActivate, ahk_id %Sourcehwnd% SetTimer, BitBlt, Off selectionFlag := 0 ToolTip 关闭, % r_x + w, % r_y + h SetTimer, RemoveToolTip, -1000 } else if (Flag = 3) { WinMove, ahk_id %Sourcehwnd%, , A_ScreenWidth, A_ScreenHeight Gui, Live: Show, % "w"w " h"h, Live WinSet, ExStyle, -0x20, ahk_id %Livehwnd% WinSet, ExStyle, +0x80, ahk_id %Sourcehwnd% SetTimer, BitBlt, 0 selectionFlag := 1 ToolTip 仅置顶, % r_x + w, % r_y + h SetTimer, RemoveToolTip, -1000 } return #IfWinExist, Live #WheelDown:: #WheelUp:: WinSet, Transparent, % 16*(A_ThisHotkey = "#WheelDown" ? tp > 0 ? --tp : tp : tp < 16 ? ++tp : tp), ahk_id %Livehwnd% return BitBlt: DllCall("StretchBlt", "UInt", hLiveDC, "Int", t_x, "Int", t_y, "Int", t_w, "Int", t_h , "UInt", hWindowDC, "Int", o_x < o_xx ? o_x : o_xx, "Int", o_y < o_yy ? o_y : o_yy, "Int", o_w, "Int", o_h, "UInt", 0xCC0020) return RemoveToolTip: ToolTip return LiveClose: WinMove, ahk_id %Sourcehwnd%, , ow_x, ow_y, ow_w, ow_h WinSet, ExStyle, -0x80, ahk_id %Sourcehwnd% WinActivate, ahk_id %Sourcehwnd% SetTimer, BitBlt, Off ExitApp return WM_ACTIVATE(l, p) { global if (l = 1) { WinActivate, ahk_id %Sourcehwnd% Sleep 100 WinActivate, ahk_id %Livehwnd% } } WIN_MOVE() { PostMessage, 0xA1, 2 } WM_LBUTTONDBLCLK() { global WinMove, Live, , , , o_w + 14, o_h + 14 } WM_RBUTTONDBLCLK() { global WinMove, Live, , , , w/h < o_p ? w + 14 : h*o_p + 14, w/h < o_p ? w/o_p + 14 : h + 14 } LiveGuiSize(GuiHwnd, EventInfo, Width, Height) { global Gui, Live: Color, 66CCFF w := width, h := height if ((w + 1)/h > o_p) && ((w - 1)/h > o_p) t_x := (w - h*o_p)/2, t_y := 0, t_w := h*o_p, t_h := h else t_x := 0, t_y := (h - w/o_p)/2, t_w := w, t_h := w/o_p }
能截出窗口,但是不能播放视频,音频有。
NB,有一款软件叫OnTopReplica有类似的功能,但是win10有些不兼容.
好东西。
截完了就可以保留了。
搞不懂