Что нового

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

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,556
Репутация
628
MnM
это не всегда удачное решение. так как на очередном компе такого значка может и не быть. поэтому лучше все свое носить с собой.
 
Автор
MnM

MnM

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

AZJIO

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

MnM

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

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Код:
; 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,874
Репутация
1,194
MnM
Ладно, все проблема в промежутке перед получением дескриптора курсора. LoadCursorFromFile загружает его из файла. Значит нужна функция, которая загрузит курсор из ресурса. Вся проблема в том что Курсор это не BMP-рисунок и просто использовать подменяющую функцию, которая возвратит дескриптор вряд ли получится. Нужно именно где-то выковыривать специальную функцию для курсора.
 
Автор
MnM

MnM

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


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

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

AZJIO

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

Вот вариант Resource.au3 содержит функцию LoadCursor
 
Автор
MnM

MnM

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

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Она и не должна использоваться, её пользователь указывает в скрипте чтобы вытащить соответствующий ресурс. Вот до чего я дошёл, но не работает.
Код:
#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,874
Репутация
1,194
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,874
Репутация
1,194
MnM
Я выше давал на неё ссылку и писал что у меня не работает. Скрипт просто вылетает с ошибкой.
Ещё раз проверил, ani-файлы не вставились (WinXP)
 
Верх