Что нового

Как получить хэш курсора?

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Подскажите, как получить хэш, уникальную строку итп для курсора?

Мне нужно будет сравнивать этот хэш с запомненным, так я могу определить что курсор имеет нужную мне форму.
Курсор не получить с помощью
Код:
MouseGetCursor
, но можно через
Код:
_WinAPI_GetCursorInfo
извлечь handle и через
Код:
_WinAPI_GetIconInfo
получить иконку.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Получите данные битмапа с помощью _WinAPI_GetObject() и возьмите от них хэш.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Не подскажите как получить данные битмапа? А то я в этом слегка "плаваю".
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А зачем все так сложжно? Неужели нельзя обойтись ID курсора?
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Yashied [?]
Неужели нельзя обойтись ID курсора?
Нельзя


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

Вот так я могу нарисовать на элементе Pic текущий курсор. Но мне нужно не рисовать, а хэш.
Код:
$aCursor = _WinAPI_GetCursorInfo()
    $hCursor = $aCursor[2]
    $aCursorInfo = _WinAPI_GetIconInfo($hCursor)
    $hbmMask = $aCursorInfo[4]
    $hColor = $aCursorInfo[5]
    $hIcon = _WinAPI_CreateIconIndirect($hColor, $hbmMask)
    GUICtrlSendMsg($idIcon, $STM_SETIMAGE, 1, $hIcon)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
inververs сказал(а):
Не подскажите как получить данные битмапа? А то я в этом слегка "плаваю".
_WinAPI_GetCursorInfo() -> _WinAPI_GetIconInfo() -> _WinAPI_GetObject()

В результате получите данные битмапа, от которых и возьмете любой хэш.

P.S

Но все это немного неправильно. Если можете, то опишите саму задачу, т.к. на лицо бессмысленное усложнение задачи.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
_WinAPI_GetObject все сложно... $iSize как узнать? $pObject откуда взять?.. печаль.

Yashied [?]
Если можете, то опишите саму задачу, т.к. на лицо бессмысленное усложнение задачи.
Флэш автоматизирую, там из элементов только курсор меняется...
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
inververs сказал(а):
Флэш автоматизирую, там из элементов только курсор меняется...
ControlClick с ним хорошо работает, я как-то делал, всё отлично работало, даже в скрытом окне...
Код:
ControlClick($hwnd,"","MacromediaFlashPlayerActiveX1", "main",1,252,161)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>

$hCursor = _WinAPI_GetCursorInfo()
$hBitmap = _WinAPI_GetIconInfo($hCursor[2])
$hObject = _WinAPI_CopyBitmap($hBitmap[5])
For $i = 4 To 5
	_WinAPI_DeleteObject($hBitmap[$i])
Next
$tBITMAP = DllStructCreate($tagBITMAP)
If _WinAPI_GetObject($hObject, DllStructGetSize($tBITMAP), DllStructGetPtr($tBITMAP)) Then
	ConsoleWrite('Address: ' & $tBITMAP.bmBits & @CRLF)
	ConsoleWrite('Size:    ' & $tBITMAP.bmWidth & ' x ' & $tBITMAP.bmHeight & ' x 4' & ' = ' & ($tBITMAP.bmWidth * $tBITMAP.bmHeight * 4) & ' bytes' & @CRLF)
EndIf


Далее берете хэш от блока по полученному адресу и размеру.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Вот! Отлично. Это подходит. Спасибо, вы очень выручили.
Кому будет интересно хэш можно так получить:
Код:
ConsoleWrite('Hash: ' &  _WinAPI_HashData ($tBITMAP.bmBits, ($tBITMAP.bmWidth * $tBITMAP.bmHeight * 4) ) & @CRLF)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
inververs,
Может, Вам удобнее будет _WinAPI_ComputeCrc32() использовать?
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
madmasles может, вообще любой подойдет, выбрал первый попавшийся.
 
Верх