Что нового

координаты PixelChecksum

babanty

Новичок
Сообщения
34
Репутация
1
Добрый день! застрял на глупом вопросе уже второй день :stars:
Есть координаты двух точек квадрата первая 50;100(левая верхняя точка), вторая 300;400(нижняя правая точка), как использовать PixelChecksum для этих координат?
PixelChecksum(50,100,300,400) он считает не ту область в которой располагается квадрат

Вот индусский код, в котором ни как не могу это реализовать, зажмите ctrl+s и выделите область, координаты левой верхней и нижней правой точки будут записаны в delite.ini, записывает координаты правильно (проверить можно нажав ctrl+z), PixelChecksum тоже работает, только проверяет область выше и левее чем так что выделена
Код:
#Include <Misc.au3>
#Include <WindowsConstants.au3>
$Gui_videl = 0
$nagat_Gui_videl = 0
;~ $WinGetTitle_videlenie = ''
Dim $Inipix[5]
Global $MouseGetPos_old[4]
Global $MouseGetPos[4]


HotKeySet('^a','poisk')
HotKeySet('^ф','poisk')
HotKeySet('^s','videlenie')
HotKeySet('^ы','videlenie')
HotKeySet('^z','Win')
HotKeySet('^я','Win')

Func poisk ()
	For $i_zero = 0 To 4
		$Inipix[$i_zero] = IniRead('delite.ini','Заменить_на_шаг', 'summpix_'&$i_zero,-789)
	Next
	If($Inipix[0] = -789) Then 	MsgBox(0,'','Не найдена информация в ини')
;~ 	MsgBox(0,'',$Inipix[1]&'--'&$Inipix[2]&'--'&$Inipix[3]&'--'&$Inipix[4])
	If(PixelChecksum($Inipix[1],$Inipix[2], $Inipix[3],$Inipix[4]) = $Inipix[0]) Then
		MsgBox(0,'','Области совпадают')
	Else
		MsgBox(0,'','Области НЕ совпадают')
	EndIf
EndFunc

Func videlenie()
	$MouseGetPos =  MouseGetPos()
;~ 	$WinGetTitle_videlenie = WinGetTitle("")
	if($Gui_videl = 0) Then
	$Gui_videl = GUICreate('NazvaniprogrammiAND',1,1,$MouseGetPos[0],$MouseGetPos[1],0x80000000,0x00000008)
	GUISetBkColor(0xff2400);
	Opt("WinTitleMatchMode", 2)
	WinSetTrans('NazvaniprogrammiAND','',100)
	$nagat_Gui_videl = 1
	$MouseGetPos_old = WinGetPos( 'NazvaniprogrammiAND')
	IniWrite('delite.ini','Заменить_на_шаг', 'summpix_1',$MouseGetPos_old[0])
	IniWrite('delite.ini','Заменить_на_шаг', 'summpix_2',$MouseGetPos_old[1])
	GUISetState (@SW_SHOWNOACTIVATE,$Gui_videl)
	EndIf
	; Сделать обнуление $Gui_vide после его удаления
	if($Gui_videl <> 0 ) Then
		WinMove('NazvaniprogrammiAND', "", Default,Default, $MouseGetPos[0]-$MouseGetPos_old[0],$MouseGetPos[1]-$MouseGetPos_old[1])
	EndIf

If($nagat_Gui_videl = 1) Then
While $nagat_Gui_videl <> 0

If(_IsPressed('53')  = 0) Then
	$MouseGetPos_old = WinGetPos( 'NazvaniprogrammiAND')
	$MouseGetPos_old[2] = $MouseGetPos_old[0]+$MouseGetPos_old[2]
	$MouseGetPos_old[3] = $MouseGetPos_old[1]+$MouseGetPos_old[3]
		GUIDelete($Gui_videl)
		IniWrite('delite.ini','Заменить_на_шаг', 'summpix_0',PixelChecksum($MouseGetPos_old[0],$MouseGetPos_old[1],$MouseGetPos_old[2],$MouseGetPos_old[3]))
		IniWrite('delite.ini','Заменить_на_шаг', 'summpix_1',$MouseGetPos_old[0])
		IniWrite('delite.ini','Заменить_на_шаг', 'summpix_2',$MouseGetPos_old[1])
		IniWrite('delite.ini','Заменить_на_шаг', 'summpix_3',$MouseGetPos_old[2])
		IniWrite('delite.ini','Заменить_на_шаг', 'summpix_4',$MouseGetPos_old[3])
		$nagat_Gui_videl = 0
;~ 		For $i_zero = 0 To 1
;~ 		$MouseGetPos_old = 0
;~ 		$MouseGetPos = 0
;~ 		Next
;~ 		$WinGetTitle_videlenie = 0
		$Gui_videl = 0
		Sleep(100)
EndIf
Sleep(5)
WEnd
EndIf
EndFunc

Func Win()
	$Id_okno_1 = GUICreate("", $Inipix[3]-$Inipix[1],$Inipix[4]-$Inipix[2], $Inipix[1],$Inipix[2], 0x80000000) ; создание окна,
	GUISetState (@SW_SHOW,$Id_okno_1)
	EndFunc

While 1
Sleep(5)
	WEnd
 

InnI

AutoIT Гуру
Сообщения
4,599
Репутация
1,293
У меня на Win7 ваш код работает. Выдаёт "Области совпадают". Только нужно добавить задержку между удалением окна и расчётом контрольной суммы, чтобы перерисовались прозрачные области окон, находившихся под окном выделения
Код:
GUIDelete($Gui_videl)
        Sleep(50) ; <= добавить
        IniWrite('delite.ini', 'Заменить_на_шаг', 'summpix_0', PixelChecksum($MouseGetPos_old[0], $MouseGetPos_old[1], $MouseGetPos_old[2], $MouseGetPos_old[3]))
 
Автор
B

babanty

Новичок
Сообщения
34
Репутация
1
InnI сказал(а):
У меня на Win7 ваш код работает. Выдаёт "Области совпадают". Только нужно добавить задержку между удалением окна и расчётом контрольной суммы, чтобы перерисовались прозрачные области окон, находившихся под окном выделения
Код:
GUIDelete($Gui_videl)
        Sleep(50) ; <= добавить
        IniWrite('delite.ini', 'Заменить_на_шаг', 'summpix_0', PixelChecksum($MouseGetPos_old[0], $MouseGetPos_old[1], $MouseGetPos_old[2], $MouseGetPos_old[3]))

Да проверил на других компьютерах, работает, а вот у меня на Win8.1 с разрешением 1920х1080 и почему то нет, PixelChecksum считает область выше и левее выделенной, с чем это может быть связано?


Добавлено:
Сообщение автоматически объединено:

ТЕМА РЕШЕНА. Я не выключал компьютер несколько недель, после перезагрузки все стало нормально работать ;D
 
Верх