Что нового

Внедрение иконок в скомпилированный скрипт (использование AutoIt3Wrapper)

saavaage

Знающий
Сообщения
171
Репутация
17
Суть:
попробовал внедрить при компиляции иконки в будущий исполняемый файл. Все, что удалось добиться, - внедрить иконку windows.ico и музыку. Остальные иконки встроились, но не работают. Библиотеку вроде активировал, но не знаю, какие функции из нее использовать и как ими заставить работать все иконки.

Код:
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=Windows.ico
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Res_Description=Resources Test Script
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_Language=1033
#AutoIt3Wrapper_Res_Icon_Add=refresh.ico
#AutoIt3Wrapper_Res_Icon_Add=ok.ico
#AutoIt3Wrapper_Res_Icon_Add=error.ico
#AutoIt3Wrapper_Run_AU3Check=n
#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, MySound.wav, SOUND, 200, 0
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <Constants.au3>
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
#include <Icons.au3>
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>

#Include <Resources.au3>

Global $Pic1_1, $Pic3_1, $Pic1_2, $Pic2_2, $Pic3_2, $PicError, $sLogI1_1, $sLogI1_2, $sLogI2_2, $sLogI3_1, $sLogI3_2, $hIcon, $Width = 14, $Height = 14
Global $Save_Event, $Save_MU, $Save_BITS, $sLog1_2, $sLog2_2, $sLog3_2, $sLog1_1, $sLog3_1

Global $aIcons[2] = [_ResourceSetImageToCtrl('error.ico'), _ResourceSetImageToCtrl('ok.ico')]
For $i = 0 To 1
    $hIcon = _Icons_Icon_Extract($aIcons[$i], 0, $Width, $Height)
	$aIcons[$i] = _Icons_Bitmap_CreateFromIcon($hIcon)
	_WinAPI_DestroyIcon($hIcon)
Next

Global $hImageListRefresh = _GUIImageList_Create(16, 16, 5)
_ResourceSetImageToCtrl(-1, "refresh.ico")





Opt("GUIOnEventMode", 1)

$hMain_GUI = GUICreate("Диагностика и Настройка", 619, 442, 189, 122)
GUISetFont(8.5, 400, 0, 'MS Shell Dlg')
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

$Tab1 = GUICtrlCreateTab(8, 16, 601, 377)

;;;; Hotfixes ;;;;
$HotfixErrors = GUICtrlCreateTabItem("HotfixErrors")

$Button_HotFixesUpdate = _GUICtrlCreateButtonEx4("Обновить", 510, 400, 85, 33, 'refresh.ico', -5)
GUICtrlSetTip(-1, "Обновить текущее состояние вкладки")
GUICtrlSetOnEvent($Button_HotFixesUpdate, "_HotFixes_Update")

; Работа со службами
GUICtrlCreateGroup("Службы, отвечающие за Автообновление", 16, 330, 370, 55)

GUICtrlCreateLabel("Автоматич. обновление", 24, 348, 75, 30, $BS_MULTILINE)
GUICtrlSetTip(-1, "тс - текущее состояние службы, тз - тип запуска службы")
GUICtrlCreateLabel("тс", 95, 348, 15, 15)
GUICtrlCreateLabel("тз", 95, 361, 15, 15)

GUICtrlCreateLabel("Фоновая Интел. Служба", 143, 348, 75, 30, $BS_MULTILINE)
GUICtrlCreateLabel("тз", 229, 361, 15, 15)

GUICtrlCreateLabel("Журнал Событий", 282, 348, 75, 30, $BS_MULTILINE)
GUICtrlCreateLabel("тс", 335, 348, 15, 15)
GUICtrlCreateLabel("тз", 335, 361, 15, 15)


$Pic1_1 = GUICtrlCreatePic('', 115, 348, $Width, $Height)
$Pic3_1 = GUICtrlCreatePic('', 355, 348, $Width, $Height)
$Pic1_2 = GUICtrlCreatePic('', 115, 361, $Width, $Height)
$Pic2_2 = GUICtrlCreatePic('', 249, 361, $Width, $Height)
$Pic3_2 = GUICtrlCreatePic('', 355, 361, $Width, $Height)
; запуск и сбор информации о текущем состоянии служб
_ServicesStat()

