Что нового

[Окна, Диалоги] Как связаны координаты в зависимости от выставленной GUICoordMode

shm_alex

Новичок
Сообщения
34
Репутация
4
Ну собственно пусть положение мышки не менялось
Код:
Opt("MouseCoordMode", 0)        ;1=absolute, 0=relative, 2=client
$pos0 = MouseGetPos()

Opt("MouseCoordMode", 1)        ;1=absolute, 0=relative, 2=client
$pos1 = MouseGetPos()


Opt("MouseCoordMode", 2)        ;1=absolute, 0=relative, 2=client
$pos2 = MouseGetPos()

как связаны Pos0,Pos1,Pos2?
Задача прикладная
Пусть разрешение одинаковое .
Но оказывается на разной винде(виртуальной машине) ширина шрифтов минюшек, заголовка окна, ширины границы окна- разное количество пикселей, что бы как-то уйти от этой зависимости и чтобы хотя бы на вирт машине с моим же разрешением я бы анализировал одинаковые области в скрипте я решил использовать
Opt("MouseCoordMode", 1) (хотя возможно это не панацея)
Но вот Мне понадобилось перевезти Координаты X,Y из Opt("MouseCoordMode", 1) в Opt("MouseCoordMode", 0)
для того чтобы сделать $hBMP = _ScreenCapture_Capture("",$lx,$ly,$rx,$ry,False)
(ведь _ScreenCapture_Capture поджирает только абсолютные координаты)
Т.Е у меня есть X,Y в координатах клиента как из них получить X1,Y1- координаты экрана, какие константы переменные добавить?
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Вообще никто не запрещает менять Opt в процессе работы скрипта ;).
Но если нужно вычислить...
Непонятно какой все таки нужен перевод координат? сделал оба :D
1. Opt('MouseCoordMode', 1) --> Opt('MouseCoordMode', 0) [absolute --> relative]
Код:
Opt('MouseCoordMode', 1)
#include <GUIConstants.au3>
#Include <Misc.au3>
Dim $aResult[4]
$hGUI = GUICreate('My GUI', 400, 200)
$hButton = GUICtrlCreateButton('Push', 50, 100, 80, 20)
GUISetState()

While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $GUI_EVENT_CLOSE
			Exit
		Case $msg = $hButton
			$aResult = _getcoord()
			MsgBox(0, 'Result', 'Абсолютные координаты: ' & $aResult[0] & ' / ' & $aResult[1] & @CRLF & 'относительные координаты окна: ' & $aResult[2] & ' / ' & $aResult[3])
	EndSelect
WEnd
Func _getcoord()
	MsgBox(0, 'Click', 'Кликните мышкой внутри окна')
	Dim $aArr[4]
	Do
		Sleep(5)
	Until _IsPressed('01')
	$aCoords = MouseGetPos()
	$aPos = WinGetPos($hGUI)
	$x = $aCoords[0] - $aPos[0]
	$y = $aCoords[1] - $aPos[1]
	$aArr[0] = $aCoords[0]
	$aArr[1] = $aCoords[1]
	$aArr[2] = $x
	$aArr[3] = $y
	Return $aArr
EndFunc
2. Opt('MouseCoordMode', 0) --> Opt('MouseCoordMode', 1) [relative --> absolute]
Код:
Opt('MouseCoordMode', 0)
#include <GUIConstants.au3>
#Include <Misc.au3>
Dim $aResult[4]
$hGUI = GUICreate('My GUI', 400, 200)
$hButton = GUICtrlCreateButton('Push', 50, 100, 80, 20)
GUISetState()

While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $GUI_EVENT_CLOSE
			Exit
		Case $msg = $hButton
			$aResult = _getcoord()
			MsgBox(0, 'Result', 'Относительные координаты окна: ' & $aResult[0] & ' / ' & $aResult[1] & @CRLF & 'абсолютные координаты: ' & $aResult[2] & ' / ' & $aResult[3])
	EndSelect
WEnd
Func _getcoord()
	MsgBox(0, 'Click', 'Кликните мышкой внутри окна')
	Dim $aArr[4]
	Do
		Sleep(5)
	Until _IsPressed('01')
	$aCoords = MouseGetPos()
	$aPos = WinGetPos($hGUI)
	$x = $aCoords[0] + $aPos[0]
	$y = $aCoords[1] + $aPos[1]
	$aArr[0] = $aCoords[0]
	$aArr[1] = $aCoords[1]
	$aArr[2] = $x
	$aArr[3] = $y
	Return $aArr
EndFunc
В этих скриптах нет проверки, что клик произведен по GUI!

Сложнее деле обстоит с координатами, относительно области клиента - там приходится учитывать высоту заголовка окна и толщину границ окна(они меняются в зависимости от оформления и тем в Windows), но и это решается - можешь посмотреть в коде моей утилиты:
Фоторамка - снятие скриншотов по фиксированным координатам
 
Автор
S

shm_alex

Новичок
Сообщения
34
Репутация
4
Redline сказал(а):
Вообще никто не запрещает менять Opt в процессе работы скрипта ;).
Но если нужно вычислить...
В своих поделках я часто использую процедурки типа
Func WaitForImg($x,$y,$l,$h,$CRC,$TimeOutSec,$str="",$RefreshTime=500)
которая ждёт пока не появится нужная мне картинка в нужной области экрана, ну и если координаты в абсолютных величинах , то на другой рабочей станции всё перестаёт работать из того что картинки смещаются на пиксель - два три из-за ширины шрифтов заголовков и ширины бордюров окна. даже при одинаковом разрешении экрана и максимизированном окне


Redline сказал(а):
Сложнее деле обстоит с координатами, относительно области клиента - там приходится учитывать высоту заголовка окна и толщину границ окна(они меняются в зависимости от оформления и тем в Windows), но и это решается - можешь посмотреть в коде моей утилиты:
Фоторамка - снятие скриншотов по фиксированным координатам
посморел я так понял здесь собака зарыта
Код:
$wincoord = WinGetPos($proj)
$labelcoord = ControlGetPos($proj, '', 'Static1') ; я так понимаю что это как раз координаты клиентской области ;окна , для произвольного окна как быть? не понял что за Static1, согласно справке  тут должно быть
;controlID - int , а не строка
;не понятно можно 
$border = ($wincoord[2] - $labelcoord[2]) / 2
$hTitle = $wincoord[3] - $labelcoord[3] - $border

ну всё понятно
если у меня есть X2,Y2- координаты взятые при помощи Opt("MouseCoordMode", 2)
то для того чтобы перейти к координатам экрана X,Y
надо
X=X2+_
ControlGetPos("Окно над которым взяты коодинаты'', 'Контрол над которым взяты координаты')[0]+_
+WinGetPos("Окно над которым взяты коодинаты")[0]
О! нашёл процедурку
_WinAPI_ClientToScreen($hwnd, $tpoint)
 

Medved

Новичок
Сообщения
27
Репутация
0
shm_alex [?]
О! нашёл процедурку _WinAPI_ClientToScreen($hwnd, $tpoint)
Отмечу, что обратная процедурка вроде как работает не только с хэндлом окна, но и с хэндлом контрола. Таким образом посылать клики в контролы по абс. координатам можно в два клика :laugh:
 
Верх