Что нового

Внедрение в скомпилированный скрипт подвижного указателя

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Здравствуйте, просьба помочь с проблемой установления подвижного курсора, который должен быть внедрен в запускаемый файл и был вызван по необходимости. Проблема в том что (*.ani) файлы могут быть установлены при помощи функции
Код:
_WinAPI_LoadCursorFromFile(@scriptdir&"\b.ani")

И далее
Код:
_WinAPI_SetCursor($handle);$handle от предыдущей функции

Я знаю только такой способ установки "чистого"(не внедренного) (*.ani) файла. Если кто знает как можно их устанавливать из (*.exe) файлов или хотя бы из (*.dll) Просьба высказать.
 

sims

Осваивающий
Сообщения
184
Репутация
24
Есть также функция LoadCursor, которая загружает курсор из ресурса исполняемого файла.
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Да, знаю но в дело в том что я не знаю как добавить (*.ani) файл в (*.exe), ResourceHacker не может его добавить если указывать CURSORGROUP как тип ресурса.
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
ivsatel, я использовал этот вариант, но все равно приходится доставать курсор и использовать его в чистом виде. Хотелось бы чтобы его можно было использовать на прямую из ресурсов.
 

joiner

Модератор
Локальный модератор
Сообщения
3 338
Репутация
574
MnM
это не всегда удачное решение. так как на очередном компе такого значка может и не быть. поэтому лучше все свое носить с собой.
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Joiner,
Извините, но либо я не понял вашего сообщения, либо вы не поняли моего первого :smile:.
Я как бы и хочу чтобы курсор .ani(именно он) можно было поместить в ресурсы .exe(скомпилированного скрипта) и использовать его на прямую из ресурсов(например как картинку или шрифт) не вытаскивая его физически в накопитель, как предложил ivsatel
Код:
FileInstall()
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
Внедрение в скомпилированный скрипт подвижного указателя
Может иконки курсора? Каждый раз читая заголовок создаётся впечатление указателя, который является переменной при передачи в функцию или указателя на структуру данных (Ptr).
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
AZJIO сказал(а):
Может иконки курсора
Нуу... в системе при наведении на .ani курсор выводится комментарий что "тип:Подвижный указатель" :smile:
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
Код:
; GaryFrost
; http://www.autoitscript.com/forum/topic/22214-change-activate-mouse-cursor/#entry154740
Global Const $OCR_APPSTARTING = 32650
Global Const $OCR_NORMAL = 32512
Global Const $OCR_CROSS = 32515
Global Const $OCR_HAND = 32649
Global Const $OCR_IBEAM = 32513
Global Const $OCR_NO = 32648
Global Const $OCR_SIZEALL = 32646
Global Const $OCR_SIZENESW = 32643
Global Const $OCR_SIZENS = 32645
Global Const $OCR_SIZENWSE = 32642
Global Const $OCR_SIZEWE = 32644
Global Const $OCR_UP = 32516
Global Const $OCR_WAIT = 32514

;~ _SetCursor(@WindowsDir & "\cursors\3dgarro.cur", $OCR_NORMAL)
;~ _SetCursor(@WindowsDir & "\cursors\3dwarro.cur", $OCR_NORMAL)
_SetCursor(@WindowsDir & "\cursors\dinosaur.ani", $OCR_NORMAL) ; ставим топающего динозавра
;_SetCursor(@WindowsDir & "\cursors\aero_arrow.cur", $OCR_NORMAL) ; Восстанови курсор потом

;==================================================================
; $s_file - file to load cursor from
; $i_cursor - system cursor to change
;==================================================================
Func _SetCursor($s_file, $i_cursor)
   Local $newhcurs, $lResult
   $newhcurs = DllCall("user32.dll", "int", "LoadCursorFromFile", "str", $s_file)
   If Not @error Then
      $lResult = DllCall("user32.dll", "int", "SetSystemCursor", "int", $newhcurs[0], "int", $i_cursor)
      If Not @error Then
         $lResult = DllCall("user32.dll", "int", "DestroyCursor", "int", $newhcurs[0])
      Else
         MsgBox(0, "Error", "Failed SetSystemCursor")
      EndIf
   Else
      MsgBox(0, "Error", "Failed LoadCursorFromFile")
   EndIf