$Button_StartOptim = GUICtrlCreateButton("Старт", 478, 342, 55, 35, $BS_MULTILINE)
GUICtrlSetOnEvent($Button_StartOptim, "_StartOptim")
$Button_Save = GUICtrlCreateButton("Сохранить", 400, 342, 65, 35, $BS_MULTILINE)
GUICtrlSetOnEvent($Button_Save, "_SaveOld")
GUICtrlSetState(-1, $GUI_FOCUS)
$Button_Restore = GUICtrlCreateButton("Откат", 545, 342, 55, 35, $BS_MULTILINE)
GUICtrlSetOnEvent($Button_Restore, "_RestoreOld")

GUICtrlCreateTabItem("")

GUISetState()
_ResPlaySound('#200')
While 1
    Sleep(100)
WEnd

Func CLOSEClicked()
  Exit
EndFunc

Func _GUICtrlCreateButtonEx4($sText, $iLeft, $iTop, $iWidth = -1, $iHeight = -1, $sIconFile = "", $iIconIndex = 0)
    Local $nButton = GUICtrlCreateButton($sText, $iLeft, $iTop, $iWidth, $iHeight)
    _GUIImageList_AddIcon($hImageListRefresh, $sIconFile, $iIconIndex)
    _GUICtrlButton_SetImageList($nButton, $hImageListRefresh)
    Return $nButton
EndFunc


;; Hotfixes Section ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; функция сохранения текущих настроек служб
Func _SaveOld()
 GUICtrlSetState($Button_Save, $GUI_DISABLE)
 Dim $aSvcState[5]=['boot','system','auto','demand','disabled']
$Save_MU   = $aSvcState[$sLog1_2]
$Save_BITS = $aSvcState[$sLog2_2]
$Save_Event= $aSvcState[$sLog3_2]
 sleep(1000)
 GUICtrlSetState($Button_Save, $GUI_ENABLE)
EndFunc

; функция оптимизации настроек служб для запуска и работы MU
Func _StartOptim()
	GUICtrlSetState($Button_StartOptim, $GUI_DISABLE)
	RunWait('sc config BITS start= demand', '', @SW_HIDE)
	RunWait('sc config wuauserv start= auto', '', @SW_HIDE)
	RunWait('sc start wuauserv', '', @SW_HIDE)
	RunWait('sc config EventLog start= auto', '', @SW_HIDE)
	RunWait('sc start EventLog', '', @SW_HIDE)
     sleep(1000)
   _ServicesStat()
   sleep(1000)
   GUICtrlSetState($Button_StartOptim, $GUI_ENABLE)
EndFunc
; функция откат состояния служб к старым конфигурациям
Func _RestoreOld()
 GUICtrlSetState($Button_Restore, $GUI_DISABLE)
 RunWait('sc config eventlog start= ' & $Save_Event &'', '', @SW_HIDE)
 RunWait('sc config wuauserv start= ' & $Save_MU &'', '', @SW_HIDE)
 RunWait('sc config BITS start= ' & $Save_BITS &'', '', @SW_HIDE)
  sleep(1000)
 _ServicesStat()
 sleep(1000)
 GUICtrlSetState($Button_Restore, $GUI_ENABLE)
EndFunc

; функция кнопки "Обновить"  обновление информации о текущем состоянии служб
Func _HotFixes_Update()
	 GUICtrlSetState($Button_HotFixesUpdate, $GUI_DISABLE)
     _ServicesStat()
     sleep(1000)
     GUICtrlSetState($Button_HotFixesUpdate, $GUI_ENABLE)
 EndFunc

; функция сбора информации о текущем состоянии служб (используется SC и обработка полученного вывода через  StringRegExpReplace)и вывод через иконки данной информации на форму)
Func _ServicesStat()

  $sLog1_1 = ''
  $sLog1_2 = ''
  $sLog2_2 = ''
  $sLog3_1 = ''
  $sLog3_2 = ''

;  запрос информации о состоянии служб (текущее состояние: работает или нет)
 $hIPconfig1_1 = Run('sc query wuauserv', '', @SW_HIDE, $STDOUT_CHILD)
 $hIPconfig3_1 = Run('sc query eventlog', '', @SW_HIDE, $STDOUT_CHILD)
