Ru-Board.club
← Вернуться в раздел «Программы»

» AutoIT

Автор: Maza Faka
Дата сообщения: 31.03.2008 12:29

Цитата:
Задача, как я понимаю, более сложная

Я так и понял, просто учитывая весь гемор с
Цитата:
создание фиктивного окна и передача данных через него
хотел узнать подробности задачи (Возможно нашлось бы более простое решение)
Автор: ynbIpb
Дата сообщения: 31.03.2008 12:55
ViSiToR
Огромное спасибо! Вник в код, подразобрался и очень даже чудно получилось
Небольшой нюанс: при нажатии кнопки закрытия окна на дочернем закрывается вся программа, а надо бы чтоб только это окно. Вижу что причина в Case $GUI_EVENT_CLOSE
Но как у казать тут чтоб относилось только к основному окну? пробовал: Case ($GUI_EVENT_CLOSE, $Form1) но не канает. как правильнее?
И ещё заметил одну неудобную особенность: когда я например нажимаю на какойнибудь бутон, который у меня должен вызывать месадж бокс, то если я не закрывая месадж бокс ещё нажму несколько раз на этот бутон, то после закрытия месаджбокса он снова вылезит столоко раз сколько я нажимал. Как бы это исправить?
з.ы.
ещё вспомнил вопрос:
Решил использовать оформление в виде *.bmp файлов. типа: GUICtrlSetImage ($Button1, "ok.bmp") но в данном случае каринка ok.bmp лежит в каталоге со скриптом, а как сделать чтоб она была внутри скрипта?
Автор: Maza Faka
Дата сообщения: 31.03.2008 14:01
ynbIpb

Цитата:
при нажатии кнопки закрытия окна на дочернем закрывается вся программа, а надо бы чтоб только это окно

Используй функцию GuiGetMsg() с параметром 1 GuiGetMsg(1)


Цитата:
если я не закрывая месадж бокс ещё нажму несколько раз на этот бутон

Можно "задизэйблить" кнопку перед вызовом MsgBox()


Цитата:
Решил использовать оформление в виде *.bmp файлов. типа: GUICtrlSetImage ($Button1, "ok.bmp") но в данном случае каринка ok.bmp лежит в каталоге со скриптом, а как сделать чтоб она была внутри скрипта?

FileInstall()

Добавлено:

Цитата:
если я не закрывая месадж бокс ещё нажму несколько раз на этот бутон

Или так:

Код: #include <GUIConstants.au3>

$hGUI = GUICreate("Test GUI", 200, 100)

$hButton = GUICtrlCreateButton("Test", 50, 25, 100, 50)

GUISetState()

While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
ExitLoop
Case
$hButton
DllCall("user32.dll", "int", "MessageBox", "hwnd", $hGUI, "str", "Some text", "str", "Some title", "int", 0)
EndSwitch
WEnd
Автор: ViSiToR
Дата сообщения: 31.03.2008 15:59
NIKZZZZ

Цитата:
ViSiToR предлагал решение

Могу предложить более универсальное решение - больше подходит для удалённого управления/управления с внешнего приложения (подключение плагинов?):

[more=Sender.au3]


Код: #include <Misc.au3>

Global Const $WM_AU3_USR = 0x0400 ;$WM_USER

$hWnd = WinGetHandle("[CLASS:AutoIt v3 GUI;TITLE:_MYAPP_]")

_SendMessage($hWnd, $WM_AU3_USR, 0, 1001)
Sleep(1500)
_SendMessage($hWnd, $WM_AU3_USR, 0, 1002)
Sleep(1500)
_SendMessage($hWnd, $WM_AU3_USR, 0, 1003)
Автор: ynbIpb
Дата сообщения: 31.03.2008 19:35
Maza Faka Спасибо! но немного не догоняю по поводу
кнопки закрытия окна на дочернем закрывается вся программа

Цитата:
Используй функцию GuiGetMsg() с параметром 1 GuiGetMsg(1)

можно на явном примере? например на этом:

Код: #include <GUIConstants.au3>
$Form1 = GUICreate("Main", 193, 106)
GUISetBkColor (0x656365 )
$Button1 = GUICtrlCreateButton("About", 8, 64, 94, 21, $BS_BITMAP)
$Form1pos = WinGetPos($Form1)
$Form2 = GUICreate("About", 193, 106, $Form1pos[0],$Form1pos[1]+140, _
BitOR($WS_SYSMENU,$WS_CAPTION, $WS_POPUP), $WS_EX_TOOLWINDOW, $Form1)
GUICtrlCreateLabel ("типа диалог о программе"&@CRLF&"Версия 1.0",5, 5, 185, 25)
GUISetState(@SW_SHOW, $Form1)
GUIRegisterMsg($WM_MOVE, "WM_MOVE")
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case
$Button1
If Not BitAND(WinGetState($Form2), 2) Then
GUISetState(@SW_SHOW, $Form2)
Else
GUISetState(@SW_HIDE, $Form2)
EndIf
EndSwitch
WEnd
Func
WM_MOVE($hWndGUI, $MsgID, $WParam, $LParam)
If $hWndGUI = $Form1 Then
$aParent_Pos = WinGetPos($Form1)
WinMove($Form2, "", $aParent_Pos[0], $aParent_Pos[1]+140)
Else
EndIf
EndFunc
Автор: NIKZZZZ
Дата сообщения: 31.03.2008 22:16
ViSiToR
Посмотрел, но пока особо не разбирался. Как я понял, синхронизация осуществляется именно таймером?

Цитата:
больше подходит для удалённого управления/управления с внешнего приложения

Для этой цели - вполне.
Но в идеале хотелось бы получить некоторую common область (не окошко), доступную обеим скриптам.



Автор: Maza Faka
Дата сообщения: 01.04.2008 08:07
ynbIpb

Цитата:
можно на явном примере?


Код: #include <GUIConstants.au3>

$Form1 = GUICreate("Main", 193, 106)

GUISetBkColor (0x656365 )

$Button1 = GUICtrlCreateButton("About", 8, 64, 94, 21, $BS_BITMAP)

$Form1pos = WinGetPos($Form1)

$Form2 = GUICreate("About", 193, 106, $Form1pos[0],$Form1pos[1]+140, _
BitOR($WS_SYSMENU,$WS_CAPTION, $WS_POPUP), $WS_EX_TOOLWINDOW, $Form1)

GUICtrlCreateLabel ("типа диалог о программе"&@CRLF&"Версия 1.0",5, 5, 185, 25)

GUIRegisterMsg($WM_MOVE, "WM_MOVE")

GUISetState(@SW_SHOW, $Form1)

While 1
$msg = GUIGetMsg(1) ;using the "advanced" parameter
Select
Case
$msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $Form1
ExitLoop
Case
$msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $Form2
GUISetState(@SW_HIDE, $Form2)
Case $msg[0] = $Button1
If Not BitAND(WinGetState($Form2), 2) Then
GUISetState(@SW_SHOW, $Form2)
Else
GUISetState(@SW_HIDE, $Form2)
EndIf
EndSelect
WEnd

Func
WM_MOVE($hWndGUI, $MsgID, $WParam, $LParam)
If $hWndGUI = $Form1 Then
$aParent_Pos = WinGetPos($Form1)
WinMove($Form2, "", $aParent_Pos[0], $aParent_Pos[1]+140)
Else
EndIf
EndFunc
Автор: Lovec
Дата сообщения: 01.04.2008 17:20
Если приложение свернуто в значок в трее и по правой кнопке мыши на значке появляется контекстное меню (например, "Обновить"), можно ли написать программу, чтобы она посылала этому приложению какое-то сообщение и то думало, что выбрали из контекстного меню пункт "Обновить"?
Автор: Loopback
Дата сообщения: 01.04.2008 21:31
Если известен ID элемента меню, можно активировать соответствующую ему функцию простым вызовом:


Код: DllCall("user32.dll","int","SendMessage", "hWnd", $hWnd, "int", $WM_COMMAND, "int", $ID, "int", 0)
Автор: ViSiToR
Дата сообщения: 02.04.2008 02:14
Loopback

Цитата:
Если известен ID элемента меню, можно активировать соответствующую ему функцию простым вызовом:

Хороший метод

NIKZZZZ

Цитата:
синхронизация осуществляется именно таймером?

