Что нового

Неправильное вычисление координат

Nefakt

Новичок
Сообщения
74
Репутация
3
Всем привет.
Нужна помощь, взял данный код
Код:
#Include <Constants.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Run(@ProgramFilesDir & '\Microsoft Games\Minesweeper\MineSweeper.exe')
$hWnd = WinWait('Minesweeper', '', 3)
If Not $hWnd Then
    Exit
EndIf

; Чтобы мины успели нарисоваться!
Sleep(1000)

$Size = WinGetClientSize($hWnd)
$hDC = _WinAPI_GetDC($hWnd)
$hMemDC = _WinAPI_CreateCompatibleDC($hDC)
$hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $Size[0], $Size[1])
$hSv = _WinAPI_SelectObject($hMemDC, $hBitmap)
_WinAPI_BitBlt($hMemDC, 0, 0, $Size[0], $Size[1], $hDC, 0, 0, $SRCCOPY)
_WinAPI_SelectObject($hMemDC, $hSv)
_WinAPI_DeleteDC($hMemDC)
_WinAPI_ReleaseDC($hWnd, $hDC)

; Здесь у тебя есть готовый битмап ($hBitmap), делай с ним что хочешь!

;----------------------------------------

; Демонстрация
$hWnd = GUICreate('', $Size[0], $Size[1], 50, 50, -1, $WS_EX_TOPMOST)
GUISetState()
$hDC = _WinAPI_GetDC($hWnd)
$L = $Size[0] * $Size[1]
$tBits = DllStructCreate('dword[' & $L & ']')
_WinAPI_GetBitmapBits($hBitmap, 4 * $L, DllStructGetPtr($tBits))
$Offset = 1
For $y = 0 To $Size[1] - 1
    For $x = 0 To $Size[0] - 1
        _WinAPI_SetPixel($hDC, $x, $y, DllStructGetData($tBits, 1, $Offset))
        $Offset += 1
    Next
Next
_WinAPI_ReleaseDC($hWnd, $hDC)

;----------------------------------------

; Ищем точку с цветом 0x87BEF5 (RGB)
$ARGB = _WinAPI_IntToDWord(BitOR(0x87BEF5, 0xFF000000))
$L = $Size[0] * $Size[1]
$tBits = DllStructCreate('dword[' & $L & ']')
_WinAPI_GetBitmapBits($hBitmap, 4 * $L, DllStructGetPtr($tBits))
$Timer = TimerInit()
$Offset = -1
For $i = 1 To $L
    If DllStructGetData($tBits, 1, $i) = $ARGB Then
        $Offset = $i
        ExitLoop
    EndIf
Next
ConsoleWrite('API' & @CR)
ConsoleWrite(TimerDiff($Timer) & @CR)
If $Offset = -1 Then
    ConsoleWrite('Not Found!' & @CR)
Else
    ConsoleWrite('X = ' & Mod($Offset, $Size[0]) - 1 & @CR)
    ConsoleWrite('Y = ' & Ceiling($Offset / $Size[0]) - 1 & @CR)
$X = Mod($Offset, $Size[0]) - 1
$Y = Ceiling($Offset / $Size[0]) - 1
MouseClick("left", $X, $Y)
EndIf

ConsoleWrite('' & @CR)
;----------------------------------------
Opt('MouseCoordMode', 2)
Opt('PixelCoordMode', 2)
$Timer = TimerInit()
$Offset = False
For $y = 0 To $Size[1] - 1
    For $x = 0 To $Size[0] - 1
        If PixelGetColor($x, $y, $hWnd) = 0x87BEF5 Then
            $Offset = True
            ExitLoop 2
        EndIf
    Next
Next
ConsoleWrite('AutoIt' & @CR)
ConsoleWrite(TimerDiff($Timer) & @CR)
If Not $Offset Then
    ConsoleWrite('Not Found!' & @CR)
Else
    ConsoleWrite('X = ' & $x & @CR)
    ConsoleWrite('Y = ' & $y & @CR)
EndIf

;----------------------------------------

Do
Until GUIGetMsg() = -3


Работает он правильно, в консоль выводит нужные координаты.
Но если прикрутить нажатие мыши
Код:
ConsoleWrite('X = ' & Mod($Offset, $Size[0]) - 1 & @CR)
    ConsoleWrite('Y = ' & Ceiling($Offset / $Size[0]) - 1 & @CR)
$X = Mod($Offset, $Size[0]) - 1
$Y = Ceiling($Offset / $Size[0]) - 1
MouseClick("left", $X, $Y)

В консоль выводит те же координаты но мышь нажимает совсем в другом месте.
Помогите решить, заранее спасибо и с наступающим вас.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Nefakt
Координаты считаешь относительно окна, а кликаешь относительно экрана.

Или так:
http://autoit-script.ru/autoit3_docs/functions/AutoItSetOption.htm#MouseCoordMode

Или так:
Код:
$myX = 500 ;Относительно экрана
$myY = 500
_Convert( $hWnd, $myX, $myY ) ;Относительно рабочей области окна hWnd

$myX = 500 ;Относительно экрана
$myY = 500
_Convert1( $hWnd, $myX, $myY ) ;Относительно окна hWnd

Func _Convert( $hWnd, ByRef $myX, ByRef $myY )
	Local $_tPoint = DllStructCreate( $tagPOINT )
		_WinAPI_ClientToScreen( $hWnd, $_tPoint )

	$myX = $myX - DllStructGetData( $_tPoint, 'X' )
	$myY = $myY - DllStructGetData( $_tPoint, 'Y' )
EndFunc

Func _Convert1( $hWnd, ByRef $myX, ByRef $myY )
	Local $aPos = WinGetPos( $hWnd )
	
	$myX = $myX - $aPos[0]
	$myY = $myY - $aPos[1]
EndFunc
 
Верх