;  запрос информации о типе запуска служб (авто, вручную, отключено)
 $hIPconfig1_2 = Run('sc qc wuauserv', '', @SW_HIDE, $STDOUT_CHILD)
 $hIPconfig2_2 = Run('sc qc BITS', '', @SW_HIDE, $STDOUT_CHILD)
 $hIPconfig3_2 = Run('sc qc eventlog', '', @SW_HIDE, $STDOUT_CHILD)

 While 1
    $sLogI1_1 &= StdoutRead($hIPconfig1_1)
	$sLogI3_1 &= StdoutRead($hIPconfig3_1)

	$sLogI1_2 &= StdoutRead($hIPconfig1_2)
	$sLogI2_2 &= StdoutRead($hIPconfig2_2)
	$sLogI3_2 &= StdoutRead($hIPconfig3_2)

	 If @error Then ExitLoop
    Sleep(10)
 WEnd

; фильтрация информации о службах
  $sLog1_1 = StringRegExpReplace($sLogI1_1, "(?si).*STATE\D*(\d+).*", '\1')
  $sLog3_1 = StringRegExpReplace($sLogI3_1, "(?si).*STATE\D*(\d+).*", '\1')
  $sLog1_2 = StringRegExpReplace($sLogI1_2, "(?si).*START_TYPE\D*(\d+).*", '\1')
  $sLog2_2 = StringRegExpReplace($sLogI2_2, "(?si).*START_TYPE\D*(\d+).*", '\1')
  $sLog3_2 = StringRegExpReplace($sLogI3_2, "(?si).*START_TYPE\D*(\d+).*", '\1')
; программиорование отображение информации о службах через иконки

_SetHImage($Pic1_1, $aIcons[$sLog1_1 = 4])
_SetHImage($Pic3_1, $aIcons[$sLog3_1=4])
_SetHImage($Pic1_2, $aIcons[$sLog1_2=2])
_SetHImage($Pic2_2, $aIcons[(($sLog2_2 = 3) Or ($sLog2_2 = 2))])
_SetHImage($Pic3_2, $aIcons[$sLog3_2=2])
_SetHImage($PicError, $aIcons[$sLog3_1=4])

EndFunc



Подскажите как их заставить работать, плиз

PS Полный архив с иконками, AutoIt3Wrapper, библиотекой, ResHacker и т.д. - в аттаче - см. ссылку:
http://ifolder.ru/19539487


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

изменил шапку кода на:

Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=Windows.ico
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Res_Description=Resources Test Script
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_Language=1033
#AutoIt3Wrapper_Res_Icon_Add==ResHacker.exe -add %out%, %out%,  ok.ico, Icon, 0, 0
#AutoIt3Wrapper_Res_Icon_Add=ResHacker.exe -add %out%, %out%, error.ico, Icon, 0, 0
#AutoIt3Wrapper_Run_AU3Check=n
#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, MySound.wav, SOUND, 200, 0
#AutoIt3Wrapper_Res_Icon_Add=ResHacker.exe -add %out%, %out%, refresh.ico, Icon, 0, 0
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <Constants.au3>
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
#include <Icons.au3>
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#Include <Resources.au3>

Результат - опять ошибка...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
saavaage сказал(а):
Код:
#AutoIt3Wrapper_Res_Icon_Add==ResHacker.exe  -add %out%, %out%,  ok.ico, Icon, 0, 0

Ты сам понял чего написал? Чтобы добавить иконку, достаточно такой записи:

Код:
#AutoIt3Wrapper_Res_Icon_Add=ok.ico


Если приспичило для этого использовать ResHacker, то нужно писать так:

Код:
#AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, ok.ico, Icon, 100, 0


