Jump to content
RHolmes

PixelGetColor: Can't get correct color of pixel

Recommended Posts

RHolmes

I have a program that has a control that changes color a few seconds into running. So ideally, I would poll this to tell when an event has occurred. 

I can't seem to retrieve the correct color value for a control. It always seems to return white indicating that its selecting somewhere else in the window.

In the PixelGetColor call I'm adding half the width to the x value and subtracting half the height to the y value  in order to get the center of the control. (assuming the coords returned by ControlGetPos are top left - which i can't be sure of) But I've also tried without modifying the x/y and with changing the PixelCoordMode option to 2. Maybe I'm making a silly mistake and can't see it? Any help would be appreciated.

Code is below:

Opt("PixelCoordMode", 0)
FileChangeDir( "C:\Where\My\File\Is" );
Run( "MyProgram.exe" )
Local $hClient = WinWaitActive( $CLIENT_TITLE, "", 10 )
Local $systemIndicatorClassNN= "[CLASS:Qt5QWindowIcon; INSTANCE:99]"
Local $hSystemIndicator = ControlGetHandle ( $hClient, "", $systemIndicatorClassNN)
Local $xywh = ControlGetPos ( $hClient, "", $hSystemIndicator )
For $i = 10 To 1 Step -1
      $color = PixelGetColor ( $xywh[0] + ($xywh[2]/2), $xywh[1] - ($xywh[3]/2), $hClient )
      LogToFile( $color )
      Sleep( 2000 )
Next

Share this post


Link to post
Share on other sites
careca

Dont forget that pixelgetcolor retrieves the color in decimal, is that what you need?

Also why this?

For $i = 10 To 1 Step -1

 


Spoiler

Paster - Main function is to paste text, but has more functions. (No longer mantained, switched to String Trigger)

Renamer - Rename files and folders, remove portions of text from the filename etc.

GPO Tool - Export/Import Group policy settings.

BeatsPlayer - Music player.

Params Tool - Right click an exe to see it's parameters or execute them.

String Trigger - Triggers pasting text or applications or internet links on specific strings.

Inconspicuous - Hide files in plain sight, not fully encrypted.

Regedit Control - Registry browsing history, quickly jump into any saved key.

Time4Shutdown - Write the time for shutdown in minutes.

Power Profiles Tool - Set a profile as active, delete, duplicate, export and import.

Firefox Profile Backup - Backup/restore previously saved profile.

Finished Task Shutdown - Shuts down pc when specified window/Wndl/process closes.

NetworkSpeedShutdown - Shuts down pc if download speed goes under "X" Kb/s.

IUIAutomation - Topic with framework and examples

Au3Record.exe

Share this post


Link to post
Share on other sites
RHolmes

It doesn't matter what format the color is in, as long as I can determine if it has changed. So far I've been getting the value 16777215 - which is white. 

In each iteration of the for loop, I sleep the program for 2 seconds. That way it checks if the color has changed every 2 seconds.

Share this post


Link to post
Share on other sites
RHolmes

Maybe I don't understand how ControlGetPos works? Perhaps the coords it returns are some value I'm not expecting. I'm also using two monitors, I'm not sure if that can confuse the coordinate system?

Share this post


Link to post
Share on other sites
RHolmes

Ok, I finally solved it after a lot of logging! 

; get the control

Local $hSystemIndicator = ControlGetHandle ( $hClient, "", "SystemReadyWindow" )

; get pos and size of control

Local $xywh = ControlGetPos ( $hClient, "", $hSystemIndicator )

; check color at the center of the control, not the window

$color = PixelGetColor ( $xywh [2]/2, $xywh [3]/2, $hSystemIndicator )

Share this post


Link to post
Share on other sites
careca

Nice you got it working


Spoiler

Paster - Main function is to paste text, but has more functions. (No longer mantained, switched to String Trigger)

Renamer - Rename files and folders, remove portions of text from the filename etc.

GPO Tool - Export/Import Group policy settings.

BeatsPlayer - Music player.

Params Tool - Right click an exe to see it's parameters or execute them.

String Trigger - Triggers pasting text or applications or internet links on specific strings.

Inconspicuous - Hide files in plain sight, not fully encrypted.

Regedit Control - Registry browsing history, quickly jump into any saved key.

Time4Shutdown - Write the time for shutdown in minutes.

Power Profiles Tool - Set a profile as active, delete, duplicate, export and import.

Firefox Profile Backup - Backup/restore previously saved profile.

Finished Task Shutdown - Shuts down pc when specified window/Wndl/process closes.

NetworkSpeedShutdown - Shuts down pc if download speed goes under "X" Kb/s.

