;------------------------------
; AHK抓抓工具
;
; 作者:飞跃
; 版本:2.5
; 介绍:这是一个方便的抓取屏幕坐标和颜色的工具
;------------------------------
Goto, _Start
;======== 热键 ========
;-- 按 PrintScreen 热键截屏
*PrintScreen::
IfWinExist, ahk_id %gui_id%
{
Gui, Main: Hide
WinWaitClose, ahk_id %gui_id%
Sleep, 50
}
PrintScreen(nX, nY, nW, nH, bits)
SetImage(nW, nH, bits)
Gui, Main: Show
return
#If MouseIsOver()
MouseIsOver() {
global hPic, gui_id
ListLines, Off
MouseGetPos, px, py, id
if (id!=gui_id)
return, 0
WinGetPos, x, y, w, h, ahk_id %hPic%
return, (px>=x && px=y && py"
. "`n`n1、先按 PrintScreen 键截屏,然后"
. "用 鼠标右键菜单+[0-9] 键抓点,"
. "`n`n2、可以用 ALT+[0-9] 组合热键抓点。"
. "`n`n3、抓点时可以用上下左右键微调。`n"
;-------------------------------------
Gui, Font, s12 cBlue norm
Gui, Add, Edit, w180 ReadOnly
Gui, Add, Button, x+10 yp-3 gRunButton, 清本空组
;-------------------------------------
Gui, Font, s14 cEE6600 bold
Gui, Add, Tab3, xs vMyTab gRunTab AltSubmit -Wrap Section
, 一组|二组|三组|四组|五组
Gui, Font, s12 cBlue norm
C2_:=[]
Loop, 5 {
Gui, Tab, %A_Index%
Loop, 10 {
i:=Mod(A_Index,10), j:=i=1 ? "xs+15 y+15":"xs+15 y+3"
Gui, Add, Text, %j%, 抓点 %i%
Gui, Add, Edit, x+10 w200 +Hwndid
C2_.Push(id)
Gui, Add, Progress, x+0 w25 hp +Border
+Hwndid Background%WindowColor%
C2_.Push(id)
Gui, Add, Button, x+10 yp-3 gRunButton, 复制 %i%
Gui, Add, Button, x+0 gRunButton, 清空 %i%
}
}
Gui, Tab
MySlider1:=MySlider2:=0, MyTab:=1
;-------------------------------------
Gui, SubPic: Default
Gui, +Parent%hPic% -Caption +ToolWindow -DPIScale +LabelGui
Gui, Margin, 0, 0
Gui, Color, White
Gui, Add, Picture, x0 y0 w%nW% h%nH% +HwndhPic2 +0xE
Gui, Show, NA x0 y0 w%nW% h%nH%, SubPic
;-------------------------------------
Gui, Main: Show,, %ToolName% v%Version% - By FeiYue
OnMessage(0x201, Func("LButton_Down"))
OnMessage(0x200, Func("Mouse_Move"))
return
LButton_Down() {
global hPic, hPic2, nW, nH
ListLines, Off
Critical
MouseGetPos, px, py
WinGetPos, x, y, w, h, ahk_id %hPic%
if !(px>=x && px=y && py0 ? 0 : x
y:=y0 ? 0 : y
Gui, SubPic: Show, NA x%x% y%y%
GuiControl, Main:, MySlider1, % Round(-x/(nW-w)*100)
GuiControl, Main:, MySlider2, % Round(-y/(nH-h)*100)
Sleep, 10
}
}
Mouse_Move() {
ListLines, Off
SetTimer, ReDraw, -10
}
ReDraw() {
global LineNumber, C_
static C3_:=[]
ListLines, Off
Critical
SetTimer, ReDraw, Off
if !MouseIsOver()
return
MouseGetPos, px, py
c:=GetPosAndColor(px, py, x, y)
if (C3_[0]=x "," y)
return
C3_[0]:=x "," y, c:=Format("0x{:06X}", c)
GuiControl, Main:, Edit2, %x%`, %y%`, %c%
n:=LineNumber, k:=n*(n//2)+(n//2)+1, i:=0
Loop, %n% {
py:=y-(n//2)+A_Index-1
Loop, %n% {
px:=x-(n//2)+A_Index-1, i++
if !(i=k-1||i=k+1||i=k-n||i=k+n)
if (c:=GetColor(px,py))!=C3_[i]
C3_[i]:=c, SetColor(c, C_[i])
}
}
}
GuiEscape:
Gui, Main: Hide
return
MainShow:
Gui, Main: Show
return
RunTab:
GuiControlGet, MyTab, Main:, MyTab
return
GuiContextMenu:
if (A_Gui="SubPic")
{
MouseGetPos, px, py
Menu, MyMenu, Show, %px%, %py%
}
return
RunMenu:
n:=A_ThisMenuItemPos
CaptureN:
Gosub, RunTab
c:=GetPosAndColor(px, py, x, y)
n:=(MyTab-1)*20+2*n-1+20*(!n)
c:=Format("0x{:06X}", c)
GuiControl, Main:, % C2_[n], %x%`, %y%`, %c%
SetColor(c, C2_[n+1])
return
MovePic:
ListLines, Off
WinGetPos,,, w, h, ahk_id %hPic%
x:=-(nW-w)*MySlider1//100
y:=-(nH-h)*MySlider2//100
Gui, SubPic: Show, NA x%x% y%y%
return
RunButton:
Gosub, RunTab
k:=A_GuiControl, n:=RegExReplace(k, "D+")
n:=(MyTab-1)*20+2*n-1+20*(!n)
if InStr(k, "组")
{
Loop, 10 {
n:=(MyTab-1)*20+2*A_Index-1
GuiControl, Main:, % C2_[n]
SetColor(WindowColor, C2_[n+1])
}
}
else if InStr(k, "复制")
{
GuiControlGet, r, Main:, % C2_[n]
Clipboard:=r
}
else
{
GuiControl, Main:, % C2_[n]
SetColor(WindowColor, C2_[n+1])
}
ToolTip, %k% OK !
SetTimer, Tip_Off, -500
return
Tip_Off:
ToolTip
return
SaveLoad:
SaveLoad()
return
SaveLoad() {
global bits, nW, nH
k:=A_GuiControl, i:=RegExReplace(k, "D+")
f:=A_Temp "~pic" i ".tmp"
ToolTip, %k% OK !
SetTimer, Tip_Off, -500
if InStr(k,"存")
{
file:=FileOpen(f, "w")
file.RawWrite(bits, nW*nH*4)
file.Close()
GuiControl, Main: Enable, 取%i%
}
else if InStr(k,"删")
{
FileDelete, %f%
GuiControl, Main: Disable, 取%i%
}
else if FileExist(f)
{
file:=FileOpen(f, "r")
file.RawRead(bits, nW*nH*4)
file.Close()
SetImage(nW, nH, bits)
}
}
SetColor(c, hwnd)
{
c:=((c&0xFF)>16)
SendMessage, 0x2001, 0, c,, ahk_id %hwnd%
}
GetPosAndColor(px, py, ByRef x="", ByRef y="")
{
global
VarSetCapacity(pt,8), NumPut(py,NumPut(px,pt,"int"),"int")
DllCall("ScreenToClient", "ptr",hPic2, "ptr",&pt)
x:=NumGet(pt,0,"int")+nX, y:=NumGet(pt,4,"int")+nY
return, GetColor(x, y)
}
GetColor(x, y, bpp=32)
{
global
return, (xnX+nW-1 or y>nY+nH-1)
? 0xFFFFFF : NumGet(bits,(y-nY)*(((nW*bpp+31)//32)*4)
+(x-nX)*(bpp//8),"uint")&0xFFFFFF
}
PrintScreen(x, y, w, h, ByRef bits, bpp=32)
{
Ptr:=A_PtrSize ? "UPtr" : "UInt"
Scan0:=&bits, Stride:=((w*bpp+31)//32)*4
win:=DllCall("GetDesktopWindow", Ptr)
hDC:=DllCall("GetWindowDC", Ptr,win, Ptr)
mDC:=DllCall("CreateCompatibleDC", Ptr,hDC, Ptr)
if (hBM:=CreateDIBSection(w, -h, mDC, bpp, ppvBits))
{
oBM:=DllCall("SelectObject", Ptr,mDC, Ptr,hBM, Ptr)
DllCall("BitBlt", Ptr,mDC, "int",0, "int",0, "int",w, "int",h
, Ptr,hDC, "int",x, "int",y, "uint",0x00CC0020|0x40000000)
DllCall("RtlMoveMemory", Ptr,Scan0, Ptr,ppvBits, Ptr,Stride*h)
DllCall("SelectObject", Ptr,mDC, Ptr,oBM)
DllCall("DeleteObject", Ptr,hBM)
}
DllCall("DeleteDC", Ptr,mDC)
DllCall("ReleaseDC", Ptr,win, Ptr,hDC)
}
SetImage(w, h, ByRef bits, bpp=32)
{
global hPic2
static hBM
Ptr:=A_PtrSize ? "UPtr" : "UInt"
if (hBM)
DllCall("DeleteObject", Ptr,hBM)
Scan0:=&bits, Stride:=((w*bpp+31)//32)*4
if (hBM:=CreateDIBSection(w, -h, 0, bpp, ppvBits))
DllCall("RtlMoveMemory",Ptr,ppvBits,Ptr,Scan0,Ptr,Stride*h)
SendMessage, 0x172, 0x0, hBM,, ahk_id %hPic2%
if (E:=ErrorLevel)
DllCall("DeleteObject", Ptr,E)
WinSet, ReDraw,, ahk_id %hPic2%
}
CreateDIBSection(w, h, hdc=0, bpp=32, ByRef ppvBits=0)
{
Ptr:=A_PtrSize ? "UPtr" : "UInt", PtrP:=Ptr "*"
VarSetCapacity(bi, 40, 0), NumPut(40, bi, 0, "int")
NumPut(w, bi, 4, "int"), NumPut(h, bi, 8, "int")
NumPut(1, bi, 12, "short"), NumPut(bpp, bi, 14, "short")
hbm:=DllCall("CreateDIBSection", Ptr,hdc, Ptr,&bi
, "int",0, PtrP,ppvBits, Ptr,0, "uint",0, Ptr)
return, hbm
}
;======== 脚本结束 ========
;