Таймер только для проверки (чтобы не нагружать главный цикл), самое главное это GUIRegisterMsg($WM_USER, ...), чтобы скрипт мог восспринимать сообщения.


Цитата:
Но в идеале хотелось бы получить некоторую common область (не окошко), доступную обеим скриптам.

А что мешает для второго скрипта (Sender.au3) задать тоже самое?


Код: #include <Misc.au3>
#include <AU3_INTERACT.au3>

#Region _AutoItSetInteraction() Part
Dim $aFunctions[1][3]

$aFunctions[0][0] = 1001
$aFunctions[0][1] = "My_Func"
$aFunctions[0][2] = ""

_AutoItSetInteraction("_MYAPP2_", $aFunctions)
#EndRegion _AutoItSetInteraction() Part

Global Const $WM_AU3_USR = 0x0400 ;$WM_USER

.....

Func My_Func()
;
EndFunc
Автор: gomosek
Дата сообщения: 06.04.2008 19:51
Подскажите,пожалуйста,как средствами AutoIT можно узнать количество байт,принятых через Dial-Up соединение?
Автор: ynbIpb
Дата сообщения: 07.04.2008 13:17
Уважаемые подскажите как средствами autoit инвертировать цвет?


Код: #include <GUIConstants.au3>
$color1="000000"
$color2="FFFFFF"
$Form1 = GUICreate("invert color", 179, 140, 418, 182)
$Label1 = GUICtrlCreateLabel ("Типа цвет шрифта"&@CRLF&"противоположность фону",10, 10, 135, 100);лейбл для отображения цвета
GuiCtrlSetBkColor($Label1, "0x"& $color1);устанавливем цвет фона лейбла
GUICtrlSetColor ( $Label1, "0x"& $color2);устанавливем цвет шрифта лейбла
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE;если нажата кнопка закрытия окна, выход их программы
Exit
EndSwitch
WEnd
Автор: Loopback
Дата сообщения: 07.04.2008 17:16

Цитата:
Например я задаю сам значение перменной $color1 (допустим из *.ini файла), а переменная $color2 должна сразу поместить в себя инвертированное значение цвета первой переменной. Типа сделал я 1 чёрным, а 2 сразу должно стать белым.

Если просто инвертировать цвет - наверное, что-то вроде этого:

Код: $color2=Hex(BitNOT(Number("0x" & $color1)), 6)
Автор: ViSiToR
Дата сообщения: 07.04.2008 19:02
ynbIpb
По поводу цветов, я для этого написал UDF, она определяет не является ли цвет чёрным оттенком, таким образом можно проверять фоновой цвет, и соответственно менять цвет лейбла...


Код: #include <GuiConstants.au3>
#include <Misc.au3>

Global $Bk_Color = 0xFFFFFF

$GUI = GUICreate("_ColorIsDarkShade Demo", 300, 200)

$Label = GUICtrlCreateLabel("Some Text", 20, 40, 55, 14)
GUICtrlSetBkColor(-1, $Bk_Color)

$ColorSet_Button = GUICtrlCreateButton("Set Color", 20, 80)

GUISetState(@SW_SHOW, $GUI)

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case
$ColorSet_Button
$Bk_Color
= _ChooseColor(2, $Bk_Color, 2, $GUI)

GUICtrlSetBkColor($Label, $Bk_Color)
GUICtrlSetColor($Label, 0x0)

If _ColorIsDarkShade($Bk_Color) Then GUICtrlSetColor($Label, 0xFFFFFF)
EndSwitch
WEnd

Func
_ColorIsDarkShade($nColor)
Local $i_Red = BitAND(BitShift($nColor, 16), 0xFF)
Local $i_Green = BitAND(BitShift($nColor, 8), 0xFF)
Local $i_Blue = BitAND($nColor, 0xFF)

Local $iMidle_Color_Val = Int(765 / 2) ;765 is the total of 255 + 255 + 255

Return ($i_Red + $i_Green + $i_Blue) < $iMidle_Color_Val
EndFunc
Автор: Loopback
Дата сообщения: 07.04.2008 20:38

Цитата:
По поводу цветов, я для этого написал UDF, она определяет не является ли цвет чёрным оттенком, таким образом можно проверять фоновой цвет, и соответственно менять цвет лейбла...

