在AutoIt的帮助文档中, 提到可以用 ControlCommand函数判断checkbox是否选中,有个参数叫“IsChecked”, 但在实际的使用中,至少对.net的checkbox控件无效,网上有人给出了解决方法,原文地址:
http://www.autoitscript.com/forum/topic/61295-ischecked-not-working-with-controlcommand/
他自定义了一个方法,根据选中时控件的颜色变化来判断状态,这是一种新的思路。
Func CheckboxIsChecked($strWindowTitle, $strWindowText, $strCheckboxId)
;===============================================================================
; Function Name: CheckboxIsChecked()
; Description: Determines checkbox state using difference in color luminosity.
; A pixel within the checkmark, which significantly changes its
; luminosity based on the IsChecked value, is compared to a pixel
; that has luminosity that's relatively unaffected by IsChecked
; state. The absolute difference can accommodate a variety of
; user color schemes.
; The location of the two pixels is relative to the upper left
; corner of the control. These pixels were selected to provide
; large contrast in both WinXP and Vista, with the checkbox both
; enabled and disabled. Other versions of Windows may require
; other pixels (e.g., older Windows uses an 'x' rather than tick)
; or a different threshold; use a Select Case @OSVersion to
; choose the best pixel pairs.
; Procedure:
; 1. get starting position (upper left corner of checkbox)
; which is defined as (0,0)
; 2. get colors of two pixels: checkmark at (8,6) and baseline
; at (8,11)
; 3. place in RGB array to facilitate Min/Max calc
; 4. calculate luminousity of each pixel (Max+Min)/2
; 5. if luminousity difference > threshold then IsChecked=True
; Entry: $strWindowTitle is control's owner window
; $strWindowText is window text
; $strCheckboxId is ID of control to be examined
; Returns: 1 if IsChecked=True, otherwise 0
; Created: 2008-01-09
; Author: Ed Allwein, Active Sensing, Inc. www.BuyPLM.com
;===============================================================================
Local Enum $rgblRed=0, $rgblGreen=1, $rgblBlue=2, $rgblLum=3
Const $maskRed = 0x0FF0000
Const $maskGreen = 0x0FF00
Const $maskBlue = 0x0FF
Const $intThreshold = 26; good UI practice suggests at least 10% diff on scale of 0-255
Local $rectControl[4]
$rectControl = ControlGetPos($strWindowTitle, $strWindowText, $strCheckboxId)
Local $posX = 0 ; X offset from upper left corner of checkbox
Local $posY = 0 ; Y offset from upper left corner of checkbox
; baseline pixel luminosity should be relatively stable regardless of checkmark luminosity
$posX = 8 ; baseline X offset
$posY = 11 ; baseline Y offset
Local $rgblBaseline[4]
$rgblBaseline = GetColorAsRGBL($rectControl[0]+$posX,$rectControl[1]+$posY)
; checkmark pixel should alternate between 2 luminosities (one of which is similar to baseline)
$posX = 8 ; checkmark X offset
$posY = 6 ; checkmark Y offset
Local $rgblCheckmark[4]
$rgblCheckmark = GetColorAsRGBL($rectControl[0]+$posX,$rectControl[1]+$posY)
If Abs($rgblBaseline[$rgblLum] - $rgblCheckmark[$rgblLum]) > $intThreshold Then
Return 1 ;notable luminousity difference between checkmark and baseline
Else
Return 0
EndIf
EndFunc
Func GetColorAsRGBL($posX,$posY)
;===============================================================================
; Function Name: GetColorAsRGBL()
; Description: returns an array containing (R,G,B,Lum) values. Lum is useful
; for seeking relative intensity change regardless of RGB value
; Entry: $posX,$posY are the (x,y) coordinates of the pixel
; Exit: $colorRGBL is (R,G,B,Lum) array of integers in range of 0-255
; Created: 2008-01-09
; Author: Ed Allwein, Active Sensing, Inc. www.BuyPLM.com
;===============================================================================
Local Enum $rgblRed=0, $rgblGreen=1, $rgblBlue=2, $rgblLum=3
Local Const $maskRed = 0x0FF0000
Local Const $maskGreen = 0x0FF00
Local Const $maskBlue = 0x0FF
Local $colorRGB[3] ; Lum is omitted during Min/Max tests
Local $colorRGBL[4]
Local $intColorValue = 0
$intColorValue = PixelGetColor($posX,$posY)
$colorRGB[$rgblRed] = BitShift(BitAND($intColorValue, $maskRed),16)
$colorRGBL[$rgblRed] = $colorRGB[$rgblRed]
$colorRGB[$rgblGreen] = BitShift(BitAND($intColorValue, $maskGreen),8)
$colorRGBL[$rgblGreen] = $colorRGB[$rgblGreen]
$colorRGB[$rgblBlue] = BitAND($intColorValue, $maskBlue)
$colorRGBL[$rgblBlue] = $colorRGB[$rgblBlue]
; calculate luminosity of pixel
$colorRGBL[$rgblLum] = Round((_ArrayMax($colorRGB, 1) + _ArrayMin($colorRGB, 1)) / 2)
Return $colorRGBL
EndFunc