在AutoIt的帮助文档中, 提到可以用 ControlCommand函数判断checkbox是否选中,有个参数叫“IsChecked”, 但在实际的使用中,至少对.net的checkbox控件无效,网上有人给出了解决方法,原文地址:
他自定义了一个方法,根据选中时控件的颜色变化来判断状态,这是一种新的思路。
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 $colorRGBLEndFunc