PDA

Показать полную графическую версию : [решено] Внедрение иконок в скомпилированный скрипт (использование AutoIt3Wrapper)


Страниц : 1 [2]

FlatX007
02-10-2010, 03:24
Ну неважно, смысл понятен ? всё работает.

saavaage
02-10-2010, 03:56
FlatX007, посмотрел пример. Как ни странно, обновление происходит только при однократном нажатии на кнопку "Обновить". После изменения статуса службы или типа ее запуска, ничего не меняется.

Вот немного изменил иконки для пущей наглядности:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <GuiButton.au3>
#Include <GuiImageList.au3>

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

Global $Icon_Hotfix, $Icon_HotfixErrors

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")
_ServicesStat()
$Icon_HotfixErrors = GUICtrlCreateIcon("shell32.dll", 23, 115, 348, 16, 16)
$Icon_Hotfix = GUICtrlCreateIcon("shell32.dll", 28, 115, 361, 16, 16)

$Hotfix = GUICtrlCreateTabItem("Hotfix")


GUICtrlCreateTabItem("")
GUISetState()

While 1
Sleep(1000)
WEnd

Func CLOSEClicked()
Exit
EndFunc

Func _IconCom()

If @Compiled Then
For $iListCom = 0 To 3

$hImageListCom[$iListCom] = _GUIImageList_Create(16, 16, 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, "")
; запрос информации о типе запуска служб (авто, вручную, отключено)
$hIPconfig1_2 = Run('sc qc wuauserv', '', @SW_HIDE, "")

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
;~ GuiCtrlSetData($Pic1_1, 2)
GUICtrlSetImage($Icon_Hotfix, "shell32.dll", 5)
Else
;~ GuiCtrlSetData($Pic1_1, 1)
GUICtrlSetImage($Icon_Hotfix, "shell32.dll", 18)
EndIf

IF $sLog1_2 = 2 Then
;~ GuiCtrlSetData($Pic1_2, 2)
GUICtrlSetImage($Icon_HotfixErrors, "shell32.dll", 9)
Else
;~ GuiCtrlSetData($Pic1_2, 1)
GUICtrlSetImage($Icon_HotfixErrors, "shell32.dll", 43)
EndIf

EndFunc

FlatX007, индикаторы служат для сигнализации службы обновления

Попробуйте сделать следующее:
1. запустить скрипт
2. нажать на кнопку обновить - > иконки поменялись
3. заходим Панель управления -> администрирование -> службы и меняем у Автоматического обновления статус и тип запуска
4. жмем на обновить - > иконки не поменялись..

Я уже просто в тихом трансе. Из-за этих иконок не могу собрать утилиту. Знал бы -заменил на сигнализацию цветом, блин...

FlatX007
02-10-2010, 05:51
Я разобрался StringRegExpReplace - не срабатывал, а следовательно возвращал полную информацию вместо 2,4 ...

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


Из консольного потока русские символы читаются в виде крокозябр, поэтому шаблон не подходил!
Правильно будет так:

#include <Encoding.au3> (http://autoit-script.ru/index.php/topic,510.0.html)

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


У меня у самого скоро транс будет, я думаю вам стоит заняться чем нибудь полегче, для наблотыкивания :)

saavaage
02-10-2010, 13:11
FlatX007, черт, тут даже не в этом была проблема!!! Я, походу, взял не те исходники. Сегодня буду чистить весь мусор из версий, блин. Ошибка закралась гораздо раньше, в строках:

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

правильно, конечно же так:

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

моя вина... не проверил исходник, был уверен, что рабочий.
Извиняюсь еще раз, что запудрил мозги.
Спасибо!

PS Полегче - не получится, т.к. уже поставил перед собой задачу и практически ее сделал, может сегодня - завтра выложу свою контрольную работу на тему "Введение в Autoit" на обсуждение ошибок...

saavaage
02-10-2010, 13:43
FlatX007, весьма странно, но у меня все прекрасно отрабатывает без перегонки в формат с перекодировкой.
Windows XP Pro Ru SP3, не совсем понимаю, почему у вас идет русский вывод информации о службах, у меня все на английском.
Собственно поэтому я и убрал тут перекодировку... Не подскажите, что у Вас за система? Неужели, прийдется еще вводить проверку и на рус/англ?

saavaage
02-10-2010, 14:22
Таким образом, рабочий код (при условии, что у вас XPPro Rus SP3):

#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')


Проверьте еще раз, пожалуйста, FlatX007. Архив с иконками и прочим - в аттаче http://ifolder.ru/19573601

FlatX007
02-10-2010, 18:52
У меня Win 7 не срабатывает пример, переменная $sLog1_1 - возвращает это:

?¬п_б«г¦Ўл: wuauserv
’ЁЇ : 20 WIN32_SHARE_PROCESS
‘®бв®п*ЁҐ : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, ACCEPTS_PRESHUTDOWN)
Љ®¤_ўл室*_Win32 : 0 (0x0)
Љ®¤_ўл室*_б«г¦Ўл : 0 (0x0)
Љ®*ва®«м**п_в®зЄ* : 0x0
Ћ¦Ё¤**ЁҐ : 0x0


Нужно делать два! щаблона на XP и на Win Vista, 7 ...мой пример объединить с вашим.

saavaage
02-10-2010, 19:05
FlatX007, Пока у мея стоит, к сожалению, только XP. Я и делал утилиту под нее. Без 7 на борту невозможно будет проверить как и что работает.
Вобщем, выкладываю на форуме для тестинга то, что получилось. Спасибо Вам большое, последние 3 дня, благодаря этой проблеме, чуть меня с ума не свели. Но теперь, по крайней мере разобрался, что и как.

FlatX007, как будет SP1 по 7-ке, тогда поставлю новую ось и начну адаптацию...




© OSzone.net 2001-2012