KryTonX Posted November 30, 2015 Posted November 30, 2015 (edited) Hello there,as I used this function in a lot of projects, I might as well share it It gets a color value from a background (or foreground of course) window by using a combination of WinAPI.au3 and GDIPlus.au3 (might as well be replaced with https://msdn.microsoft.com/en-us/library/windows/desktop/dd144909(v=vs.85).aspx which should work too and is maybe a bit faster, as it wouldn't need to create an extra GDIPlus Bitmap). Long story short; here is the function: expandcollapse popup;=================================================================================================================================== ; ; Description: Gets the Color Value from a Pixel (possible in background windows [not hidden!]) ; Syntax: GetColor() ; Parameter(s): ; $iX - X Coordinate (In the Window, not whole Screen), get it by using the Autoit Window Info tool! ; $iY - Y Coordinate (In the Window, not whole Screen), get it by using the Autoit Window Info tool! ; $WinHandle - Handle obtained by WinGetHandle ; $iWidth - Width of the Window to Capture ; $iHeight - Height of the Window to Capture ; ; Return Value(s): Hex of Color Value ; ; Requirements: ; #RequireAdmin Braucht Adminrechte falls ihr auf ein Programm mit Adminrechten zugreifen wollt! ;#include <WinAPI.au3> ;#include <WindowsConstants.au3> ;#include <GDIPlus.au3> ;#include <ScreenCapture.au3> ; #include <Array.au3> ; ; Note: Does NOT work on hidden or minimized windows as Windows stops rendering them. ; If you do not want to put in the $WinHandle all the time, replace the $WinHandle Parameter ; with $WinHandle = $hwnd (if $hwnd is your Handle obtained by WinGetHandle) ; ; Tested only on Windows 10 Professional 64 Bit ; ;=================================================================================================================================== Func GetColor($iX,$iY,$WinHandle) _GDIPlus_Startup() Local $aPos = WinGetPos($WinHandle) $iWidth = $aPos[2] $iHeight = $aPos[3] Local $hDDC = _WinAPI_GetDC($WinHandle) Local $hCDC = _WinAPI_CreateCompatibleDC($hDDC) $hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iWidth, $iHeight) _WinAPI_SelectObject($hCDC, $hBMP) DllCall("User32.dll", "int", "PrintWindow", "hwnd", $WinHandle, "hwnd", $hCDC, "int", 0) _WinAPI_BitBlt($hCDC, 0, 0, $iWidth, $iHeight, $hDDC, 0, 0, $__SCREENCAPTURECONSTANT_SRCCOPY) $BMP = _GDIPlus_BitmapCreateFromHBITMAP($hBMP) Local $aPixelColor = _GDIPlus_BitmapGetPixel($BMP, $iX, $iY) _WinAPI_ReleaseDC($WinHandle, $hDDC) _WinAPI_DeleteDC($hCDC) _WinAPI_DeleteObject($hBMP) _GDIPlus_ImageDispose($BMP) _GDIPlus_Shutdown() Return Hex($aPixelColor, 6) EndFunc ;==>GetColorAnd when we are at it, here is a little program to get the right color values for your program, just press Shift + X after configuration it, by putting in the right Program Title and you will get the coordinates and the color value of your mouse position inside of the program you wanted ^^ expandcollapse popup; #RequireAdmin Braucht Adminrechte falls ihr auf ein Programm mit Adminrechten zugreifen wollt! #include <WinAPI.au3> #include <WindowsConstants.au3> #include <GDIPlus.au3> #include <ScreenCapture.au3> #include <Array.au3> HotKeySet("{ESC}","_exit") HotKeySet("X","Go") Global $x Global $y Global $hBMP ;~ MsgBox(0,"","OK!") $Title = "PUT THE TITLE OF YOUR WINDOW HERE!" $hwnd = WinGetHandle($Title) MsgBox (0,"",$hwnd) While 1 Sleep (100) WEnd Func Go() Local $MousePos = _WinAPI_GetMousePos(True, $hWnd) $x = DllStructGetData($MousePos, "X") $y = DllStructGetData($MousePos, "Y") ;~ $x = if you want to set them manual ;~ $y = use this and comment out both DLLStructGetData $Color = GetColor($x, $y, $hwnd) MsgBox(0,"","x: " &$x& " y: " &$y& " Color: " &$Color) EndFunc Func _Exit() Exit EndFunc Func GetColor($iX,$iY,$WinHandle) _GDIPlus_Startup() Local $aPos = WinGetPos($WinHandle) $iWidth = $aPos[2] $iHeight = $aPos[3] Local $hDDC = _WinAPI_GetDC($WinHandle) Local $hCDC = _WinAPI_CreateCompatibleDC($hDDC) $hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iWidth, $iHeight) _WinAPI_SelectObject($hCDC, $hBMP) DllCall("User32.dll", "int", "PrintWindow", "hwnd", $WinHandle, "hwnd", $hCDC, "int", 0) _WinAPI_BitBlt($hCDC, 0, 0, $iWidth, $iHeight, $hDDC, 0, 0, $__SCREENCAPTURECONSTANT_SRCCOPY) $BMP = _GDIPlus_BitmapCreateFromHBITMAP($hBMP) Local $aPixelColor = _GDIPlus_BitmapGetPixel($BMP, $iX, $iY) _WinAPI_ReleaseDC($WinHandle, $hDDC) _WinAPI_DeleteDC($hCDC) _WinAPI_DeleteObject($hBMP) _GDIPlus_ImageDispose($BMP) _GDIPlus_Shutdown() Return Hex($aPixelColor, 6) EndFunc ;==>GetColorI hope I was able to help somebody on the long run If you have any improvements or found any mistake, please let me know and I will try to improve the function as soon as possible.Also please excuse my "not so clean" coding, I am still learning Have fun,KryTonX EDIT: Thanks at JohnOne for his improvements on the Script, I have added WinGetPos...I wonder why I never got that Idea Edited December 22, 2015 by KryTonX
JohnOne Posted December 1, 2015 Posted December 1, 2015 Appears to do what it says on the tin.expandcollapse popup;#RequireAdmin #include <WinAPI.au3> #include <WindowsConstants.au3> #include <GDIPlus.au3> #include <ScreenCapture.au3> #include <Array.au3> $scite = WinGetHandle("[ACTIVE]") $gui = GUICreate("gui", 1000, 500) GUISetBkColor(0x112233) GUISetState() WinActivate($scite) Sleep(500) $hwnd = WinGetHandle("gui") MsgBox(0, 0, GetColor(100, 100, $hwnd)) Func GetColor($iX, $iY, $WinHandle) Local $aPos = WinGetPos($WinHandle) $iWidth = $aPos[2] $iHeight = $aPos[3] _GDIPlus_Startup() Local $hDDC = _WinAPI_GetDC($WinHandle) Local $hCDC = _WinAPI_CreateCompatibleDC($hDDC) $hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iWidth, $iHeight) _WinAPI_SelectObject($hCDC, $hBMP) DllCall("User32.dll", "int", "PrintWindow", "hwnd", $WinHandle, "hwnd", $hCDC, "int", 0) _WinAPI_BitBlt($hCDC, 0, 0, $iWidth, $iHeight, $hDDC, 0, 0, $__SCREENCAPTURECONSTANT_SRCCOPY) $BMP = _GDIPlus_BitmapCreateFromHBITMAP($hBMP) Local $aPixelColor = _GDIPlus_BitmapGetPixel($BMP, $iX, $iY) _WinAPI_ReleaseDC($WinHandle, $hDDC) _WinAPI_DeleteDC($hCDC) _WinAPI_DeleteObject($hBMP) _GDIPlus_ImageDispose($BMP) Return Hex($aPixelColor, 6) EndFunc ;==>GetColorNote: altered func params and does not require admin. KryTonX 1 AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans.
KryTonX Posted December 2, 2015 Author Posted December 2, 2015 Thanks for your little improvement I have added the change.For me, somehow, it still doesn't give back the right ColorValue without Admin rights I will let it in for now, if some people can confirm that it works without I will put it out! Thanks for your help
JohnOne Posted December 2, 2015 Posted December 2, 2015 Perhaps the window you are looking at is admin window, and that requires admin rights.Anyway, might be prudent to shut down _GDIPlus_Startup(). AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans.
KryTonX Posted December 3, 2015 Author Posted December 3, 2015 (edited) Perhaps the window you are looking at is admin window, and that requires admin rights.Anyway, might be prudent to shut down _GDIPlus_Startup().Added You are probably right with the Admin rights,Fixed it in the code! Edited December 3, 2015 by KryTonX
jontrac Posted December 7, 2015 Posted December 7, 2015 Absolutely love this bro! Many thanks for the share and keep up the good work.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now