Что нового

контрольная сумма области пикселей

AlexxxMksv

Новичок
Сообщения
39
Репутация
0
Добрый день такой код вычисляет контрольную сумма области пикселей:


Код:
WinWait($ConfigName)
   $hWnd1 = WinWaitActive($ConfigName)
   $tRect = _WinAPI_GetWindowRect($hWnd1)
   ;Получим координаты
   $Left = DllStructGetData($tRect, "Left")
   $Top = DllStructGetData($tRect, "Top")
   $Right = DllStructGetData($tRect, "Right")
   $Bottom = DllStructGetData($tRect, "Bottom")
   MsgBox(0,"","" & $Left & "/" & $Top & "/" & $Right & "/" & $Bottom)
   ;Генерируем контрольную сумму области пикселе
   $checksum = PixelChecksum($Left, $Top, $Right, $Bottom)


почему меняется контрольная сумма окна "$ConfigName", если я всего лишь переместил окно?
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Сейчас опробовал ваш код на "Блокноте". Контрольная сумма меняется даже если ничего не двигать. В моём случаи, думаю, это связано с мигающим курсором. Вполне возможно, что и у вас меняется что-то в окне.
 
Автор
A

AlexxxMksv

Новичок
Сообщения
39
Репутация
0
edyapd сказал(а):
Сейчас опробовал ваш код на "Блокноте". Контрольная сумма меняется даже если ничего не двигать. В моём случаи, думаю, это связано с мигающим курсором. Вполне возможно, что и у вас меняется что-то в окне.

Ладно, тогда тут почему разные контрольные суммы, окно перемещаю программно, ни каких органов управление в нем нет:

Код:
#include <WinAPIEx.au3>
#Include <WindowsConstants.au3>
    ;покажу зону контроля в окне
   $hWnd1 = GUICreate('Test', 100, 100, 0, 0, $WS_POPUP, $WS_EX_TOPMOST)
   GUISetBkColor(0xFF00000)
   WinSetTrans($hWnd1, '', 255) ; прозрачность
   GUISetState()
   Sleep(3000)

   $tRect = _WinAPI_GetWindowRect($hWnd1)
   ;Получим координаты
   $Left = DllStructGetData($tRect, "Left")
   $Top = DllStructGetData($tRect, "Top")
   $Right = DllStructGetData($tRect, "Right")
   $Bottom = DllStructGetData($tRect, "Bottom")

   $checksum = PixelChecksum($Left, $Top, $Right, $Bottom)

   WinMove($hWnd1,"",500,500)

      $tRect = _WinAPI_GetWindowRect($hWnd1)
   ;Получим координаты
   $Left = DllStructGetData($tRect, "Left")
   $Top = DllStructGetData($tRect, "Top")
   $Right = DllStructGetData($tRect, "Right")
   $Bottom = DllStructGetData($tRect, "Bottom")
   Sleep(3000)

   $checksum1 = PixelChecksum($Left, $Top, $Right, $Bottom)
   If $checksum1 = $checksum Then
	  MsgBox(0,"", "Равны: " & $checksum1 & " и " & $checksum)
   Else
	  MsgBox(0,"", "НЕ Равны: " & $checksum1 & " и " & $checksum)
   EndIf




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

я просто охрен.... убрал картинку с рабочего стола и сделал его однотонным и контрольная сумма окна после перемещения не изменилась.
как избавится от этого эффекта?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
AlexxxMksv,
Код:
#include <GUIConstantsEx.au3>

Opt('PixelCoordMode', 2);!!!

Global $hGui, $iCheck

$hGui = GUICreate('Test', 150, 100, 0, 0)
GUISetBkColor(0xFF0000)
GUISetState()
$iCheck = PixelChecksum(0, 0, 150, 100, 1, $hGui)
ConsoleWrite('Start: ' & $iCheck & @LF)
HotKeySet('1', '_Move')
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _Move()
	If Not WinActive($hGui) Then WinActivate($hGui)
	WinWaitActive($hGui, '', 3)
	WinMove($hGui, '', Random(1, 300, 1), Random(1, 300, 1))
	ConsoleWrite(PixelChecksum(0, 0, 150, 100, 1, $hGui) & @LF)
EndFunc   ;==>_Move
 
Автор
A

AlexxxMksv

Новичок
Сообщения
39
Репутация
0
madmasles сказал(а):
AlexxxMksv,
Код:
#include <GUIConstantsEx.au3>

Opt('PixelCoordMode', 2);!!!

Global $hGui, $iCheck

$hGui = GUICreate('Test', 150, 100, 0, 0)
GUISetBkColor(0xFF0000)
GUISetState()
$iCheck = PixelChecksum(0, 0, 150, 100, 1, $hGui)
ConsoleWrite('Start: ' & $iCheck & @LF)
HotKeySet('1', '_Move')
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func _Move()
	If Not WinActive($hGui) Then WinActivate($hGui)
	WinWaitActive($hGui, '', 3)
	WinMove($hGui, '', Random(1, 300, 1), Random(1, 300, 1))
	ConsoleWrite(PixelChecksum(0, 0, 150, 100, 1, $hGui) & @LF)
EndFunc   ;==>_Move


