New Lexer:
; RegionGetColor - Average color a window - v3.8 +MCode!
; http://www.autohotkey.com/forum/topic36394.html
;region ;Functions; ######################################################################
regionGetColor(x, y, w, h, hwnd=0) {
; created by Infogulch - thanks to Titan for much of this
; x, y, w, h  ~  coordinates of the region to average
; hwnd        ~  handle to the window that coords refers to
   DllCall("QueryPerformanceCounter", "Int64 *", Start1)
   If !hwnd, hdc := regionGetColor_GetDC( hwnd )
      hcdc := hdc
   Else
    {
      WinGetPos, , , hwndW, hwndH, ahk_id %hwnd%
       hcdc := regionGetColor_CreateCompatibleDC( hdc )
      , hbmp := regionGetColor_CreateCompatibleBitmap( hdc, hwndW, hwndH )
      , hobj := regionGetColor_SelectObject( hcdc, hbmp )
      , regionGetColor_PrintWindow( hwnd, hcdc, 0 )
   }
   memdc := regionGetColor_CreateCompatibleDC( hdc )
   , membmp := regionGetColor_CreateCompatibleBitmap( hdc, w, h )
   , memobj := regionGetColor_SelectObject( memdc, membmp )
   , regionGetColor_BitBlt( memdc, 0, 0, w, h, hcdc, x, y, 0xCC0020 )
   , fmtI := A_FormatInteger
   SetFormat,    Integer, Hex
    retval := regionGetColor_AvgBitmap(membmp, w * h) + 0
   SetFormat,    Integer, %fmtI%
   
    If hbmp
      regionGetColor_DeleteObject(hbmp), regionGetColor_SelectObject(hcdc, hobj), regionGetColor_DeleteDC(hcdc)
   regionGetColor_DeleteObject(membmp), regionGetColor_SelectObject(memdc, memobj), regionGetColor_DeleteDC(memdc)
   , regionGetColor_ReleaseDC(hwnd, hdc)
   , DllCall("QueryPerformanceCounter", "Int64 *", End1), DllCall("QueryPerformanceFrequency", "Int64 *", f)
   return retval, ErrorLevel := (End1-Start1)/f
}

regionGetColor_AvgBitmap(hbmp, pc) {
; by Infogulch
; hbmp  ~  handle to an existing bitmap
; pc    ~  size of the bitmap, should be w * h
; http://msdn.microsoft.com/en-us/library/dd144850(VS.85).aspx
   DllCall("GetBitmapBits", "UInt", hbmp, "UInt", VarSetCapacity(bits, pc*4, 0), "UInt", &bits)
   regionGetColor_SumIntBytes(bits, pc, ca, cr, cg, cb)
   return ((Round(cr/pc) & 0xff) << 16) | ((Round(cg/pc) & 0xff) << 8) | (Round(cb/pc) & 0xff)
}

regionGetColor_SumIntBytes( ByRef arr, len, ByRef a, ByRef r, ByRef g, ByRef b ) {
; by infogulch
; 32 bit:             16,843,009 px ||       4,104 x       4,104 px screen
; 64 bit: 72,340,172,838,076,673 px || 268,961,285 x 268,961,285 px screen
  static f, i
  if !i
  {
    t =
    (LTrim Join
    558bec81eccc0000005356578dbd34ffffffb933000000b8ccccccccf3abc745
    f800000000eb098b45f883c0018945f88b45f83b450c0f83940000008b45f88b
    4d088b1481c1ea1833c08b4d1003118b490413c88b451089108948048b45f88b
    4d088b1481c1ea1081e2ff00000033c08b4d1403118b490413c88b4514891089
    48048b45f88b4d088b1481c1ea0881e2ff00000033c08b4d1803118b490413c8
    8b451889108948048b45f88b4d088b148181e2ff00000033c08b4d1c03118b49
    0413c88b451c8910894804e957ffffff5f5e5b8be55dc3
    )
    VarSetCapacity(f, tl := StrLen(t)/2), i := 0
    While i < tl
       NumPut("0x" SubStr(t, i*2+1, 2), f, i, "UChar"), i++
  }
    VarSetCapacity(a, 8, 0), VarSetCapacity(r, 8, 0)
  , VarSetCapacity(g, 8, 0), VarSetCapacity(b, 8, 0)
  , DllCall( &f, "UInt", &arr, "UInt", len
    , "UInt", &a, "UInt", &r, "UInt", &g, "UInt", &b
    , "CDecl")
  , a := NumGet(a, 0, "UInt64"), r := NumGet(r, 0, "UInt64")
  , g := NumGet(g, 0, "UInt64"), b := NumGet(b, 0, "UInt64")
}

