regionGetColor [v3.8]

作者: Infogulch, Titan 最近更新时间: nonexistent


RegionGetColor() function gets the average color of a portion of the screen. RegionWaitColor() function waits either until the average color of a region matches a value, or until the region's current color changes. Included are some generally useful color functions such as InvertColor() and withinVariation().

Using the AvgBitmap() func, you can get the average color of any bitmap in memory.

regionGetColor(x, y, w, h, hwnd=0)
regionGetColor_AvgBitmap(hbmp, pc)
regionGetColor_BitBlt( hdc_dest, x1, y1, w1, h1 , hdc_source, x2, y2 , mode )
regionGetColor_CreateCompatibleBitmap(hdc, w, h)
regionGetColor_CreateCompatibleDC(hdc=0)
regionGetColor_DeleteDC(hdc)
regionGetColor_DeleteObject(hbmp)
regionGetColor_GetDC(hwnd=0)
regionGetColor_invertColor(x, a = "")
regionGetColor_PrintWindow(hwnd, hdc, Flags=0)
regionGetColor_regionCompareColor(color, x, y, w, h, hwnd=0, a="", b="", c="")
regionGetColor_regionWaitColor(color, X, Y, W, H, hwnd=0, interval=100, timeout=5000, a="", b="", c="")
regionGetColor_ReleaseDC(hwnd, hdc)
regionGetColor_SelectObject(hdc, hgdiobj)
regionGetColor_SumIntBytes(bits, pc, ca, cr, cg, cb)
regionGetColor_Variation( x, y )
regionGetColor_withinVariation( x, y, a, b="", c="")

关于函数的参数和返回值, 请参阅其源码.

备注

I added the prefix regionGetColor_ on all functions, except on regionGetColor() itself to make the library stdlibconform.

Infogulch is the author of this function, but borrowed some of Titans codes plus it uses MCode.

关于此函数(集)的更新细节和注意事项, 请参见 AutoHotkey 论坛: http://www.autohotkey.com/forum/topic36394.html

许可

此函数(集)是基于 infogulch`s license 许可的开源项目. 想了解许可详情, 请参见 infogulch-license.txt

示例

; Tuncay: I made small changes only.
; Thanks to tic for most of the demonstration script.
; #include regionGetColor.ahk
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
;region ;AutoExec; #######################################################################
#SingleInstance, Force
CoordMode, Mouse, Screen
MsgBox Press Alt+LeftMouseButton for selecting new area.`n`nPress Alt+r for rechecking that area and refreshing the gui.
RegionMain:
If !regionInit
{
   OnExit, Exit
   Gui, 1:+AlwaysOnTop +ToolWindow
   Gui, 1:Color, 0xffffff
   Gui, 1:Add, Edit, vGuiTextVar +ReadOnly h160 w180, Color: 0xffffff`nCount: `nTime: `n`n`n`n`n`n`n
   Gui, 1:Show, , regionColor
   Gui, 2:Color, 0xCCCCCC
   Gui, 2:+ToolWindow -Caption +Border +AlwaysOnTop +0x20 ; 0x20=click-thru
   Gui, 2:Add, Text, vGuiTextVar2 w80
   Gui, 2:+LastFound
   2GuiID := WinExist()
   Gui, 2:Show, X-2000 Y-2000 W1 H1
   WinSet, Trans, 150, ahk_id %2GuiID%
;   CoordMode, Mouse, Screen
   Process, Priority,, High
   SetBatchLines, -1
   SetWinDelay, -1
   RegionInit = 1
   GuiX := GuiY := 0
   GuiW := GuiH := 100
}
Gui, 1:Show
return
;end_region

;region ;Labels and Hotkeys; #############################################################
Esc::
Exit:
GuiClose:
   ExitApp

!LButton::
; use gui 2 to create a rectangle for area selection
   If !RegionInit
      GoSub RegionMain
   MouseGetPos, s_MSX, s_MSY, s_ID, s_CID, 2 ;start mouse X and Y
   WinSet, AlwaysOnTop, On, ahk_id %2GuiID%
   Loop
   {
      Sleep 20
      If !GetKeyState("LButton", "P")                  ;break if user releases the mouse
         Break   
      MouseGetPos, c_MSX, c_MSY                     ;current mouse X and Y
      GuiX := (s_MSX < c_MSX ? s_MSX : c_MSX)            ;use whichever smaller for X and Y
      GuiY := (s_MSY < c_MSY ? s_MSY : c_MSY)
      GuiW := Abs(Abs(s_MSX)-Abs(c_MSX))               ;doesn't matter which is bigger,
      GuiH := Abs(Abs(s_MSY)-Abs(c_MSY))               ;the absloute difference will be the same
      WinMove, ahk_id %2GuiID%,, GuiX, GuiY, GuiW, GuiH   ;move the window there
      GuiControl, 2:, GuiTextVar2, % GuiW ", " GuiH
   }
!r::               ;to retry at the last used coord.
   WinMove, ahk_id %2GuiID%,, GuiX, GuiY, GuiW, GuiH      ;to see where it's retrying
   Sleep 100
   WinMove, ahk_id %2GuiID%,, -2000,-2000, 2, 2          ;hide the window away
      WinGetPos, WinX, WinY, WinW, WinH, ahk_id %s_ID%
      ControlGetPos, CtrX, CtrY, CtrW, CtrH, , ahk_id %s_CID%
      regionInfo := "Relative to:`n   Screen: " GuiX "," GuiY
      regionInfo .= "`n   Window: " GuiX-WinX "," GuiY-WinY
      regionInfo .= "`n   Control: " GuiX-WinX-CtrX "," Guiy-WinY-CtrY
      regionInfo .= "`nWidth/Height: " GuiW "," GuiH
   Info1 := "RGB:`t"
   Color1 := regionGetColor(GuiX, GuiY, GuiW, GuiH) ;get the color of the region
   Time1 := "Time: " ErrorLevel
   Gui, 1:Color, %Color1%
   GuiControl, , GuiTextVar, % Info1 Color1 "`n`t" Time1 "`n`n" regionInfo
return
;end_region