Что то мне кажется в коде строка:
Код:
ConsoleWrite(PixelChecksum(0, 0, 150, 100, 1, $hGui) & @LF)

читает один и тот же участок экрана, поэтому и контрольные суммы одинаковые.
Я изменил ваш код и получаю координаты экрана методом "_WinAPI_GetWindowRect"
и у меня контрольные суммы отличаются после перемещения окна.
Прошу найти ошибку в моем коде, если она есть (возможно я подсчитываю координаты не верно):

Код:
#include <GUIConstantsEx.au3>
#include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Opt('PixelCoordMode', 2);!!!

Global $hGui, $iCheck

$hGui = GUICreate('Test', 150, 100, 1, 2, $WS_POPUP, $WS_EX_TOPMOST)
GUISetBkColor(0xFF0000)
GUISetState()


$iCheck = PixelChecksum(1, 2, 150, 100, 1, $hGui)

ConsoleWrite('Start: ' & $iCheck & @LF)
HotKeySet('1', '_Move')
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _Move()
    If Not WinActive($hGui) Then WinActivate($hGui)
    WinWaitActive($hGui, '', 3)
    WinMove($hGui, '', Random(1, 300, 1), Random(1, 300, 1))
   $tRect1 = _WinAPI_GetWindowRect($hGui)
   ;Получим координаты
   $Left = DllStructGetData($tRect1, "Left")
   $Top = DllStructGetData($tRect1, "Top")
   $Right = DllStructGetData($tRect1, "Right")
   $Bottom = DllStructGetData($tRect1, "Bottom")
    ConsoleWrite(PixelChecksum($Left, $Top, $Right, $Bottom) & @LF)
EndFunc   ;==>_Move
 

InnI

AutoIT Гуру
Сообщения
4,982
Репутация
1,460
AlexxxMksv
читает один и тот же участок экрана
Неверно. Она "читает" относительно окна $hGui независимо от положения этого окна.

получаю координаты экрана методом "_WinAPI_GetWindowRect"
Данная функция возвращает экранные координаты, а у вас включена опция расчёта координат 'PixelCoordMode' относительно клиентской области активного окна.

подсчитываю координаты не верно
Для второго вашего примера
Код:
PixelChecksum($Left, $Top, $Right - 1, $Bottom - 1)
 
Автор
A

AlexxxMksv

Новичок
Сообщения
39
Репутация
0
InnI сказал(а):
AlexxxMksv


получаю координаты экрана методом "_WinAPI_GetWindowRect"
Данная функция возвращает экранные координаты, а у вас включена опция расчёта координат 'PixelCoordMode' относительно клиентской области активного окна.

Мне очень важно, тогда какой функцией пользоваться в моем случае вместо _WinAPI_GetWindowRect"?


я установил в 1 Opt('PixelCoordMode', 1);!!! и исправил:

PixelChecksum($Left, $Top, $Right - 1, $Bottom - 1)

и все заработало, все ли корректно я сделал?:

Код:
#include <GUIConstantsEx.au3>
#include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

Opt('PixelCoordMode', 1);!!!

Global $hGui, $iCheck
Global $i = 0

$hGui = GUICreate('Test', 150, 100, 0, 0, $WS_POPUP, $WS_EX_TOPMOST)
GUISetBkColor(0xFF0000)
GUISetState()

HotKeySet('1', '_Move')
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _Move()
    WinMove($hGui, '', $i , $i)
   $tRect = _WinAPI_GetWindowRect($hGui)
   $Left = DllStructGetData($tRect, "Left")
   $Top = DllStructGetData($tRect, "Top")
   $Right = DllStructGetData($tRect, "Right")
   $Bottom = DllStructGetData($tRect, "Bottom")

    ConsoleWrite($Left & '/' & $Top & '/' & $Right & '/' & $Bottom & @CRLF& _
    PixelChecksum($Left, $Top, $Right-1, $Bottom-1) & @LF)
	$i +=10
EndFunc   ;==>_Move
 

InnI

AutoIT Гуру
Сообщения
4,982
Репутация
1,460

edyapd

Осваивающий
Сообщения
380
Репутация
30
InnI, а можете на пальцах объяснить почему здесь
Код:
PixelChecksum($Left, $Top, $Right - 1, $Bottom - 1)

от нижней и правой границы отнимается единица?
Почему тогда к левой и верхней не прибавляется?
 

InnI

AutoIT Гуру
Сообщения
4,982
Репутация
1,460
edyapd
от нижней и правой границы отнимается единица
Для окна размером 1х1 пиксель, находящееся в координатах 0:0, функция _WinAPI_GetWindowRect() вернёт L:T:R:B - 0:0:1:1, т.е. как будто окно размером 2х2 пикселя. Для окна 2х2 область будет 0:0:2:2, т.е. [0,1,2] = 3 пикселя. А функция PixelChecksum() этот лишний пиксель и захватывает, поэтому контрольные суммы не совпадают.
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
С контрольной суммой всё понятно. Раз есть изменяющийся пиксель, то она и будет разной.
Но тогда получается, что функция _WinAPI_GetWindowRect() не совершенна?
Впрочем постараюсь просто не забыть на будующее, если вдруг придётся столкнуться.
 
Верх