Здесь 100 - название ресурса. Естественно для каждой иконки оно должно быть уникальным и не пересикаться с умолчальными иконками AutoIt'а (99, 162, 164, 169 - для версии 3.3.6.1).
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
сначала было именно так, но потом уже начал маразмить.. от безысходности :wacko:
Кстати, каким образом можно узнать название ресурса?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
saavaage, открой в любом редакторе ресурсов (в том же ResHacker'е) скомпилированный файл и посмотри добавились ли иконки. Если да, то проблема в твоем коде. Изучать такой большой код у меня нет никакого желания. Если ты его упростишь и выделишь из него, так сказать, суть проблемы, то я скажу в чем проблема.
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
"Когда народ начнёт справки читать..."
Хорошо, кабы они были на русском. А так -с 5 на 10 понимаю....


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

10 минут и постараюсь упростить...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вообщем, вот так оно должно работать (вообще без ResHacker'а):

Код:
#Region  ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=Windows.ico
#AutoIt3Wrapper_Res_Description=Resources Test Script
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_Language=1033
#AutoIt3Wrapper_Res_Icon_Add=ok.ico
#AutoIt3Wrapper_Res_Icon_Add=error.ico
#AutoIt3Wrapper_Res_Icon_Add=refresh.ico
#AutoIt3Wrapper_Res_File_Add=MySound.wav, SOUND, 200
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Вот, упростил:
Код:
Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=Windows.ico
#AutoIt3Wrapper_Res_Icon_Add=ok.ico
#AutoIt3Wrapper_Res_Icon_Add=error.ico
#AutoIt3Wrapper_Res_Icon_Add=refresh.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <Constants.au3>
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
#include <Icons.au3>
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>

#Include <Resources.au3>

Global $Pic1_1, $Pic1_2, $sLogI1_1, $sLogI1_2, $hIcon, $Width = 14, $Height = 14
Global $sLog1_2, $sLog1_1

Global $aIcons[2] = [_ResourceSetImageToCtrl('error.ico'),_ResourceSetImageToCtrl('ok.ico')]
For $i = 0 To 1
    $hIcon = _Icons_Icon_Extract($aIcons[$i], 0, $Width, $Height)
	$aIcons[$i] = _Icons_Bitmap_CreateFromIcon($hIcon)
	_WinAPI_DestroyIcon($hIcon)
Next
Global $hImageListRefresh = _GUIImageList_Create(16, 16, 5)
_ResourceSetImageToCtrl($hImageListRefresh, "refresh.ico")





Opt("GUIOnEventMode", 1)

$hMain_GUI = GUICreate("Диагностика и Настройка", 619, 442, 189, 122)
GUISetIcon('Windows.ico', 1)
GUISetFont(8.5, 400, 0, 'MS Shell Dlg')
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

$Tab1 = GUICtrlCreateTab(8, 16, 601, 377)

;;;; Hotfixes ;;;;
$HotfixErrors = GUICtrlCreateTabItem("HotfixErrors")

$Button_HotFixesUpdate = _GUICtrlCreateButtonEx4("Обновить", 510, 400, 85, 33, 'refresh.ico', -5)
GUICtrlSetTip(-1, "Обновить текущее состояние вкладки")
GUICtrlSetOnEvent($Button_HotFixesUpdate, "_HotFixes_Update")

; Работа со службами
GUICtrlCreateGroup("Службы, отвечающие за Автообновление", 16, 330, 370, 55)

GUICtrlCreateLabel("Автоматич. обновление", 24, 348, 75, 30, $BS_MULTILINE)
GUICtrlSetTip(-1, "тс - текущее состояние службы, тз - тип запуска службы")
GUICtrlCreateLabel("тс", 95, 348, 15, 15)
GUICtrlCreateLabel("тз", 95, 361, 15, 15)


$Pic1_1 = GUICtrlCreatePic('', 115, 348, $Width, $Height)
$Pic1_2 = GUICtrlCreatePic('', 115, 361, $Width, $Height)
; запуск и сбор информации о текущем состоянии служб
_ServicesStat()

GUICtrlCreateTabItem("")

GUISetState()

While 1
    Sleep(100)
WEnd

Func CLOSEClicked()
  Exit
EndFunc

Func _GUICtrlCreateButtonEx4($sText, $iLeft, $iTop, $iWidth = -1, $iHeight = -1, $sIconFile = "", $iIconIndex = 0)
    Local $nButton = GUICtrlCreateButton($sText, $iLeft, $iTop, $iWidth, $iHeight)
    _GUIImageList_AddIcon($hImageListRefresh, $sIconFile, $iIconIndex)
    _GUICtrlButton_SetImageList($nButton, $hImageListRefresh)
    Return $nButton
EndFunc


;; Hotfixes Section ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; функция кнопки "Обновить"  обновление информации о текущем состоянии служб
Func _HotFixes_Update()
	 GUICtrlSetState($Button_HotFixesUpdate, $GUI_DISABLE)
     _ServicesStat()
     sleep(1000)
     GUICtrlSetState($Button_HotFixesUpdate, $GUI_ENABLE)
 EndFunc

; функция сбора информации о текущем состоянии служб (используется SC и обработка полученного вывода через  StringRegExpReplace)и вывод через иконки данной информации на форму)
Func _ServicesStat()

  $sLog1_1 = ''
  $sLog1_2 = ''

;  запрос информации о состоянии служб (текущее состояние: работает или нет)
 $hIPconfig1_1 = Run('sc query wuauserv', '', @SW_HIDE, $STDOUT_CHILD)
;  запрос информации о типе запуска служб (авто, вручную, отключено)
 $hIPconfig1_2 = Run('sc qc wuauserv', '', @SW_HIDE, $STDOUT_CHILD)

 While 1
    $sLogI1_1 &= StdoutRead($hIPconfig1_1)
	$sLogI1_2 &= StdoutRead($hIPconfig1_2)

	 If @error Then ExitLoop
    Sleep(10)
 WEnd

; фильтрация информации о службах
  $sLog1_1 = StringRegExpReplace($sLogI1_1, "(?si).*STATE\D*(\d+).*", '\1')
  $sLog1_2 = StringRegExpReplace($sLogI1_2, "(?si).*START_TYPE\D*(\d+).*", '\1')

; программиорование отображение информации о службах через иконки

_SetHImage($Pic1_1, $aIcons[$sLog1_1 = 4])
_SetHImage($Pic1_2, $aIcons[$sLog1_2=2])

EndFunc



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

Проблема, имхо, в неправильном использовании функции _ResourceSetImageToCtrl
Принцип работы скрипта:
Идет анализ состояния службы автообновления: анализируется тип запуска и текущее состояние (работает или нет).
Если все ОК - включается иконка ok.ico, если нет - то error.ico
Дело осложняется тем, что эти иконки загнаны в массив и размещаются на табе через функцию библиотеки Icons.au3
Но даже без этого гемороя, не отрабатывает обычная иконка на кнопке "обновить"
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Yashied сказал(а):
...то я скажу в чем проблема.

Здесь проще сказать где нет проблем, нежели наоборот. Позже...
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
на всякий случай выкладываю вариант скрипта, который работает без вложений (иконки рядом с файлом скрипта)
Код:
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=Windows.ico
#AutoIt3Wrapper_Res_Icon_Add=ok.ico
#AutoIt3Wrapper_Res_Icon_Add=error.ico
#AutoIt3Wrapper_Res_Icon_Add=refresh.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <Constants.au3>
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
#include <Icons.au3>
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>

#Include <Resources.au3>

Global $Pic1_1, $Pic1_2, $sLogI1_1, $sLogI1_2, $hIcon, $Width = 14, $Height = 14
Global $sLog1_2, $sLog1_1

;~ Global $aIcons[2] = [_ResourceSetImageToCtrl(error.ico),_ResourceSetImageToCtrl(ok.ico)]
Global $aIcons[2] = ['error.ico', 'ok.ico']
For $i = 0 To 1
    $hIcon = _Icons_Icon_Extract($aIcons[$i], 0, $Width, $Height)
	$aIcons[$i] = _Icons_Bitmap_CreateFromIcon($hIcon)
	_WinAPI_DestroyIcon($hIcon)
Next
Global $hImageListRefresh = _GUIImageList_Create(16, 16, 5)
;~ _ResourceSetImageToCtrl($hImageListRefresh, "refresh.ico")


Opt("GUIOnEventMode", 1)

$hMain_GUI = GUICreate("Диагностика и Настройка", 619, 442, 189, 122)
GUISetIcon('Windows.ico', 1)
GUISetFont(8.5, 400, 0, 'MS Shell Dlg')
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

$Tab1 = GUICtrlCreateTab(8, 16, 601, 377)

;;;; Hotfixes ;;;;
$HotfixErrors = GUICtrlCreateTabItem("HotfixErrors")

$Button_HotFixesUpdate = _GUICtrlCreateButtonEx4("Обновить", 510, 400, 85, 33, 'refresh.ico', -5)
GUICtrlSetTip(-1, "Обновить текущее состояние вкладки")
GUICtrlSetOnEvent($Button_HotFixesUpdate, "_HotFixes_Update")

; Работа со службами
GUICtrlCreateGroup("Службы, отвечающие за Автообновление", 16, 330, 370, 55)

GUICtrlCreateLabel("Автоматич. обновление", 24, 348, 75, 30, $BS_MULTILINE)
GUICtrlSetTip(-1, "тс - текущее состояние службы, тз - тип запуска службы")
GUICtrlCreateLabel("тс", 95, 348, 15, 15)
GUICtrlCreateLabel("тз", 95, 361, 15, 15)


$Pic1_1 = GUICtrlCreatePic('', 115, 348, $Width, $Height)
$Pic1_2 = GUICtrlCreatePic('', 115, 361, $Width, $Height)
; запуск и сбор информации о текущем состоянии служб
_ServicesStat()

GUICtrlCreateTabItem("")

GUISetState()

While 1
    Sleep(100)
WEnd

Func CLOSEClicked()
  Exit
EndFunc

Func _GUICtrlCreateButtonEx4($sText, $iLeft, $iTop, $iWidth = -1, $iHeight = -1, $sIconFile = "", $iIconIndex = 0)
    Local $nButton = GUICtrlCreateButton($sText, $iLeft, $iTop, $iWidth, $iHeight)
    _GUIImageList_AddIcon($hImageListRefresh, $sIconFile, $iIconIndex)
    _GUICtrlButton_SetImageList($nButton, $hImageListRefresh)
    Return $nButton
EndFunc


;; Hotfixes Section ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; функция кнопки "Обновить"  обновление информации о текущем состоянии служб
Func _HotFixes_Update()
	 GUICtrlSetState($Button_HotFixesUpdate, $GUI_DISABLE)
     _ServicesStat()
     sleep(1000)
     GUICtrlSetState($Button_HotFixesUpdate, $GUI_ENABLE)
 EndFunc

; функция сбора информации о текущем состоянии служб (используется SC и обработка полученного вывода через  StringRegExpReplace)и вывод через иконки данной информации на форму)
Func _ServicesStat()

  $sLog1_1 = ''
  $sLog1_2 = ''