EndFunc  ;==>_SetCursor


Вот встраивание файла в скрипт с кодированием в Base64, но не уверен что у тебя получится, у меня нет.
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
OffTopic:
Складывается ощущение что надо мною издеваются :-X

AZJIO, вы мне приводите примеры установления "чистого" курсора.
Разве нельзя установить в GUI .ani курсор на прямую из ресурсов(Когда можно установить его в .dll или .exe(ResourceHack)) и использовать его?


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

AZJIO сказал(а):
Сдается мне что UEZ все также вытаскивает ресурс из файла, делая его чистым и уже только потом использует :-\ :'(
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
MnM
Ладно, все проблема в промежутке перед получением дескриптора курсора. LoadCursorFromFile загружает его из файла. Значит нужна функция, которая загрузит курсор из ресурса. Вся проблема в том что Курсор это не BMP-рисунок и просто использовать подменяющую функцию, которая возвратит дескриптор вряд ли получится. Нужно именно где-то выковыривать специальную функцию для курсора.
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
=> Данная проблема теоретически пока что не имеет решения?


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

Кроме как самого простого
Код:
FileInstall()
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
В ресурсах при просмотре в "ResHacker" есть тип "Cursor", значит что-то есть, что может его оттуда брать.
Как ни странно но в Google полно информации об этом. Типа
Код:
hCursor = LoadCursor(hInst, "AppCursor")
Вот вариант Resource.au3 содержит функцию LoadCursor
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
К сожалению переменная $RT_ANICURSOR в библиотеке только для "украшения" видимо, т.к. она ни в какой функции не фигурирует.
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
Она и не должна использоваться, её пользователь указывает в скрипте чтобы вытащить соответствующий ресурс. Вот до чего я дошёл, но не работает.
Код:
#AutoIt3Wrapper_Res_File_Add=dinosaur.ani,CURSOR,DINCUR,0
#AutoIt3Wrapper_Compression=n
#AutoIt3Wrapper_UseUpx=n

#include <GUIConstantsEx.au3>
#include <Resource.au3>

Global Const $OCR_NORMAL = 32512

; if Not @Compiled Then Exit MsgBox(0,"Err","Надо скомпилировать")

$Gui = GUICreate("Грузим курсор",500,500,0,0)
$hCursor = ResGetImage($RT_ANICURSOR, 'DINCUR', -1, @ScriptFullPath)
MsgBox(0, 'Дескриптор?', $hCursor & @LF & VarGetType($hCursor))
If $hCursor Then _SetCursor($hCursor, $OCR_NORMAL)
GUISetState()

Do
Until GUIGetMsg() = -3

Func _SetCursor($hCursor, $i_cursor)
   Local $lResult
   If Not @error Then
      $lResult = DllCall("user32.dll", "int", "SetSystemCursor", "int", $hCursor, "int", $i_cursor)
      If Not @error Then
         $lResult = DllCall("user32.dll", "int", "DestroyCursor", "int", $hCursor)
      Else
         MsgBox(0, "Error", "Failed SetSystemCursor")
      EndIf
   Else
      MsgBox(0, "Error", "Failed LoadCursorFromFile")
   EndIf
EndFunc  ;==>_SetCursor


Этот вариант тоже не хочет работать
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
MnM
Да я заметил, что там должна отображаться иконка, а не Hex-код.
Вот так удалось вставить .cur в CursorGroup.
Код:
#AutoIt3Wrapper_Run_After=%autoitdir%\SciTE\ResHacker\ResHacker.exe -add "%out%", "%out%", %scriptdir%\icons\3dsmove.cur, CursorGroup, 1, 0

Когда использую ani, пишет в лог - ResHacker.log что иконку не удаётся добавить.
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
MnM
Я выше давал на неё ссылку и писал что у меня не работает. Скрипт просто вылетает с ошибкой.
Ещё раз проверил, ani-файлы не вставились (WinXP)
 
Верх