Ага, что-то подобное я и имел в виду.


Цитата:
Если "0x" поместить как префикс, то намного лучше результат получается

Разумеется, просто код дан для подстановки в пример ynbIpb, у него 0х в GUICtrlSetColor приписывается.

Автор: ynbIpb
Дата сообщения: 08.04.2008 08:15
Спаибо вам огромное за помощь. всё попробую.
как я понял UDF нужно сохранить в *.au3, кинуть в папку Include или в папку с моим скриптом и написать в начала моего #include <*.au3> ?
Автор: ViSiToR
Дата сообщения: 08.04.2008 08:31
Loopback

Цитата:
код дан для подстановки в пример ynbIpb, у него 0х в GUICtrlSetColor приписывается.

Тогда извиняюсь, я как то не обратил внимание на код.

ynbIpb

Цитата:
нужно сохранить в *.au3, кинуть в папку Include

Не обязательно, оно будет работать если просто в конце скрипта добавить как функцию:


Код: #include <GUIConstants.au3>
$color1="000000"
$color2="000000"
If _ColorIsDarkShade($color1) Then $color2 = "FFFFFF"

$Form1 = GUICreate("invert color", 179, 140, 418, 182)
$Label1 = GUICtrlCreateLabel ("Типа цвет шрифта"&@CRLF&"противоположность фону",10, 10, 135, 100);лейбл для отображения цвета
GuiCtrlSetBkColor($Label1, "0x"& $color1);устанавливем цвет фона лейбла
GUICtrlSetColor ( $Label1, "0x"& $color2);устанавливем цвет шрифта лейбла
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE;если нажата кнопка закрытия окна, выход их программы
Exit
EndSwitch
WEnd

Func _ColorIsDarkShade($nColor)
Local $i_Red = BitAND(BitShift($nColor, 16), 0xFF)
Local $i_Green = BitAND(BitShift($nColor, 8), 0xFF)
Local $i_Blue = BitAND($nColor, 0xFF)

Local $iMidle_Color_Val = Int(765 / 2) ;765 is the total of 255 + 255 + 255

Return ($i_Red + $i_Green + $i_Blue) < $iMidle_Color_Val
EndFunc
Автор: arr1val
Дата сообщения: 09.04.2008 15:32
наверное ошибаюсь в синтаксисе написания:

Global $file=RegRead ( "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\ComputerName\", "ComputerName" )

DirCreate ( "U:\$file" )

Filecopy ( "C:\*.*", "U:\$file", '' )

Вместо создания папки "ИмяКомпьютера" он создает папку $file.. Что не так ?
Автор: ynbIpb
Дата сообщения: 09.04.2008 15:53
может так?

Код: DirCreate ( "U:\"&$file)
Автор: arr1val
Дата сообщения: 09.04.2008 16:16
Так тоже почему то не срабатывало.
Но спасибо за подсказку с "&" с подстановкой @ComputerName заработало.
Автор: ViSiToR
Дата сообщения: 09.04.2008 18:54
arr1val

Цитата:
с подстановкой @ComputerName заработало

В RegRead не нужен конечный слеш:


Код: Global $file=RegRead("HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\ComputerName", "ComputerName")
Автор: Astra55
Дата сообщения: 09.04.2008 19:36
Суть проблемы - имеются портабельные софты, сделанные с помощью Thinstall. При переносе на разные компы необходим ввод регистрационных данных, поскольку софты вяжутся к железу. Была попытка сделать скрипт AutoIt следующим образом:
FileInstall("XXX.exe", @TempDir&"\XXX.exe")
Opt("TrayIconHide", 1)
Run(@TempDir&"\XXX.exe")
if WinWait ( "YYY", "", 4) Then
ControlClick("YYY", "", "Button1")
EndIf

if WinWait ( "ZZZ", "", 4) then; 4 sec
ControlSetText("ZZZ", "", "Edit1", "12345" )
ControlClick("Yes", "", "Button1")
if WinWait ( "Yes", "OK", 4) then; 4 sec
ControlClick("Yes", "OK", "Button1")
EndIf
EndIf
; end script
Все хорошо, но сам софт запускается из папки Temp, а нужно чтобы запускался из виртуального контейнера Thinstall, иначе в памяти работают два одинаковых экзешника.
Можно ли заставить запуститься только виртуальный экзешник, чтобы скрипт AutoIt провел регистрацию и больше не реагировал на любые окна софта? Проблема достаточно актуальная, поскольку софтов с привязкой к железу тем же ASProtect-ом хватает. Можно все это делать вручную, но желательно на автомате и в виде единого exe файла.
Автор: ynbIpb
Дата сообщения: 09.04.2008 21:17
А можно по подробнее, что за софт?
Я вообще удивлюсь, что программы накрытые протом запускаются в Thinstall'e
Наилучшим вариантом было бы - снять полностью прот, но если нет, то я вижу это так:
в тхинстал пакуется скрипт, который будет основным запускаемым файлом программы. Он при запуске уже сам запускает экзе программы и каким либо образом должен определять, что это первый запуск на новой машине или просто ожидать окна запроса ключа. и если окно появляется запускать опять же кейген и генерить,вводить нужные данные. Но чтоб подробнее вникнуть надо взглянуть на софт.
Автор: Astra55
Дата сообщения: 10.04.2008 06:38
ynbIpb

Цитата:
А можно по подробнее, что за софт?

BoilSoft Video Splitter 5.01 - http://forum.ru-board.com/topic.cgi?forum=35&topic=12324&start=120#lt

Цитата:
Я вообще удивлюсь, что программы накрытые протом запускаются в Thinstall'e

Пока не сталкивался с проблемами такого плана, все запускается нормально.

Цитата:
снять полностью прот

Не получается Тогда мне не нужен никакой скрипт, поскольку регистрация будет открыто лежать в реестре.
Мне по сути нужно только один раз запустить скриптом Thinstall-енный экзешник, не распаковывая его в какую-либо папку и зарегистрировать. Потом скрипт вообще не нужен. Отдельным скриптом в экзешном виде это делается элементарно. При запуске портабельной программы, если выбрать в ней Open file, то софт видит свою собссную папку в реальной директории Program Files, видно все файлы, но друг друга два софта уже не видят. Похоже, что шансов сделать такое извращение, как мне нужно, почти нет.
Автор: ynbIpb
Дата сообщения: 10.04.2008 09:06
Скачал, глянул. анализатор показывает ASProtect 2.3 SKE
Представляю себе так:
делаем основным экзешником программы скрипт типа loader.exe
он запускает программу, делает проверку на наличие текста в заголовке окна о триале. и если этого нет завершается скрипт, если есть нажимает на кнопку вводит данные.
Вот специально намутил...

Код: AutoItSetOption ( "TrayIconHide", 1 )
If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)
;--------------------------------------
Run(@ScriptDir & "\VideoSplitter.exe")
WinWaitActive("Boilsoft Video Splitter v5.01","www.boilsoft.com",5)
If WinExists ("Boilsoft Video Splitter v5.01 - Trial Version") Then
ControlClick("Boilsoft Video Splitter v5.01", "", "[CLASS:Button; CLASSNN:Button10]")
WinWaitActive("Registration","Name:",5)
ControlSend ( "Registration","Name:", "[CLASS:Edit; CLASSNN:Edit1]", "Имя хозяина ключа")
ControlSend ( "Registration","Name:", "[CLASS:Edit; CLASSNN:Edit2]", "XXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX")
ControlClick("Registration","Name:","OK")
EndIf
Автор: Astra55
Дата сообщения: 10.04.2008 10:34
Дык с отдельным экзешным лодырем все работало до этого. Как замутить это все в ОДНОМ экзешнике, вот в чем вопрос! Или я что-то не понял в идее?
Автор: gregaz
Дата сообщения: 11.04.2008 19:08
Просьба ответить на пару вопросов :

1. Как организовать поиск иконки , соответствующей типу файла ?
2. Как остановить выполнение проверки условия Switch-Case (аналогичный ExitLoop для цмкла )?
Автор: ViSiToR
Дата сообщения: 12.04.2008 02:16
gregaz

Цитата:
Как организовать поиск иконки , соответствующей типу файла ?

Вот функция для получения иконки, идентификатора, и описания для типа файла:


Код: #include <GUIConstants.au3>

$FileFolderFullPath = "c:\Boot.ini"

GUICreate("Get File/Folder Type & Icon", 300, 150)

$aIconInfo = _FileGetIcon($FileFolderFullPath)
$sIconType = _FileGetType($FileFolderFullPath)

GUICtrlCreateButton("", 130, 50, 36, 36, $BS_ICON)
GUICtrlSetImage(-1, $aIconInfo[1], -($aIconInfo[2]-1))

GUICtrlCreateLabel($sIconType, 0, 90, 300, 20, $ES_CENTER)

GUISetState()

While GUIGetMsg() <> -3
WEnd

Func
_FileGetType($sFilePathOrExt)
Local $iOld_Opt_EES = Opt("ExpandEnvStrings", 1)
Local $sRegDefault, $sRegType="", $sExt

If _IsFolder($sFilePathOrExt) Then
$sRegDefault = RegRead("HKCR\Folder", "")
If $sRegDefault <> "" Then $sRegType = $sRegDefault
Else
$sExt = StringRegExpReplace($sFilePathOrExt, '^.*\.', '.')
If $sExt = $sFilePathOrExt Then
$sExtSaerch = FileFindFirstFile($sFilePathOrExt & ".*")
$sExt = StringRegExpReplace(FileFindNextFile($sExtSaerch), '^.*\.', '.')
$sFilePathOrExt &= $sExt
EndIf

$sRegDefault = RegRead("HKCR\" & $sExt, "")

If $sRegDefault <> "" Then $sRegType = RegRead("HKCR\" & $sRegDefault, "")
If $sRegType = "" Then $sRegType = $sExt & "-File"
EndIf

Opt("ExpandEnvStrings", $iOld_Opt_EES)

Return $sRegType
EndFunc

Func
_FileGetIcon($sFile)
Local $iOld_Opt_EES = Opt("ExpandEnvStrings", 1)
Local $sRegDefault = "", $sDefIcon = "", $sExt, $sIconFile, $nIcon=0
Local $aRet[3], $iError = 0

If _IsFolder($sFile) Then
$sRegDefault = RegRead("HKCR\Folder", "")
If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\Folder\DefaultIcon", "")
Else
$sExt = StringRegExpReplace($sFile, '^.*\.', '.')

If $sExt = ".lnk" Then
Local
$aLinkInfo = FileGetShortcut($sFile)

If Not @error Then
Opt("ExpandEnvStrings", $iOld_Opt_EES)

Dim $aRet[3] = [2, $aLinkInfo[4], $aLinkInfo[5]]
Return $aRet
EndIf
EndIf

If
$sExt = $sFile Then
$sExt = FileFindFirstFile($sFile & ".*")
$sExt = StringRegExpReplace(FileFindNextFile($sExt), '^.*\.', '.')
$sFile &= $sExt
EndIf

$sRegDefault = RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" & $sExt, "ProgID")

If $sRegDefault = "" Then $sRegDefault = RegRead("HKCR\" & $sExt, "")
If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\" & $sRegDefault & "\DefaultIcon", "")
EndIf

If
$sDefIcon = "" Then
$sIconFile = "shell32.dll"
ElseIf $sDefIcon <> "%1" Then
If
StringRegExpReplace($sFile, "^.*\\", "") = "shell32.dll" Then
$sIconFile = $sFile
$nIcon
= 0
Else
Local
$aDefIconSplit = StringSplit($sDefIcon, ",")

If IsArray($aDefIconSplit) Then
$sIconFile = $aDefIconSplit[1]
If $aDefIconSplit[0] > 1 Then $nIcon = $aDefIconSplit[2]
Else
$iError = 1
EndIf
EndIf
ElseIf
$sDefIcon = "%1" Then
$sIconFile = $sFile
$nIcon
= 0
EndIf

Opt("ExpandEnvStrings", $iOld_Opt_EES)

Dim $aRet[3] = [2, $sIconFile, $nIcon]

Return SetError($iError, 0, $aRet)
EndFunc

Func
_IsFolder($sPath)
Return StringInStr(FileGetAttrib($sPath), "D")
EndFunc
Автор: gregaz
Дата сообщения: 12.04.2008 07:11
ViSiToR

Цитата:
Вот функция для получения иконки, идентификатора, и описания для типа файла:


Спасибо Но эта функция работает достаточно медленно (я ей пользовался).
Кстати при попытке вставить некоторые найденные ей иконки в ImageList выдается системное Error : _GUIImageList_AddIcon : -1 и скрипт выгружается ?
Видимо данному типу файла соответствует несколько иконок
Как предотвратить выгрузку скрипта ?


Цитата:
А зачем останавливать? в этой проверке только одно условие будет выполнено


Вот пример :
Здесь хотелось бы вместо If-Else-EndIf иметь что-то типа :
If $a=0 Then CaseExit (несуществующнее)
Я устанавливаю холостой Case $bt2 и ставлю ContinueCase

Код:
While 1
$msg = GUIGetMsg()    
Switch $msg    
Case $bt1
$a=Func1
If $a=0 Then
else
.........
.........
EndIf
$b=Func2
$c=Func3
Case $bt2
EndSwitch    
WEnd    
Автор: ViSiToR
Дата сообщения: 12.04.2008 09:06
gregaz

Цитата:
эта функция работает достаточно медленно

Это из за Opt("ExpandEnvStrings", 1). Можно попробовать расширять переменные отдельной функцией (или вообще не использовать расширение, если не критично):


Код: Func _FileGetIcon($sFile)
Local $sRegDefault = "", $sDefIcon = "", $sExt, $hSearch, $sIconFile, $nIcon=0
Local $aRet[3], $iError = 0

If _IsFolder($sFile) Then
$sRegDefault = RegRead("HKCR\Folder", "")
If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\Folder\DefaultIcon", "")
Else
$sExt = StringRegExpReplace($sFile, '^.*\.', '.')

If $sExt = ".lnk" Then
Local
$aLinkInfo = FileGetShortcut($sFile)

If Not @error Then
Dim
$aRet[3] = [2, _Expand_Environments($aLinkInfo[4]), $aLinkInfo[5]]
Return $aRet
EndIf
EndIf

If
$sExt = $sFile Then
$hSearch = FileFindFirstFile($sFile & ".*")
$sExt = StringRegExpReplace(FileFindNextFile($hSearch), '^.*\.', '.')
$sFile &= $sExt
FileClose($hSearch)
EndIf

$sRegDefault = RegRead("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" & $sExt, "ProgID")

If $sRegDefault = "" Then $sRegDefault = RegRead("HKCR\" & $sExt, "")
If $sRegDefault <> "" Then $sDefIcon = RegRead("HKCR\" & $sRegDefault & "\DefaultIcon", "")
EndIf

If
$sDefIcon = "" Then
$sIconFile = "shell32.dll"
ElseIf $sDefIcon <> "%1" Then
If
StringRegExpReplace($sFile, "^.*\\", "") = "shell32.dll" Then
$sIconFile = $sFile
$nIcon
= 0
Else
Local
$aDefIconSplit = StringSplit($sDefIcon, ",")

If IsArray($aDefIconSplit) Then
$sIconFile = $aDefIconSplit[1]
If $aDefIconSplit[0] > 1 Then $nIcon = $aDefIconSplit[2]
Else
$iError = 1
EndIf
EndIf
ElseIf
$sDefIcon = "%1" Then
$sIconFile = $sFile
$nIcon
= 0
EndIf

Dim
$aRet[3] = [2, _Expand_Environments($sIconFile), $nIcon]

Return SetError($iError, 0, $aRet)
EndFunc

Func
_Expand_Environments($sString)
$sString = StringReplace($sString, "%windir%", @WindowsDir)
$sString = StringRegExpReplace($sString, "%HomeDrive%|%SystemDrive%", @HomeDrive)
$sString = StringReplace($sString, "%HomePath%", @HomePath)
$sString = StringReplace($sString, "%Temp%", @TempDir)
$sString = StringReplace($sString, "%ProgramFiles%", @ProgramFilesDir)
$sString = StringReplace($sString, "%UserProfile%", @UserProfileDir)
$sString = StringReplace($sString, "%AppData%", @AppDataDir)
$sString = StringReplace($sString, "%ComSpec%", @ComSpec)

Return $sString
EndFunc

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

Предыдущая тема: Quintura Search


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.