;  запрос информации о состоянии служб (текущее состояние: работает или нет)
 $hIPconfig1_1 = Run('sc query wuauserv', '', @SW_HIDE, $STDOUT_CHILD)
;  запрос информации о типе запуска служб (авто, вручную, отключено)
 $hIPconfig1_2 = Run('sc qc wuauserv', '', @SW_HIDE, $STDOUT_CHILD)

 While 1
    $sLogI1_1 &= StdoutRead($hIPconfig1_1)
	$sLogI1_2 &= StdoutRead($hIPconfig1_2)

	 If @error Then ExitLoop
    Sleep(10)
 WEnd

; фильтрация информации о службах
  $sLog1_1 = StringRegExpReplace($sLogI1_1, "(?si).*STATE\D*(\d+).*", '\1')
  $sLog1_2 = StringRegExpReplace($sLogI1_2, "(?si).*START_TYPE\D*(\d+).*", '\1')

; программиорование отображение информации о службах через иконки

_SetHImage($Pic1_1, $aIcons[$sLog1_1 = 4])
_SetHImage($Pic1_2, $aIcons[$sLog1_2=2])

EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
Global $aIcons[2] = [_ResourceSetImageToCtrl('error.ico'),_ResourceSetImageToCtrl('ok.ico')]

Вот тут явно есть проблема. Для _Icons_Icon_Extract нужен путь к файлу, а не то что вернёт _ResourceSetImageToCtrl (я уже не говорю о том, что при таком использований у него нехватает параметра).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
Global $hImageListRefresh = _GUIImageList_Create(16, 16, 5)
_ResourceSetImageToCtrl($hImageListRefresh, "refresh.ico")