regionGetColor_regionWaitColor(color, X, Y, W, H, hwnd=0, interval=100, timeout=5000, a="", b="", c="") {
   regionGetColor_CompareColor := (color != "" ? color : regionGetColor(X, Y, W, H, hwnd))
   Start := A_TickCount
   while !(color ? retVal : !retVal) && !(timeout > 0 ? A_TickCount-Start > timeout : 0)
   {
      retVal := regionGetColor_regionCompareColor( CompareColor, x, y, w, h, hwnd, a, b, c)
      If interval
         Sleep interval
    }
   ErrorLevel := A_TickCount-Start
   Return (color ? retVal : !retVal)
}

regionGetColor_regionCompareColor(color, x, y, w, h, hwnd=0, a="", b="", c="") {
   return regionGetColor_withinVariation(regionGetColor(x, y, w, h, hwnd), color, a, b, c)
}

regionGetColor_withinVariation( x, y, a, b="", c="") {
; return wether x is within ±A ±B ±C of y
; if a is blank return wether x = y
; if b or c is blank, they are set equal to a
    If (a = "")
        return (x = y)
    v := regionGetColor_Variation(x, y)
    return v >> 16 & 0xFF <= a
        && v >> 8  & 0xFF <= (b+0 ? b : a)
        && v       & 0xFF <= (c+0 ? c : a)
}

regionGetColor_Variation( x, y ) {
    return Abs((x & 0xFF0000) - (y & 0xFF0000))
         | Abs((x & 0x00FF00) - (y & 0x00FF00))
         | Abs((x & 0x0000FF) - (y & 0x0000FF))
}

regionGetColor_invertColor(x, a = "") {
; by Infogulch
; inverts the rgb/bgr hex color passed
; x: color to be inverted
; a: true to invert alpha as well
   return ~x & (a ? 0xFFFFFFFF : 0xFFFFFF)
}

/* Old version, if you want to compare performance
AvgBitmap(hbmp, pc) {
; by Infogulch
; hbmp  ~  handle to an existing bitmap
; pc    ~  size of the bitmap, should be w * h
; http://msdn.microsoft.com/en-us/library/dd144850(VS.85).aspx
   cb := cg := cr := 0
   DllCall("GetBitmapBits", "UInt", hbmp, "UInt", VarSetCapacity(bits, pc*4, 0), "UInt", &bits)
   Loop, % pc
   {
      a := NumGet(bits, A_Index*4-4)
      , cr += a >> 16 & 0xff
      , cg += (a >> 8) & 0xff
      , cb += a & 0xff
   }
   return ((Round(cr/pc) & 0xff) << 16) | ((Round(cg/pc) & 0xff) << 8) | (Round(cb/pc) & 0xff)
}
*/
;end_region

;region ;mfc wrapper;#####################################################################
regionGetColor_CreateCompatibleDC(hdc=0) {
   return DllCall("CreateCompatibleDC", "UInt", hdc)
}     

regionGetColor_CreateCompatibleBitmap(hdc, w, h) {
   return DllCall("CreateCompatibleBitmap", UInt, hdc, Int, w, Int, w)
}

regionGetColor_SelectObject(hdc, hgdiobj) {
   return DllCall("SelectObject", "UInt", hdc, "UInt", hgdiobj)
}

regionGetColor_GetDC(hwnd=0) {
   return DllCall("GetDC", "UInt", hwnd)
}

regionGetColor_BitBlt( hdc_dest, x1, y1, w1, h1 , hdc_source, x2, y2 , mode ) {
   return DllCall("BitBlt"
          , UInt,hdc_dest   , Int, x1, Int, y1, Int, w1, Int, h1
          , UInt,hdc_source , Int, x2, Int, y2
          , UInt, mode)
}

regionGetColor_DeleteObject(hObject) {
   Return, DllCall("DeleteObject", "UInt", hObject)
}

regionGetColor_DeleteDC(hdc) {
   Return, DllCall("DeleteDC", "UInt", hdc)
}

regionGetColor_ReleaseDC(hwnd, hdc) {
   Return, DllCall("ReleaseDC", "UInt", hwnd, "UInt", hdc)
}

regionGetColor_PrintWindow(hwnd, hdc, Flags=0) {
   return DllCall("PrintWindow", "UInt", hwnd, "UInt", hdc, "UInt", Flags)
}
;end_region