Что нового

PixelChecksum для фонового окна

Dmitry

Новичок
Сообщения
2
Репутация
0
Добрый день.

В функции PixelChecksum есть возможность задать параметр $hWnd, определяющий окно, для которого эта функция должна применяться.
У меня стоит следующая задача: на заднем плане висит приложение, в котором происходят события. Увидеть их можно только зрительно. Поэтому наилучший вариант - брать новую хэш-сумму области из того окна и сравнивать со старой.
Однако схема не работает: хэш-сумма берется не из фонового окна, а просто из зрительной области монитора.
Может, у кого-то стояла задача мониторить изменения в приложениях на заднем плане. Гуглить пробовал, с PixelChecksum весь день воюю.
По проблеме нашел такой пост от 2009 года: https://www.autoitscript.com/forum/topic/98080-pixelchecksum-works-not/

Вот мой код:
Код:
$hWnd = WinGetHandle("[CLASS:InfoClass]")
$checksum = PixelChecksum(0, 85, 294, 804, 1, $hWnd)
While 1
  If $checksum <> PixelChecksum(0, 85, 294, 804, 1, $hWnd) Then
    MsgBox(0, "", "В указанной области произошли изменения!")
    $checksum = PixelChecksum(0, 85, 294, 804, 1, $hWnd)
  EndIf
  Sleep(500)
WEnd


Переменная $hWnd точно задана, проверял ее командой WinMove.

Подскажите, пожалуйста, кто знает.
 

Tempo

Скриптер
Сообщения
560
Репутация
176
PixelChecksum
Справка сказал(а):
hwnd[необязательный] Дескриптор окна. Требуется переключить опцию PixelCoordMode в 0 или 2.

PixelCoordMode
Справка сказал(а):
PixelCoordModeУстанавливает способ отсчёта координат используемый в Pixel-функциях. Абсолютные координаты или координаты относительно окна указанного в параметре HWND соответствующих функций (по умолчанию активное окно):
0 = относительно координат указанного окна
1 = (по умолчанию) абсолютное экранные координаты
2 = относительно координат клиентской области указанного окна
 
Автор
D

Dmitry

Новичок
Сообщения
2
Репутация
0

Tempo

Скриптер
Сообщения
560
Репутация
176
С этим параметром играл: задавал вначале кода вручную значения 0, 1, 2. Результат не меняется.
Но все равно использовали абсолютные экранные координаты?

Да и по описанию это всего лишь способ отсчета координат.
Параметр hwnd, только для этого и используется. Окно должно быть видимым даже если оно не активно.
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4 371
Репутация
1 178
Пробуйте.
1. Координаты относительно клиентской области окна (без заголовка, рамок и строки меню)
2. $iRight, $iBottom по умолчанию - правая и нижняя координата клиентской области
3. $hWnd по умолчанию - рабочий стол
4. Возвращает строку бинарных данных или пустую строку при ошибке
5. На Win7 для некоторых окон может зависеть от режима Aero (вкл/выкл)
Код:
#include <WinAPIGdi.au3>
#include <WinAPIConv.au3>

ConsoleWrite(_PixelChecksum() & @CRLF) ; весь рабочий стол

Func _PixelChecksum($iLeft = 0, $iTop = 0, $iRight = Default, $iBottom = Default, $hWnd = Default)
  If $hWnd = Default Then $hWnd = DllCall("user32.dll", "hwnd", "GetDesktopWindow")[0]
  If Not WinExists($hWnd) Then Return SetError(1, 0, "")
  Local $aPos = WinGetClientSize($hWnd)
  If Not IsArray($aPos) Then Return SetError(2, 0, "")
  If $iRight = Default Then $iRight = $aPos[0] - 1
  If $iBottom = Default Then $iBottom = $aPos[1] - 1
  If $iLeft < 0 Or $iTop < 0 Or $iRight >= $aPos[0] Or $iBottom >= $aPos[1] Then Return SetError(3, 0, "")
  Local $iWidth = $iRight - $iLeft + 1
  Local $iHeight = $iBottom - $iTop + 1
  Local $iSize = $iWidth * $iHeight * 4
  Local $hDC = _WinAPI_GetDC($hWnd)
  Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
  Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iWidth, $iHeight)
  _WinAPI_SelectObject($hMemDC, $hBitmap)
  _WinAPI_BitBlt($hMemDC, 0, 0, $iWidth, $iHeight, $hDC, $iLeft, $iTop, 0x00CC0020) ; $SRCCOPY
  _WinAPI_DeleteDC($hMemDC)
  _WinAPI_ReleaseDC($hWnd, $hDC)
  Local $tBits = DllStructCreate("byte[" & $iSize & "]")
  _WinAPI_GetBitmapBits($hBitmap, $iSize, DllStructGetPtr($tBits))
  _WinAPI_DeleteObject($hBitmap)
  Local $bHash = _WinAPI_HashData($tBits, $iSize, 16)
  If @error Then Return SetError(4, 0, "")
  Return Hex($bHash)
EndFunc
 
Верх