Это тоже какой-то неземной код.
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
ладно, признаю - бредовый код. 3 дня уже не спал. Поуду отосплюсь и потм сам наверное буду прикалываться...

Спасибо всем, кто ответил.
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Единственное, что пришло в голову, это применить функцию _ResGetAsImage:
получилось для массива:

Код:
$Icon_Ok = _ResGetAsImage('#201', -1)
$Icon_Er = _ResGetAsImage('#202',-1)

Global $aIcons[2] = [$Icon_Er, $Icon_Ok ]
;~ Global $aIcons[2] = ['error.ico', 'Ok.ico' ]
For $i = 0 To 1
    $hIcon = _Icons_Icon_Extract($aIcons[$i], 0, $Width, $Height)
	$aIcons[$i] = _Icons_Bitmap_CreateFromIcon($hIcon)
	_WinAPI_DestroyIcon($hIcon)
Next


для кнопки обновления:

Код:
$Icon_Ref = _ResGetAsImage('#203',-1)
$Button_HotFixesUpdate = _GUICtrlCreateButtonEx4("Обновить", 510, 400, 85, 33, $Icon_Ref, -5)


и опять облом..

PS Просмотрел полученный скомпилированный файл при помощи ResHacker - ok.ico и error.ico просматриваются, refresh. ico при попытке просмотра выдает "отказано в доступе".
Вопросы: 1. я правильно брал номера иконок из секции Icon Group?,
2. означает ли сообщение "отказано в доступе", что иконка встроилась некорректно?
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Вообщем, благодаря помощи FlatX007 (форум OsZone) удалось получить рабочий вариант кода. Его и выкладываю:

Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=Ico\Windows.ico
#AutoIt3Wrapper_outfile=Output\Test.exe
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -delete %out%, %out%, DIALOG, 1000,
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -delete %out%, %out%, ICON, 162,
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -delete %out%, %out%, ICON, 164,
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -delete %out%, %out%, MENU, 166,
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -delete %out%, %out%, ICON, 169,
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -add %out%, %out%, Ico\Windows.ico, Icon, 1, 0
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -add %out%, %out%, Ico\error.ico, Icon, 0, 0
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -add %out%, %out%, Ico\ok.ico, Icon, 2, 0
#AutoIt3Wrapper_Run_After=Utilities\ResHacker\ResHacker.exe -add %out%, %out%, Ico\refresh.ico, Icon, 3, 0
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;~ #AutoIt3Wrapper_Run_After=ResHacker.exe -add %out%, %out%, MySound.wav, SOUND, 200, 0
#include <ButtonConstants.au3>
#include <Constants.au3>
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
#include <Icons.au3>
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

