Re: AHK: Экранная лупа
Добавил массив для фильтра окон, сейчас в нём Notepad++ и окно копирующее лупу.
При выключении аеро фильтр окон не работает.
Из непонятного:
Без применения MagSetWindowTransform с выключенным аеро не работает.
При выключении \ включении аеро часто нарушается работоспособность лупы, при этом повышается нагрузка на процессор.
#NoEnv
#Persistent
#SingleInstance Force
SetBatchLines -1
OnExit, Uninitialize
CoordMode, Mouse, Screen
Gui, +HWNDhGui
Global hPic
rWidth := 320
rHeight := 240
HWNDarr := [WinExist("ahk_class Notepad++"), hGui]
Ptr := A_PtrSize ? "UPtr" : "UInt"
if !DllCall("GetModuleHandle", "str", "gdiplus", Ptr)
DllCall("LoadLibrary", "str", "gdiplus")
VarSetCapacity(GdiplusStartupInput, A_PtrSize = 8 ? 24 : 16, 0), GdiplusStartupInput := Chr(1)
DllCall("gdiplus\GdiplusStartup", A_PtrSize = 8 ? "UPtr*" : "UInt*", pToken, Ptr, &GdiplusStartupInput, Ptr, 0)
Gui, -Caption +AlwaysOnTop +E0x02000000 +E0x00080000 ; WS_EX_COMPOSITED := E0x02000000 WS_EX_LAYERED := E0x00080000
Gui, Margin, 0,0
Gui, Add, text, w%rWidth% h%rHeight% 0xE hwndhPic ; SS_BITMAP = 0xE
Gui, Show, x100 NA, MagnifierCloneWindowAHK
Gui, Magnifier: +AlwaysOnTop -Caption +ToolWindow +HWNDhMagnifier
Gui, Magnifier: Show, w%rWidth% h%rHeight% NA Hide, MagnifierWindowAHK
DllCall("LoadLibrary", "str", "magnification.dll")
DllCall("magnification.dll\MagInitialize")
WS_CHILD := 0x40000000, WS_VISIBLE := 0x10000000, MS_SHOWMAGNIFIEDCURSOR := 0x1
hChildMagnifier := DllCall("CreateWindowEx"
, "UInt", 0
, "Str", "Magnifier"
, "Str", "MagnifierWindow"
, "UInt", MS_SHOWMAGNIFIEDCURSOR | WS_CHILD | WS_VISIBLE
, "Int", 0
, "Int", 0
, "Int", rWidth
, "Int", rHeight
, Ptr, hMagnifier
, "UInt", 0
, Ptr, DllCall("GetWindowLong", Ptr, hMagnifier, "UInt", GWL_HINSTANCE := -6)
, "UInt", 0)
VarSetCapacity(HWNDstruct, HWNDarr.Count() * A_PtrSize, 0)
Loop % HWNDarr.Count()
NumPut(HWNDarr[A_Index], HWNDstruct, (A_Index - 1) * A_PtrSize, "UPtr")
DllCall("magnification.dll\MagSetWindowFilterList", Ptr, hChildMagnifier, "Int", MW_FILTERMODE_EXCLUDE := 0, "Int", HWNDarr.Count(), Ptr, &HWNDstruct)
Matrix := "1|0|0|"
. "0|1|0|"
. "0|0|1"
VarSetCapacity(MAGTRANSFORM, 36, 0)
Loop, Parse, Matrix, |
NumPut(A_LoopField, MAGTRANSFORM, (A_Index - 1) * 4, "Float")
DllCall("magnification.dll\MagSetWindowTransform", Ptr, hChildMagnifier, Ptr, &MAGTRANSFORM)
DllCall("magnification.dll\MagSetImageScalingCallback", Ptr, hChildMagnifier, "Int", RegisterCallback("MagImageScalingCallback", "Fast"))
VarSetCapacity(RECT, 16, 0)
; 1::
Loop
{
MouseGetPos, MXS, MYS
NumPut(MXS - rWidth/2, RECT, 0, "Int")
NumPut(MYS - rHeight/2, RECT, 4, "Int")
NumPut(rWidth, RECT, 8, "Int")
NumPut(rHeight, RECT, 12, "Int")
DllCall("magnification.dll\MagSetWindowSource", Ptr, hChildMagnifier, Ptr, &RECT)
}
Return
MagImageScalingCallback(hwnd, srcdata, srcheader, destdata, destheader, unclipped, clipped, dirty) {
Static BI_RGB := 0, CBM_INIT := 6, DIB_RGB_COLORS := 0
, Ptr := A_PtrSize = 8 ? "UPtr" : "UInt"
, STM_SETIMAGE := 0x172, IMAGE_BITMAP := 0x0
, _ := VarSetCapacity(BITMAPV5HEADER, 124, 0)
, __ := VarSetCapacity(BITMAPINFO, 44, 0)
bV5Width := NumGet(srcheader + 0, 0, "UInt")
bV5Height := NumGet(srcheader + 0, 4, "UInt")
NumPut(124, BITMAPV5HEADER, 0, "UInt") ; DWORD bV5Size;
NumPut(bV5Width, BITMAPV5HEADER, 4, "UInt") ; LONG bV5Width;
NumPut(bV5Height, BITMAPV5HEADER, 8, "UInt") ; LONG bV5Height;
NumPut(1, BITMAPV5HEADER, 12, "Short") ; WORD bV5Planes;
NumPut(32, BITMAPV5HEADER, 14, "Short") ; WORD bV5BitCount;
NumPut(BI_RGB, BITMAPV5HEADER, 16, "UInt") ; DWORD bV5Compression;
NumPut(44, BITMAPINFO, 0, "UInt") ; DWORD biSize;
NumPut(bV5Width, BITMAPINFO, 4, "UInt") ; LONG biWidth;
NumPut(bV5Height, BITMAPINFO, 8, "UInt") ; LONG biHeight;
NumPut(1, BITMAPINFO, 12, "Short") ; WORD biPlanes;
NumPut(32, BITMAPINFO, 14, "Short") ; WORD biBitCount;
NumPut(BI_RGB, BITMAPINFO, 16, "UInt") ; DWORD biCompression;
hDC := DllCall("GetDC", Ptr, hwnd)
hBMP := DllCall("CreateDIBitmap"
, Ptr, hDC
, Ptr, &BITMAPV5HEADER
, "UInt", CBM_INIT
, Ptr, srcdata
, Ptr, &BITMAPINFO
, "UInt", DIB_RGB_COLORS)
DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", Ptr, hBMP, Ptr, 0, A_PtrSize = 8 ? "UPtr*" : "UInt*", pBitmap)
DllCall("gdiplus\GdipImageRotateFlip", Ptr, pBitmap, "Int", 6) ; Rotate180FlipX
DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", Ptr, pBitmap, A_PtrSize = 8 ? "UPtr*" : "UInt*", hBitmap, "Int", 0xffffffff)
SendMessage, STM_SETIMAGE, IMAGE_BITMAP, hBitmap,, ahk_id %hPic%
DllCall("DeleteObject", Ptr, ErrorLevel)
DllCall("gdiplus\GdipDisposeImage", Ptr, pBitmap)
DllCall("DeleteDC", Ptr, hDC)
DllCall("DeleteObject", Ptr, hBMP)
DllCall("DeleteObject", Ptr, hBitmap)
Return 1
}
Escape::
Uninitialize:
DllCall("magnification.dll\MagUninitialize")
DllCall("gdiplus\GdiplusShutdown", Ptr, pToken)
if hModule := DllCall("GetModuleHandle", "Str", "gdiplus", Ptr)
DllCall("FreeLibrary", Ptr, hModule)
ExitApp
Win10x64 AhkSpy, Hotkey, ClockGui