IUIAutomation - Topic with framework and examples

Au3Record.exe

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • Fin
      By Fin
      Hello...:)
      I have done extensive searches on this issue before posting but have not found a solve. Any help will be greatly appreciated.
      ;I have a valid AutoIt support question and kindly provided the details of my system: ;AutoIt Version: V3.3.14.2 [X32] ;Windows Version: WIN_VISTA [X86] ;Language: English (0409) #include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> Global $form = GUICreate("O_o", 146, 66, -1, -1) Global $inputNorth = GUICtrlCreateInput("", 12, 24, 53, 21) Global $btnSet = GUICtrlCreateButton("Set Controls", 72, 16, 65, 33, $BS_DEFPUSHBUTTON) GUISetState(@SW_SHOW) HotKeySet("{UP}","_north") While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $btnSet Global $goNorth= "-" & GUICtrlRead($inputNorth) MsgBox(0,"", "go north: " & $goNorth) Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd ;functions Func _north() $pos=MouseGetPos() MouseMove($pos[0], $pos[1]$goNorth,0) ;-results in syntax error EndFunc As you can see, $goNorth gets its value from $inputNorth
      (the MsgBox shows it works)
      But I cannot get MouseMove() to take $goNorth
      If I use: MouseMove($pos[0], $pos[1]$goNorth,0) --I get a syntax error.
      If I use: MouseMove($pos[0], $pos[1] & $goNorth,0) --I no longer get a syntax error, but that's not right so the function, (likely), moves by zero.
      So is there a way I can get MouseMove() to take a variable for that parameter?
      Thank you in advance should you choose to help!
    • CodingMonkey81
      By CodingMonkey81
      All,
      I'm working on automating the update process for a piece of software that we use at my company. The installer file always contains the version number as a part of the file name (eg InstallFile_9342.msi) and the numbers always change with every update.
      How do I use AutoIt to run the program? I know I can't use a wildcard in place of the numbers when using the "Run" command. 
      I tried 
      Local $aArray = _FileListToArray("C:\path\to\file", "InstallFile_*.msi", 0, 1) Run("$aArray") and I also tried
      Local $bInstall = FileFindFirstFile("InstallFile_*.msi") Run("$bInstall") and neither worked. 
      Can someone please point me in the right direction? I've done some searching on the forum and haven't found anyone in a similar situation before.
      Thanks!
    • VAN0
      By VAN0
      Hello.
      I have a program XX that asks for user confirmation on exit, which hangs the system reboot/shutdown process until I confirm. So I decided create a autoit script that would automatically close that dialog and let the system reboot/shutdown.
      The problem I'm facing is that my scripts now exits before the XX.
      Is there a way delay script exit until the XX is closed but only when system is rebooting/shutting down?
       
      Thank you.
    • Ian_Mac
      By Ian_Mac
      HotKeySet("^{SPACE}", "get_color") $colorCodeHere = ;<---------------- func get_color() Global $point = MouseGetPos() Global $color = PixelGetColor($point[0], $point[1]) MsgBox(0, "debug", "result: " & $color) EndFunc While 1 Sleep(100) WEnd Hello guys my problem is, how can i store the value that i get in that PixelGetColor($point[0], $point[0])
      i know that when i msgbox the color i will show the = of $color
      but i wanted it to be the value like  $colorCodeHere = 13456254. but  not hardcoding the value.
       
      or how could i say 
      if $color is = to $color then do this and if  $color is not  equal to $color then do that.
    • Simpel
      By Simpel
      Hi, I created a gui with date field but formatted as time in HH:mm. It always shows "now-time". Even if I try to set it with GUICtrlSetData.
      #include <DateTimeConstants.au3> #include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> Example() Func Example() GUICreate("My GUI get date", 200, 200, 800, 200) Local $idDate = GUICtrlCreateDate("", 20, 20, 100, 20, $DTS_TIMEFORMAT) ; to select a specific default format Local $sStyle = "HH:mm" ; Just display hours and minutes <<<<<<<<<<<<<<<<<<<<<<<<<<<< GUICtrlSendMsg($idDate, $DTM_SETFORMATW, 0, $sStyle) ConsoleWrite(GUICtrlRead($idDate) & @CRLF) GUICtrlSetData($idDate, "00:00") ConsoleWrite(GUICtrlRead($idDate) & @CRLF) GUISetState(@SW_SHOW) ; Loop until the user exits. While GUIGetMsg() <> $GUI_EVENT_CLOSE WEnd MsgBox($MB_SYSTEMMODAL, "Time", GUICtrlRead($idDate)) EndFunc ;==>Example How can I set the time field with another time and how can this field be set blank?
      Regards, Conrad
×