;~ #Include <Resources.au3>

Global $Pic1_1, $Pic1_2, $P1_1, $P1_2, $sLogI1_1, $sLogI1_2
Global $sLog1_2, $sLog1_1
Global $hImageListCom[4]




Opt("GUIOnEventMode", 1)

$hMain_GUI = GUICreate("Диагностика и Настройка", 619, 442, 189, 122)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
_IconCom()

$Tab1 = GUICtrlCreateTab(8, 16, 601, 377)

$HotfixErrors = GUICtrlCreateTabItem("HotfixErrors")
$Button_HotFixesUpdate = GUICtrlCreateButton("Обновить", 510, 400, 85, 33, 0)
_GUICtrlButton_SetImageList($Button_HotFixesUpdate, $hImageListCom[2])
GUICtrlSetOnEvent($Button_HotFixesUpdate, "_HotFixes_Update")


$Icon1 = GUICtrlCreateIcon('', '', 115, 348, 16, 16)
$Icon2 = GUICtrlCreateIcon('', '', 115, 361, 16, 16)
_ServicesStat()

; запуск и сбор информации о текущем состоянии служб
$Hotfix = GUICtrlCreateTabItem("Hotfix")

GUICtrlCreateTabItem("")

GUISetState()

While 1
    Sleep(100)
WEnd

Func CLOSEClicked()
  Exit
EndFunc

Func _IconCom()

  If @Compiled Then
	For $iListCom = 0 To 3

		$hImageListCom[$iListCom] = _GUIImageList_Create(24, 24, 5, 3, 6)

		Local $aImageCom[5] = [$iListCom, $iListCom, $iListCom, $iListCom, $iListCom] ; [Иконка наложения , при наведении , при нажатии , нет ,  иконка после нажатия на кнопку]

		For $f = 0 To UBound($aImageCom) - 1
			_GUIImageList_AddIcon($hImageListCom[$iListCom], @ScriptFullPath, $aImageCom[$f], True)
		Next

	Next
  EndIf
EndFunc


; функция кнопки "Обновить"  обновление информации о текущем состоянии служб
Func _HotFixes_Update()
	 GUICtrlSetState($Button_HotFixesUpdate, $GUI_DISABLE)

	 _ServicesStat()
     sleep(1000)
     GUICtrlSetState($Button_HotFixesUpdate, $GUI_ENABLE)
 EndFunc

; функция сбора информации о текущем состоянии служб (используется SC и обработка полученного вывода через  StringRegExpReplace)и вывод через иконки данной информации на форму)
Func _ServicesStat()

  $sLog1_1 = ''
  $sLog1_2 = ''

;  запрос информации о состоянии служб (текущее состояние: работает или нет)
 $hIPconfig1_1 = Run('sc query wuauserv', '', @SW_HIDE, $STDOUT_CHILD)
;  запрос информации о типе запуска служб (авто, вручную, отключено)
 $hIPconfig1_2 = Run('sc qc wuauserv', '', @SW_HIDE, $STDOUT_CHILD)

 While 1
    $sLogI1_1 &= StdoutRead($hIPconfig1_1)
	$sLogI1_2 &= StdoutRead($hIPconfig1_2)

	 If @error Then ExitLoop
    Sleep(10)
 WEnd

; фильтрация информации о службах
  $sLog1_1 = StringRegExpReplace($sLogI1_1, "(?si).*STATE\D*(\d+).*", '\1')
  $sLog1_2 = StringRegExpReplace($sLogI1_2, "(?si).*START_TYPE\D*(\d+).*", '\1')

; программиорование отображение информации о службах через иконки
IF $sLog1_1 = 4  Then
	GUICtrlSetImage($Icon1, @ScriptFullPath, 2)
Else
    GUICtrlSetImage($Icon1, @ScriptFullPath, 0)
EndIf

IF $sLog1_2 = 2  Then
	GUICtrlSetImage($Icon2, @ScriptFullPath, 2)
Else
	GUICtrlSetImage($Icon2, @ScriptFullPath, 0)
EndIf

EndFunc

Если не отрабатывает сигнализация об изменении статуса слыжбы, то заменить условие фильтрации
на :

Код:
; фильтрация информации о службах
$sLog1_1 = StringRegExpReplace(_Encoding_CyrillicTo1251($sLogI1_1), "(?si).*Состояние\D*(\d+).*", '\1')
$sLog1_2 = StringRegExpReplace(_Encoding_CyrillicTo1251($sLogI1_2), "(?si).*Тип_запуска\D*(\d+).*", '\1')

Полный архив по этому решению: http://ifolder.ru/19573601
 

eil

Новичок
Сообщения
53
Репутация
0
хоть тема уже и старая, но чтобы не захламлять решил спросить здесь.
как вшить иконки в скомпилированный скрипт, чтобы привязки к пути или "чтоб все иконки таскать в той же папке -не было. ведь из строк ниже, иконка по первой строке действительно вживляется в создаваемый exe, но не все остальные :(

#AutoIt3Wrapper_Icon=main1.ico
#AutoIt3Wrapper_Res_Icon_Add=op.ico
#AutoIt3Wrapper_Res_Icon_Add=qo.ico
#AutoIt3Wrapper_Res_Icon_Add=main2.ico
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
eil,
Код:
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Res_Icon_Add=Resources\1.ico
#AutoIt3Wrapper_Res_Icon_Add=Resources\2.ico
#AutoIt3Wrapper_Res_Icon_Add=Resources\3.ico
#AutoIt3Wrapper_Res_Icon_Add=Resources\4.ico
#AutoIt3Wrapper_Res_Icon_Add=Resources\5.ico
#AutoIt3Wrapper_Res_Icon_Add=Resources\6.ico
#AutoIt3Wrapper_Res_Icon_Add=Resources\7.ico
#AutoIt3Wrapper_Res_Icon_Add=Resources\8.ico
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
;иконки 1.ico - 8.ico должны лежать в папке Resources, которая должна находиться в папке со скриптом при компиляции или при запуске из SciTE

Opt('TrayMenuMode', 1)

HotKeySet('{Esc}', '_Exit') ;Esc - выход

While 1
	For $i = 1 To 8
		If @Compiled Then
			TraySetIcon(@ScriptFullPath, 200 + $i)
		Else
			TraySetIcon(@ScriptDir & '\Resources\' & $i & '.ico')
		EndIf
		Sleep(100)
	Next
WEnd

Func _Exit()
	Exit
EndFunc   ;==>_Exit

Почитайте эту тему: FAQ по использованию ресурсов в AutoIt.
 

eil

Новичок
Сообщения
53
Репутация
0
спасибо за ответ, разобрался :smile:
так же за хороший пример как для скрипта так и для exe.
ссылка то что нада, жаль нет такого help файла.
 
Верх