Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [архив - Часть 2] AutoIt скрипты (http://forum.oszone.net/showthread.php?t=60616)

Vadikan 05-02-2006 00:02 402617

[архив - Часть 2] AutoIt скрипты
 
Внимание!
Тема переведена в архивное состояние







(настоятельно рекомендуется к прочтению/поиску)


Руководство к действию по работе c AutoIt.


Сайт программы
Русская справка
Коллекция AutoIt скриптов от Sanja Alone
Коллекция AutoIt скриптов от MSFN (могут быть устаревшие).
Справочник по командам rundll32 (команды запуска диалоговых окон и не только...)

AutoIt скрипты - введение и FAQ (статья содержит вводную информацию по AutoIt, а также ответы на ЧаВо).



Данная тема предназначена для общих вопросов по AutoIt. Вопросы по установке приложений при помощи AutoIt следует задавать в соответствии с правилами форума "Автоматическая установка приложений". Таким образом, если вы хотите узнать как установить Winamp 5.x при помощи AutoIt, то создайте тему [autoit] Winamp 5.х (если таковой еще нет на форуме). Проверить наличие тем можно при помощи поиска или фильтров.
Цитата:

Цитата Vadikan
В теме уже свыше 500 сообщений и поиск нужной информации в ней усложняется. Есть предложение собрать все решения (скрипты) и разместить их на Wiki по принципу "один скрипт - одна статья wiki", добавляя статьи в категорию Autoit. Речь, в принципе, идет об общих решениях, а не о скриптах для установки конкретной программы. Название статьи, очевидно, должно отражать назначение скрипта. Затем можно в шапке просто разместить ссылки на статьи Wiki.


eNcub 09-06-2007 15:37 597389

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

Как мне через AutoIT сэмитировать двойной клик на определенной иконке на рабочем столе? Сам ярлык может быть в произвольном месте, но он есть точно...
Извиняюсь если это на самом деле глупый вопрос, сам сижу уже второй день, не могу найти...

Diamond 09-06-2007 18:55 597474

eNcub
Этот пример, произведёт двойной клик в левой верхней части экрана:
MouseClick("left",0,0,2,50)

Первый параметр определяет кнопку мыши
Второй и третий - координаты экрана X,Y
Четвёртый параметр - это количество кликов мышью
Ну и наконец последний - это скорость перемещения указателя к заданным координатам экрана.

Этот способ подходит, если значок ярлыка находиться всё время на одном месте.
В остальных случаях логично использовать команду Run() - для запуска файла к которому ведёт ярлык.

eNcub 09-06-2007 20:12 597507

Diamond этот способ я знаю, весь хэлп перерыл...
Помоги тогда как обратиться к определнному VPN подключению. Та же ситуация, открыть панель управления могу, а два раза кликнуть на нужном соединении не могу...

XXXler 09-06-2007 20:53 597521

eNcub, пользуйся штатной утилитой rasdial:
Код:

rasdial Имя_VPN_подключения имя_пользователя пароль_пользователя
параметры с пробелами заключаются в кавычки
при удачном подключении возвращает 0, в противном случае код конкретной ошибки

есть вариант запускать как через ярлык:

Код:

rasphone.exe -f "C:\Documents and Settings\All Users\Application Data\Microsoft\Network\Connections\Pbk\rasphone.pbk" -d "Имя VPN подключения"
при этом не надо указывать имя и пароль, но для полного автомата в свойствах подключения необходимо снять все галки "запрашивать имя\пароль\номер"

eNcub 10-06-2007 09:59 597622

Цитата:

есть вариант запускать как через ярлык:

Код:
rasphone.exe -f "C:\Documents and Settings\All Users\Application Data\Microsoft\Network\Connections\Pbk\rasphone.pbk" -d "Имя VPN подключения"


при этом не надо указывать имя и пароль, но для полного автомата в свойствах подключения необходимо снять все галки "запрашивать имя\пароль\номер"
Вот это мне и нужно было :).
Только... вот теперь вопрос дурацкий будет, а как эту строку прописать правильно в АвтоИТ?
Пробую из командной строки - всё получается, а в скрипте не могу. В пути к ярлыку есть пробелы, как сделать чтобы воспринимался параметр командной строки как единое целое?
Пробовал
rasphone.exe -f 'C:\Documents and Settings\All Users\Application Data\Microsoft\Network\Connections\Pbk\rasphone.pbk' - не работает. Есть ли в АвтоIT что-то типа экранирования символов (типа обратного слэша в линуксе).?

XXXler 10-06-2007 15:09 597694

eNcub, просто удвой знаки кавычек:

Код:

$ConnectionName="Имя подключения"
Run(@SystemDir&"\rasphone.exe -f """&@AppDataCommonDir&"\Microsoft\Network\Connections\Pbk\rasphone.pbk"" -d """&$ConnectionName&"""")


Creat0R 11-06-2007 03:25 597853

Никак не могу довести до ума одну, казалось бы простую вещь...

Имеем переменную $InetSpeed которой присваивается определённое значение каждую секунду, как можно догадаться, эта переменная содержит данные о скорости закачки файла.

Вот по завершению закачки, мне нужно узнать среднюю скорость за этот промежуток закачки.

Я сделал, наверное (хотя точно) не правильно, но вот что у меня получилось...

Я засёк самую большую видимую скорость, самую маленькую, и вычеслил золотую середину среди них:

Код:

$LowsetSpeed = 0
$HighestSpeed = 0
$TempLowsetSpeed = 0
$TempHighestSpeed = 0

While @InetGetActive
    $InetGetBytesRead = @InetGetBytesRead

        ;Получаем скорость закачки (кб' в секунду)
    $InetSpeed = 170;Тут идёт функция _InetGetSpeed(1000) - подсчитывает скорость закачки в секунду. Возвращается скорость/в сек.

        $TempLowsetSpeed = $InetSpeed
    $TempHighestSpeed = $InetSpeed

        If $TempLowsetSpeed < $LowsetSpeed Or $LowsetSpeed = 0 Then $LowsetSpeed = $TempLowsetSpeed
    If $TempHighestSpeed > $HighestSpeed Or $HighestSpeed = 0 Then $HighestSpeed = $TempHighestSpeed
WEnd

$AverageDownloadSpeed = Round(_GetAverageSpeed($LowsetSpeed, $HighestSpeed)/1024)

Func _GetAverageSpeed($LowsetSpeed, $HighestSpeed)
    Return ($LowsetSpeed / 2) + ($HighestSpeed / 2)
EndFunc


В общем в результате, если самая большая скорость была 190, а самая маленькая 65, то просто 190 делим на 2, 65 тоже делим на 2, и прибавляем результаты (получаем 127,5)...

Но я не уверен что это правильное решение, полагаю нужно в процессе (в цикле) засикать наиболее замеченные данные о скорости, и уже между ними подсчитывать среднее значение - но как это реализовать корректно, я не могу никак сообразить :idontnow:

Кто может, имеет время, помогите плиз разобраться :shuffle:

gregaz 11-06-2007 13:32 597954

Creat0R
Большое спасибо за помощь
Действительно твой совет об использовании новых окон GUI для вывода информации значительно облегчает жизнь.

Есть пара вопросов :
1.Никак не могу найти функцию переименования файлов (ведь должен же быть какой-нибудь Rename)
2.Как задействовать поиск в Helpe (почему то не находятся разделы) ?

amel27 11-06-2007 13:50 597963

Creat0R
не совсем понятно как работает _InetGetSpeed(), но тем не менее... среднюю скорость нельзя вычислить на основывании только мгновенных значений скорости. Для расчета нужно просто взять разницу в значениях @InetGetBytesRead (закачанный размер) и разделить на соответствующую разницу значений TimerDiff() (за какой период времени).

Цитата:

кстати, как оно по русски?
в данном случае просто "подстрока" :)

Creat0R 11-06-2007 19:36 598089

gregaz
Цитата:

Никак не могу найти функцию переименования файлов
FileMove("C:\file.txt", "C:\file_1.txt")

также и с папками...
Но учти, в версии 3.2.2.0 и ранее, есть баг - если пытаться переименовать файл в то же имя но с разным регистром, файл удаляется, к примеру вот так:

Код:

FileMove("C:\test.txt", "C:\teST.txt", 1)
Файл C:\test.txt будет удалён.
Я дал знать разработчикам об этом баге, и в версиях выше чем 3.2.2.0 они вроде это поправили.

Цитата:

.Как задействовать поиск в Help
Речь про обычный файл справки к AutoIt? там есть вкладка Поиск, в неё вводишь слово-запрос, и нажимаешь Enter, если есть соответствующие разделы, они будут отображены ;).

amel27
Цитата:

не совсем понятно как работает _InetGetSpeed()
Вот она:

Код:

Func _InetGetSpeed($Sleep=1000)
    Local $BytesCheckBefore = @InetGetBytesRead
    Sleep($Sleep)
    Local $BytesCheckAfter = @InetGetBytesRead
    Local $RetSpeedByBytes = $BytesCheckAfter - $BytesCheckBefore
    If $RetSpeedByBytes < 0 Then $RetSpeedByBytes = 0
    Return $RetSpeedByBytes
EndFunc

Цитата:

Для расчета нужно просто взять разницу в значениях @InetGetBytesRead (закачанный размер) и разделить на соответствующую разницу значений TimerDiff()
А можно пример плиз, а то я не уверен что понял как засекать и сравнивать :shuffle: .

amel27 12-06-2007 09:38 598282

Creat0R
Цитата:

можно пример
Код:

If Not(InetGet("http://downloadmirror.intel.com/6667/eng/ISM556_Build7.exe", "xpSP2_ru.exe", 1, 1)) Then MsgBox (16,'','')
$begin = TimerInit()

While @InetGetActive
    Sleep(250)
    $AverageSpeed = (@InetGetBytesRead / TimerDiff($begin))
    TrayTip("Downloading", "Average Speed = " & Int($AverageSpeed) & " Kbyte/sec", 10, 16)
Wend

Цитата:

Вот она
Имхо текущую скорость удобней измерять через AdLib():
Код:

Global $InetSpeed = 0, $InetGetBytesRead = 0, $InetTimeStamp = 0
AdlibEnable ("_InetGetSpeed", 1000)

InetGet("http://downloadmirror.intel.com/6667/eng/ISM556_Build7.exe", "test.exe", 1, 1)
While @InetGetActive
    Sleep(250)
    TrayTip("Downloading", "Speed = " & Int($InetSpeed) & " Kbyte/sec", 10, 16)
Wend

Func _InetGetSpeed()
    If @InetGetActive Then
        If @InetGetBytesRead <> -1 Then
            Local $ticks = TimerDiff($InetTimeStamp)
            If  $ticks>0 Then $InetSpeed = (@InetGetBytesRead-$InetGetBytesRead) / $ticks
        EndIf
        $InetGetBytesRead = @InetGetBytesRead
        $InetTimeStamp = TimerInit()
    Else
        $InetGetBytesRead = 0
        $InetSpeed = 0
    EndIf
EndFunc


Creat0R 13-06-2007 03:02 598584

amel27
Цитата:

текущую скорость удобней измерять через AdLib():
Не всегда, а что если в скрипте уже используется Adlib для других целей?
Хотя это можно совмещать... но почему бы не поместить функцию в цикл, и передавать ей как параметр чтение байтов, и возвращать с неё данные о скорости? это мне кажется лучший вариант...

Код:

Global $InetSpeed = 0, $InetGetBytesRead = 0, $InetTimeStamp = 0, $begin = TimerInit()

InetGet("http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3.2.4.4-setup.exe", "test.exe", 1, 1)

While @InetGetActive
    Sleep(200)
    $Bytes = @InetGetBytesRead
    $InetSpeed = _InetGetSpeed($Bytes)
    $AverageSpeed = $Bytes*1000 / TimerDiff($begin)
    TrayTip("Downloading", "Speed = " & Round($InetSpeed/1024, 1), 10, 16)
Wend

MsgBox(0, "", "Avarage speed is: " & Round($AverageSpeed/1024, 1))

Func _InetGetSpeed($Bytes)
    If @InetGetActive Then
        If $InetTimeStamp Then
            Local $Ticks = TimerDiff($InetTimeStamp)
            If  $Ticks > 0 Then $InetSpeed = ($Bytes-$InetGetBytesRead)*1000 / $Ticks
        EndIf
        $InetGetBytesRead = $Bytes
        $InetTimeStamp = TimerInit()
    Else
        $InetTimeStamp = 0
        $InetGetBytesRead = 0
        $InetSpeed = 0
    EndIf
    Return $InetSpeed
EndFunc

Остаётся один главный вопрос - Насколько это точный подсчёт? и можно ли “доверять” этим данным?

Спасибо за примеры, вроде всё работает как надо :).

P.S
А среднюю скорость мне нужно не в цикле отображать, а подсчитать её для конечного вывода (чтобы показать юзеру с какой скоростью (средней) закаивался файл за весь промежуток закачки).


Diamond
По теме словарей (Dictionary):
http://www.autoitscript.com/forum/in...6&#entry352256

amel27 13-06-2007 03:24 598585

Creat0R
Цитата:

почему бы не поместить функцию в цикл, и передавать ей как параметр чтение байтов, и возвращать с неё данные о скорости?
Из соображений эффективности... Смущает Sleep() внутри функции - обычно время контролирует один (основной цикл) и не предполагается, что какая-то функция будет стопорить скрипт...

З.Ы. скрипт привел к работоспособному виду.

Creat0R 13-06-2007 04:51 598599

amel27
Цитата:

скрипт привел к работоспособному виду.
А что если в Adlib я поставлю не 1000, а 500, чтобы данные обновлялись более часто? если это нарушает достоверность данных, то как сделать отображение чаще чем раз в секунду, но при этом сохранить достоверность (надёжность) данных о скорости?

P.S
А по поводу средней скорости.... на выходе из цикла переменная $AverageSpeed будет содержать общую среднюю скорость закачки на промежуток времени всей закачки, или она будет содержать последнюю засеченную среднюю скорость (на выходе из цикла)?

amel27 13-06-2007 12:18 598748

Creat0R
Цитата:

а что если в скрипте уже используется Adlib для других целей?
использовать самопальный AdLib ;) тем более, что у него нет ограничений на количество запусков...
Цитата:

на выходе из цикла переменная $AverageSpeed будет содержать общую среднюю скорость закачки на промежуток времени всей закачки, или она будет содержать последнюю засеченную среднюю скорость (на выходе из цикла)?
среднюю по закаченной части файла, соответственно на выходе - по всему файлу... вообще если нужен только итог, то достаточно по завершению разделить FileGetSize() на TimerDiff().
Цитата:

А что если в Adlib я поставлю не 1000, а 500, чтобы данные обновлялись более часто? если это нарушает достоверность данных, то как сделать отображение чаще чем раз в секунду, но при этом сохранить достоверность (надёжность) данных о скорости?
придется хранить все предыдущие значения @InetGetBytesRead, например в массиве... Вот измененный вариант, где скорость измеряется за последние 500*10 = 5 сек закачки:
Код:

Global $AdLibMS=500, $InetBytesBack = 10
Global $InetSpeed = 0, $InetTimeStamp
Global $InetBytesRead[$InetBytesBack+1]

AdlibEnable ("_InetGetSpeed", $AdLibMS)
InetGet("http://downloadmirror.intel.com/6667/eng/ISM556_Build7.exe", "test.exe", 1, 1)

While @InetGetActive
    Sleep(100)
    $bytes = StringFormat('Downloads: %d Kb',@InetGetBytesRead/1000)
    $speed = StringFormat('Speed: %d Kb/Sec',$InetSpeed)
    TrayTip('', $bytes & @CRLF & $speed, 10, 16)
Wend

Func _InetGetSpeed()
    Local $nb ; Значение массива по текущему индексу до его обновления (цикл назад)
    If @InetGetActive Then
        ; Если первый раз, то инициализируем массив
        If $InetBytesRead[0]=0 Then $InetBytesRead[0] = 1
        ; Ищем следущую ячейку массива
        $InetBytesRead[0]+=1
        If $InetBytesRead[0] > $InetBytesBack Then $InetBytesRead[0]=1
        ; Сохраняем значение массива в переменной (сколько было байт 1 цикл назад)
        $nb = $InetBytesRead[$InetBytesRead[0]]
        ; Записываем новое значение загруженных байт
        $InetBytesRead[$InetBytesRead[0]] = @InetGetBytesRead
        ; Выбираем формулу в зависимости от того проходим первый цикл или уже нет
        If $nb >0 Then
            $InetSpeed = ($InetBytesRead[$InetBytesRead[0]]-$nb)/($AdLibMS * $InetBytesBack)
        Else
            $InetSpeed = $InetBytesRead[$InetBytesRead[0]]/($AdLibMS * $InetBytesRead[0])
        EndIf
    Else
        ; Если нет закачки затираем массив и сбрасываем параметры
        If $InetBytesRead[0]>0 Then Global $InetBytesRead[$InetBytesBack+1]
        $InetSpeed = 0
    EndIf
EndFunc


schel4ok 13-06-2007 14:34 598812

Написал скрипты установки MathCAD 2001 и AutoCAD 2006 Mechanical.

В MathCAD 2001 после установки при первом запуске программы производится какая-то настройка. При этом необходимо не вынимать установочный диск. Грубо говоря, тыкаешь ярлык к mathcad.exe и запускается прогресс бар msi-настройщика длящийся около минуты. У ярлыка не указаны никакие ключи командной строки (точнее поле объект в свойствах ярлыка вообще неактивно и недоступно для просмотра).
Поэтому простой запуск
Run (@Programfilesdir & 'Mathsoft\Mathcad 2001 professional\mathcad.exe')
Processwait('процесс')
ProcessWaitClose('процесс')
ProcessClose ('mathcad.exe')

не помогает! При этом первой строчкой запускается сам Маткад и никакой настройки не производится. Настройка происходит только при запуске через ярлык. Как узнать что именно при этом происходит?

В AutoCAD 2006 Mechanical после установки при первом запуске запускается процесс регистрации. Только строчка Run (@Programfilesdir & '...\...\Acad.exe') тоже не помогает. При отработке этой строчки из скрипта, выскакивает диалоговое окно сообщающее о том, что система не может найти како-то .dll. Если же сразу после этого запустить AutoCAD вручную - то все нормально!
Помогите!

Diamond 13-06-2007 18:33 598943

Внедрённый HTML объект
Анимированный gif, звук (в бесконечном цикле!), плюс эффект с текстом.
З.Ы. Пытался с помощью дополнительных стилей убрать рамку у объекта , но нашёл лишь несколько новых рамок... и всё же есть одна небольшая хитрость:
В коде есть четыре закомментированных параметра, если их задействовать - то рамка исчезнет.
Код:

$sound=@ScriptDir & "\MUSIC9.MID"
$image=@ScriptDir & "\butterfly.gif"

Opt("GUIOnEventMode",1)
#include <GUIConstants.au3>
$hGUI=GUICreate("Embedded Web control Test", 442, 300)
GUISetOnEvent($GUI_EVENT_CLOSE,"Quit")
$oIE = ObjCreate("Shell.Explorer.2")
$GUIActiveX = GUICtrlCreateObj($oIE, 1, 1, 440, 62)
$oIE.navigate ("about:blank")
While $oIE.busy
    Sleep(200)
WEnd
$oIE.document.write('<bgsound loop="-1"  src="' & $sound & '">')
$oIE.document.write('<marquee behavior="alternate" direction="right"><font size="+3" color="#ff00ff"><b>Web control Test</b></font></marquee>')
$oIE.refresh

;~ $oIE.height=66
;~ $oIE.width=444
;~ $oIE.left=-4
;~ $oIE.top=-4

$oIE.document.body.scroll = "no"
$oIE.document.body.bgcolor = "buttonface"
$oIE.document.body.leftmargin = "2"
$oIE.document.body.rightmargin = "2"
$oIE.document.body.topmargin= "10"
$oIE.document.body.background = $image
GUICtrlSetStyle($GUIActiveX,-1,0x1999)
GUICtrlSetState($GUIActiveX,$GUI_DISABLE)
GUISetState(@SW_SHOW)

While 1
        Sleep(1000)
WEnd

Func Quit()
        Exit
EndFunc

Creat0R
Цитата:

По теме словарей (Dictionary)
Эх, мне бы этот пример немного пораньше... и я сэкономил бы пару часов на его изучении. :search:
В любом случае, большое спасибо! :)

Creat0R 13-06-2007 22:20 599003

amel27
Цитата:

вообще если нужен только итог, то достаточно по завершению разделить FileGetSize() на TimerDiff()
Гинеально!!! оказалось намного проще! спасибо.

Цитата:

придется хранить все предыдущие значения @InetGetBytesRead, например в массиве
А что если объявлять локально переменные которые не изменяются нигде, это повлияет на результаты?

Вот как я сделал:

Код:

Global $InetBytesRead[10+1]

InetGet("http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3.2.4.4-setup.exe", "test.exe", 1, 1)

$begin = TimerInit()

While @InetGetActive
    Sleep(100)
    $InetSpeed = _InetGetSpeed(100)
    $bytes = StringFormat('Downloads: %d Kb',@InetGetBytesRead/1024)
    $speed = StringFormat('Speed: %d Kb/Sec',$InetSpeed)
    TrayTip('', $bytes & @CRLF & $speed, 10, 16)
Wend

MsgBox (64,'', "Download is finished with Avarage Speed of: " & Int(FileGetSize("test.exe")/TimerDiff($begin)) & " kb/s")

Func _InetGetSpeed($AdLibMS=500)
    Local $nb ; Значение массива по текущему индексу до его обновления (цикл назад)
    Local $InetSpeed = 0, $InetBytesBack = 10
    If @InetGetActive Then
        ; Если первый раз, то инициализируем массив
        If $InetBytesRead[0]=0 Then $InetBytesRead[0] = 1
        ; Ищем следущую ячейку массива
        $InetBytesRead[0]+=1
        If $InetBytesRead[0] > $InetBytesBack Then $InetBytesRead[0]=1
        ; Сохраняем значение массива в переменной (сколько было байт 1 цикл назад)
        $nb = $InetBytesRead[$InetBytesRead[0]]
        ; Записываем новое значение загруженных байт
        $InetBytesRead[$InetBytesRead[0]] = @InetGetBytesRead
        ; Выбираем формулу в зависимости от того проходим первый цикл или уже нет
        If $nb >0 Then
            $InetSpeed = ($InetBytesRead[$InetBytesRead[0]]-$nb)/($AdLibMS * $InetBytesBack)
        Else
            $InetSpeed = $InetBytesRead[$InetBytesRead[0]]/($AdLibMS * $InetBytesRead[0])
        EndIf
    Else
        ; Если нет закачки затираем массив и сбрасываем параметры
        If $InetBytesRead[0]>0 Then Global $InetBytesRead[$InetBytesBack+1]
        $InetSpeed = 0
    EndIf
    Return $InetSpeed
EndFunc

Ну не очень мне нравится идея с Adlib в этом случае :shuffle:

Кстати, у тебя в примере чтобы получить кб, байты деляться на 1000:

Код:

@InetGetBytesRead/1000
Разве не на 1024 нужно делить?


amel27 14-06-2007 10:55 599172

Creat0R
Цитата:

А что если объявлять локально переменные которые не изменяются нигде, это повлияет на результаты?
не повлияет, только значение $InetBytesBack придется вбивать дважды - при определении массива и в функции, а $InetSpeed в твоем случае и вовсе не нужна - можно просто заменить "$InetSpeed = <формула>" на "Return <формула>"
Цитата:

Ну не очень мне нравится идея с Adlib в этом случае
Свои предпочтения нужно обосновывать. :)
AdLib хорош тем, что он не зависит от скрипта (есть соединение или нет) и временной интервал всегда одинаков. В твоем варианте интервал между "временнЫми засечками" на самом деле >100 ровно на столько, сколько потребуется скрипту на выполнение команд после Sleep(100). Обычно это неcущественно, но в общем случае он может быть любым (особенно если где-нибудь есть еще один Sleep() ;) ), соответственно показания скорости будут неверными. Для сохранения точности придется в дополнение к @InetGetBytesRead сохранять показания TimerInit(), хотя интервал замера уже перестанет быть фиксированным... Кроме того инициализацию массива придется возложить на основной скрипт, так как функция не знает старая это закачка или новая.
Код:

Global $InetBytesRead

InetGet("http://downloadmirror.intel.com/6667/eng/ISM556_Build7.exe", "test.exe", 1, 1)
_GetProgressSpeed ($InetBytesRead, @InetGetBytesRead, 100)

While @InetGetActive
    Sleep(100)
    $bytes = StringFormat('Downloads: %d Kb',@InetGetBytesRead/1024)
    $speed = StringFormat('Speed: %d Kb/Sec',_GetProgressSpeed ($InetBytesRead, @InetGetBytesRead) *0.9765625)
    TrayTip('', $bytes & @CRLF & $speed, 10, 16)
Wend

Func _GetProgressSpeed (ByRef $arrValueBack, $intValue = -1, $intCountBack = 0)
    Local $nb, $nt, $bound = UBound($arrValueBack,1)
    If $intCountBack<=0 Then $intCountBack = $bound-1 ; Восстанавливаем актуальное значение глубины отката
    ; Блок инициализации массива и контроля ошибок
    If $intCountBack<=0 Then Return SetError(1, 0, -1) ; Ошибка размерности 1
    If $intValue<0 Then
        Dim $arrValueBack [$intCountBack+1][2] = [[1,TimerInit()]]
        Return 0
    ElseIf $intCountBack<>$bound-1 Then
        Dim $arrValueBack [$intCountBack+1][2] = [[1,TimerInit()],[$intValue,TimerInit()]]
        Return 0
    Else
        If UBound($arrValueBack,2)<2 Then Return SetError(2, 0, -1) ; Ошибка размерности 2
        If ($arrValueBack[0][0]<=0) Or ($arrValueBack[0][0]>$intCountBack) Then  Return SetError(3, 0, -1) ; Ошибка целостности
    EndIf
    ; Ищем следующую ячейку массива
    $arrValueBack[0][0]+=1
    If $arrValueBack[0][0] > $intCountBack Then $arrValueBack[0][0]=1
    ; Сохраняем значения массива в переменных (цикл назад)
    $nb = $arrValueBack[$arrValueBack[0][0]][0]
    $tb = $arrValueBack[$arrValueBack[0][0]][1]
    ; Записываем новые значения загруженных байт и время
    $arrValueBack[$arrValueBack[0][0]][0] = $intValue
    $arrValueBack[$arrValueBack[0][0]][1] = TimerInit()
    ; Выбираем формулу в зависимости от того проходим первый цикл или нет
    If $nb =0 Then Return $arrValueBack[$arrValueBack[0][0]][0] / TimerDiff($arrValueBack[0][1])
    Return ($arrValueBack[$arrValueBack[0][0]][0]-$nb) / TimerDiff($tb)
EndFunc

Цитата:

Разве не на 1024 нужно делить?
с учетом вышеизложенного это мелочи :)
...кстати, множитель 0.9765625 как раз отвечает за перевод исходной величины Byte/ms в KByte/sec

amel27 14-06-2007 11:10 599181

schel4ok
Цитата:

первой строчкой запускается сам Маткад и никакой настройки не производится
попробуй вместо Run() использовать ShellExecute() не для EXE, а для ярлыка (*.LNK), поищи его в папке Рабочего стола....

Creat0R 14-06-2007 11:20 599185

amel27
Цитата:

Свои предпочтения нужно обосновывать.
Они обосновываются тем, что я хотел создать библиотеку для _InetGet...(), а помещать в библиотеку единственный ресурс Adlib не очень то уж и хорошая идея, поэтому и писал, что возможно эта функция будет вызываться позже (из родительского скрипта в котором используется библиотека).

Цитата:

на самом деле >100 ровно на столько, сколько потребуется скрипту на выполнение команд после Sleep(100)
Согласен, но в моём случае, не думаю что команды TrayTip (хотя использую ProgressSet() ;) ), или String...() могут занять много времени....

Цитата:

кстати, множитель 0.9765625 как раз отвечает за перевод исходной величины Byte/ms в KByte/sec
Т.е это считается меркой соотношения между bytes/ms и kb/s? а для mb/m (просто интересно), нужно ещё раз умножать на это же значение? :)

amel27 15-06-2007 05:59 599481

Creat0R
Переделал последний вариант скрипта - добавил обработку ошибок и упростил использование параметров. Теперь он может использоваться для измерения не только скорости закачки, но и скорости прогресса любой величины (>0), например обработанных файлов, произведенных кликов мышки и т.д.
Цитата:

не думаю что команды TrayTip (хотя использую ProgressSet() ), или String...() могут занять много времени
Имхо не стоит загадывать, особенно если включать функцию в библиотеку... и если вспомнить, что скрипт может стопориться даже без вызова Sleep(). ;)
Цитата:

это считается меркой соотношения между bytes/ms и kb/s? а для mb/m (просто интересно), нужно ещё раз умножать на это же значение?
Byte/ms -> KByte/s : 1000/1024 = 0.9765625
KByte/s -> MByte/min : 60/1024 = 0.05859375

Creat0R 15-06-2007 18:21 599770

amel27
Цитата:

добавил обработку ошибок
Имхо, возвращаемое значение не должно быть -1 в подобной функции, чтобы это не отобразилось случайно в TrayTip (или любом другом “отображающем устройстве” :) ), мне кажется присваивать последовательно значения @error будет достаточно, а возвращать в таком случае 0.


Цитата:

Теперь он может использоваться для измерения не только скорости закачки, но и скорости прогресса любой величины (>0), например обработанных файлов, произведенных кликов мышки и т.д.
не совсем понял, а как это засикается скорость обработанных файлов, или что ещё более удивитеьнее (для меня), как это работает на “произведенных кликов мышки”? :shuffle:

И ещё такой вопрос: Функция для подсчёта скорости, в оригинале возвращает байты/мс, или байты/с ? если первое, то как поправить чтобы возвращались именно байты в секунду, это нужно для ещё одной функции подсчёта... функция подсчитывает приблизительно оставшиеся время до закачки (в секундах) :

Код:

;Функция возвращает приблизительно оставшееся время в секундах (за счёт вычесления из общего размера файла и деления на скорость скачивания).
Func _InetGetRemained($Bytes, $TotalBytesSize, $SpeedByBytes)
    Local $RemainedSecs = ($TotalBytesSize - $Bytes) / $SpeedByBytes
    If $RemainedSecs < 0 Then $RemainedSecs = 0
    Return $RemainedSecs
EndFunc


GTeam 16-06-2007 00:15 599858

Здравствуйте!

подскажите пожалуйста как получить файл с и-нета а затем его запустить(скачать и после того как он на компе запустить его)
делаю вот так:

InetGet("http://the-file.com/file.exe", "file.exe", 1, 1)
Sleep(30000)
Global $file = 'file.exe'
RunWait($file)

но мне почемуто кажется что функция Sleep(30000) только останавливает скрипт а сним и получение файла с и-нета, или я не прав?

приведите пример пожалуйста как правельно это сделать..

Creat0R 16-06-2007 01:29 599879

GTeam
Цитата:

как получить файл с и-нета а затем его запустить
Нужно поставить закачку не в фоновой режим, а чтобы функция возвращала по завершению закачки...

Цитата:

делаю вот так:
В этом случае закачка поставлена именно в фоновой режим, за это отвечает последний параметр.

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

Код:

;Обьявляем переменную для имени файла (желательно и весь путь)
Global $file = 'file.exe'

;Ставим закачку в ждущем режиме
$Ret = InetGet("http://the-file.com/file.exe", $file, 1, 0)

;Если удачно закачался файл, то запускаем его
If $Ret = 1 Then RunWait($file)


GTeam 16-06-2007 02:34 599895

спасибо огромное, очень помог!
еще один вопрос , может ли AutoItSetOption("TrayIconHide", 1) повлиять как то на работу скрипта?

Creat0R 16-06-2007 02:57 599901

GTeam
Цитата:

может ли AutoItSetOption("TrayIconHide", 1) повлиять как то на работу скрипта?
В каком смысле?

оно влияет только на то, что иконка в трее не будет отображаться, это удобно если нужно в работе скрипта скрывать/показывать иконку в области уведомления (трей), если нужно чтобы иконка вовсе не показывалась (никогда), то в начале скрипта достаточно поставить директиву #NoTrayIcon, это кстати, в отличие от Opt("TrayIconHide", 1), позволяет не показывать иконку при запуске скрипта, т.е икона не появится на мгновение как это происходит при использовании Opt("TrayIconHide", 1) :).

amel27 16-06-2007 12:23 599941

Creat0R
Цитата:

Имхо, возвращаемое значение не должно быть -1 в подобной функции, чтобы это не отобразилось случайно
если проверять на ошибки, то случайностей не будет ;)
Цитата:

как это засикается скорость обработанных файлов
Код:

#include <Constants.au3>
Global $ProcessCount, $ProcessLines=0

$pid = Run (@ComSpec & ' /C DIR /B /S *.*', 'C:\', @SW_HIDE, $STDOUT_CHILD)
_GetProgressSpeed ($ProcessCount, -1, 100)

While 1
    Sleep(100)
    $text = StdoutRead($pid)
    If @error Then ExitLoop
    $count = StringLen($text)-StringLen(StringStripCR($text))
    $ProcessLines+= $count
    $files = StringFormat('Processed %i files', $ProcessLines)
    $speed = StringFormat('Speed: %i Files/Sec',_GetProgressSpeed($ProcessCount, $ProcessLines)*1000)
    TrayTip('', $files & @CRLF & $speed, 10, 16)
    ConsoleWrite ($text)
Wend

Цитата:

или что ещё более удивитеьнее (для меня), как это работает на “произведенных кликов мышки”?
Код:

#include <GUIConstants.au3>
Global $ProcessCount, $ProcessClicks=0
Opt("GUIOnEventMode", 1)

GUICreate("My GUI")
GUISetOnEvent($GUI_EVENT_CLOSE, "_Quit")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_AddClick")

_GetProgressSpeed ($ProcessCount, -1, 50)
GUISetState (@SW_SHOW)

While 1
    Sleep(100)
    $clicks = StringFormat('Processed %i clicks', $ProcessClicks)
    $speed = StringFormat('Speed: %.2f Clicks/Sec',_GetProgressSpeed($ProcessCount, $ProcessClicks)*1000)
    TrayTip('', $clicks & @CRLF & $speed, 10, 16)
Wend

Func _AddClick()
    $ProcessClicks+=1
EndFunc

Func _Quit()
    Exit
EndFunc

Цитата:

Функция для подсчёта скорости, в оригинале возвращает байты/мс, или байты/с ?
как и AutoIT - миллисекунды
Цитата:

как поправить чтобы возвращались именно байты в секунду, это нужно для ещё одной функции подсчёта... функция подсчитывает приблизительно оставшиеся время до закачки (в секундах)
Код:

Func _InetGetRemained($Bytes, $TotalBytesSize, $SpeedByBytes)
    Local $RemainedSecs = ($TotalBytesSize - $Bytes) / ($SpeedByBytes * 1000)
    If $RemainedSecs < 0 Then $RemainedSecs = 0
    Return $RemainedSecs
EndFunc


gregaz 16-06-2007 18:57 600087

Creat0R. Спасибо за советы !
Есть еще один вопрос :
Как правильно организовать архивирование файлов Winrar_ом ?
Имеется Файл , полученный после работы функции FileOpenDialog, есть его массив-форма,обработанная определенным обазом.
Задача :архивировать выбранные и обработанные файлы
Попытка занести в окно Winrara требуемый путь к папке (имеющий и русские названия папок) выдают абракадабру
Поочередное переключение раскладок клавы не дает стабильного результата.
Возможно есть простой путь ?

Diamond 16-06-2007 22:24 600149

gregaz
Цитата:

Попытка занести в окно Winrara требуемый путь к папке (имеющий и русские названия папок) выдают абракадабру
Поочередное переключение раскладок клавы не дает стабильного результата.
Возможно есть простой путь ?
Если в папке с программой WinRAR, есть консольный "Rar.exe", то можно сделать совсем просто...

Код:

;~ путь к консольной программе:
$WinRar="C:\Program Files\WinRAR\Rar.exe"
;~ Имя создаваемого архива:
$ArchiveName=' "C:\MyArchive.rar"'
;~ Добавляемые файлы:
$addFiles=' "C:\Fie1.txt" "c:\File2.txt"'
;~ ...или путь к текстовому файлу, который содержит список добавляемых файлов:
;~ $list=' "@C:\List.txt"'

;~ Задаём параметры:
$param=' a' & $ArchiveName & $addFiles
;~ или:
;~ $param=' a' & $ArchiveName & $list

Run ($WinRar & $param,"",1)


gregaz 16-06-2007 23:01 600166

[Diamond,
Спасибо
Просто и здорово
А как ввести другие параметры архивирования :
скажем ПАРОЛЬ или ДОБАВИТЬ ИНФОРМАЦИЮ ДЛЯ ВОССТАНОВЛЕНИЯ ,?

Diamond 17-06-2007 01:25 600216

gregaz
Цитата:

А как ввести другие параметры архивирования :
скажем ПАРОЛЬ или ДОБАВИТЬ ИНФОРМАЦИЮ ДЛЯ ВОССТАНОВЛЕНИЯ ,?
Код:

$WinRar="C:\Program Files\WinRAR\Rar.exe"
$ArchiveName=' "C:\MyArchive.rar"'
$addFiles=' "C:\File1.txt" "C:\File2.txt"'

;~ Пароль с шифрованием имён файлов -hp
$password=' -hpgregaz'
;~ информация для восстановления -rr
$ResInfo=' -rr10%'
$param = ' a' & $ResInfo & $password & $ArchiveName & $addFiles
Run ($WinRar & $param,"",0)

Если я буду продолжать в том же духе - то офтоп получается...
Там очень много всяких возможностей, проще будет изучить справку самостоятельно:
Run(@ComSpec & ' /k "C:\Program Files\WinRAR\Rar.exe" /?',"",3)
Да, насчёт информации для восстановления... я не уверен, нужен ли знак процента на конце.

eNcub 17-06-2007 10:19 600266

Подскажите кто-нибудь плз, когда создается vpn подключение, то в зависимости от того есть уже подключения в системе или нет, то выскакивает окно "Набирать номер для предварительного подключения. Как его отследить?


Такая конструкция обрабатывается неверно, в свойствах окна этот текст есть как скрытый... Как сделать чтобы WinWaitActive смотрел только на видимый текст?
Цитата:

if WinWaitActive('Мастер новых подключений', 'Выберите, надо ли автоматически подключаться к Интернету','5' )==1 Then
Send ( '{UP}{ENTER}' ) EndIf
Получается что с этой проверкой vpn подключение создается только если в системе уже какое-то подключение есть..

Diamond 17-06-2007 23:08 600506

eNcub
Цитата:

Как сделать чтобы WinWaitActive смотрел только на видимый текст?
Вообще-то, WinWaitActive() по умолчанию работает только с видимым текстом, а вот если нужно обрабатывать и тот и другой текст, то потребуется изменить умолчание:
Opt("WinDetectHiddenText",1)
0 = не сопоставлять со скрытым текстом окна (по умолчанию)
1 = сопоставлять в том числе и со скрытым текстом окна

Creat0R 18-06-2007 00:43 600530

amel27
Цитата:

если проверять на ошибки, то случайностей не будет
Это понятно, но это лишний код, имхо.. ладно это ерунда ;)

Спасибо за примеры, всё стало намного яснее :)

Diamond 18-06-2007 23:47 601023

Функция, которая позволяет замостить фон GUI текстурой или небольшими изображениями
Код:

;~ Использование:
;~ Tiled_BgImage("Путь к изображению с текстурой","ширина изображения", "высота изображения")

Func Tiled_BgImage($ImagePath,$width,$height)
  $yTile=Round(@DesktopHeight/$height)
  $xTile=Round(@DesktopWidth/$width)
  For $y=0 To $yTile
    For $x=0 To $xTile
      GUICtrlCreatePic($ImagePath,$width*$x,$height*$y,$width,$height)
      GUICtrlSetResizing(-1,802) ; $GUI_DOCKALL
      GUICtrlSetState(-1,128) ; $GUI_DISABLE
    Next
  Next
EndFunc


gregaz 19-06-2007 11:30 601183

Спасибо Diamond за помощь по Winrarу
Действительно есть,оказывается <Руководство по консольной версии RAR > - там все прописано .

Можно пару вопросов на другую тему ?
1.Как ввести данные в Интернет страницу ( типа Логин,пароль )или текст поиска (для Google)
2.Как найти на Интернет странице нужный текст (Ссылку и .т.п.)
Вопрос поиска текстового фрагмента в файле рассматривался здесь на форуме ,а как это сделать на ВЕБ- странице ?

Creat0R 19-06-2007 17:19 601388

gregaz
Цитата:

Как ввести данные в Интернет страницу
Мне кажется нужно смотреть в сторону функции _IE... (в справке).

Цитата:

Как найти на Интернет странице нужный текст
Примерно так:

Код:

#include <INet.au3>

$WebPage = "http://www.autoitscript.com"
$WhatToFind = "autoit"

$Source = _INetGetSource($WebPage)

$FindPos = StringInStr($Source, $WhatToFind)

If $FindPos <> 0 Then MsgBox(64, "", "Текст <" & $WhatToFind & "> найден в позиции: " & $FindPos)

Можно также в файл сохранить иточник ($Source), и уже делать поиск по файлу (с учотом регистра, не латинских букв и т.д).

proxy 19-06-2007 19:13 601449

привет всем =))
если честно сижу ещё в офисе, после напрженного рабочего дня, глаза "в кучку" - и даже не могу найти кнопку "создать новую тему"
в общем если не влом "киньте" ею в меня ))


а вот сам вопрос:
дле элемента GUICtrlCreateList очень хорошо работае функция GUICtrlSetOnEvent
т.е. если кликнуть по списку GUICtrlCreateList мышкой, то тут же будет вызвана функция, прописанная в GUICtrlSetOnEvent.

а вот для элемента GUICtrlCreateListView функция GUICtrlSetOnEvent - не работает, как быть?
добиться я хочу все того же: т.е. когда кликаю мышкой по таблице GUICtrlCreateListView, мне необходимо, что бы
на это сыбите таблица "реагировала" и вызывала мою функцию.

и как то же самое произвести для элимента GUICtrlCreateTab .

пользуюсь autoIT v3.2.4.0

Diamond 19-06-2007 20:26 601471

gregaz
Цитата:

Действительно есть,оказывается <Руководство по консольной версии RAR > - там все прописано
Я имел ввиду консольную справку (cmd /k "Rar.exe" /?), а о том, что есть руководство, я почему-то не подумал... :sorry:

Creat0R 19-06-2007 22:00 601495

proxy
Цитата:

как быть?
Если для GUICtrlCreateListView поставить GUICtrlSetOnEvent, то оно срабатывать будет при нажатии на заголовок (Column), для того чтобы срабатывало при нажатии в пустом (точнее в любом) месте ListView, нужно совместить события (нажатие мышки и наведение курсора мышки над ListView контролем)...

Код:

#include <GuiConstants.au3>
Opt("GuiOnEventMode", 1)

$GUI = GUICreate("Test")
GUISetOnEvent($GUI_EVENT_CLOSE, "Quit")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "LV_Event")

$ListViewID = GUICtrlCreateListView("Column", 20, 40)

GUISetState()

While 1
    Sleep(10)
WEnd

Func LV_Event()
    Local $CursorInfoArr = GUIGetCursorInfo($GUI)
    If $CursorInfoArr[4] = $ListViewID Then MsgBox(0, "", "Ok, List View was Clicked")
EndFunc

Func Quit()
    Exit
EndFunc

точно также и с табами:

Код:

#include <GuiConstants.au3>
Opt("GuiOnEventMode", 1)

$GUI = GUICreate("Test")
GUISetOnEvent($GUI_EVENT_CLOSE, "Quit")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "Tab_Event")

$TabID = GUICtrlCreateTab(20, 40)
GUICtrlCreateTabItem("Tab Item")

GUISetState()

While 1
    Sleep(10)
WEnd

Func Tab_Event()
    Local $CursorInfoArr = GUIGetCursorInfo($GUI)
    If $CursorInfoArr[4] = $TabID Then MsgBox(0, "", "Ok, Tab control was Clicked")
EndFunc

Func Quit()
    Exit
EndFunc


Diamond 19-06-2007 23:45 601533

объект: "Scripting.Dictionary" - Сортировка данных в словаре
Использование:
SortDictionary($objDict, flag)
$objDict - словарь (как объект)
flag - 0 сортировка по ключам(key); 1 сортировка по элементам(item)
Код:

$Dict = ObjCreate("Scripting.Dictionary")

;~ Наполняем словарь неотсортированными данными:
$Dict.Add ("3", "Delta")
$Dict.Add ("1", "Foxtrot")
$Dict.Add ("4", "Bravo")
$Dict.Add ("2", "Echo")
$Dict.Add ("6", "Alpha")
$Dict.Add ("5", "Charlie")

;~ Сортировка:
SortDictionary($Dict, 0)

;~ Просмотр результатов сортировки:
For $o In $Dict
        MsgBox(0+262144 ,$o, $Dict($o) )
Next

;~ Эта функция основана на:
;~ http://support.microsoft.com/support/kb/articles/q246/0/67.asp
Func SortDictionary(ByRef $objDict, $intSort=0)
        Local Const $dictKey  = 0
        Local Const $dictItem = 1
        Local $strDict[1]
        Local $objKey
        Local $strKey, $strItem
        Local $intCount, $i, $j
        $intCount = $objDict.Count
        If $intCount > 1 Then
                ReDim $strDict[$intCount][2]
                $i = 0
                For $objKey In $objDict
                        $strDict[$i][$dictKey]  = String($objKey)
                        $strDict[$i][$dictItem] = String($objDict($objKey))
                        $i = $i + 1
                Next
                For $i = 0 To $intCount-2
                        For $j = $i To $intCount-1
                                If StringCompare($strDict[$i][$intSort], $strDict[$j][$intSort]) > 0 Then
                                        $strKey  = $strDict[$i][$dictKey]
                                        $strItem = $strDict[$i][$dictItem]
                                        $strDict[$i][$dictKey]  = $strDict[$j][$dictKey]
                                        $strDict[$i][$dictItem] = $strDict[$j][$dictItem]
                                        $strDict[$j][$dictKey]  = $strKey
                                        $strDict[$j][$dictItem] = $strItem
                                EndIf
                        Next
                Next
                $objDict.RemoveAll
                For $i = 0 To $intCount-1
                $objDict.Add ($strDict[$i][$dictKey], $strDict[$i][$dictItem])
                Next
        EndIf
EndFunc

P.S. "Scripting.Dictionary" имеет свойства и методы которые делают его функциональней обычных массивов, плюс простота использования и высокая скорость обработки. А с этой функцией сортировки, словарь может стать серьёзным конкурентом для одномерных массивов.
Для тех кто не знаком с принципами работы этого объекта, есть хорошая ссылка, котрую дал мне Creat0R :http://www.autoitscript.com/forum/in...56?entry352256
Также, описание свойств и методов можно найти на MSDN.


Creat0R 20-06-2007 02:15 601571

На офф. форуме нашел функцию, которая казалось бы, воплотит в реальность мою давнюю “хотелку” :) ...

Вот функция:

Код:

Func SetParent($hWndChild, $hWndNewParent)
    Local $vRtn = DllCall("USER32.DLL", "hwnd", "SetParent", "hwnd", $hWndChild, "hwnd", $hWndNewParent)
    Return $vRtn[0]
EndFunc

Судя по её назваению и содержанию, я предположил что она позволяет присваивать одно окно к другому (в соотношении родительское-дочернее), и делая как бы дочернее окно “прикреплённым” к родительскому, но после долгих тестировании, присваивании якобы родительскому окну атрибута @SW_DISABLE и т.п, так ничего и не вышло :(.
Окно однако становится дочерним/родительским, но не так как мне этого хотелось...

В общем вопрос вот в чём: Возможно ли переделать эту функцию (или написать новую), которая позволит прикреплять одно окно к другому, также как это происходит при вызове подобной фкункции MsgBox...

Код:

$Hwnd = WinGetHandle(WinGetTitle(""))

_MsgBox(0, "", "", $Hwnd)

Func _MsgBox($MsgBoxType, $MsgBoxTitle, $MsgBoxText, $mainGUI="")
    $ret = DllCall ("user32.dll", "int", "MessageBox", _
            "hwnd", $mainGUI, _
            "str", $MsgBoxText , _
            "str", $MsgBoxTitle, _
            "int", $MsgBoxType)
    Return $ret [0]
EndFunc


amel27 20-06-2007 04:58 601584

Diamond
ИМХО у "Scripting.Dictionary" только одно преимущество перед массивами AutoIT - индекс может быть не только числовым, но и текстовым... другими словами это означает штатную поддержку _ArraySearch(), которая в AutoIT доступна только через UDF... Во всех остальных случаях не вижу причин для замены ими штатных массивов... Между прочим функция SortDictionary() по большому счету ничем не отличается от _ArraySort() (кроме отсутствия контроля ошибок), поэтому быстрей она работать не может по определению...
Подробно: http://www.osp.ru/win2000/2006/07/3643019

Creator
Цитата:

На офф. форуме нашел функцию
угу, видел эту функцию, только это не совсем то... а точней совсем не то:
Цитата:

прикладная программа обычно использует дочерние окна, чтобы поделить рабочую область родительского окна на функциональные области
т.е. грубо говоря применение это функции превращает окно в контрол другого окна, источник: http://www.firststeps.ru/mfc/winapi/win/r.php?18

schel4ok 20-06-2007 11:19 601694

А кто-нибудь знает как запускать inf файлы при помощи AutoIt?

eNcub 20-06-2007 12:41 601744

Цитата:

Вообще-то, WinWaitActive() по умолчанию работает только с видимым текстом
Тогда я вообще ничего не понимаю :(.
Почему такая проверка:
Код:

if WinWaitActive('Мастер новых подключений', 'Выберите, надо ли автоматически подключаться к Интернету','5' )==1 Then
      Send ( '{UP}{ENTER}' )
EndIf

не срабатывает
Если это окно не появляется, то нажатие стрелки вверх и энтера всё равно производится. В чем ошибаюсь, может как-то проверять надо другим способом?

Diamond 20-06-2007 14:46 601833

amel27
Цитата:

ИМХО у "Scripting.Dictionary" только одно преимущество перед массивами AutoIT - индекс может быть не только числовым, но и текстовым... другими словами это означает штатную поддержку _ArraySearch(), которая в AutoIT доступна только через UDF... Во всех остальных случаях не вижу причин для замены ими штатных массивов...
Действительно, для "Scripting.Dictionary" функция _ArraySearch(), по большому счёту не нужна, поскольку он имеет метод Exists, но это не единственный его плюс. Например, чтобы произвести добавление, удаление или замену элементов, массивы используют UDF-функции, а при работе со словарём зависимость от UDF также отпадает.
Цитата:

Между прочим функция SortDictionary() по большому счету ничем не отличается от _ArraySort() (кроме отсутствия контроля ошибок), поэтому быстрей она работать не может по определению...
Если честно, я их ещё не сравнивал... А по поводу скорости, согласен, но я и не утверждал что она работает быстрее, ведь сам факт использования в ней массивов, говорит об обратном. Её плюс только в том, что она адаптирована для работы со словарём, и то что она компенсирует отсутствие штатной сортировки (что-то вроде udf, для "Scripting.Dictionary"). :)

proxy 20-06-2007 15:28 601853

хм....., если Creat0R это стиль жизни...то как же тебя именовать?

В любом случае, Человек живущий и создающий - Спаибо, уже витал ответ в голове но небыло времени проверить...
а так и бестрее и вернее выйдет ))) Продолжу вкладывать свои силы в подобный тебе стиль жизни.. )

ChVL 20-06-2007 15:29 601855

В обычном режиме скрипт работает нормально: мелькают окна, но установка проходит автоматом до конца.
При использовании ключа /VERYSILENT идёт скрытый режим и натыкается на место, когда на экране одновременно два окна. Послать команду надо в верхнее окно, но скрипт его упорно не видит. Как победить?

Добавлено:
Разобрался. Оказалось, что это баг самой подопытной программы.

Diamond 20-06-2007 15:53 601863

eNcub
Цитата:

Если это окно не появляется, то нажатие стрелки вверх и энтера всё равно производится. В чем ошибаюсь, может как-то проверять надо другим способом?
Странно... я проверил код, у меня всё нормально. :idontnow: на предыдущем шаге подключения, этот текст действительно есть, но он скрытый и при этом никаких нажатий не происходит...

Кто-нибудь знает в чём тут может быть проблема?

Creat0R 20-06-2007 17:02 601887

amel27
Цитата:

источник:
Спасибо, довольно полезный источник :) - Правда там нет кажется решения для моей хотелки :( ... оно вообще реализуемо?

schel4ok
Цитата:

как запускать inf файлы при помощи AutoIt?
ShellExecute("InfoFile.inf") запустит файл в редакторе для которого сопоставлено расширение файла *.inf в системе.

eNcub
Цитата:

Если это окно не появляется, то нажатие стрелки вверх и энтера всё равно производится
Попробуй так:

Код:

WinWaitActive('Мастер новых подключений', 'Выберите, надо ли автоматически подключаться к Интернету', 5)
If WinActive('Мастер новых подключений', 'Выберите, надо ли автоматически подключаться к Интернету') Then Send('{UP}{ENTER}')

ChVL
Цитата:

но скрипт его упорно не видит. Как победить?
Попробовать определить заголовок окна через Au3Info Tool? (при обычной установке).

gregaz 20-06-2007 17:38 601903

Creat0R,спасибо за "толчок" в сторону функций _IE...
Я и не подозревал об их существовании
Их так много-целое направление в Autoite и богатые возможности (надо разбираться)
Пример поиска на ВЕБ-стр вроде бы работает
Надо будет ввести туда разбиение на строки.
Спасибо

proxy 20-06-2007 18:48 601933

Привет, ещё раз.
А как отслеить двойное нажатие правой и ливой кнопкой мыши?
по элименту.

proxy 20-06-2007 21:58 602000

хм.....и вопрос номер три, забыл спросить сразу.

имеется: файли txt со списком строк
необходимо: из этого файла удалить определенную строчку

я сейчас это реализовал так: т.е. считываю все строчки по одной из файла 1.txt
и если считанная строчка не совпадает с образцом, то записываю её в файл 2.txt
после оканчания файла 1.txt - удаляю его, а файл 2.txt переименовываю (т.е. копирую)
в файл 1.txt.

может есть вариант полегче?

Diamond 21-06-2007 00:32 602047

Я считаю, что в пользовательской функции _FileReadToArray() допущена ошибка.
Рассматриваю строку из этой функции:
$aArray = StringSplit(StringStripCR(FileRead($hFile, FileGetSize($sFilePath))), @LF)
Поясню свою позицию. Дело в том, что строка текстового файла может иметь 3 типа завершения:
1 - @CRLF
2 - @CR
3 - @LF
Автор наверное посчитал что символ @LF - неотъемлемый элемент перевода на новую строку, и понадеявшись на него, одним махом удалил все @CR из полученного текста...
На деле же получается, что если строка завершается только символом @CR, то после такой обработки эта строка соединится со следующей, а в результате мы получим неверный массив.
Предлагаю свой вариант решения:
$aArray = StringSplit(StringRegExpReplace(FileRead($hFile,FileGetSize($sFilePath)),"\r\n|\n",@CR),@CR)

proxy
Цитата:

имеется: файли txt со списком строк
необходимо: из этого файла удалить определенную строчку
Пример замены текста в файле: http://forum.oszone.net/post-533177-616.html

proxy 21-06-2007 00:42 602049

Diamond, спасибо. Необходимое с тектом реализовал уже по другому, а пример приму на заметку, чувствую дальше понадобиться.

И вопрос все ещё открыт:
Как отслеить двойное нажатие правой и ливой кнопкой мыши по элименту?
можеть есть пример?

Creat0R 21-06-2007 01:20 602055

Diamond
Цитата:

в результате мы получим неверный массив
Ну почему, в массив то попадают все строки с нужным текстом, а зачем в массиве символы перевода строки и возврата каретки?
И кстати, при чтении всего файла, совсем не обязательно использовать FileGetSize() :

Код:

$aArray = StringSplit(StringRegExpReplace(FileRead($hFile),"\r\n|\n",@CR),@CR)
А разве в этом примере символы перевода строки и возврата каретки не заменятся на символ новой строки? может при делении на массив нужно использовать @LF а не @CR?

proxy
Цитата:

Как отслеить двойное нажатие правой и ливой кнопкой мыши по элименту?
Вот пример для левой кнопки мышки (для правой пока не вкурсе) :

Код:

#include <GuiConstants.au3>
Opt("GuiOnEventMode", 1)

Global Const $WM_NOTIFY    = 0x004E
Global Const $NM_CLICK      = -2
Global Const $NM_DBLCLK    = -3

$GUI = GUICreate("Dowble Click on List View", 300, 200)
GUISetOnEvent(-3, "Quit")

$ListView = GUICtrlCreateListView("Column1|Column2", 20, 20, 250, 130)
$ListViewItem = GUICtrlCreateListViewItem("Item|SubItem", $ListView)

GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")

GUISetState()

While 1
    Sleep(10)
WEnd

Func DowbleClickEvent()
    MsgBox(262144, "Clicked", GUICtrlRead(GUICtrlRead($ListView)))
EndFunc

Func WM_Notify_Events($GUI, $MsgID, $wParam, $lParam)
    Local $tagNMHDR, $event, $hwndFrom, $code
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return
    $code = DllStructGetData($tagNMHDR, 3)
    If $wParam = $ListView And $code = $NM_DBLCLK Then DowbleClickEvent()
    Return $GUI_RUNDEFMSG
EndFunc

Func Quit()
    Exit
EndFunc


proxy 21-06-2007 01:57 602064

спасибо.

от таких добавлений мои функции разростаются как на .....сникерсах и чипсах =)))

хм, а свою dll тут ни как не создать? что просто вызывать когда необходимо?

Creat0R 21-06-2007 02:34 602067

proxy
Цитата:

а свою dll тут ни как не создать? что просто вызывать когда необходимо?
Для чего? что она должна делать? ... хотя это не ко мне, я в этих Dll пока блуждаюсь сильно.

Diamond 21-06-2007 03:03 602070

Creat0R
Цитата:

Ну почему, в массив то попадают все строки с нужным текстом, а зачем в массиве символы перевода строки и возврата каретки?
Ни один из символов перевода строки, в массив не попадают. (у меня)
Цитата:

И кстати, при чтении всего файла, совсем не обязательно использовать FileGetSize()
Енто вопрос не ко мне а, к автору функции: _FileReadToArray() ;) - раз уж он так зделал, то и я вслед за ним не стал это исправлять.
Цитата:

А разве в этом примере символы перевода строки и возврата каретки не заменятся на символ новой строки? может при делении на массив нужно использовать @LF а не @CR?
А, какая разница?
На всякий случай поясню:
Допустим в одном файле могут встретится 3 различных типа завершения строки, с помощью StringRegExpReplace() я последовательно меняю все @CRLF на @CR, затем @LF на @CR, в конечном счёте в тексте остаётся только @CR который я использую в качестве разделителя.
Но можно использовать и @LF - не вижу разницы...
Код:

$aArray = StringSplit(StringRegExpReplace(FileRead($hFile),"\r\n|\r",@LF),@LF)

Diamond 21-06-2007 04:42 602079

proxy
Цитата:

Diamond, спасибо. Необходимое с тектом реализовал уже по другому, а пример приму на заметку, чувствую дальше понадобиться.
Я бы посоветовал использовать UDF'ную функцию _FileReadToArray(), для считывания файла в массив но считаю, что в некоторых случаях она может сработать некорректно...
Хотя с другой стороны, кроме меня пока ещё никто не жаловался...
Код:

#include <File.au3>
Dim $FileArray
_FileReadToArray("C:\1.txt",$FileArray)
$hFile = FileOpen("C:\1.txt",2)
$LineFeed = @CRLF
For $i=1 To $FileArray[0]
        If $i = $FileArray[0] Then $LineFeed = ''
        If $FileArray[$i] <> "Ненужная строка" Then
                FileWrite($hFile, $FileArray[$i] & $LineFeed)
        EndIf
Next
FileClose($hFile)


Creat0R 21-06-2007 06:52 602086

Diamond
Цитата:

в конечном счёте в тексте остаётся только @CR который я использую в качестве разделителя
А разве \n это @CR, мне казалось что \r это @CR, а \n это @LF, именно с этого и исходили мои вопросы.

А на счёт изменения функции _FileReadToArray(), я так и не понял, зачем превращать все переводы строк и возврата каретки в символ возврата кареткми (или наоборот :wacko: , не очень уж важно), потом делить всё это в массив, когда при этом, ни символ возврата каретки, ни символ перевода строки, не попадает в массив :idontnow: - У тебя случалось что не все строки с файла попадали в массив?

Так вроде правильнее:

Код:

$aArray = StringSplit(StringRegExpReplace(FileRead($hFile),"\n|\r",@LF),@LF)
По поводу функции для замены текста в файле...

Вот моя версия на подобную функцию:

Код:

$Ret = ReplaceText("C:\test.txt", "Old Text", "New Text")
ConsoleWrite($Ret & @LF & @extended)

Func ReplaceText($FileName, $OldText, $NewText)
    If Not FileExists($FileName) Then Return SetError(1, 0, -1)
    If $OldText = "" Then Return SetError(2, 0, 0)
    $OldText = String($OldText)

        Local $hFile = FileOpen($FileName, 0)
    Local $VarToWrite = FileRead($hFile)
    FileClose($hFile)
    If Not StringInStr($VarToWrite, $OldText) Then Return SetError(3, 0, 0)

        Local $ReplStr = StringReplace($VarToWrite, $OldText, $NewText)
    Local $Extended = @extended

        Local $hFileW = FileOpen($FileName, 2)
    FileWrite($hFileW, $ReplStr)
    FileClose($hFileW)
    Return SetError(0, $Extended, 1)
EndFunc


Creat0R 21-06-2007 07:13 602089

Diamond
Дааа, оказывается ты прав.... возьмём этот пример:

Код:

#include <Array.au3>
#include <File.au3>

Dim $Array

FileWrite("test.txt", "Line1" & @LF & "Line2" & @CR & "Line3" & @LF & "Line4")

_FileReadToArray("test.txt", $Array)

_ArrayDisplay($Array)

Получается такой массив:

Код:

[1] = "Line1"
[2] = "Line2Line3"
[3] = "Line4"

Если применять этот же пример используя изменённую функцию _FileReadToArray(), то мы получаем “нормальный” массив (как и записи в файле) :

Код:

[1] = "Line1"
[2] = "Line2"
[3] = "Line3"
[4] = "Line4"

Вот полная функция как она, имхо, должна быть построена:

Код:

Func _FileReadToArray($sFilePath, ByRef $aArray)
    ;==============================================
    ; Local Constant/Variable Declaration Section
    ;==============================================
    Local $hFile = FileOpen($sFilePath, 0)

    If $hFile = -1 Then Return SetError(1)

    $aArray = StringSplit(StringRegExpReplace(FileRead($hFile),"\r|\n", @LF), @LF)

    FileClose($hFile)
    Return 1
EndFunc  ;==>_FileReadToArray

Хм.. надо бы её автору маякнуть об этом.... а ещё лучше, сразу в баг репорт запостить на оф. форум, привести пример что эта функция может возвращать не корректные данные...

Creat0R 21-06-2007 07:35 602094

Но всё же остаётся одна проблема - если в файле содержатся промежуточные символы перевода строки (@LF), то гинерируется пустой элемент массива...

Получается это ошибка функции StringSplit() ?

amel27 21-06-2007 08:36 602111

Diamond
Цитата:

чтобы произвести добавление, удаление или замену элементов, массивы используют UDF-функции
Хм... Добавление в конец массива можно сделать через ReDim(), вставку в середину массива без UDF не осуществить в обоих случаях.... Физическое удаление элементов массива проводить не обязательно - достаточно "пометить" их и не использовать при обработке.... по замене не понял - это же обычное присвоение.

Diamond, Creat0R ...по поводу _FileReadToArray():

- у StringSplit() есть флаг, позволяющий использовать более одного символа для разбиения:
Код:

$a = StringSplit ($text, @CRLF, 1)
- уж коли зашла речь про StringRegExp(), то она вполне самодостаточна:
Код:

$a = StringRegExp ($text, '(?m)^(.*)$', 3)
Creat0R
Цитата:

оно вообще реализуемо?
ИМХО в общем виде - нет, иначе можно было бы без проблем подчинить себе любое окно, скажем тот же IE... Видимая "подчиненность" отражает классовую сущность окон, поэтому они должны быть как минимум в одном процессе... В случае с MsgBox() код расшарен через DLL и запускается в текущем потоке, поэтому подчинение реализуемо.

eNcub 21-06-2007 09:40 602131

Цитата:

eNcub
Цитата:Если это окно не появляется, то нажатие стрелки вверх и энтера всё равно производится


Попробуй так:

Код:

WinWaitActive('Мастер новых подключений', 'Выберите, надо ли автоматически подключаться к Интернету', 5)
If WinActive('Мастер новых подключений', 'Выберите, надо ли автоматически подключаться к Интернету') Then Send('{UP}{ENTER}')
:(... попробовал, ничего не изменилось...
еще мысли есть у кого-нибудь? плз..

XXXler 21-06-2007 10:59 602176

eNcub,
Код:

$Wtitle="Мастер новых подключений"
$Wtext="Выберите, надо ли автоматически подключаться к Интернету"
$Timeout=30

WinWait($Wtitle,$Wtext,$Timeout)
If WinExists($Wtitle,$Wtext) Then
  If Not WinActive($Wtitle,$Wtext) Then WinActivate($Wtitle,$Wtext)
  If WinWaitActive($Wtitle,$Wtext,$Timeout) Then Send("{UP}{ENTER}")
EndIf

если я правильно понял цель написания скрипта, то проще использовать твик реестра :)

eNcub 21-06-2007 12:10 602216

XXXler

таак, а что с реестром? этот вариант тоже не прошел...

amel27 21-06-2007 12:17 602218

schel4ok
Цитата:

А кто-нибудь знает как запускать inf файлы при помощи AutoIt?
вот функция, запускающая произвольную секцию INF-файла… К сожалению, прямой вызов функции InstallHinfSection из setupapi.dll не сработал… :idontnow:
Код:

Func _RunInfSection ($filepath, $section = 'DefaultInstall', $mode = 128)
    If Not(FileExists($filepath)) Then Return -1
    Local $ret = RunWait ('rundll32 setupapi,InstallHinfSection '& $section &' '& $mode &' '& FileGetLongName($filepath,1), @SystemDir, @SW_HIDE)
    Return $ret
EndFunc

proxy
Цитата:

от таких добавлений мои функции разростаются как на .....сникерсах и чипсах
хм, а свою dll тут ни как не создать? что просто вызывать когда необходимо?
чем не устраивает UDF?.. чтобы текст скрипта не разрастался, выделите функции в AU3-файл(ы) и загружайте через #include в заголовке скрипта...

Creat0R 21-06-2007 20:03 602429

amel27
Цитата:

у StringSplit() есть флаг, позволяющий использовать более одного символа для разбиения:
Я его пробовал, в этом случае он всё ровно добавляет в массив пустую строку...

Цитата:

уж коли зашла речь про StringRegExp(), то она вполне самодостаточна:
Этот пример должен возвращать массив с подделенными строками на @LF? возвращается массив с одним пустым, и при чём нудевым элементом :idontnow:

schel4ok
Я сразу не понял что речь идёт об установке файла, а не его запуске (это ведь требуется?)...
Для установки действительно будет полезна функция предложенная amel27 чуть выше, сам нечто подобным пользуюсь для установки Inf файлов (правда из батника ;) ).

gvshil 21-06-2007 22:15 602472

Помогите, пожалуйста, разобраться:
Код:

While 1
ControlClick  ('Abbyy FineReader Professional v8.0 keygen', '', 'Button4' ) ;генерация серийника
$GetSN=ControlGetText ('Abbyy FineReader Professional v8.0 keygen', '', 'Edit1' )
; ввод серийника
ControlSetText ('ABBYY FineReader 8.0 Professional Edition Try&Buy', '&Введите серийный номер', 'Edit1', $GetSN)
ControlClick('ABBYY FineReader 8.0 Professional Edition Try&Buy', '&Введите серийный номер', 'Button1')
;если серийник не верен, то появляется окно
;('ABBYY FineReader 8.0 Professional Edition Try&Buy', 'Проверьте правильность введенного серийного номера.')
If WinExists ('ABBYY FineReader 8.0 Professional Edition Try&Buy', 'Проверьте правильность введенного серийного номера.') Then ContinueLoop
        If Not WinWaitActive ('ABBYY FineReader 8.0 Professional Edition Try&Buy', 'Проверьте правильность введенного серийного номера.',5) Then
        WinActivate ('ABBYY FineReader 8.0 Professional Edition Try&Buy', 'Проверьте правильность введенного серийного номера.')       
        ControlClick ('ABBYY FineReader 8.0 Professional Edition Try&Buy', 'Проверьте правильность введенного серийного номера.','Button1'); не закрывает окно
        ; Send ( '{ENTER}' ) тоже не закрывает это окно
        EndIf
ExitLoop
Wend

Info окна
Код:

>>>> Window <<<<
Title:        ABBYY FineReader 8.0 Professional Edition Try&Buy
Class:        #32770
Position:        332, 333
Size:        366, 126
Style:        0x94C801C5
ExStyle:        0x00010101

>>>> Control <<<<
Class:        Button
Instance:        1
ID:        2
Text:        ОК
Position:        478, 422
Size:        75, 23
ControlClick Coords:        35, 11
Style:        0x50030000
ExStyle:        0x00000004

>>>> Mouse <<<<
Position:        178, 71
Cursor ID:        0
Color:        0xE9F1F5

>>>> StatusBar <<<<

>>>> Visible Text <<<<
ОК
Проверьте правильность введенного серийного номера.

Окно не закрывается и все идет по кругу, т.е. генерация и серийника и появление еще одного окна

proxy 21-06-2007 22:57 602482

Diamond, спасибо за подсказки, это очень интересно.
Сейчас считываю весь файл в gui List и от него "играю",
но как варинат с текстом в масиве.....может пригодится.

Creat0R - спасибо за пример, Diamond пару постов выше
уже показал твой пример. Я сейчас изменел первичный замысел
и сейчас не требуется замена тсрок, но на вооружение взял.


И ещё, скромный вопрос, auto IT это замечательно, но создовать
уж созданное думаю нет серьезного смысла.....может знакомы
с языком С++ , VB, ..... что лучше применить к изучению для
написания подобных приложений?

п.с.: я не сравниваю аутоИТ и другие языки, я хочу понять
какой, в целом, язык оптимальние и приняться к его изучению.

Creat0R 21-06-2007 23:08 602483

gvshil
Цитата:

Окно не закрывается и все идет по кругу
Иногда даже закрытие окна, на самом деле его не удаляет из списка существующих окон, а просто скрывает, поэтому думаю нужно проверять видимость окна...

Код:

If _WinIsVisible('ABBYY FineReader 8.0 Professional Edition Try&Buy', 'Проверьте правильность введенного серийного номера.') Then ContinueLoop

Func _WinIsVisible($Title, $Text)
    Return BitAND(WinGetState($Title, $Text), 2)
EndIf

proxy
Цитата:

что лучше применить к изучению для
написания подобных приложений?
Каких приложении?

AutoIt в основном предназначен для написания скриптов в помощь автоматизации запуска/установки приложении и ежедневных системных задач, но кроме этого на нём также возможно писать программы среднего (а может и высшего) уровня.

Цитата:

какой, в целом, язык оптимальние и приняться к его изучению
AutoIt написан на C++, думаю что именно изучение C++ и будет оптимальным языком программирования (это конечно, очень и очень Имхо ;)).

gvshil 21-06-2007 23:26 602489

Creat0R
Совсем я запутался.
Если не трудно, укажите куда конкретно в моем примере нужно вставить проверку.

Creat0R 22-06-2007 00:54 602515

gvshil
Цитата:

куда конкретно в моем примере нужно вставить проверку.
Вместо всех функции проверки на существование окна (WinExists()). А саму функцию _WinIsVisible в конец файла.

Dirk Diggler 22-06-2007 01:00 602517

Вложений: 1
Написал скрипт для архивирования.
если кому надо, поюзайте, расскажете, как оно....

вот, из ридмишки.
Цитата:

1. ВВЕДЕНИЕ

Когда-то я пользовался nnBackup. Но ограничение в 2Гб на архив меня убивало. И убивает посейчас. Кроме того, nnBackup, как и многие архиваторы, использующиеся для резервного копирования, не умеют архивировать открытые другими программами файлы(дружно вспомним базы 1С).
И вот, я решил устранить эти недостатки. Эти устранил. вроде бы. А вот чего этот скрипт не умеет, см. в самом конце.


2. ОПИСАНИЕ

Данный скрипт представляет собой "оболочку" для архиватора 7-zip(www.7-zip.org) начиная с версии 7.47.
Основное назначение - резервное архивирование данных.

Diamond 22-06-2007 01:40 602522

Creat0R
Цитата:

Так вроде правильнее:
Если в файл добавить следущую комбинацию:
Код:

$file = FileOpen("test.txt",2)
FileWrite($file,"" & @CRLF)
FileWrite($file,"" & @CRLF)
FileWrite($file,"" & @CRLF)

То твоя функция возвращает массив из 7 пустых строк, хотя на самом деле строк 4.
Необходимо учитывать все возможные типы завершения строк, как я уже сказал, всего их 3. (...правда, редактор "Notepad.exe" об этом не знает.)
Если автор UDF-функции упустил из виду @CR - то ты, в данном случае проигнорировал @CRLF.
Опишу всё подробно:
Код:

$hFile = FileOpen("test.txt", 0)

$text = FileRead($hFile)
$text = StringRegExpReplace($text,"\r\n",@LF) ; заменяем все комбинации @CRLF на @LF
$text = StringRegExpReplace($text,"\r",@LF) ; заменяем все оставшиеся @CR на @LF
; И теперь, когда мы точно уверены что все строки завершаются только символом @LF - делим текст:
$aArray = StringSplit($text,@LF)

;~ Иными словами, всё это можно реализовать так:
Код:

$hFile = FileOpen("test.txt", 0)
$aArray = StringSplit(StringRegExpReplace(FileRead($hFile),"\r\n|\r", @LF), @LF)

А сама функция должна выглядеть так:
Код:

Func _FileReadToArray($sFilePath, ByRef $aArray)
    ;==============================================
    ; Local Constant/Variable Declaration Section
    ;==============================================
    Local $hFile = FileOpen($sFilePath, 0)

    If $hFile = -1 Then Return SetError(1)

    $aArray = StringSplit(StringRegExpReplace(FileRead($hFile),"\r\n|\r", @LF), @LF)

    FileClose($hFile)
    Return 1
EndFunc  ;==>_FileReadToArray

З.Ы. Сколько я не тестировал, всё время получается правильный массив. В чём моя ошибка? :(

Creat0R 22-06-2007 02:17 602524

Diamond
Цитата:

Иными словами, всё это можно реализовать так:
Да, но разве @CRLF это не одно и тоже что @CR & @LF? если одно и тоже, тогда зачем проверять ещё и @LF, можно только лишь @CR заменить на @LF, и делить на @LF (ведь в переменной останутся только @LF'ы)...

$aArray = StringSplit(StringReplace(FileRead($hFile), @CR, @LF), @LF)

На выходе имеется тот же массив...

Но у меня проблема не в этом, а как раз в содержимом массива...

Цитата:

всё время получается правильный массив
А вот у меня даже с таким примером:

Код:

#include <Array.au3>

Dim $Array

$TestFileHandle = FileOpen("Test.txt", 2)

FileWrite($TestFileHandle, @LF & "Line1" & @CR & "Line2" & @CR & "Line3" & @CR & "Line4" & @LF)

FileClose($TestFileHandle)

_FileReadToArray("Test.txt", $Array)

_ArrayDisplay($Array)

Func _FileReadToArray($sFilePath, ByRef $aArray)
    ;==============================================
    ; Local Constant/Variable Declaration Section
    ;==============================================
    Local $hFile = FileOpen($sFilePath, 0)

    If $hFile = -1 Then Return SetError(1)

    $aArray = StringSplit(StringRegExpReplace(FileRead($hFile),"\r\n|\r", @LF), @LF)

    FileClose($hFile)
    Return 1
EndFunc

Почему то первый и последний элемент содержат символы перевода строки :idontnow: .

Diamond 22-06-2007 02:38 602527

Creat0R
Цитата:

Да, но разве @CRLF это не одно и тоже что @CR & @LF? если одно и тоже, тогда зачем проверять ещё и @LF, можно только лишь @CR заменить на @LF, и делить на @LF (ведь в переменной останутся только @LF'ы)...
Теперь у меня началось :wacko: - надеюсь это не заразно... :biggrin:
Цитата:

Почему то первый и последний элемент содержат символы перевода строки
Я посмотрел содержимое файла в редакторе "Bred" и... оказалось что полученный массив полностью соответствует текстовому файлу... 6 строк, первая и последняя пустые.
Всё верно! ;)

Creat0R 22-06-2007 02:41 602529

Альтернатива подобной функции:

Код:

Func _FileReadToArray($sFilePath)
    ;==============================================
    ; Local Constant/Variable Declaration Section
    ;==============================================
    Local $hFile = FileOpen($sFilePath, 0)
    Local $RetArr[1], $Line, $i=1

        If $hFile = -1 Then Return SetError(1)

        While 1
        $Line = FileReadLine($hFile, $i)
        If @error = -1 Then ExitLoop
        If $Line <> "" Then
            ReDim $RetArr[UBound($RetArr)+1]
            $RetArr[UBound($RetArr)-1] = $Line
        EndIf
        $i += 1
    WEnd
    $RetArr[0] = UBound($RetArr)-1

        FileClose($hFile)
    Return $RetArr
EndFunc

Возможно немного(?) медленней, но зато в массив не попадают пустые строки :tongue:

Diamond 22-06-2007 02:55 602532

Creat0R
Они туда попадают, потому что ты их с самого начала записываешь в текстовой файл. :)
Пожалуй возьму эту функцию на вооружение... Но всё таки, мне кажется что я сделал всё правильно...

Creat0R 22-06-2007 02:56 602533

Diamond
Цитата:

Я посмотрел содержимое файла в редакторе "Bred" и... оказалось что полученный массив полностью соответствует текстовому файлу... 6 строк, первая и последняя пустые.
Это я вижу и в Notepad(2 ;)), но мне кажется в массив не должны попадать пустые строки, и я считал что пустая строка, это и есть сочетание символов @LF и @CR, и что функция StringSplit() должна поделить на элементы которе не будут содержать тот символ на который делим (используя к примеру, в качестве третьего параметра, 1 - использовать все символы разделителя как метку деления, т.е не вносить сами символы в полученные элементы).

amel27 22-06-2007 06:50 602543

Creat0R, Diamond
Цитата:

Теперь у меня началось - надеюсь это не заразно
нет, этого нельзя так оставлять :aggressiv ...для начала нужно ответить на вопросы:

- считать ли пустой строкой промежуток между началом файла и разделителем (@LF/@CR);
- считать ли пустой строкой промежуток между и спецсимволом и концом файла;
- как разбивать на пустые строки произвольную последовательность разделителей.

Обычно за разделитель считают именно @LF, а все вхождения @CR просто удаляют, соответственно последовательность @LF@LF будет означать "разделитель-пустая строка", при этом ответ на первые два вопроса чаще положительный... Можно договориться считать за разделители @CR и @LF, тогда последовательность @CRLF опять же вернет пустую строку (между ними). Мне представляется наиболее удобным следующий вариант:

- ДА
- НЕТ
- разделители: пары @CRLF/@LFCR и в последнюю очередь одиночные @CR и @LF

реализация через RegExp:
Код:

$array = StringRegExp(FileRead ("Test.txt"),'(?s)(.*?)(?:\n\r|\r\n|[\n\r])', 3)
P.S. Ктати, в RegExp метасимволы '^' и '$' по умолчанию различают только позиции в начале и конце файла (т.е. всей строки), а с модификатором '(?m)' указывают на позиции после- и перед- @LF соответственно...

Creat0R 22-06-2007 08:05 602556

amel27
Цитата:

реализация через RegExp:
Хм... попробуй подобный пример:

Код:

#include <Array.au3>

$TestFileHandle = FileOpen("Test.txt", 2)

FileWrite($TestFileHandle, @CR & "Line1" & @LF & @CR & @LF & @CR & @LF & @CR & "Line2" & @CR & "Line3" & @LF & "Line4" & @CRLF)

FileClose($TestFileHandle)

Dim $Array
_FileReadToArray("Test.txt", $Array)

_ArrayDisplay($Array)

Func _FileReadToArray($sFilePath, ByRef $RetArr)
    Local $hFile = FileOpen($sFilePath, 0)
    If $hFile = -1 Then Return SetError(1)

        $RetArr = StringRegExp(FileRead($hFile), '(?s)(.*?)(?:\n\r|\r\n|[\n\r])', 3)
    $RetArr[0] = UBound($RetArr)-1

        FileClose($hFile)
    Return $RetArr
EndFunc

В массив попадают несколько пустных строк...

Кстати, я проверил скорость выполнения функции - С использованием RegExp, в 5-6 раз быстрее чем используя цикл, но зато при использовании цикла возвращаются только текстовые строки :tongue:

amel27 22-06-2007 12:54 602670

Creat0R
Цитата:

В массив попадают несколько пустных строк
Все правильно, так и запрограммировано - (@LFCR & @LFCR & @LFCR) это разделитель из двух пустых строк... проблема не в том, что остаются пустые строки (почему бы им не быть?), а в том что этими строками считать... Проигнорировать пустые строки как раз проще:
Код:

$RetArr = StringRegExp(FileRead($hFile),'(?s)(.*?)[\n\r]+', 3)
ADD: или так:
Код:

$RetArr = StringRegExp(FileRead($hFile),'([^\n\r]+)', 3)
З.Ы. StringRegExp() возвращает массив без счетчика.. т.е. первый элемент занят!

Diamond 23-06-2007 00:43 602961

amel27
Цитата:

Обычно за разделитель считают именно @LF, а все вхождения @CR просто удаляют
Т.е. получается... что функция _FileReadToArray() написана правильно?
Цитата:

- ДА
- НЕТ
- разделители: пары @CRLF/@LFCR и в последнюю очередь одиночные @CR и @LF
Я думал что символы @LFCR не могут сосуществовать вместе, т.е. должна получаться пустая строка...
...Если общего правила не существует - то этот вариант, как мне кажется, наиболее подходит.
-Да

Creat0R 23-06-2007 01:18 602973

amel27
Цитата:

или так:
Вот так лучше, таким образом даже первые пустые строки игнорируются.

Цитата:

StringRegExp() возвращает массив без счетчика.. т.е. первый элемент занят!
Хм... а вот это уже немного досадно... а самой функцией StringRegExp нельзя подвинуть все полученные элементы? пусть даже первый элемент будет содержать пустую строку, его то потом просто можно заменить ($RetArr[0] = Ubound($RetArr)-1).

amel27 23-06-2007 05:11 602990

Diamond
Цитата:

Если общего правила не существует
в отличие от никсов текстовый файл, сформировнный в Windows не должен содержать одиночных @LF или @CR, только в паре @CRLF - для таких файлов _FileReadToArray() работает правильно

Creat0R
Цитата:

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

Creat0R 23-06-2007 07:42 602992

amel27
Цитата:

а оно того стоит?.
Если нет необходимости перебирать массив, то да.

Цитата:

не вижу смысла оформлять UDF ради одной строчки кода
Иногда в скрипте нужно по несколько раз вызывать _FileReadToArray(), не писать же каждый раз одну и туже строку содержащюю две-три комманды :shuffle:

amel27 23-06-2007 09:47 603007

Creat0R
Цитата:

Если нет необходимости перебирать массив, то да
ты думаешь я владею тайным знанием?... :) сам подумай - если бы даже была такая команда, она бы все равно (втайне от нас) делала вставку с передвижкой всего "хвоста" в памяти на одну позицию.

З.Ы. К слову, я уже давно отказался от _FileReadToArray() и некоторых других штатных UDF, так как RegExp-команды более мощные и гибкие... К примеру, при чтении файла кроме обычного деления на строки можно по ходу делать много других полезных вещей - убирать ведущие и оконечные пробелы, проверять строки на условия, etc.

amel27 23-06-2007 13:33 603060

Creat0R
однако... лучший способ разубедить себя - попытаться убедить другого... =)
Код:

Func _FileReadToArray($sFilePath, ByRef $RetArr)
    Local $str = @LF & FileRead($sFilePath)
    If @error Then Return SetError(1)
    $RetArr = StringRegExp($str,'(^\n|[^\n\r]+)',3)
    $RetArr[0] = UBound($RetArr)-1
    Return $RetArr
EndFunc

З.Ы. вот только работать этот способ будет чуть медленней

Creat0R 23-06-2007 23:33 603221

amel27
Цитата:

сам подумай - если бы даже была такая команда, она бы все равно (втайне от нас) делала вставку с передвижкой всего "хвоста" в памяти на одну позицию.
Я не это имел ввиду, я думал что может StringRegExp “умеет” как бы добавлять пустую строку в начало массива....

Цитата:

вот только работать этот способ будет чуть медленней
Идеально, по крайней мере не медленней моего примера с циклом ;)

Спасибо, с этой функциецй (о котороый уже около 3-ёх страниц пишем), можно успокоиться :)

proxy 24-06-2007 01:01 603244

Добрые ночи.

В моей программе много gui элиментов, которые в ходе работы с программой будут очень часто вызываться, обробатываться и т.д.
Эти элементы состоят из целых групп, т.е. парочка текстовых полей и несколько кнопок, список и несколько кнопок и т.д.

Как лучше организовать, со стороны наилучшей работоспособности программы, вариант:

1) насоздовать все gui элименты и не нужным дать статус $GUI_HIDE и показывать их только при необходимости?

2) все gui элименты создовать при необходимости и удалять по завершении работы с ними?

Creat0R 24-06-2007 01:29 603251

proxy
Цитата:

Как лучше организовать, со стороны наилучшей работоспособности программы
Мой личный совет - 1)

Поясню...

* Я не раз приходил к выводу, что создавая элементы "на лету", ими потом очень тяжело управлять (хотя не всегда), особенно если используется больше чем один Гуи.
* Когда мы создаём сразу все необходимые элементы (под нужными GUI), мы потом можем легко присваивать им нужные атрибуты/свойства/статусы, удалять их, или менть их значения.

Исходя из этого, я бы создавал всё сразу, но главное, обьявлять глобально все переменные элементов, и постараться “не забыть” из имена ;)

Вывод:
Если есть терпение, желание, стремление, то лучше сразу привыкнуть, хоть и не к лёгкому, но зато верному методу, чтобы потом можно было клипать ГУИ с увереностью в том, что будет наименьшее количество припятсвии и ошибок (а они всегда будут).
Однако, в некоторых случая бывает как раз наоборот, когда более удобнее создавать “на лету”, но это уже на расмотрение автора, нужно учитывать такие факторы как количество окон Гуи которые планируется создавать, насколько часто будут обращения к создаваемым элементам, и другие подобные факторы... возможно иногда, лучшим методом окажется помещение в отдельную функцию всей процедуры создания элементов, чтобы без затруднении можно было пересоздать (с удалением внутри функции к примеру) необходимые элементы.

Diamond 24-06-2007 03:54 603268

amel27
Цитата:

лучший способ разубедить себя - попытаться убедить другого...
Хорошо сказано, обычно так и случается...
По поводу _FileReadToArray, большое спасибо! Уже не один раз убеждался что 'RegExp' мощный инструмент, особенно в опытных руках. Жалко только что в справке AutoIt, об этом слишком сжато написано...

amel27 24-06-2007 08:43 603280

Diamond
Цитата:

Жалко только что в справке AutoIt, об этом слишком сжато написано
лучшее из переведенного: http://shop.piter.com/lib/978531800056/regvir.phtml

Diamond 24-06-2007 09:21 603284

Кто ни будь знает, как использовать команду PluginOpen() и где взять сами плагины?

amel27
Цитата:

лучшее из переведенного:
Я и не подозревал что есть такая книга, да ещё и на русском... Спасибо!

Creat0R
А твоя версия функции _FileReadToArray() та которая с циклом, тоже пригодилась. Я её изменил немного, чтобы она считывала файл один к одному, включая пустые строки.
Вот только переменную $i можно было бы совсем убрать, имхо лишняя... Как считаешь?
Получается, что если была использована FileOpen() - то при каждом новом вызове команды: FileReadLine(), автоматически генерируется новый номер строки. Выходит что для FileReadLine() номер то, можно и не указывать...?

proxy 24-06-2007 13:49 603342

Creat0R, спасибо.

в моей программе только одно окно GUI и в нем меняется куча элементов,
так что я сразу создал все и не нужное скрыл. И вот после этого задумался
не станет ли это "грузит" мою программу.

но используя комментарии к глобальным переменнм, даюи им понятные имена,
и ты мысли мои прочетал - создание, скрытие и отображение элементов,
все организовал через функции, все очень удобно.

Creat0R 24-06-2007 21:21 603451

Diamond
Цитата:

Получается, что если была использована FileOpen() - то при каждом новом вызове команды: FileReadLine(), автоматически генерируется новый номер строки. Выходит что для FileReadLine() номер то, можно и не указывать...?
Так и есть, из справки:

Цитата:

If no line number to read is given, the "next" line will be read. ("Next" for a newly opened file is initially the first line.)
Но по непонятной мне причине, первая попытка это сделать, выдала только одну строку, хотя файл содержал немного больше строк, возможно была ошибка чтнения?

proxy
Цитата:

не станет ли это "грузит" мою программу.
Естественно сам процесс создания элементов, использует память, но сильно нагружать не будет, как только создаются элементы, они как бы висят в памяти.
Это кстати, ещё одна причина по которой стоит сразу создавать нужные элементы, т.к создавая и удаляя их в процессе выполнения разных задач программы, память будет пополняться, при удалении элементов она обычно не высвобождается самостоятельно, кстати для этого есть функция на оф. форуме (_ReduceMemory()).

Creat0R 24-06-2007 21:38 603460

Diamond
Цитата:

Кто ни будь знает, как использовать команду PluginOpen() и где взять сами плагины?
Как я понял, это может быть использованно вместо DllOpen(), но предназначено для открытия плагинов SDK...

Вот ссылка на топик в оф. форуме - Coming Soon: Plugins
А вот как я понял сами плагины - http://www.autoitscript.com/autoit3/...plugin_sdk.zip

И ссылка на помощь по коммандам (во встроенной справке описании почему то нет :( ) - http://www.autoitscript.com/autoit3/...PluginOpen.htm

Creat0R 25-06-2007 05:03 603557

Такой вопрос касательно RegExp...

К примеру имеем такую переменную:

Код:

$String = "This  is  the  text"
И нужно используя StringRegExpReplace() заменить все двоичные пробелы на одиночные, т.е чтобы в результате получилось это:

Код:

$String = "This is the text"
Это можно сделать циклом:

Код:

While StringInStr($String, '  ')
        $String = StringReplace($String, '  ', ' ')
WEnd

Но полагаю RegExp быстрее справится с этой задачей....

P.S
Желательно организовать для этого функцию, т.к вызывать придётся не раз, и использовать разные удвоенные символы...

Вот пример этой же функции используя цикл (до сих пор ею и пользуюсь) :

Код:

Func ReplaceUnsupported($String, $Patern='[*?\\/|:<>"]', $Replace="_")
    If StringLen($String) = 0 Then Return $String
    $String = StringRegExpReplace($String, $Patern, $Replace)
    While StringInStr($String, $Replace & $Replace) <> 0
        $String = StringReplace($String, $Replace & $Replace, $Replace)
    WEnd
    Return $String
EndFunc

В общем в целом, эта функция предназначена для замены не поддерживаемых символов в имени файла, но чтобы заменяемы символы не повторялись подряд.

Creat0R 25-06-2007 05:53 603558

Нашёл!!! Эврика!!! :yahoo:

Вот оно - StringRegExpReplace($String, '( +)', ' ')

И вот функция соответственно (для других символов) :

Код:

Func ReplaceUnsupported($String, $Patern='[*?\\/|:<>"]', $Replace="_")
    If StringLen($String) = 0 Then Return $String
    $String = StringRegExpReplace($String, $Patern, $Replace)
    $String = StringRegExpReplace($String, '(' & $Replace & '+)', $Replace)
    Return $String
EndFunc

Вот пример для использования с именами файлов (чтобы в имени файла не попались неподдерживаемые символы, и чтобы при их замене не было повторных замененных символов) :

Код:

$String = 'This//\\is<|"|>my??"??:??\*\"::|/::"File.txt'

$String = ReplaceUnsupported($String, '[*?\\/|:<>"]', '_')

ConsoleWrite($String) ;На выходе имеем это - This_is_my_File.txt


schel4ok 25-06-2007 18:04 603865

amel27

Цитата:

попробуй вместо Run() использовать ShellExecute() не для EXE, а для ярлыка (*.LNK), поищи его в папке Рабочего стола....
Попробовал - не выходит. То есть ярлык в принципе запускается и начинается процесс настройки Маткада. Но в самом конце, он пишет что задан неправильный параметр ярлыка.

schel4ok 26-06-2007 14:05 604219

Недавно пробовал запустить msi файл из под АвтоИТ (TweakUI.msi) и вот что вышло:
- если запускать ShellExecute("файл.msi /параметр") то ничего не получается
- если запускать ShellExecute("файл.msi") все нормально запускается,но...

при появлении первого же диалогового окна установщика, я скопировал его титул и текст через Ау3инфо и попытался запустить скрипт.
оказалось что АвтоИТ почему то не понимает этих данных и соответственно скрипт останавливается на WinWaitActive

why?

Creat0R 26-06-2007 14:15 604229

schel4ok
Цитата:

оказалось что АвтоИТ почему то не понимает этих данных и соответственно скрипт останавливается на WinWaitActive
Возможно окно не становится активным?
Попробуй вместо WinWaitActive() использовать WinWait().

schel4ok 27-06-2007 10:13 604643

Creat0R

Цитата:

Возможно окно не становится активным?
Попробуй вместо WinWaitActive() использовать WinWait().
Возможно, попробую на днях.
Но когда я испытывал скрипт - я вручную запускал инсталлер.
Потом запускал строчки скрипта, отвечающие за обработку данного окна WinWaitActive.
И после этого тыкал мышкой по окну - соответственно оно по любому было активным, но скрипт не работал.

Вообще я часто встречал что когда наводишь на один и тот же элемент управления, то в окне Ау3инфо в строке classnameNN мигают разные значения.
Я так один раз, например, устанавливал прогу и не мог понять почему она не ставиться. А дело было в том, что в четвертое по счету окно я вводил в текстовое поле путь к папке ярлыков в меню пуск inet\swissknife, а этот путь вместо этого попадал в текстовое поле во втором окне выбора пути к установочной папке C:\swissknife.

Так что shit happens! И видимо дело в наложении одних и тех же элементов управления и в их видимости и невидимости в определенные моменты.

schel4ok 27-06-2007 13:15 604762

Кстати, а существуют ли подобные АвтоИт программы для КПК?

GTeam 28-06-2007 05:33 605115

тоже интересует версия для КПК.

ну и вопрос естественно!
на сервере лежит файл txt формата который каждый день обновляется, меняются url к exe файлу который нужно скачать и запустить нашим скриптом,
можно ли создать скрипт который будет выполнять работу парсера, а точней выдерать с файла http://www.site.com/update.txt строку(http://url_to_file_from_txt_file.com/filename.exe) одна единственая строка в файле! затем качать этот самый exe и запустить его в тихом режиме..

Global $file = 'file.exe'
$Ret = InetGet("http://url_to_file_from_txt_file.com/filename.exe", $file, 1, 0)
If $Ret = 1 Then RunWait ( $file & ' /S' )


amel27 28-06-2007 06:15 605123

Цитата:

ярлык в принципе запускается и начинается процесс настройки Маткада. Но в самом конце, он пишет что задан неправильный параметр ярлыка
как последняя альтернатива - произвести двойной клик на ярлыке, но для этого нужно знать его координаты на рабочем столе... пошарившись по офсайту почему-то не нашел готового решения (может плохо искал? :idontnow: ), поэтому пришлось сваять самому:
Код:

#include <ListViewConstants.au3>

$a = _GetDesktopItemList('Мой компьютер')
 ;~ свернуть все окна
Send("#d")
 ;~ запустить ярлык
MouseClick ("left", $a[0], $a[1], 2, 1)

;~ По имени элемента рабочего стола (ярлыка) возвращает его местоположение:
;~        x-координата, y-координата.
;~ Если не задан конкретный элемент, то возвращает двумерный массив всех элементов рабочего стола:
;~        имя элемента, x-координата, y-координата;
;~        первый элемент массива содержит количество записей.
Func _GetDesktopItemList($sItemName='')
        Local $i, $ret, $hWnd, $hProc, $pMem, $IconList, $IconInfo[2], $IconList[1][3] = [[0]]
        Local Const $iMaxSize = 254
        ;~ Создаем структуры данных API
        Local $uPID = DllStructCreate("long")
        Local $uBuffer = DllStructCreate("long;long;int;int;int;int;int;ptr;int;int;int;int;int;int;int;int;int;char["& $iMaxSize &"]")
        Local $uPOINTAPI = DllStructCreate("long;long", DllStructGetPtr($uBuffer,1))
        Local $uLVITEM = DllStructCreate("int;int;int;int;int;ptr;int;int;int;int;int;int;int;int;int", DllStructGetPtr($uBuffer,3))
        Local $uTEXT = DllStructCreate("char["& $iMaxSize &"]",DllStructGetPtr($uBuffer,18))
        ;~ Ищем GUI - список элементов рабочего стола
        $hWnd = DLLCall ("user32.dll", "hwnd", "FindWindow", "str", "Progman", "str", "Program Manager" )
        $hWnd = DLLCall ("user32.dll", "hwnd", "FindWindowEx", "hwnd", $hWnd[0], "int", 0 , "str", "SHELLDLL_DefView", "int", 0 )
        $hWnd = DLLCall ("user32.dll", "hwnd", "FindWindowEx", "hwnd", $hWnd[0], "int", 0 , "str", "SysListView32", "int", 0 )
        ;~ Находим количество элементов списка и готовим массив
        $ret = DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWnd[0], "int", $LVM_GETITEMCOUNT, "int", 0, "ptr", 0 )
        If $ret[0]=0 Then Return SetError(1, 0, -1)
        ReDim $IconList[$ret[0]+1][3]
        $IconList[0][0]=$ret[0]
        ;~ Находим процесс, которому принадлежит список
        $ret = DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $hWnd[0], "ptr", DllStructGetPtr($uPID))
        $hProc = DllCall('kernel32.dll', 'int', 'OpenProcess', "int", 0x38, "int", 0, "int", DllStructGetData($uPID,1))
        ;~ Резервируем и заполняем память в чужом процессе
        $pMem = DllCall('kernel32.dll', 'int', 'VirtualAllocEx', _
                "int", $hProc[0], "ptr", 0, "int", DllStructGetSize($uBuffer),        "int", 0x3000, "int", 0x4)
        DllStructSetData($uLVITEM, 1, $LVIF_TEXT)
        DllStructSetData($uLVITEM, 6, $pMem[0]+DllStructGetSize($uPOINTAPI)+DllStructGetSize($uLVITEM))
        DllStructSetData($uLVITEM, 7, $iMaxSize)
        $ret = DllCall("kernel32", "int", "WriteProcessMemory", _
                "int", $hProc[0], "ptr", $pMem[0], "ptr", DllStructGetPtr($uBuffer), "int", DllStructGetSize($uBuffer), "ptr", 0)
        ;~ Считываем параметры каждого элемента списка
        For $i=0 To $IconList[0][0]-1
                $ret = DllCall("user32.dll", "int", "SendMessage", _
                        "hwnd", $hWnd[0], "int", $LVM_FIRST+16, "int", $i, "ptr", $pMem[0])
                $ret = DllCall("user32.dll", "int", "SendMessage", _
                        "hwnd", $hWnd[0], "int", $LVM_GETITEMTEXTA, "int", $i, "ptr", $pMem[0]+DllStructGetSize($uPOINTAPI))
                $ret = DllCall("kernel32", "int", "ReadProcessMemory", _
                        "int", $hProc[0], "ptr", $pMem[0], "ptr", DllStructGetPtr($uBuffer), "int", DllStructGetSize($uBuffer), "ptr", 0)
                $IconList[$i+1][0]=DllStructGetData($uTEXT,1)
                $IconList[$i+1][1]=DllStructGetData($uPOINTAPI,1)
                $IconList[$i+1][2]=DllStructGetData($uPOINTAPI,2)
        Next
        ;~ Освобождаем память
        $ret = DllCall('kernel32.dll', 'int', 'VirtualFreeEx', "int", $hProc[0], "ptr", $pMem[0], "int", 0, "int", 0x8000)
        $ret = DllCall("kernel32.dll", "int", "CloseHandle", "int", $hProc[0])
        ;~ Возвращаем данные
        If $sItemName = '' Then Return $IconList
        For $i=1 To $IconList[0][0]
                If $IconList[$i][0]=$sItemName Then ExitLoop
        Next
        If $i=$IconList[0][0]+1 Then Return SetError(2, 0, -1)
        $IconInfo[0]=$IconList[$i][1]
        $IconInfo[1]=$IconList[$i][2]
        Return $IconInfo
EndFunc


Creat0R 28-06-2007 06:22 605124

GTeam
Цитата:

можно ли создать скрипт который будет выполнять работу парсера
Примерно так:

Код:

#include <Inet.au3>

$ExeFileToDownload = _INetGetSource("http://www.site.com/update.txt")
$ExeFileToDownload = StringStripWS($ExeFileToDownload, 3)
$ExeFileName = StringRegExpReplace($ExeFileToDownload, "^.*\\", "")

$Ret = InetGet($ExeFileToDownload, @TempDir & "\" & $ExeFileName, 1, 0)

If $Ret = 1 Then RunWait(@TempDir & "\" & $ExeFileName & ' /S')

Можно конечно ещё сделать так в конце:

Код:

RunWait(@TempDir & "\" & $ExeFileName & ' /S', @TempDir, @SW_HIDE)
Но если поддерживается ключ /S, то нет особой необходимости.

gregaz 28-06-2007 09:14 605170

Просьба помочь разобраться с IE... функциями
Задача :
1. Открыть ВЕБ страницу в нужном месте и в нужном формате
2.Ввести в нее данные

Этим скриптом страница открывается и данные вводятся (но в полном размере окна браузера):

Код:

#include <IE.au3>
$oIE = _IECreate ("http://www.google.com")
$oForm = _IEFormGetCollection ($oIE, 0)
$oQuery1 = _IEFormElementGetCollection ($oForm, 1)
_IEFormElementSetValue ($oQuery1, "oszone")
_IEFormSubmit ($oForm)

Открываю страницу в нужном месте (в окне GUI ) с помошью скрипта :
Код:

#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)
$oIE = ObjCreate("Shell.Explorer.2")
GUICreate( "Внедренная HTML-страница",640,480)
$GUIActiveX=GUICtrlCreateObj( $oIE,0,0,640,480 )
GUISetOnEvent($GUI_EVENT_CLOSE,"closed")
GUISetState ()
$oIE.navigate("www.google.com ")
While 1
  Sleep(1000)
Wend
Func closed()
  Exit
EndFunc

И не могу ввести в нее данные.

Видимо это связано с использованием обьектной переменной,в которых я не очень разбираюсь

И еще один похожий вопрос :

Можно ли управлять (размер,позизионирование ) системного окна типа окна вызываемого функцией FileOpenDialog
или это возможно только для окон GUI ?
Если можно просьба показать (у меня не получается)


amel27 28-06-2007 13:03 605297

gregaz
Цитата:

И еще один похожий вопрос
и чем же он похожий? :idontnow:

Задачка не так проста как кажется... Для чужих окон юзаем WinMove(), но если речь о системных окнах самого AutoIT, то ИМХО штатными средствами никак, так как на время активности системного окна выполнение скрипта прерывается и изменить параметры окна не представляется возможным... Тем не менее для некоторых системных окон можно написать API-аналог, частично решающий данную проблему... Например, удалось взять контроль над FileSelectFolder(), правда только в классическом исполнении - при запуске вызывается специальная функция, которая может изменить настройки этого окна. В примере меняется стартовый каталог, но аналогично на этапе инициализации можно управлять и другими параметрами.

Думаю не составит труда по тому же принципу написать аналоги FileOpenDialog() и FileSaveDialog().... конечно, если в этом есть необходимость. ;)

Creat0R 28-06-2007 17:01 605416

Переделанная функция (взята у Smoke_N на офф. форуме ;)) _MsgBox() - Если текста для показа слишком много, то текст можно прокрутить и просмотреть (используется Edit-элемент, а для прокрутки есть две самопальные стрелочки :)), окно MsgBox меняет размеры в соответствии с текстом и с разрешением экрана.

Код:

$Text = ""
For $i = 1 To 50
        $Text &= "Line " & $i & " Line " & $i & " Line " & $i & @CRLF
Next

_MsgBox(104, "Test", $Text)

Func _MsgBox($mb_Icon, $mb_Title, $mb_Text, $mb_Time = '')
        Local $StrnLenText = MsgLongestString($mb_Text)
        Local $NumberOfLines = (UBound(StringSplit($mb_Text, @CRLF)) - 1) * 6.5
        If (160 + $NumberOfLines) >= @DesktopHeight Then $NumberOfLines = @DesktopHeight - 200
        Local $Button1Txt = "OK"
        Local $Button2Txt = "Cancel"
        Local $MsgValue = 0
        Local $Timer = ''
        Local $ScrollLabel1 = -1, $ScrollLabel2 = -1
        Local $iMsgBox = GUICreate($mb_Title, $StrnLenText + 190, 100 + $NumberOfLines, -1, -1, 0x00400000, 0x00000008)
        Local $Edit = GUICtrlCreateEdit($mb_Text, 60, 10, $StrnLenText + 105, 30 + $NumberOfLines, 64+128+2048+4, 0x990)
        GUICtrlCreateIcon(@SystemDir & "\User32.dll", $mb_Icon, 10, 10, 35, 35)
        $Button1 = GUICtrlCreateButton($Button1Txt, 30 + ($StrnLenText / 2), 45 + $NumberOfLines, 60 + StringLen($Button1Txt), 25)
        $Button2 = GUICtrlCreateButton($Button2Txt, 100 + ($StrnLenText / 2), 45 + $NumberOfLines, 60 + StringLen($Button2Txt), 25)
       
        If $NumberOfLines = (@DesktopHeight - 200) Then
                $ScrollLabel1 = GUICtrlCreateLabel("т", 40, ((100 + $NumberOfLines)/2)+20, 20)
                GUICtrlSetTip(-1, "Click here to scroll Down")
                GUICtrlSetFont(-1, 18, 600, 0, "Wingdings")
                $ScrollLabel2 = GUICtrlCreateLabel("с", 40, ((100 + $NumberOfLines)/2)-20, 20)
                GUICtrlSetTip(-1, "Click here to scroll UP")
                GUICtrlSetFont(-1, 18, 600, 0, "Wingdings")
        EndIf
       
        GUISetState()
        If $mb_Time <> 0 Then $Timer = TimerInit()
        While 1
                $imsg = GUIGetMsg()
                Select
                        Case $imsg = $Button1
                                $MsgValue = 6
                                ExitLoop
                        Case $imsg = $Button2
                                $MsgValue = 7
                                ExitLoop
                        Case $imsg = $ScrollLabel1
                                ControlSend($iMsgBox, "", $Edit, "{PgDn}")
                        Case $imsg = $ScrollLabel2
                                ControlSend($iMsgBox, "", $Edit, "{PgUp}")
                        Case $mb_Time <> 0
                                If TimerDiff($Timer) / 1000 >= $mb_Time Then ExitLoop
                EndSelect
        WEnd
        GUIDelete($iMsgBox)
        Return $MsgValue
EndFunc

Func MsgLongestString($sText)
        Local $Times = ''
        Local $sSplit = StringSplit($sText, @CRLF)
    If Not @error Then
        ArraySortByLen($sSplit)
        If StringLen($sSplit[1]) <= 100 Then $Times = 2.25
        If StringLen($sSplit[1]) >= 101 And StringLen($sSplit[1]) <= 150 Then $Times = 2.5
        If StringLen($sSplit[1]) >= 151 And StringLen($sSplit[1]) <= 201 Then $Times = 3
        If StringLen($sSplit[1]) >= 202 Then $Times = 3.25
        Return Round(StringLen($sSplit[1])*$Times)
    Else
        If StringLen($sText) <= 100 Then $Times = 2.25
        If StringLen($sText) >= 101 And StringLen($sText) <= 150 Then $Times = 2.5
        If StringLen($sText) >= 151 And StringLen($sText) <= 201 Then $Times = 3
        If StringLen($sText) >= 202 Then $Times = 3.25
        Return Round(StringLen($sText)*$Times)
    EndIf
EndFunc

Func ArraySortByLen(ByRef $nArray, $Start = 1)
        For $i = $Start To UBound($nArray) - 2
                Local $SE = $i
                For $x = $i To UBound($nArray) - 1
                        If StringLen($nArray[$SE]) < StringLen($nArray[$x]) Then $SE = $x
                Next
                Local $HLD = $nArray[$i]
                $nArray[$i] = $nArray[$SE]
                $nArray[$SE] = $HLD
        Next
EndFunc


gregaz 28-06-2007 19:22 605509

Цитата:

Думаю не составит труда по тому же принципу написать аналоги FileOpenDialog() и FileSaveDialog().... конечно, если в этом есть необходимость
amel27,спасибо,но раз это сложно,то овчинка выделки не стоит
Мне это надо было в порядке изучения возможностей Autoit
А так понятно,что в принципе любой вопрос можно решить использованием того или другого языка

GTeam 02-07-2007 04:10 606820

Цитата:

Примерно так:


Код:

#include <Inet.au3>

$ExeFileToDownload = _INetGetSource("http://www.site.com/update.txt")
$ExeFileToDownload = StringStripWS($ExeFileToDownload, 3)
$ExeFileName = StringRegExpReplace($ExeFileToDownload, "^.*\\", "")

$Ret = InetGet($ExeFileToDownload, @TempDir & "\" & $ExeFileName, 1, 0)

If $Ret = 1 Then RunWait(@TempDir & "\" & $ExeFileName & ' /S')
почему то не качает файл

Creat0R 02-07-2007 05:08 606823

GTeam
Цитата:

почему то не качает файл
Используется прокси? попробуй также просмотреть переменную $ExeFileToDownload после второй строки... вот так:

Код:

#include <Inet.au3>

$ExeFileToDownload = _INetGetSource("http://www.site.com/update.txt")
$ExeFileToDownload = StringStripWS($ExeFileToDownload, 3)

MsgBox(0, "", $ExeFileToDownload)

Что она содержит?

Dirk Diggler 02-07-2007 12:15 606953

как из скрипта узнать список всех работающих служб в их сокращенном английском названии?
т.е. обработка вывода net start не пойдет - там полные русские, и чтение раздела реестра SERVICES тоже - оттуда невозможно узнать, какие службы запущены.

Diamond 02-07-2007 13:44 606991

Dirk Diggler
Цитата:

как из скрипта узнать список всех работающих служб в их сокращенном английском названии?
Можно через WMI:
Код:

$strComputer = "."
$WMI=ObjGet("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
$colServices = $WMI.ExecQuery("Select * from Win32_Service")
For $o in $colServices
MsgBox (0,"Всего служб: " & $colServices.Count ,$o.Name)
Next

Чтобы узнать какие ещё бывают свойтва кроме Name, можно воспользоваться следующим кодом:
Код:

MsgBox(0, "Свойства:", GetClassProperty("root\cimv2","Win32_Service") )

Func GetClassProperty($strNameSpace,$strClass,$strComputer = ".")
        Local $ret
        $objClass = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & _
                $strComputer & "\" & $strNameSpace & ":" & $strClass)
        For $objClassProperty In $objClass.Properties_
                $ret=$ret & $objClassProperty.Name & @CRLF
        Next
        Return $ret
EndFunc

А с помощью этого кода можно получить названия методов:
Код:

MsgBox(0,"Методы:", GetClassMethods("root\cimv2","Win32_Service") )

Func GetClassMethods($strNameSpace,$strClass,$strComputer = ".")
        Local $ret
        $objClass = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & _
                $strComputer & "\" & $strNameSpace & ":" & $strClass)
        For $objClassMethod In $objClass.Methods_
                $ret=$ret & $objClassMethod.Name & @CRLF
        Next
        Return $ret
EndFunc

Если нужно получить общее описание для этого класса:
Код:

ClipPut(ListMOF("root\cimv2","Win32_Service"))
MsgBox(0,"","MOF-описание, скопировано в буфер обмена!")

Func ListMOF($strNameSpace,$strClass,$strComputer = ".")
Local Const $wbemFlagUseAmendedQualifiers = 0x20000
        $objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & _
                $strComputer & "\" & $strNameSpace)
        $objClass = $objWMIService.Get($strClass, $wbemFlagUseAmendedQualifiers)
        $strMOF = $objClass.GetObjectText_
        Return $strMOF
EndFunc

P.S. К сожалению, я не знаю как получить mof-описание для каждого метода или свойства по отдельности :(
Если кто-то знает, пожалуйста подскажите...

GTeam 02-07-2007 16:01 607059

Цитата:

#include <Inet.au3>

$ExeFileToDownload = _INetGetSource("http://www.site.com/update.txt")
$ExeFileToDownload = StringStripWS($ExeFileToDownload, 3)

MsgBox(0, "", $ExeFileToDownload)
Цитата:

Что она содержит?
нет, прокси не используется.
msgbox, выдает верный урл

trigun 02-07-2007 16:35 607085

всем привет.
у меня тут такая проблемка возникла. Не могу понять как заставить программу считывать нажатую клавишу...
подскажите плз как начать обработку события.

пишу небольшой скриптик для сидюка.
кому интересно(вот исходник):

Код:

CDTray("K:", "open")
Sleep(500)
MsgBox(0,"insert disk","вставте диcк")
WinActivate("insert disk")
WinWaitClose("insert disk")
CDTray("K:","close")
MsgBox(4,"inf","Хотите посмотреть информацию о диске?")
WinActivate("inf")
$var=DriveGetFileSystem("K:")
MsgBox(0,"info","файловая система диска:"& $var)
WinActivate("info")
WinWaitClose("info")

$1= DriveGetLabel("K:")
msgbox(0,"info1","Заголовок диска:"& $1)
WinActivate("info1")
WinWaitClose("info1")
$2=DriveGetSerial("K:")
MsgBox(0,"info2","серийный номер диска:"& $2)
WinActivate("info2")
WinWaitClose("info2")
$3=DriveSpaceFree("K:")
msgbox(0,"info3","свободного места: "& $3 & " MB")
WinActivate("info3")
WinWaitClose("info3")
$4=DriveSpaceTotal("K:")
MsgBox(0,"info4","всего места на диске: " & $4 & " MB")
WinActivate("info4")


Dirk Diggler 02-07-2007 19:35 607166

как заставить контрол "метка"(Label) расширяться по мере смены в ней текста?

Sandro Half-Dead 02-07-2007 19:51 607173

Не знаю, может и был вопрос...
Возможно ли с помощью AutoIT послать клик мыши в неактивное окно (возможно и вовсе не видное на экране (не свёрнутое, но закрытое другим))??? Если можно, то как???

ChVL 02-07-2007 20:52 607195

Sandro Half-Dead
Всё, куда можно послать, Вам покажет программа AutoIt Window Info. Другого не дано.

Creat0R 02-07-2007 22:10 607223

GTeam
Цитата:

msgbox, выдает верный урл
Моя вина, сори, замени 4-тую строку в примере на эту:

Код:

$ExeFileName = StringRegExpReplace($ExeFileToDownload, "^.*/", "")
Я перепутал направление слешев, забыл что это урл в сети :shuffle:

trigun
Цитата:

как заставить программу считывать нажатую клавишу
Я так понял тебе нужно узнать что нажал юзер в MsgBox?
У тебя в примере скрипт ожидает закрытия окна MsgBox... но пока на экране виден MsgBox, скрипт останавливается, поэтому все функции после него будут запущены только после его закрытия.

См. справку по MsgBox(), эта команда возвращает значения, вот пример:

Код:

$Ret = MsgBox(36, "Title", "Вы подтверждаете?")
If $Ret = 6 Then MsgBox(0, "", "Да, вы подтвердили :)")
If $Ret = 7 Then MsgBox(0, "", "Нет, вы не хотите подтверждать :)")


Dirk Diggler
Цитата:

как заставить контрол "метка"(Label) расширяться по мере смены в ней текста?
я как то на оф. форуме встречал подобну функцию (возвращает нужную длину для смены элемента основываясь на новом тексте), но к сожалению пока не могу найти где :(, как только найду отпишусь.

amel27 03-07-2007 07:10 607310

Diamond
Цитата:

не знаю как получить mof-описание для каждого метода или свойства по отдельности
может просто пропарсить текст?
Код:

#include <array.au3>
_ArrayDisplay(GetObjDescriptions("root\cimv2","Win32_Service"),'Win32_Service')

Func GetObjDescriptions($strNameSpace, $strClass, $strComputer = ".")
    Local $objWMIService, $objClass, $strMOF, $array, $num, $out
    Local Const $wbemFlagUseAmendedQualifiers = 0x20000
    Local Const $regExp = '\s\[(?:\\\]|[^]])*?Description\("((?:\\"|[^"])*)"(?:\\\]|[^]])*\] \w+ (\w+)'

    $objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & _
        $strComputer & "\" & $strNameSpace)
    $objClass = $objWMIService.Get($strClass, $wbemFlagUseAmendedQualifiers)
    $strMOF = $objClass.GetObjectText_
    $array = StringRegExp($strMOF, $regExp, 3)
    $num = UBound($array)/2
    Dim $out[$num+1][2] = [[$num]]
    For $i=1 To $num
        $out[$i][0] = $array[$i*2-1]
        $out[$i][1] = $array[$i*2-2]
    Next
    Return $out
EndFunc


Dirk Diggler 03-07-2007 19:16 607624

Вот такую библиотеку накалякал. Кому пригодится - пользуйтесь. Брать здесь .

Код:

Func _FileGetFileName($path)  ;  выделяет из полного пути и возвращает имя файла
Func _FileGetDirPath($path)  ;  выделяет из полного пути и возвращает имя директории
Func _GetDocumentsAndSettingsDir()        ; возвращает полный путь к папке "Documents And Settings"
Func _GetProfilesPath()  ; возвращает массив строк с полными ключами к профилям пользователей этого компьютера
Func _LocalGroupExist($us)    ; Проверяет, существует ли ЛОКАЛЬНАЯ ГРУППА С ТАКИМ ИМЕНЕМ. возвращает ИСТИНУ/ЛОЖЬ
Func _LocalUserExist($us)        ; Проверяет, существует ли ЛОКАЛЬНЫЙ ПОЛЬЗОВАТЕЛЬ С ТАКИМ ИМЕНЕМ. возвращает ИСТИНУ/ЛОЖЬ
Func _GetDomainOrWorkGroup()    ; ВЕРНЕТСЯ ИМЯ ДОМЕНА, если не в домене - то рабочей группы.
Func _GetWorkgroup()    ; ТОЛЬКО РАБОЧАЯ ГРУППА, ДЛЯ ДОМЕННОГО КОМПА ВЕРНЕТСЯ ПУСТАЯ СТРОКА
Func _JOINWORKGROUP($WG)        ; вводит компьютер в Рабочую группу (имя передается параметром)
Func _ShareFolder($dir,$name, $comment = '')  ; создает общий ресурс.
Func _GetShareInfoByNumber($i)  ; Возвращает массив с инфой о шаре № $i или 0, если шар больше нет. В массиве по порядку ИМЯ, ПУТЬ, ТИП
Func _GetShareInfoByName($name)  ; Возвращает массив с инфой о шаре с данным именем или 0, если шар больше нет. В массиве по порядку ИМЯ, ПУТЬ, ТИП
Func _GetShareInfoByPath($path)  ; Возвращает массив с инфой о шаре данного каталога или 0, если шар больше нет. В массиве по порядку ИМЯ, ПУТЬ, ТИП
Func _NoActiveStaticIP()  ; возвращает истину/ложь. Если нет IP на рабочей, подключенной и т.п. карте
Func _AllNetworkDevicesDisabled()    ; возращает истину-ложь
Func _RunVBS($vbs)  ; запускает VBS-скрипт , переданный ему в кач-ве параметра.
Func _RenameComputer($name)        ; переименовывает компьютер
Func _GetShortUserName($_user) ; возвращает короткое имя пользователя - т.е. для tega@office.local или OFFICE\tega результатом будет tega
Func _CreateLocalGroup($gn)        ; создает локальную группу с указанным именем
Func _CreateLocalUser($us,$passw='')  ; создает локального пользователя с указанным именем и паролем
Func _ListLocalGroups($username)  ; Возвращает массив со списком локальных групп, членом которых является указанный пользователь
Func _JoinLocalgroup($us,$gr)    ; добавляет пользователя в указанную локальную группу.
Func _DomainUserInLocalGroup($UserName, $InGroup, $Domain='')    ; проверяет, является ли пользователь членом локальной группы
Func _GetStartedServicesAndDrivers()    ;  возвращает массив из имен запущенных сервисов и драйверов.
Func _GetStartedServices()    ;  возвращает массив из имен запущенных сервисов.
Func _GetStartedDrivers()    ;  возвращает массив из имен запущенных системных драйверов.
Func _HostIsOk($host_)  ; проверяет, пингуется ли хост. Возвр. истину-ложь
Func _TCPServiceIsOk($_addr,$_port=0); Проверяет порт путем установления к нему соединения.возращает истину-ложь .
Func _UDPServiceIsOk($_addr,$_port=0) ; Проверяет порт путем установления к нему соединения.возращает истину-ложь .
Func _GetDns(ByRef $_dns1,ByRef $_dns2)  ; заполняет переменные значениями и возвращает 0. В случае ошибки возвращает -1
Func _GetGateWay()  ; возвращает адрес шлюза по умолчанию
Func _GetIEProxy()  ; возвращает настройки прокси-сервера из Internet Explorer в виде строка "ip-адрес:порт"       
Func _StringIsIp($str)  ; проверяет, является ли строка ip-адресом. Возвр. истину-ложь
Func _StringIsEmpty($str) ; проверяет, является ли строка пустой. Возвр. истину-ложь
Func _HTTPget($url, $ProxyServer='', $ProxyUser = '' , $ProxyPass = '', $UseIntegratedSecurity = False)  ; возвращает текст, полученный методом get протокола HTTP. Устанавливает флаг ошибки @error=0 в случае успеха, -1 в случае неудачи.
Func _HTTPSetTimeOuts($tResolve = 30000,$tConnection = 30000,$tSendTimeout = 30000,$tReceive = 30000) ; устнавливает таймауты для HTTP-запроса


Creat0R 04-07-2007 04:43 607770

Dirk Diggler
Цитата:

Цитата Dirk Diggler
как заставить контрол "метка"(Label) расширяться по мере смены в ней текста?

Цитата:

Цитата Creat0R
как только найду отпишусь.

Нашёл!


Вот пример использования:

Код:

#include <GUIConstants.au3>
$text = "Text Label"

$hGui = GUICreate("Test Label Size")
 $Label_1 = GUICtrlCreateLabel($text, 20, 20)
GUICtrlSetFont(-1, 9, 400, 0, "Tahoma")

$Button = GUICtrlCreateButton("Change Label", 20, 300)

GUISetState()

      While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $Button
            $Text &= " and some more text, "
            GUICtrlSetData($Label_1, $Text)
            $TextLenght = _GetTextLabelWidth($Text, "Tahoma", 9)
            GUICtrlSetPos($Label_1, 20, 20, $TextLenght)
    EndSwitch
WEnd

Func _GetTextLabelWidth($s_WinText, $s_TextFont, $i_FontSize, $i_FontWeight = -1)
    Local Const $DEFAULT_CHARSET = 0 ; ANSI character set
    Local Const $OUT_CHARACTER_PRECIS = 2
    Local Const $CLIP_DEFAULT_PRECIS = 0
    Local Const $PROOF_QUALITY = 2
    Local Const $FIXED_PITCH = 1
    Local Const $RGN_XOR = 3
    Local Const $LOGPIXELSY = 90

    $h_WinTitle = "Get Label Width"
    If $i_FontWeight = "" Or $i_FontWeight = -1 Then $i_FontWeight = 600 ; default Font weight
    Local $h_GUI = GUICreate($h_WinTitle, 10, 10, -100, -100, $WS_POPUPWINDOW, $WS_EX_TOOLWINDOW)
    Local $hDC = DllCall("user32.dll", "int", "GetDC", "hwnd", $h_GUI)

    Local $intDeviceCap = DllCall("gdi32.dll", "long", "GetDeviceCaps", "int", $hDC[0], "long", $LOGPIXELSY)
    $intDeviceCap = $intDeviceCap[0]

    Local $intFontHeight = DllCall("kernel32.dll", "long", "MulDiv", "long", $i_FontSize, "long", $intDeviceCap, "long", 72)
    $intFontHeight = -$intFontHeight[0]

    Local $hMyFont = DllCall("gdi32.dll", "hwnd", "CreateFont", "int", $intFontHeight, _
            "int", 0, "int", 0, "int", 0, "int", $i_FontWeight, "int", 0, _
            "int", 0, "int", 0, "int", $DEFAULT_CHARSET, _
            "int", $OUT_CHARACTER_PRECIS, "int", $CLIP_DEFAULT_PRECIS, _
            "int", $PROOF_QUALITY, "int", $FIXED_PITCH, "str", $s_TextFont)
    DllCall("gdi32.dll", "hwnd", "SelectObject", "int", $hDC[0], "hwnd", $hMyFont[0])

    Local $res = DllStructCreate("int;int")

    Local $ret = DllCall("gdi32.dll", "int", "GetTextExtentPoint32", "int", $hDC[0], "str", $s_WinText, "long", StringLen($s_WinText), "ptr", DllStructGetPtr($res))

    Local $intLabelWidth = DllStructGetData($res,1)

    GUIDelete($h_GUI)
    Return $intLabelWidth
EndFunc


Diamond 04-07-2007 05:05 607771

amel27
Цитата:

может просто пропарсить текст?
Потрясающе!!! Как раз то что мне и было нужно, даже больше! :UP:
Теперь я смогу написать gui для просмотра WMI - пространств имён и классов, которое (на мой взгляд) будет удобней всяких scriptomatic2 и подобных ему программ.
Огромное спасибо!

Creat0R 04-07-2007 09:50 607832

Dirk Diggler
Цитата:

Func _FileGetFileName($path)
Имхо, намного проще использовать RegExp:
Код:

StringRegExpReplace($path, "^.*\\", "")
Цитата:

Func _FileGetDirPath($path)
Тоже самое и тут:
Код:

StringRegExpReplace($Path, '\\[^\\]*$', '')
Цитата:

Func _StringIsEmpty($str)
А чем плоха встроенная функция StringIsSpace ($str)? :shuffle:

Dirk Diggler 04-07-2007 12:08 607904

Цитата:

А чем плоха встроенная функция StringIsSpace ($str)?
она возвращает число, это раз, а во вторых, я когда писал ту функцию, попросту не знал о существовании этой.

а регэкпы - это конечно, хорошо.

Creat0R 08-07-2007 05:55 609858

amel27
Помню как то ты упоминал о CallBack функциях, не знаю насколько ты следишь за оф. форумом, но думал может пригодится - там обсуждают какие то новые открытия для AutoIt связанные с CallBack, топик так и назвали - CallBack :) (последний пост сегодня, picasso предложил раньше решение без использования сторонних Dll'ок, вот он и делится архивом полный примеров) - Там штурмуют по моему лучшие ума AutoIt'а ;)

Creat0R 08-07-2007 06:11 609859

На оф. форуме нашёл способ проверки нажатии какой либо клавиши, давно искал...

Правда там используется файл, с которого берутся (не)всевозможные варианты для клавиш, вот я и решил переделать тот пример в функцию, и вот что получилось:


Код:

While 1
    $KeyIsPressed = _KeyIsPressed()
    If $KeyIsPressed Then MsgBox(64, "Pressed/Clicked:", $KeyIsPressed)
    Sleep(10)
WEnd

Func _KeyIsPressed()
    Local $KeyBoardLayoutArr = StringSplit("{LMouse}|{RMouse}|{}|(MMouse}|{}|{}|{}|{BACKSPACE}|{TAB}|{}|{}|{}|{ENTER}|{}|{}|{SHIFT}|{CTRL}|{ALT}|{PAUSE}|{CAPSLOCK}|{}|{}|{}|{}|{}|{}|{ESC}|{}|{}|{}|{]|{SPACE}|{PGUP}|{PGDN}|{END}|{HOME}|{LEFT}|{UP}|{RIGHT}|{DOWN}|{SELECT}|{PRINTSCREEN}|{}|{PRINTSCREEN}|{INSERT}|{DEL}|{}|0|1|2|3|4|5|6|7|8|9|{}|{}|{}|{}|{}|{}|{}|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|{LWIN}|{RWIN}|{APPSKEY}|{}|{SLEEP}|{numpad0}|{numpad1}|{numpad2}|{numpad3}|{numpad4}|{numpad5}|{numpad6}|{numpad7}|{numpad8}|{numpad9}|{NUMPADMULT}|{NUMPADADD}|{}|{NUMPADSUB}|{NUMPADDOT}|{NUMPADDIV}|{F1}|{F2}|{F3}|{F4}|{F5}|{F6}|{F7}|{F8}|{F9}|{F10}|{F11}|{F12}|{F13}|{F14}|{F15}|{F16}|{F17}|{F18}|{F19}|{F20}|{F21}|{F22}|{F23}|{F24}|{}|{}|{}|{}|{}|{}|{}|{}|{NUMLOCK}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{SHIFT}|{SHIFT}|{CTRL}|{CTRL}|{ALT}|{ALT}|{BROWSER_BACK}|{BROWSER_FORWARD}|{BROWSER_REFRESH}|{BROWSER_STOP}|{BROWSER_SEARCH}|{BROWSER_FAVORITES}|{BROWSER_HOME}|{VOLUME_MUTE}|{VOLUME_DOWN}|{VOLUME_UP}|{MEDIA_NEXT}|{MEDIA_PREV}|{MEDIA_STOP}|{MEDIA_PLAY_PAUSE}|{LAUNCH_MAIL}|{LAUNCH_MEDIA}|{LAUNCH_APP1}|{LAUNCH_APP2}|{}|{}|;|{+}|,|{-}|.|/|`|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|[|\|]|'", "|")
    Local $a_R
    For $i = 0 To 165
        $a_R = DllCall("user32.dll", "int", "GetAsyncKeyState", "int", '0x' & Hex($i,2))
        If Not @error And BitAND($a_R[0], 0x8000) = 0x8000 Then Return $KeyBoardLayoutArr[$i]
    Next
    Sleep(40)
    Return 0
EndFunc


Если было что-то нажато, возвращается нажатая клавиша (или даже кнопка мышки), если ничего не нажимается (при проверке в цикле), возвращается 0.

P.S
Просчитать ВСЕ возможные нажатия клавиш, мне увы, не удалось :(.

Dirk Diggler 08-07-2007 16:12 610008

Как из AutoIt открыть ссылку в дефолтном браузере?

Creat0R 08-07-2007 16:32 610015

Dirk Diggler
Цитата:

Как из AutoIt открыть ссылку в дефолтном браузере?
Код:

ShellExecute("http://forum.oszone.net")

proxy 09-07-2007 05:48 610190

Доброе утро всем =))

есть файл1 и файл2
в фале2 описанна функция какая-нибуть
а в фале1 вызов этой функции

в autoit это вообще реально?

т.е. запустить файл1 и из него считать функцию из файла2
и вернуть данные на обработку обратно файл1 .. - ?

amel27 09-07-2007 06:24 610192

Creat0R
Цитата:

picasso предложил раньше решение без использования сторонних Dll'ок
да, видел... не слежу - случайно наткнулся :) ... Первая версия (через DLL) была несовместима с диалоговыми API-функциями, последний вариант пока пробовал... Однако, конкуренция с AutoHotkey пошла на пользу. ;)

proxy
собственно, макрос #include как раз и загружает функции, определенные в других AU3-файлах, примеры смотри в справке или тут на форуме... А что значит "вернуть данные на обработку обратно файл"?.. данные читаются и записываются в файл, а обрабатываются "процессом" (или точней - "потоком").

Creat0R 09-07-2007 06:48 610200

amel27
Цитата:

макрос #include как раз и загружает функции, определенные в других AU3-файлах
Немного дополню...

Загружать он (макрос) умеет не только AU3-файлы, но и любые(?) другие текстовые файлы ;) (к примеру: #Include "MyFunctions.fnc").

Dirk Diggler 10-07-2007 15:00 611044

как прочитать/установить права NTFS на папку\файл?? Я даже это в микрософтовском vbs-репозитории не нашел.

amel27 11-07-2007 08:10 611304

Dirk Diggler
Цитата:

Я даже это в микрософтовском vbs-репозитории не нашел
http://download.microsoft.com/downlo...escriptors.doc
http://www.microsoft.com/technet/tec...tingGuy&loc=ru :)

Sanja Alone 11-07-2007 12:24 611525

Скрипт для применения темы

Присутствуют некоторые отличия от предыдущих.

Код:

#NoTrayIcon
Opt("TrayIconHide",1)
Global $Title='Theme apply', $Properties='Свойства', $del, $theme

#region CODE
_CmdLine()
If $del=1 Then Opt("OnExitFunc","Quit")
;то же, что и Run('rundll32.exe Shell32.dll,Control_RunDLL desk.cpl desk,@Themes /Action:OpenTheme /File:"'&$theme&'"') (нужен AutoIt 3.2.2.0)
ShellExecute($theme)
;дождаться окна
WinWait($Properties)
WinSetState($Properties,'',@SW_HIDE)
;нажать на кнопку OK (должно работать и при неактивном окне)
ControlClick($Properties,'','Button3')
WinWait($Properties)
WinClose($Properties)
WinWaitClose($Properties)
Exit
#endregion CODE

#region FUNCTIONS
Func _CmdLine()
    If $CmdLine[0]<>0 Then
        For $k=1 To $CmdLine[0]
            If $CmdLine[$k]='/?' or $CmdLine[$k]='-?' Then
                Help()
                Exit
            EndIf
            If StringInStr($CmdLine[$k],'/theme=') Then
                $theme=StringTrimLeft($CmdLine[$k],7)
            EndIf
            If StringInStr($CmdLine[$k],'/del') Then
                $del=1
            EndIf
        Next
    Else
        Help()
        Exit
    EndIf
EndFunc

Func Help()
    MsgBox(64+262144,$Title & ': Использование',@ScriptName&' /theme="тема" [/del]'&@LF&@LF&@LF&'Ключи командной строки:'&@LF&@LF&'/theme="тема" - файл темы'&@LF&@LF&'/del                    - самоубийство'&@LF&@LF&'/?                      - Использование (это окно)')
EndFunc

Func Quit()
    ;самоубийство
    Run(@ComSpec & ' /c del /f /q "'&@ScriptFullPath&'"','',@SW_HIDE)
EndFunc
#endregion FUNCTIONS

Другие варианты реализации данной функциональности:
от DmitryOlenin
от amel27

Creat0R 12-07-2007 01:28 611994

Поставил последний AutoIT с поддержкой Unicode...

Теперь возникли серъёзные проблемы почти со всеми скриптами - В частности проблема заключается в том, что невозможно прочесть данные с файла который содержится в кодировке UTF-8.
Я до этого использовал функцию _Utf8ToAnsi() от amel27, но теперь она возвращает половину текста, а точнее последние символы либо съедает, либо превращает в иероглифы.

amel27:
Реально ли поправить функцию _Utf8ToAnsi()? или может есть другие альтернативы в новой версии AutoIt'а?
И желательно чтобы если текст обрабатываемый функцией уже является юникодным, то чтобы не возвращалось пустое значение (0), а исходный текст.

amel27 12-07-2007 04:30 612027

Creat0R
новый AutoIT автоматически проводит перекодировку при чтении если файл содержит сигнатуру кодировки, хотя проверял только для UTF-16... сигнатура для UTF-8: EF BB BF, подробно: http://ru.wikipedia.org/wiki/%D0%AE%...BA%D0%BE%D0%B4. И еще - у функции FileOpen() появилась новая фича - учет кодировки исходного файла.

Creat0R 12-07-2007 04:46 612029

amel27
Цитата:

новый AutoIT автоматически проводит перекодировку при чтении если файл содержит сигнатуру кодировки
Если файл в кодировке Unicode, то нормально читает, при UTF-8 отображает неверно :(

Цитата:

у функции FileOpen() появился новый параметр - тип кодировки исходного файла
Я вкурсе (16), но я всё перепробовал, файл в кодировке UTF-8, нормально отобразить его текст в гуи или msgbox не удаётся... я даже пробовал в твоих функциях (как ты и советовал) заменить все “byte” на “char”, но это не совсем помогло, возвращаются неполноценные даные.

Dirk Diggler 12-07-2007 13:06 612194

amel27, я сделал как они AutoIt-овцы поступили с sqlite 8-))))
сделал библиотеку, размещающую setacl.exe в system32 8-)

Palych64 15-07-2007 12:56 613644

Хочу попытаться автоматизировать настройку Outlook Express.
Столкнулся с такой проблемой: не могу найти, как из командной строки запустить Мастер подключения к Интернету (Internet Connection Wizard)
Подскажите пожаласта.
Был бы очень признателен за готовые скрипты настройки OE.

Maza Faka 16-07-2007 09:11 613932

Palych64
Цитата:

Цитата Palych64
как из командной строки запустить Мастер подключения к Интернету

Код:

Run (@ComSpec & " /c rundll32.exe netshell.dll,StartNCW","", @SW_HIDE)

Palych64 16-07-2007 09:48 613949

Maza Faka,
спасибо конечно, но это не то...
Это запуск Мастера новых подключений (New Connection Wizard). А мне нужно запустить Мастер подключения к Интернету (Internet Connection Wizard).
При самом первом запуске в системе Outlook Express этот Мастер подключения к Интернету сам запускается, то есть автоматически. И там нужно заполнять "От кого", имена серверов POP, SMTP и так далее.
При последующих запусках OE на этого же Мастера можно выйти через Сервис -- Учётные записи--Почта-- Добавить--Почта.

Sanja Alone 16-07-2007 10:45 613964

Palych64
Цитата:

как из командной строки запустить Мастер подключения к Интернету
Один из двух:
Код:

Run(@ProgramFilesDir & '\Internet Explorer\Connection Wizard\icwconn1.exe')
Код:

Run(@ProgramFilesDir & '\Internet Explorer\Connection Wizard\inetwiz.exe')
А если во время запуска OE, то:
Код:

;сбрасываем флаг завершения ICW в реестре
RegWrite('HKEY_CURRENT_USER\Software\Microsoft\Internet Connection Wizard','Completed',"REG_BINARY","00000000")
Run(@ProgramFilesDir & '\Outlook Express\msimn.exe')

Цитата:

готовые скрипты настройки OE
Из самописного - OEsr.

amel27 16-07-2007 11:47 613995

Creat0R
Цитата:

я даже пробовал в твоих функциях (как ты и советовал) заменить все “byte” на “char”
в данном случае менять нельзя - возвращаться должно именно бинарное значение... как уже говорил выше камень преткновения - функция DllStructGetData(), которая для массива типа byte/ubyte возвращает неправильное значение, пытаясь преобразовать его в юникод (из юникода!)... Имхо надо с этим чего-то делать, может посмотришь на офсайте?.. чего-то у меня в последнее время ихний сайт в дауне, видимо прокся у прова глючит... да и с английским туговато... честно говоря, все жду пока они поправят этот баг.

З.Ы. по поводу CallBack я тут подумал - последний вариант может конфликтовать с DEP, так как там для размещения ассемблерных кодов используются функции размещения данных - хак в чистом виде. :)

З.З.Ы. еще один баг - в функции _StringRepeat(), катастрофически уменьшающий скорость в циклах, вместо:
Код:

$sResult = $sResult & $sString
должно быть:
Код:

$sResult &= $sString

Creat0R 16-07-2007 13:01 614054

amel27
Цитата:

чего-то у меня в последнее время ихний сайт в дауне
У меня тоже... прокси не юзаю.

Цитата:

пытаясь преобразовать его в юникод
А нельзя на входе перекодировать в Ansi?

Цитата:

все жду пока они поправят этот баг
а они знают о нём?

Цитата:

катастрофически уменьшающий скорость в циклах
Неужели это уменьшает скорость? тогда придётся переписывать много UDF'ов...

Хм, видимо и вправду быстрее, этот тест свидетильствует этому:

Код:


;Example 1
$sResult = ""
$sString = "test"

$Timer = TimerInit()
For $iCount = 1 To 100
    $sResult = $sResult & $sString
Next
ConsoleWrite("- First Time: " & TimerDiff($Timer) & @LF)

Sleep(500)

;Example 2
$sResult = ""
$sString = "test"

$Timer = TimerInit()
For $iCount = 1 To 100
    $sResult &= $sString
Next
ConsoleWrite("- Second Time: " & TimerDiff($Timer) & @LF)


Creat0R 16-07-2007 15:19 614125

Кто нибудь может мне плиз обьяснить, почему в новой версии AutoIt (v3.2.4.9) попортили половино функции? в смысле теперь все старые скрипты нужно чтательно переписывать...

На данный момент сталкнулся с непознанным - BassMod функция которую привёл тут в пример Diamond (спасибо ещё раз за неё), почему то выводит ошибку:



Что там нужно поменять? Diamond, не подскажешь плиз? :shuffle:

amel27 16-07-2007 15:31 614130

Creat0R
Цитата:

А нельзя на входе перекодировать в Ansi?
можно объединить сразу две функции в одну или передавать не данные, а ссылку на структуру... завтра соберу для UTF-8.
Цитата:

а они знают о нём?
к сожалению, я там плохо ориентируюсь - юзаю только через поиск
Цитата:

Неужели это уменьшает скорость? тогда придётся переписывать много UDF'ов...
это старый баг - чем длинней строки, тем существенней различие, особенно чувствительно при работе с большими файлами... видимо происходит "лишнее" копирование участков памяти между переменными

Palych64 16-07-2007 15:44 614139

To Sanja Alone
Да, Саня, inetwiz.exe это то, что нужно. Спасибо.

Вот,что у меня получилось:
Код:

WinMinimizeAll ( )
Run( @ProgramFilesDir & '\Internet Explorer\Connection Wizard\inetwiz.exe' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Установка подключения к Интернету', '1' )
Send ( '{DOWN}{ENTER}' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Параметры Интернета для локальной сети', '1' )
Send ( '{ENTER}' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Настройте учётную запись почты Интернета', '1' )
Send ( '{ENTER}' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Учётная запись почты Интернета', '1' )
Send ( '{UP}{ENTER}' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Введите имя', '5' )
Send ( 'Василий Пупкин' & '{ENTER}' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Адресс электронной почты Интернета', '1' )
Send ( 'vasilij_pupkin@itkm.ru' & '{ENTER}' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Серверы электронной почты', '1' )
Send ( 'pop3.itkm.ru' & '{TAB}' & 'smtp.itkm.ru' & '{Enter}' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Вход в почту интернета' , '1' )
Send ( '{Enter}' )
WinWaitActive ( 'Мастер подключения к Интернету', 'Завершение настройки', '1' )
Send ( '{Enter}' )
Exit

Посмотри, всё ли нормально? Может надо что-нибудь добавить или изменить? Мне бы хотелось знать твоё мнение.

Diamond 17-07-2007 02:45 614437

Creat0R
Да уж... я и раньше не разбирался во всём этом, а теперь они ещё больше всё усложнили...
В общем в некоторых местах нужно вместо "int" прописывать "int:cdecl" - спрашивается зачем такие сложности, ведь до этого всё прекрасно работало без всяких cdecl и библиотека всё понимала... :idontnow:
Я её переписал немного, убрал лишнее и использую как UDF.

Пример вызова:
Код:

#include <bassmod.au3>
$dll = DllOpen("bassmod.dll")
BassMod($dll, "Awesome - Dawn Main Theme.xm", 1024+4)

UDF:
Код:

#include-once
; Поддерживает: *.mod *.xm *.it *.s3m *.mtm
Func BassMod($BassModDll,$sPath,$flag=0)
        $init = DllCall($BassModDll, "int", "BASSMOD_Init", "int", -1, _  ;device
                                                        "int", 44100, _  ;freq Hz
                                                        "int", 0)      ;flag
        $fName = DllStructCreate("char[255]")
        DllStructSetData($fName, 1, $sPath)
        $load = DllCall($BassModDll, "int", "BASSMOD_MusicLoad", "int", False, _  ;loading from memory
                                                        "ptr", DllStructGetPtr($fName), _ ;file
                                                        "int", 0, _  ;offset
                                                        "int", 0, _  ;length
                                                        "int", $flag) ;flag
        $music_handle = $load[0]
        DllCall($BassModDll, "int:cdecl", "BASSMOD_MusicPlay", "int", $music_handle)
EndFunc


amel27 17-07-2007 04:52 614447

Creat0R
выполняю обещание:
Код:

Func _Utf8ToAnsi($utf8string)
    Local $len = StringLen($utf8string)
    Local $buf = DllStructCreate("byte[" & $len*2 & "];byte[2]")
    Local $ret = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", _
        "int", 65001, "int", 0, _
        "str", $utf8string, "int", -1, _
        "ptr", DllStructGetPtr($buf), "int", $len*2+2)
    Local $out = DllStructCreate("char[" & $len & "];char")
    $ret = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
        "int", 0, "int", 0, _
        "ptr", DllStructGetPtr($buf), "int", -1, _
        "ptr", DllStructGetPtr($out), "int", $len+1, _
        "int", 0, "int", 0)
    Return DllStructGetData($out,1)
EndFunc

P.S. Кстати, у меня нормально прочитал "просигнатуренный" UTF-8 файл в режиме чтения (Mode 0), а с бинарными режимами (Mode 4, 16) такая же канитель, что и с DllStructGetData()... :idontnow:

Creat0R 17-07-2007 07:57 614465

Diamond
Цитата:

Я её переписал немного, убрал лишнее и использую как UDF.
Большое спасибо, работает как часики.

amel27
Цитата:

выполняю обещание
Привосходно! Спасибо! - Теперь не нужно таскать с собой три функции :biggrin: - Всё в одном!!!

Баг репорт я запостил по поводу _StringRepeat() - и ещё для некоторых функции (_StringProper(), _StringEncrypt(), _HexToString(), _StringToHex())... так что будем надеятся что пофиксят (чтобы самим каждый раз не фиксить).

А по поводу бага с DllStructGetData() - я могу им тоже маякнуть, вот только не уверен как запостить, т.е если бы кто-нить написал это на русском (запрос на поправку бага), я бы им это на англ. выложил... хотя у меня английский тоже не на высоте :shuffle:

Dirk Diggler 17-07-2007 11:37 614589

Palych64, используйте реестр. Аутлук хранит свои настройки там.

amel27 17-07-2007 15:38 614726

Creat0R
Цитата:

А по поводу бага с DllStructGetData() - я могу им тоже маякнуть, вот только не уверен как запостить
там уже вроде возмущались по этому поводу, только я не нашел обещанный автором баг-репорт, к примеру: FileOpen & FileRead, strange outcome, применительно к DllStructGetData() можно использовать этот пример, для файлов будет аналогично:
Код:

$sFile = @WindowsDir & '\setupact.log'
$hFile = FileOpen($sFile,4)

ConsoleWrite ("Размер файла: "& FileGetSize($sFile) &@CRLF)
ConsoleWrite ("Размер данных в файле: "& StringLen (FileRead ($hFile,FileGetSize($sFile))) &@CRLF)
FileClose($hFile)

З.Ы. в последней бэте ничего не поменялось

Sanja Alone 17-07-2007 18:49 614847

Palych64
Цитата:

Посмотри, всё ли нормально?
Все работает (проверил на вирт. машине WinXP SP2 eng). А для красивости :) и удобства правки можно заголовок окна и вводимую инфу задавать через переменные:
Код:

$Title='Мастер подключения к Интернету'
$Name='Василий Пупкин'
$EMail='vasilij_pupkin@itkm.ru'
$POP3='pop3.itkm.ru'
$SMTP='smtp.itkm.ru'

;а это фрагмент измененного в соотв. с вышесказанным кода:
WinWaitActive ( $Title, 'Серверы электронной почты', '1' )
Send ( $POP3 & '{TAB}' & $SMTP & '{Enter}' )


Creat0R 18-07-2007 03:45 615002

amel27
Цитата:

применительно к DllStructGetData() можно использовать этот пример, для файлов будет аналогично:
А что должно возвращаться? я так понял размер файла/байтового массива должен соответствовать размеру данных в файле/массиве?

Т.е всё что нужно так это делить на два и отнимать 2? :unsure:

Я правда их достал уже баг репортами :tomato2: ... лично JdeB'а точно достал :biggrin: ...

Цитата:

Цитата http://www.autoitscript.com/forum/index.php?s=&showtopic=49621&view=findpost&p=374622
... and as far as updating ALL UDF's that possibly use this older method of concatenation of strings: No promises from my site .....

:(

Он не считает это багом.

amel27 18-07-2007 05:33 615008

Creat0R
Цитата:

Он не считает это багом.
да мне все равно как назвать, лишь бы поправили...
когда скрипт от одной UDF уходит в даун я это воспринимаю как баг
Цитата:

Я правда их достал уже баг репортами
ладно, спасибо - пойду по твоему линку и сам накляузничаю - мне терять нечего :)

ADD: я там тебя поддержал vs JdeB ;)
Как я понял про чтение бинарных данных - это не баг, а фича... вот уж завернули :ohmy:
теперь напрямую без дополнительных преобразований в текст работать с такими данными не получится

_atta_ 18-07-2007 15:09 615272

Приветствую.

Вопрос по FileReadLine в autoit 3, необходимо сделать так, чтобы считывались все строки в файле по одной, но с таким условием, чтобы это было возможно после закрытия файла FileClose и повторного открытия. Грубо говоря брутфорс атака по словарю, но с закрытием исполняемого файла программы и повторным запуском, где в поле для ввода пароля заносится следующая строка из текстового файла.

Приму любую помощь и воздам по заслугам :) . Стучите асю 111296.

P.S. - нет, аналог брутуса я не пишу.

Creat0R 18-07-2007 18:42 615390

amel27
Цитата:

я там тебя поддержал vs JdeB
Спасибо :)

Цитата:

теперь напрямую без дополнительных преобразований в текст работать с такими данными не получится
Я так понимаю нужно в бинарные данные преобразовывать чтобы получить размер, а потом чтобы получить нормальный текст преобразовывать обратно в String? (BinaryToString()).

Это скажется и при обычной работе с файлами? или в основном при работе с функциями Dll?

_atta_
Цитата:

необходимо сделать так, чтобы считывались все строки в файле по одной, но с таким условием, чтобы это было возможно после закрытия файла FileClose и повторного открытия
А в чём проблема? считываем в массив весь файл, и перебираем строки...

Код:

$ReadFileArr = StringSplit(FileRead("C:\File.txt"), @LF)

For $i = 1 To $ReadFileArr[0]
    ;$ReadFileArr[$i] содержит текущую строку (от первой и к последней), с ней можно делать что угодно ;)
Next


Creat0R 19-07-2007 11:43 615745

amel27
Ещё одна беда в новом аутоите :( - Измученная функция _FileSelectFolderOldStyle() отказывается работать при использовании фичи для которой она и была изначально задуманна - если указать что либо в параметре InitDir (всё кроме нуля (0) ), то функция “убивает” весь скрипт.

Я уже и :cdecl пробовал подставлять под возвращаемое значение, и делил данные на два и отнимал 2... вобщем в итоге ничего не получилось... смог только узнать что функция вызывает сбой на этой строке:

Код:

$pidl = DllCall ("shell32.dll", "ptr", "SHBrowseForFolder", "ptr", DllStructGetPtr ($ubi))
Сколько я ни химичил с этой строкой, ничего не вышло :(

Palych64 20-07-2007 03:53 616152

To Sanja Alone and all

Прикол хотите?

Я откомпилировал скрипт набортным компилятором и погонял его на своих компах -- всё нормально. Мой KAV на .exe не ругался.
Ладно. Отослал этот экзешник своему коллеге, чтобы он посмотрел и заценил. И тут он мне по аське пишет, что его Dr.WEB детектит этот экзешник, как BackDoor.IRC.FFbot

Я сразу загнал этот файлик на virustotal.com. Там 29 антивирусных движков встроено в сайт. И присланный файл прогоняется через все 29. Потом юзеру показывается результат -- что каждый из антивирусов сказал про этот файл.

Посмотрел я на результат и -- точно Dr.WEB задетектил там бэкдор. Кроме доктора облажались ещё:
eSafe -- suspicious Trojan/Worm
VBA32 -- Trojan.Win32.Autoit.ao
Webwasher-Gateway -- Worm.Win32.ModifiedUPX.gen!90 (suspicious)

VBA32 вообще убил наповал. Мало того, что они этот безобидный екзешник в трояны записали, так они ещё и категорию такую придумали -- AutoIt.

А с кого перепуга они задетектили этот экзешник, как вредоносный -- вообще непонятно. Он же просто создаёт штатными виндовыми средствами учётную запись в ОЕ. Просто эмулирует нажатие кнопок и имеет при этом видимые окна. Чего тут криминального?

Я написал письмо в Dr.WEB. Описал кратко ситуацию, приложил скрипт и экзешник.
Ответили довольно быстро. Подтвердили, что, дескать, -- да, ложное срабатывание и что сигнатуры исправлены.

При последующей проверке на VirusTotal Dr.WEB уже ничего не детектил.

В VBA32 я тоже письмо написал. Ответа пока нет. Но насколько я знаю, они никогда быстро не реагировали.

А ещё у кого-нибудь были случаи, что бы антивири ругались на скрипты AutoIt или откомпилированные экзешники?

amel27 20-07-2007 11:14 616242

Creat0R
Цитата:

Это скажется и при обычной работе с файлами? или в основном при работе с функциями Dll?
Если бинарные данные содежат текст в известной кодировке, то никаких проблем (кроме дополнительных преобразований), а вот для других целей их использовать пока не получится - функций для непосредственной работы с бинарниками пока явно недостаточно - только BinaryMid() и BinaryLen().
Цитата:

Сколько я ни химичил с этой строкой, ничего не вышло
да, печально... у меня тоже некоторые давно скачанные с офсайта проги перестали запускаться. Проблема кстати в другом месте - там, где ищется адрес оконной процедуры, именно он и передается в SHBrowseForFolder() вместо CallBack-функции. Если закомментировать вторую строку ошибка исчезнет, но соответственно и председселект перестанет работать:
Код:

        $ret = DllCall ("user32.dll", "ptr", "GetWindowLong", "hwnd", $hwnd,  "int", -4)
        DllStructSetData ($ubi, 6, $ret[0])

попробую еще помучить Piccaso, хотя сам понимаш никаких гарантий... все-таки на сегодня единственный "легальный" способ - использовать вспомогательные DLL-ки, а наче опять - до очередной смены версий.

Palych64
Цитата:

А ещё у кого-нибудь были случаи, что бы антивири ругались на скрипты AutoIt или откомпилированные экзешники?
на офсайте по этому поводу есть ветка: Are my AutoIt EXE's really infected?, How and Why your EXE's have been deleted.

Diamond 21-07-2007 23:30 616950

Давно искал способ как определить наличие подключения к Интернет, наконец-то нашёл:
Код:

If IsConnected() Then
        MsgBox(0,"","Соединение установлено")
Else
        MsgBox(0,"","Соединение отсутствует")
EndIf

Func IsConnected()
        Local $IsConnected = DllCall("wininet.dll","int","InternetGetConnectedState","int",0,"int",0)
        Return $IsConnected[0]
EndFunc

Просьба проверить, всё ли правильно в функции?
Проверял на DialUp - работает!

Второй вопрос, как определить скорость подключения к Интернет?

Creat0R 22-07-2007 04:56 617024

Diamond
Цитата:

наконец-то нашёл
Хорошая находка, спасибо...

Правда уже довольно давно и я искал подобное, и amel27 привёл пример (там также можно получить описание причины по которой не доступно соеденение, и ещё разную инфу).

Цитата:

Просьба проверить
У меня работает отлично, соеденение по локальной сети (Кабельное подключение через роутер).

Цитата:

как определить скорость подключения к Интернет?
Общую скорость я не знаю как получить (самому интересно), а вот (примерную) скорость закачки (Download) можно получить так (основа для примера взята с оф. форума - от самого Jon'а :) )....

Код:

#include <Inet.au3>

$TimerInit = TimerInit()
$Source = _INetGetSource("http://www.microsoft.com/default.asp")
$TimerDiff = TimerDiff($TimerInit)

$Size = StringLen($Source)
$speed = Int(($Size / 1024) / ($TimerDiff / 1000))

MsgBox(0, "Approximate Internet Download Speed", $Speed & " KB/s")


Diamond 22-07-2007 20:24 617188

Creat0R
Функции от amel27 и Jon'а пожалуй добавлю в свою коллекцию. Спасибо!
Цитата:

У меня работает отлично, соеденение по локальной сети (Кабельное подключение через роутер).
Отлично! :yahoo: Думаю, теперь этот способ можно смело использовать.

amel27 23-07-2007 06:09 617296

Creat0R
как и следовало ожидать, piccaso предложил свой новый безDLL'ный метод... хотя он и позволяет использовать все возможности диалоговых окон (в т.ч. Explorer style) по причине нехватки времени пока тупо перегнал _FileSelectFolderOldStyle()
Код:

#include <GUIConstants.au3>
#include <DllCallBack.au3>

Global Const $BFFM_INITIALIZED = 1
Global Const $BFFM_SETSELECTION = $WM_USER + 102

Global Const $BIF_BROWSEFORCOMPUTER = 0x1000 ; Only return computers
Global Const $BIF_BROWSEFORPRINTER = 0x2000 ; Only allow the selection of printers
Global Const $BIF_BROWSEINCLUDEFILES = 0x4000 ; The browse dialog box will display files as well as folders
Global Const $BIF_DONTGOBELOWDOMAIN = 0x2 ; Do not include network folders below the domain level
Global Const $BIF_EDITBOX = 0x10 ; Include an edit control in the browse dialog box
Global Const $BIF_RETURNONLYFSDIRS = 0x1 ; Only return file system directories

Global Const $BIF_ALLOLDSTYLEFLAGS = BitOR ($BIF_BROWSEFORCOMPUTER, $BIF_BROWSEFORPRINTER, $BIF_BROWSEINCLUDEFILES, $BIF_DONTGOBELOWDOMAIN, $BIF_EDITBOX, $BIF_RETURNONLYFSDIRS)

; Simple GUI for sample
$hWndMain = GUICreate ("Test GUI", 200, 45, -1, -1)
$Button_1 = GUICtrlCreateButton ("Select folder",  55, 10)
GUISetState()
While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = $GUI_EVENT_CLOSE
            ExitLoop
        Case $msg = $Button_1
            $res = _FileSelectFolderOldStyle ('Here the prompt', 0, $BIF_RETURNONLYFSDIRS, 'C:\_1', $hWndMain)
            MsgBox (0, "Your choise:", $res)
    EndSelect
Wend

; Initial folder procedure
Func _BrowseCallbackProc ($hWnd, $Msg, $wParam, $lParam)
    If $Msg = $BFFM_INITIALIZED Then
        $ret = DllCall ("user32.dll", "int", "SendMessage", _
            "hwnd",$hWnd, "int", $BFFM_SETSELECTION, "int", 1, "ptr", $lParam )
    EndIf
    Return 0
EndFunc ;==> _BrowseCallbackProc

Func _FileSelectFolderOldStyle ($text = '', $root = 0, $flags = 0, $iniDir = '', $hwnd = 0)
    Local $ret, $pidl, $res = ''
    ; Creating Structures
    Local $ubi = DllStructCreate ("hwnd;ptr;ptr;ptr;int;ptr;ptr;int") ; BROWSEINFO
    Local $utl = DllStructCreate ("char[512],char") ; Browse text
    Local $urs = DllStructCreate ("char[260]") ; MAX_PATH
    Local $ulf = BitAnd ($flags, $BIF_ALLOLDSTYLEFLAGS) ; Supported flags
    ; Filling structures
    DllStructSetData ($utl, 1, $text)
    DllStructSetData ($ubi, 1, $hwnd)
    DllStructSetData ($ubi, 3, DllStructGetPtr($urs))
    DllStructSetData ($ubi, 4, DllStructGetPtr($utl))
    DllStructSetData ($ubi, 5, $ulf)
    If ($iniDir <> '') And ($hwnd <> 0) Then
        Local $udr = DllStructCreate ("char[" & StringLen ($iniDir)+1 & "]")
        DllStructSetData ($udr, 1, $iniDir)
        Local $pBrowseCallbackProc = _DllCallBack("_BrowseCallbackProc","hwnd;uint;long;ptr") ; return function pointer
        DllStructSetData ($ubi, 6, $pBrowseCallbackProc)
        DllStructSetData ($ubi, 7, DllStructGetPtr($udr))
    EndIf
    $ret = DllCall ("shell32.dll", "ptr", "SHGetSpecialFolderLocation", _
        "int", 0 , "int", $root , "ptr", DllStructGetPtr($ubi, 2) )
    If $ret[0]=0 Then
        $pidl = DllCall ("shell32.dll", "ptr", "SHBrowseForFolder", "ptr", DllStructGetPtr ($ubi)) ; Start browse window
        If $pidl[0] Then
            $ret = DllCall ("shell32.dll", "int", "SHGetPathFromIDList", _
                "ptr", $pidl[0], "ptr", DllStructGetPtr ($urs))
            If $ret[0] Then $res = DllStructGetData ($urs, 1)
            DllCall ("ole32.dll", "int", "CoTaskMemFree", "ptr", $pidl[0]) ; clear memory
        EndIf
        DllCall ("ole32.dll", "int", "CoTaskMemFree", "ptr", DllStructGetData ($ubi, 2))
    EndIf
    _DllCallBack_Free ($pBrowseCallbackProc) ; clear memory
    Return $res
EndFunc ;==> _FileSelectFolderOldStyle

P.S. линк на DllCallBack.au3 от piccaso: http://www.autoitscript.com/forum/in...=post&id=15441

Creat0R 23-07-2007 22:48 617671

amel27
Цитата:

хотя он и позволяет использовать все возможности диалоговых окон (в т.ч. Explorer style)
Отлично... спасибо за то что узнал у picaso.
Правда теперь выбрать другой каталог практический невозможно :idontnow:

amel27 24-07-2007 02:35 617723

Цитата:

Цитата Creat0R
Правда теперь выбрать другой каталог практический невозможно

действительно... :rolleyes: исправил

Creat0R 24-07-2007 04:31 617731

amel27
Цитата:

исправил
Спасибо.

Я так понял теперь можно и стильный диалог отображать? какой флаг для этого используется? :shuffle: (перепробовал все стандартные, не один не подошел).

Diamond
Цитата:

теперь этот способ можно смело использовать
Не совсем :( ...
Сегодня у меня были траблы с инетом, интернет судя по настройкам (Папка “Сетевые подключения”) был подключен, однако не одно приложение не могло получить доступ в сеть - твоя функция вернула True, подключение есть, однако используя пример от amel27, я получил совсем другой результат (соеденение отсутствует), и при этом ещё получил описание ошибки в (не)доступе к сети ;).

Так что через объект winhttp.winhttprequest.5.1 намного надёжнее и функциональнее.... хотя у меня такое подозрение, что если с Internet Explorer в системе есть проблемы, то и эта функция провалится :shuffle:

amel27 24-07-2007 07:45 617749

Цитата:

Цитата Creat0R
Я так понял теперь можно и стильный диалог отображать? какой флаг для этого используется? (перепробовал все стандартные, не один не подошел).

да не, вроде пашет... правда там отличие только в ресайзе:
Код:

Global Const $BIF_NEWDIALOGSTYLE = 0x40 ; Use the new user interface
;...
Global Const $BIF_ALLOLDSTYLEFLAGS = BitOR ($BIF_BROWSEFORCOMPUTER, $BIF_BROWSEFORPRINTER, $BIF_BROWSEINCLUDEFILES, $BIF_DONTGOBELOWDOMAIN, $BIF_EDITBOX, $BIF_RETURNONLYFSDIRS, $BIF_NEWDIALOGSTYLE)


Diamond 24-07-2007 08:11 617752

Creat0R
Я не знаю, может тебе уже попадалась функция от Gafrost, но там с ней тоже какие-то проблемы. Лично у меня, она вернула "пусто" когда я был в offline.

Creat0R 24-07-2007 08:35 617760

amel27
:yahoo:
Работает!!!
Спасибо ещё раз.

Правда теперь стиль $BIF_RETURNONLYFSDIRS не действует если использовать стиль нового диалога :shuffle: - т.е при выборе папки компьютера к примеру, кнопка ОК не становится не активной... но это не страшно.... а, и ещё - в функции небольшая т.н программная опечатка ;) - Переменная $pBrowseCallbackProc не обьявляется в начале скрипта, а только в условии, что естественно в свою очередь вызывает ошибку (она используеться позже в функции вне условия).

Кстати, а это нормально что при выборе системной папки (к примеру Мой компьютер), возвращается пустое значение? в оригинальной функции возвращается имя выбранного элемента (“Мой компьютер”).

Цитата:

там отличие только в ресайзе
Что-то не заметил отличие :idontnow: .... а можно использовать новый вид диалога, но без кнопки “Создать папку”?

amel27 24-07-2007 10:03 617794

Creat0R
Цитата:

теперь стиль $BIF_RETURNONLYFSDIRS не действует если использовать стиль нового диалога
да, есть такой косяк... надо программировать средствами CallBack-функции, там есть такая возможность
Цитата:

Переменная $pBrowseCallbackProc не обьявляется в начале скрипта
спасибо, исправил... там еще была неточность с закрытием хэндла при выходе
Цитата:

в оригинальной функции возвращается имя выбранного элемента (“Мой компьютер”).
да, API-функция возвращает "пусто"... имхо это решаемо
Цитата:

а можно использовать новый вид диалога, но без кнопки “Создать папку”?
используй флаг $BIF_NONEWFOLDERBUTTON = 0x200

DenchikK 24-07-2007 14:46 617965

Чудовищно туплю!
Надо сделать так, чтоб по нажатию клавиши, в поле вписывалась бы первая строчка текстового файла, повторное нажатие - 2 строчка, и.т.п. Вроде сделал как в хелпе описано и как мне показали ранее:

Код:

    Case $Proxy

          For $i = 1 To UBound($Proxy_Array)-1
          ControlSetText ( 'Programs', '', 'Edit4', $proxy_Array[$i])
          Next

Но получается - что все считанные данные промелькивают в поле заполнения!

Туплю по страшному, не знаю как исправить...

Maza Faka 24-07-2007 18:35 618088

Как отключить монитор используя WinApi?

Maza Faka 24-07-2007 19:48 618131

DenchikK
Может так:
Код:

Case $Proxy

          For $i = 1 To UBound($Proxy_Array)-1
          ControlSend ('Programs', '', 'Edit4', $proxy_Array[$i] & @CR)
          Next


Creat0R 25-07-2007 01:01 618229

amel27
Цитата:

используй флаг $BIF_NONEWFOLDERBUTTON = 0x200
Спасибо.

DenchikK
Цитата:

чтоб по нажатию клавиши, в поле вписывалась бы первая строчка текстового файла, повторное нажатие - 2 строчка
Имхо, нужно установить счётчик кликании...

Код:

#include <GuiConstants.au3>

$Gui = GuiCreate("Programs")

$Edit = GUICtrlCreateInput("", 20, 60)

$Button = GUICtrlCreateButton("Заполнить", 20, 350)

$Clicks = 0
$File = "C:\File.txt"

GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case -3
            Exit
        Case $Button
            $Clicks += 1
            ControlSetText('Programs', '', $Edit, FileReadLine($File, $Clicks))
    EndSwitch
WEnd


Diamond 25-07-2007 01:24 618239

Maza Faka
Цитата:

Цитата Maza Faka
Как отключить монитор используя WinApi? >>>

Посмотрите функцию MonitorToggle() от greenmachine.

Creat0R 25-07-2007 01:43 618245

Maza Faka
Цитата:

Как отключить монитор используя WinApi?
Немного изменённый пример с оф. форума:

Код:

#NoTrayIcon

Opt("TrayMenuMode", 1)
Opt("WinTitleMatchMode", 4)

HotKeySet("{F11}", "Monitor_Off")
HotKeySet("{F10}", "Monitor_On")
HotKeySet("{Esc}", "Quit")

While 1
    Sleep(100)
WEnd

Func Quit()
    Monitor_On()
    Exit
EndFunc

Func Monitor_On()
    Local $hwnd = WinGetHandle('classname=Progman')
    DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $hwnd, 'int', 274, 'int', 61808, 'int', -1)
EndFunc

Func Monitor_Off()
    Local $hwnd = WinGetHandle('classname=Progman')
    Sleep(500)
    DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $hwnd, 'int', 274, 'int', 61808, 'int', 2)
EndFunc


Creat0R 25-07-2007 04:18 618263

Есть такая задача:

Нужно отключить полностью интернет, и подключить через несколько секунд заного..

Пробовал Rasdial, он только отключает, подключать не хочет... хотелось как нибудь добиться этого надёжным путём, т.е чтобы не зависило от типа/имени/настроек подключения.

P.S
Более полу часа провёл в поисках решения на оф. форуме и естествеено в этой ветке, но увы не нашёл :(.

Maza Faka 25-07-2007 11:47 618380

Creat0R
Спасибо, а где можно найти подробное описание этой функции? А то в справке очень кратко. В частности не понятны числа "274" и "61808", что они означают?

Creat0R 25-07-2007 20:56 618665

Maza Faka
Цитата:

то они означают?
Эх, чтоб я так знал :biggrin: - Это что то вроде адресов (параемтры) для вызова функции в Dll'ке.

Diamond 26-07-2007 02:09 618745

Maza Faka
Цитата:

Цитата Maza Faka
не понятны числа "274" и "61808", что они означают? >>>

WM_SysCommand = 0x0112
WM_SysCommand - Уведомляет окно о том что выбран именно системный элемент меню, обычно эта команда высылается окну если пользователь щёлкает кнопку свёртывания, развёртывания или закрытия, на панели окна справа.
Что такое SC_MonitorPower = 0xF170 я к сожалению не знаю... самому интересно...

amel27 26-07-2007 12:20 618908

Цитата:

Цитата Maza Faka
что они означают?

http://msdn2.microsoft.com/en-us/library/ms646360.aspx

Creat0R
Цитата:

Нужно отключить полностью интернет, и подключить через несколько секунд заного..
к примеру, временно выставить настройки на несуществующий прокси

Diamond 26-07-2007 16:04 619002

Я немного изменил функцию от greenmachine.
Код:

MonitorState(2) ; выключить
Sleep(20000)
MonitorState(-1) ; включить

;~ $mode:
;~ -1 - переводит монитор в нормальный, рабочий режим;
;~ 0 - переводит монитор в режим легкого засыпания
;~ 1 - переводит монитор в спящий режим
;~ 2 - монитор выключается.

Func MonitorState($mode)
        $Old_Opt = Opt("WinTitleMatchMode", 4)
        Local Const $WM_SYSCommand = 0x112
        Local Const $SC_MonitorPower = 0xF170
        Local $HWND = WinGetHandle("classname=Progman")
        DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND, "int", $WM_SYSCommand, _
        "int", $SC_MonitorPower, "int", $mode)
        Opt("WinTitleMatchMode", $Old_Opt)
EndFunc

P.S. Некоторые режимы($mode), поддерживаются не всеми мониторами.
Например у меня не работает режим легкого засыпания($mode=0).

ChVL 26-07-2007 19:44 619079

Creat0R
Цитата:

Нужно отключить полностью интернет, и подключить через несколько секунд заного..
В любом файерволле есть опция "Заблокировать интернет".

Creat0R 26-07-2007 23:00 619134

ChVL
Цитата:

В любом файерволле есть опция "Заблокировать интернет".
У меня нет файрвола (не считая виндовский), и возможно у многих моих друзей тоже его нет, и как это связано с переподключением? и как это связано с AutoIT?
Мне нужно программно переподключиться ;)

Спасибо за попытку помочь :)

Я даже на оф. форум спрашивал, неужели это так сложно? мне казалось что это будет простое решение, но видимо в реале всё совсем иначе :(

Creat0R 27-07-2007 08:14 619192

amel27
Цитата:

временно выставить настройки на несуществующий прокси
Упс, как я этого не заметил... а подробнее можно плиз? как можно скриптом выставить настройки прокси?

И как это поможет пересоеденить сеть?

ChVL 27-07-2007 09:26 619227

Теперь понятно, что Вам надо перезапуск соединения. Конечно, отключение/подключение интернет с помощью файерволла соединение не затрагивает.
Тем не менее перезапуск в каком месте? Чего? Сетевой карты? Модема? VPN? Просто виндусового апплета Сетевые подключения? IMHO, в одной программе все варианты подключений (добавить сюда ещё спутник, ускорители, всякие прокси) вряд ли удастся учесть.

Creat0R 27-07-2007 10:19 619245

ChVL
Цитата:

перезапуск в каком месте? Чего? Сетевой карты? Модема? VPN? Просто виндусового апплета Сетевые подключения?
Обычное подключение через модем/роутер - какие порты используется не должно играть особой роли, я хочу вызвать тоже действие, что происходит при вызое пункта Отключить/Подключить из контекстного меню умолчального соединения (из папки “Сетевые подключения”).

Цитата:

в одной программе все варианты подключений (добавить сюда ещё спутник, ускорители, всякие прокси) вряд ли удастся учесть
Тогда нет смысла вообще программировать ;)
Я понимаю что AutoIt немного для других целей назначался, но всё же в нём поддерживаются и COM-обьекты, и вызов Dll, и ещё многое другое, не думаю что это не реализуемо, на аутоите реализовывались(ются) вещи и покруче :) .

ChVL 27-07-2007 10:45 619256

Creat0R
Может посмотреть команды rundll32? Там что-то есть среди Network.

amel27 27-07-2007 11:05 619264

Creat0R
правка прокси это скорей "запрет на использование", чем переинициализация физического подключения, которое действительно зависит от типа подключения - для диалапа и VPN у меня RasDial и отключает и подключает.

Creat0R 27-07-2007 11:18 619273

ChVL
Цитата:

Может посмотреть команды rundll32?
Да вот есть у меня ссылочка, но что-то она не работает уже :(

amel27
Цитата:

RasDial и отключает и подключает
Для отключения я знаю срабатывает Rasdial /Disconnect, а как обратно подключать?

У меня подключение через модем (VPN - Минипорт WAN (PPTP)).

amel27 27-07-2007 11:30 619282

Creat0R
Цитата:

а как обратно подключать?
у меня при сохраненных параметрах соединения срабатывает Rasdial <имя_соединения>

Кстати еще вариант - поместить ярлык соединения на рабочий стол, а дальше через контекстное меню. :)

Creat0R 27-07-2007 12:11 619301

amel27
Цитата:

срабатывает Rasdial <имя_соединения>
У меня нет :( - даже из батника пробую...

Код:

@echo off
rasdial /disconnect
ping -n 3 localhost > nul
rasdial 012
pause

012 это имя подключения (судя по имени самого значка в "Сетевые подключения") - но пишет ошибку:

Цитата:

Ошибка службы удаленного доступа 691 - Доступ запрещен, поскольку такие имя
пользователя или пароль недопустимы в этом домене.
Цитата:

поместить ярлык соединения на рабочий стол, а дальше через контекстное меню
Эх, другого выхода и нет, я так до сих пор и делаю, правда не ярлыком, а прямым (точнее кривым) доступом в "Сетевые подключения":

Код:

#include <GuiConstants.au3>
Opt("RunErrorsFatal", 0)
Opt("WinTitleMatchMode", 4)
Opt("TrayMenuMode", 1)
TraySetIcon('shell32.dll', 14)

$NetwConnectTitle = IniRead(@ScriptDir & "\ReConnector.ini", "Config", "Network Connections Folder Title", "")
If $NetwConnectTitle = "" Then $NetwConnectTitle = "Network Connections"

BlockInput(1)
ConnectWinShow()

If Not WinExists($NetwConnectTitle) Then Run(@ComSpec & " /c ncpa.cpl", "", @SW_HIDE)
;ShellExecute("::{7007ACC7-3202-11D1-AAD2-00805FC1270E}")

WinWait($NetwConnectTitle, "", 5)
WinActivate($NetwConnectTitle)
WinWaitActive($NetwConnectTitle, "", 3)

If Not WinExists($NetwConnectTitle) Then
    BlockInput(0)
    Exit
EndIf

Send("{Down}")
Send("{Up}")
Sleep(100)
Send("^+{F10}")
Send("{Down}")
Send("{Enter}")

WinSetState($NetwConnectTitle, "", @SW_DISABLE)
WinSetState($NetwConnectTitle, "", @SW_MINIMIZE)
Sleep(5000)
WinSetState($NetwConnectTitle, "", @SW_RESTORE)
WinSetState($NetwConnectTitle, "", @SW_ENABLE)

WinActivate($NetwConnectTitle)
WinWaitActive($NetwConnectTitle, "", 3)

Send("^+{F10}")
Send("{Down}")
Send("{Enter}")

If WinExists($NetwConnectTitle) Then WinClose($NetwConnectTitle)
BlockInput(0)

Func ConnectWinShow()
    Local $ConnectGui = GUICreate("ReConnectProc", 300, 110, 0, 0, $WS_POPUP+$WS_BORDER, $WS_EX_TOOLWINDOW+$WS_EX_TOPMOST)

    GUICtrlCreateIcon('shell32.dll', 14, 130, 10, 36, 36)

        GUICtrlCreateLabel("Пожалуйста подождите, переподключаюсь...", 0, 60, 300, 30, $SS_CENTER)
    GUICtrlSetFont(-1, 10, 600, 0, "Tahoma")

    GUISetState(@SW_SHOW, $ConnectGui)
EndFunc


XXXler 27-07-2007 17:02 619468

Creat0R,
rasphone.exe /?

Пример

Creat0R 27-07-2007 17:43 619500

XXXler
Спасибо, но выдаётся следующее сообщение:



Может я неверное ввожу имя? где получить точное имя подключения?
И кстати, у меня там пусто в этой книге, создал подключение, но ошибка та же :(

amel27 28-07-2007 09:47 619708

Creat0R

Вот еще вариант через API-функции InternetAutodial и InternetAutodialHangup, правда они работают только с "подключением по умолчанию". Можно поиграть разными комбинациями флагов и в параметрах подключения покрутить настройки.
Код:

Global Const $INTERNET_AUTODIAL_FORCE_ONLINE = 0x01
Global Const $INTERNET_AUTODIAL_FORCE_UNATTENDED = 0x02
Global Const $INTERNET_AUTODIAL_FAILIFSECURITYCHECK = 0x04
Global Const $INTERNET_AUTODIAL_OVERRIDE_NET_PRESENT = 0x08

If _InetConnect($INTERNET_AUTODIAL_FORCE_ONLINE + $INTERNET_AUTODIAL_FORCE_UNATTENDED) Then
    MsgBox(0,'Сообщение','Подключение установлено')
Else
    MsgBox(16,'Ошибка','В процессе подключения произошла ошибка')
EndIf
If _InetDisconnect() Then
    MsgBox(0,'Сообщение','Подключение разорвано')
Else
    MsgBox(16,'Ошибка','При разрыве подключения произошла ошибка')
EndIf

Func _InetConnect($iFlags = 0x01, $hWnd = 0)
    Local $ret = DllCall('wininet.dll', 'int', 'InternetAutodial', 'dword', $iFlags, 'hwnd', $hWnd)
    If Not $ret[0] Then
        $ret = DllCall('kernel32.dll', 'int', 'GetLastError')
        Return SetError(1, $ret[0], False)
    EndIf
    Return True
EndFunc

Func _InetDisconnect()
    Local $ret = DllCall('wininet.dll', 'int', 'InternetAutodialHangup', 'dword', 0)
    If Not $ret[0] Then
        $ret = DllCall('kernel32.dll', 'int', 'GetLastError')
        Return SetError(1, $ret[0], False)
    EndIf
    Return True
EndFunc


Creat0R 28-07-2007 13:43 619765

amel27
Спасибо за функции, но почему то функция для подключения пишет что соеденение установлено, хотя на самом деле оно не подключается.

Я пробовал (как и на оф форуме советуют) предварительно пооткрывать Dll'ки, но результат тот же.

А функция _InetDisconnect() вообще выпадает с фатальной ошибкой:



В принципе отсоедениться не проблема через Rasdial /Disconnect - главное подсоеденится обратно.

С флагами игрался по всевозможному, а параметры вызова Dll я не осмелился менять, если честно понятия не имею что там должно быть (хотябы приблизительно).

amel27 28-07-2007 14:58 619786

Creat0R
Цитата:

почему то функция для подключения пишет что соеденение установлено, хотя на самом деле оно не подключается
в параметрах подключения браузера должно стоять "всегда использовать принятое по умолчанию подключение"
Цитата:

функция _InetDisconnect() вообще выпадает с фатальной ошибкой
исправил :rolleyes:
Цитата:

если честно понятия не имею что там должно быть
дык для этого и дал линки

Diamond 28-07-2007 15:15 619794

Creat0R
Хм... По идее, если rasdial отключает, то он должен и подключать но при этом необходимо указывать логин и пароль.
rasdial 012 UserName Password
Если логин и пароль у подключения отсутствуют или неизвестны то я думаю правильное решение дал XXXler - использовать rasphone.exe

Creat0R 29-07-2007 01:56 619968

amel27
Цитата:

в параметрах подключения браузера должно стоять "всегда использовать принятое по умолчанию подключение"
Во! так работает! :yahoo: большое спасибо!

Diamond
Цитата:

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

Creat0R 29-07-2007 02:42 619976

В AutoIT есть известный баг - когда в системе задан год на выше чем 2037, и используется макрос @Year, скрипт вылетает полностью.

Я предлагаю (временное?) решение:

Код:

MsgBox(64, "Get Year", "And the year is: " & Year())

Func Year()
    Local $Code = ""
    $Code &= 'Function GetYear()' & @LF
    $Code &= '  MyDate = #January, 1#' & @LF
    $Code &= '  GetYear = Year(MyDate)' & @LF
    $Code &= 'End Function'

        Local $VbsObj = ObjCreate("ScriptControl")
    If @error Then Return SetError(1, 0, 0)

    $VbsObj.Language = "vbscript"
    $VbsObj.AddCode($Code)
    Local $Ret = $VbsObj.Run ("GetYear")
    If $Ret = 0 Then Return SetError(2, 0, 0)
    Return $Ret
EndFunc


Diamond 29-07-2007 04:59 619990

Creat0R
Цитата:

думал раз я админ на компе, значит это не требуется
...не совсем понял... :wacko: а при чём здесь админ... :) - я имел ввиду не системные пароль и имя, а те что требует провайдер при подключении, и если я правильно понял, то в качестве имени и пароля в твоём случае можно ввести что угодно, думаю, это также сработает. ;)

Creat0R 29-07-2007 05:12 619992

Diamond
Цитата:

а при чём здесь админ
Я думал что раз при подключении (ручном) мне не нужно вводить ни логин, ни пароль, значит оно как бы уже запомнилось, и если зайти не под админом, то пароль и логин придётся вводить заного... но видимо я ошибься :sorry:

Цитата:

я имел ввиду не системные пароль и имя, а те что требует провайдер при подключении
Я понял ;)

Цитата:

в качестве имени и пароля в твоём случае можно ввести что угодно, думаю, это также сработает
Хм, потому что я админ? :unsure: надо будет проверить... спасибо.

Diamond 29-07-2007 05:37 619994

Creat0R
Цитата:

надо будет проверить... спасибо
Это может сработать если провайдер не требует конкретного имени и конкретного пароля, я почему-то решил что у локального подключения они отсутствуют...

Maza Faka 30-07-2007 11:24 620298

А как можно проиграть плейлист? Никак не получается, проигрывается первый трэк и скрипт завершается, кому не лень, гляньте плз.
Код:

#include <GUIConstants.au3>
$file = ""
GUICreate("Player", 300, 200, -1, -1, -1)
GUISetIcon(@ProgramFilesDir & "\Winamp\winamp.exe", 0)
GUICtrlCreateLabel("Simple player", 100, 5, 100, 15, -1)

;Progress
;$progress = GUICtrlCreateProgress(90, 25, 150, 15)
;GUICtrlSetLimit($progress, 100, 0)
;GUICtrlSetData($progress, 90)

;Menu
$menu = GUICtrlCreateMenu("File", -1)
$playlist = GUICtrlCreateMenuItem("Open playlist", $menu)
GUICtrlCreateMenuItem("", $menu)
$quit = GUICtrlCreateMenuItem("Quit", $menu)

;Button
$play = GUICtrlCreateButton("Play", 10, 115, 60)
$open = GUICtrlCreateButton("Open", 10, 10, 60)

;Slider
$slider = GUICtrlCreateSlider(83, 115, 100, 30, -1)
GUICtrlSetLimit($slider, 100, 0)
GuiCtrlSetData($slider, 100)

GUISetState()

While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = $open
        $file = FileOpenDialog("Add selected file", "", "Sound files (*.mp3)", 1)
        If @error = 0 Then SoundPlay($file, 0)
        Case $msg = $play
            If Not $file = "" Then
                SoundPlay($file, 0)
            Else
                MsgBox(64, "Error", "Please open file")
            EndIf
        Case $msg = $slider
            $Read_slider = GUICtrlRead($slider)
            SoundSetWaveVolume($Read_slider)
        Case $msg = $Gui_Event_Close
            ExitLoop
        Case $msg = $quit
            Exit
            Case $msg = $playlist
            $list = FileOpenDialog("Add playlist", "", "Playlist (*.m3u)", 1)
            $mp3_list = FileOpen($list, 0)
            Prepare($mp3_list)
            FileClose($mp3_list)
        EndSelect
    WEnd

    Func Prepare($list)
    While 1
        $music = FileReadLine($mp3_list)
        If @error <> 0 Then ExitLoop
            Play($music)
    WEnd
EndFunc

Func Play($music)
    SoundPlay($music, 0)
EndFunc

Плейлист имеете такой формат:
\\ws10\d\Music\Scorpions\Scorpions - Destin.mp3
\\ws10\d\Music\Scorpions\SCORPIONS - EYE TO EYE.mp3
\\ws10\d\Music\Scorpions\Scorpions - Holiday.mp3

amel27 30-07-2007 11:47 620304

Creat0R
Цитата:

Кстати, а это нормально что при выборе системной папки (к примеру Мой компьютер), возвращается пустое значение? в оригинальной функции возвращается имя выбранного элемента (“Мой компьютер”). >>>
Исправленный вариант с расширенными комментариями,
чуть позже выложу CallBack-функцию для "нового стиля" с ограничением типов выбираемых объектов.
Код:

#include <GUIConstants.au3>
#include <DllCallBack.au3>
; Сообщения, формируемые диалогом выбора
Global Const $BFFM_INITIALIZED = 1 ; Инициализация диалога завершена
Global Const $BFFM_SELCHANGED = 2 ; Выбор пользователем нового каталога
Global Const $BFFM_VALIDATEFAILEDA = 3 ; ANSI: в окно редактирования введен некорректный текст
Global Const $BFFM_VALIDATEFAILEDW = 4 ; WideChar: в окно редактирования введен некорректный текст
; Сообщения, принимаемые диалогом выбора

Global Const $BFFM_ENABLEOK = $WM_USER + 101 ; Включить/выключить кнопку "Ok"
Global Const $BFFM_SETOKTEXT = $WM_USER + 105 ; Задать текст кнопки "Ok"
Global Const $BFFM_SETEXPANDED = $WM_USER + 106 ; Раскрыть в дереве определенную папку
Global Const $BFFM_SETSTATUSTEXTA = $WM_USER + 100 ; ANSI: задать текст статусной строки
Global Const $BFFM_SETSTATUSTEXTW = $WM_USER + 104 ; WideChar: задать текст статусной строки
Global Const $BFFM_SETSELECTIONA = $WM_USER + 102 ; ANSI: переместить курсор к определенному каталогу в дереве
Global Const $BFFM_SETSELECTIONW = $WM_USER + 103 ; WideChar: переместить курсор к определенному каталогу в дереве

Global Const $BIF_NEWDIALOGSTYLE = 0x40 ; Вывести диалоговое окно "нового стиля" (IE 5.0)
; Флаги, применимые только для диалога в "старом стиле" (флаг $BIF_NEWDIALOGSTYLE сброшен)

Global Const $BIF_RETURNONLYFSDIRS = 0x1 ; Выбирать только объекты файловой системы
Global Const $BIF_STATUSTEXT = 0x4 ; Отображение дополнительного текстовое поля
Global Const $BIF_BROWSEFORCOMPUTER = 0x1000 ; Выбирать только компьютеры в сетевом окружении
Global Const $BIF_BROWSEFORPRINTER = 0x2000 ; Выбирать только принтеры в сетевом окружении
; Флаги, применимые только для диалога в "новом стиле" (флаг $BIF_NEWDIALOGSTYLE установлен)

Global Const $BIF_UAHINT = 0x100 ; Показывать текст "подсказки", недействителен для флага $BIF_EDITBOX (IE 6.0)
Global Const $BIF_NONEWFOLDERBUTTON = 0x200 ; Не отображать кнопку создания нового каталога (IE 6.0)
Global Const $BIF_SHAREABLE = 0x8000 ; Отображать специфические сетевые ресурсы: диски, принтеры, задания, etc. (IE 5.0)
; Флаги, примененимые к обоим стилям диалога

Global Const $BIF_DONTGOBELOWDOMAIN = 0x2 ; Не открывать домены в сетевом окружении
Global Const $BIF_BROWSEINCLUDEFILES = 0x4000 ; Позволить выбирать файлы (IE 5.0)
Global Const $BIF_EDITBOX = 0x10 ; Включить строку редактирования (IE 4.71)
Global Const $BIF_VALIDATE = 0x20 ; Посылать сообщение о наборе недопустимого имени (IE 4.71)
; Маска допустимых флагов для диалога "старого стиля"

Global Const $FSF_ALLOLDSTYLEFLAGS = BitOR ( _
    $BIF_DONTGOBELOWDOMAIN, $BIF_BROWSEINCLUDEFILES, $BIF_EDITBOX, $BIF_VALIDATE, _
    $BIF_BROWSEFORCOMPUTER, $BIF_BROWSEFORPRINTER, $BIF_RETURNONLYFSDIRS, $BIF_STATUSTEXT)
; Маска допустимых флагов для диалога "нового стиля"
Global Const $FSF_ALLNEWSTYLEFLAGS = BitOR ( $BIF_NEWDIALOGSTYLE, _
    $BIF_DONTGOBELOWDOMAIN, $BIF_BROWSEINCLUDEFILES, $BIF_EDITBOX, $BIF_VALIDATE, _
    $BIF_NONEWFOLDERBUTTON, $BIF_UAHINT, $BIF_SHAREABLE)

;  $sText - текст приглашения;
;  $iRoot - код корневого каталога (0 - "рабочий стол");
;  $iFlags - набор флагов;
;  $sIniDir - стартовый каталог;
;  $hWnd - хэндл родительского окна;
;  $sCallbackProc - имя CallBack-процедуры (или пустая строка)

Func _FileSelectFolder ($sText = '', $iRoot = 0, $iFlags = 0, $sIniDir = @ScriptDir, $hWnd = 0, $sCallbackProc = '_FileSFCallbackProc')
    Local $ret, $pidl, $res='', $pCallbackProc=0, $iMask = $FSF_ALLOLDSTYLEFLAGS
    ; Контроль входных параметров
    If $sIniDir<>'' Then $sIniDir = StringRegExpReplace($sIniDir, '([^\\])\\*$', '\1\\')
    If StringRight($sIniDir, 2)=':\' Then $sIniDir &= '\'
    If BitAND($iFlags, $BIF_NEWDIALOGSTYLE) Then $iMask = $FSF_ALLNEWSTYLEFLAGS
    ; Создание и инициализация основных структур данных
    Local $uBI = DllStructCreate ("hwnd;ptr;ptr;ptr;int;ptr;ptr;int") ; BROWSEINFO
    Local $uTX = DllStructCreate ("char[260];char") ; текст приглашения
    Local $uMP = DllStructCreate ("char[260]") ; путь/имя выбранного объекта
    Local $uCB = DllStructCreate ("char[260];int") ; CallBack структура
    DllStructSetData ($uTX, 1, $sText)
    DllStructSetData ($uCB, 1, $sIniDir)
    DllStructSetData ($uCB, 2, $iFlags)
    ; Заполнение структуры BROWSEINFO
    DllStructSetData ($uBI, 1, $hwnd)
    DllStructSetData ($uBI, 3, DllStructGetPtr($uMP))
    DllStructSetData ($uBI, 4, DllStructGetPtr($uTX))
    DllStructSetData ($uBI, 5, BitAND($iFlags, $iMask))
    DllStructSetData ($uBI, 7, DllStructGetPtr($uCB))
    ; Получение указателя на корневую папку (PIDL)
    DllCall ("shell32.dll", "ptr", "SHGetSpecialFolderLocation", "int", 0 , "int", $iRoot , "ptr", DllStructGetPtr($uBI, 2))
    ; Получение указателя на CallBack-функцию
    If $sCallbackProc<>'' Then DllStructSetData ($uBI, 6, _DllCallBack($sCallbackProc,'hwnd;uint;long;ptr'))
    ; Запуск системного диалога и обработка полученного указателя (PIDL)
    $pidl = DllCall ("shell32.dll", "ptr", "SHBrowseForFolder", "ptr", DllStructGetPtr($uBI))
    If IsArray($pidl) Then
        $res = DllStructGetData ($uMP, 1) ; сохраняем имя объекта
        If $pidl[0] Then
            $ret = DllCall ("shell32.dll", "int", "SHGetPathFromIDList", "ptr", $pidl[0], "ptr", DllStructGetPtr($uMP))
            If IsArray($ret) Then
                If
$ret[0] Then $res = DllStructGetData ($uMP, 1) ; сохраняем путь объекта
                DllCall ("ole32.dll", "int", "CoTaskMemFree", "ptr", $pidl[0]) ; чистим за собой
            EndIf
        EndIf
    EndIf
    If
$pCallbackProc Then _DllCallBack_Free ($pCallbackProc) ; закрытие указателя
    DllCall ("ole32.dll", "int", "CoTaskMemFree", "ptr", DllStructGetData ($uBI, 2)) ; чистим за собой
    Return $res
EndFunc ;==> _FileSelectFolder

; Функция обратного вызова для _FileSelectFolder по умолчанию

Func _FileSFCallbackProc ($hWnd, $iMsg, $wParam, $lParam)
    Local $uTB = DllStructCreate("char[260];ptr"), $uCB = DllStructCreate ("char[260];int", $lParam)
    Local Const $flg = BitOr($BIF_NEWDIALOGSTYLE, $BIF_RETURNONLYFSDIRS)
    Local $ret, $tst = BitXOR(BitAnd(DllStructGetData($uCB,2), $flg), $flg)
    Switch $iMsg
        Case $BFFM_INITIALIZED
            DllCall ("user32.dll","int","SendMessage", "hwnd", $hWnd, "int", $BFFM_SETSELECTIONA, "int", 1, "ptr", DllStructGetPtr($uCB,1))
            $ret = DllCall ("shell32.dll", "int", "SHParseDisplayName", _
                "wstr", DllStructGetData($uCB,1), "ptr", 0, "ptr", DllStructGetPtr($uTB,2), "int", 0, "ptr", 0)
            If IsArray($ret) Then
                If
$ret[0]=0 Then
                    _FileSFCallbackProc($hWnd, $BFFM_SELCHANGED, DllStructGetData($uTB,2), $lParam)
                    DllCall ("ole32.dll", "int", "CoTaskMemFree", "ptr", DllStructGetData($uTB,2)) ; чистим за собой
                EndIf
            EndIf
        Case $BFFM_SELCHANGED
            If $tst=0 Then
                $ret = DllCall("shell32.dll", "int", "SHGetPathFromIDList", "ptr", $wParam, "ptr", DllStructGetPtr($uTB,1))
                If IsArray($ret) Then
                    If $ret[0] Then
                        DllCall("user32.dll","int","SendMessage","hwnd",$hWnd,"int",$BFFM_ENABLEOK,"int",0,"ptr",1)
                    Else
                        DllCall("user32.dll","int","SendMessage","hwnd",$hWnd,"int",$BFFM_ENABLEOK,"int",0,"ptr",0)
                    EndIf
                EndIf
            EndIf
    EndSwitch
EndFunc ;==> __FileSFCallbackProc


geka6pucT 30-07-2007 22:27 620629

Как можно с помощью AutoIt3 использовать обычный Twain сканнер?

Creat0R 31-07-2007 04:04 620690

Maza Faka
Цитата:

как можно проиграть плейлист?
Это не так уж просто, я сам начал давненько писать плеер, всё никак не осмелюсь его закончить, чтобы ты более менее представлял себе структуру подобного плеера (в моём стиле ;) ), вот тебе пример с добавлением в плей лист как отдельных треков, так и плейлист-файла (*.m3u) - для считывания плейлист-файла я написал функцию обработки строк (_M3uToArray()), все пути к файлам треков считываются в массив...

Код:

#include <GUIConstants.au3>
#include <GuiListView.au3>
#include <Array.au3>

GUICreate("Player", 300, 200, -1, -1, -1)
GUISetIcon(@ProgramFilesDir & "\Winamp\winamp.exe", 0)

$Playlist = GUICtrlCreateListView("File Name|Path", 20, 50, 260, 120)

$Play = GUICtrlCreateButton("Play", 20, 10, 60)
$Open = GUICtrlCreateButton("Open", 110, 10, 60)

GUISetState()

While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = $Open
            $OpenFile = FileOpenDialog("Add selected file", "", "Sound files (*.mp3;*.m3u)", 1)
            If @error Then ContinueLoop

                        Local $FilesArray[2] = [1, $OpenFile]
            If StringRight($OpenFile, 3) = "m3u" Then $FilesArray = _M3uToArray($OpenFile)

                        For $i = 1 To UBound($FilesArray)-1
                $FileName = StringRegExpReplace($FilesArray[$i], "^.*\\", "")
                GUICtrlCreateListViewItem($FileName & "|" & $FilesArray[$i], $PlayList)
            Next
        Case $msg = $Play
            $Selected = _GUICtrlListViewGetItemText($PlayList, -1, 1)
            If $Selected <> "" Then
                SoundPlay($Selected, 0)
            Else
                MsgBox(64, "Error", "Please select file")
            EndIf
        Case $msg = $GUI_EVENT_CLOSE
            Exit
    EndSelect
WEnd

Func _M3uToArray($M3uPath)
    If StringRight($M3uPath, 4) <> ".m3u" Or Not FileExists($M3uPath) Then Return -1
    Local $OpenM3u = FileOpen($M3uPath, 0), $M3uArr[1]
    While 1
        $CurrentLine = FileReadLine($OpenM3u)
        If @error = -1 Then ExitLoop
        If StringLeft($CurrentLine, 4) <> "#EXT" Then _ArrayAdd($M3uArr, $CurrentLine)
    WEnd
    FileClose($OpenM3u)
    $M3uArr[0] = UBound($M3uArr) - 1
    Return $M3uArr
EndFunc

P.S
Чтобы после проигрывания одного трека начал проигрываться другой, нужно использовать библиотеку Sound.au3, там есть функции для определения статуса текущей песни, перемотка песни, ну и в принцепе все основные функции требуемые для примитивного плеера ;)

amel27
Цитата:

Исправленный вариант с расширенными комментариями
Биг сенкс! Возвращается имя обьекта как положенно! :up:

geka6pucT
Цитата:

Как можно с помощью AutoIt3 использовать обычный Twain сканнер?
А подробнее можно? “использовать” можно понять по разному ;)

Creat0R 31-07-2007 04:39 620692

amel27
Есть ещё проблема с функцией _FileOpenDialog() :shuffle: - Если использовать флаг 4 (возможность выделения более одного файла), то функция возвращает очень много символов | и иногда между ними проскакивают разные цифры...

Это лечится?

EgOrus 31-07-2007 07:36 620712

Товарищи, подскажите кто знает формат командной строки утилиты Exe2aut.exe кот. идет в комплекте с дистрибутивом?
В старых версиях было Exe2aut.exe /in файлю.exe /out файл.au3 . Видимо формат сменился или от комстроки совсем отказались.

Creat0R 31-07-2007 08:15 620720

EgOrus,
Цитата:

или от комстроки совсем отказались
Точнее забыли про неё :biggrin:
В 3.2.5.0 её вернули как я понял.

amel27 31-07-2007 13:03 620853

Creat0R
Цитата:

Это лечится?
опять танцы вокруг Binary :not-me:... замени кусок между If и EndIf:
Код:

If BitAND ($iOpt, 4) Then
    $i = 1
    While 1
        If Binary(DllStructGetData ($usFile, 1, $i))=0 Then
            If
Binary(DllStructGetData ($usFile, 1, $i+1))=0 Then
                ExitLoop
            Else

                DllStructSetData ($usFile, 1, '|', $i)
            EndIf
        EndIf

        $i += 1
    Wend
EndIf

P.S. честно говоря пока не понял как сравнивать бинарные данные, но вроде работает

EgOrus 31-07-2007 15:02 620915

Creat0R
благодарю, бэтку даже и не заметил

Creat0R 31-07-2007 17:00 620981

amel27,
Цитата:

замени кусок между If и EndIf:
Спасибо! всё работает как раньше!

Creat0R 02-08-2007 04:11 621601

Как можно послать уведомление в окно GUI, чтобы сработали все функции отзывающиеся на изменение размера окна ($GUI_EVENT_RESIZED и т.п)?

Т.е мне нужно чтобы после появления моего окна GUI, вызвалось что то вроде имитации изменения его размера (как будто бы юзер мышкой изменил размер гуи, и я говорю не про WinMove(), а про изменение с уведомлением (Notifycation)), мне это нужно для того, чтобы все контроли которым присвоено GUICtrlSetResizing(-1, $GUI_DOCKSIZE), поменяли своё положении в соответствии с текущим размером окна (данные о размере берутся с инишки).

Относительные позиции контролов заданы (относительно размерам окна гуи), но это не помагает, когда последний размер окна был довольно большим (данные записываются в инишку), то при уменьшении контроли как бы смещаются внутрь, что не есть гуд... перепробовал всевозможные значения размеров (для GUICtrlSetResizing()), но ничего(?) не подходит :(.

amel27 02-08-2007 07:42 621624

Creat0R
можно примерчик?... "на слух" сложно воспринять

ADD: обещанная CallBack-функция для _FileSelectFolder:
Код:

Func _MyFSFCallbackProc ($hWnd, $iMsg, $wParam, $lParam)
    Local $uCB = DllStructCreate ("char[260];int", $lParam)
    Switch $iMsg
        Case $BFFM_INITIALIZED
            DllCall ("user32.dll","int","SendMessage", _
                "hwnd", $hWnd, "int", $BFFM_SETSELECTIONA, "int", 1, "ptr", DllStructGetPtr($uCB))
        Case $BFFM_SELCHANGED
            Local $pIDL=_IDLGetLast($wParam) ; Переход к последнему элементу списка
            ; Условие на допустимые для выбора типы объектов
            If _IDLIsFolder($pIDL) Then
                DllCall ("user32.dll","int","SendMessage","hwnd",$hWnd,"int",$BFFM_ENABLEOK,"int",0,"ptr",1)
            Else
                DllCall ("user32.dll","int","SendMessage","hwnd",$hWnd,"int",$BFFM_ENABLEOK,"int",0,"ptr",0)
            EndIf
    EndSwitch
EndFunc ;==> _MyFSFCallbackProc

; Рекурсивная функция перехода к последнему объекту списка IDL
Func _IDLGetLast($pIDL)
    Local $u1 = DllStructCreate("ushort", $pIDL)
    Local $u2 = DllStructCreate("ushort", $pIDL + DllStructGetData($u1,1))
    If (DllStructGetData($u1,1) And DllStructGetData($u2,1)) Then Return _IDLGetLast(DllStructGetPtr($u2))
    Return $pIDL
EndFunc
; Возврат типа объекта по его PIDL
Func _IDLGetType($pIDL)
    Local $u = DllStructCreate("ushort;byte", $pIDL)
    Return DllStructGetData($u,2)
EndFunc
; Возврат размера IDL Data
Func _IDLGetSize($pIDL)
    Local $u = DllStructCreate("ushort", $pIDL)
    Return DllStructGetData($u,1)
EndFunc
; Проверка: является ли объект диском
Func _IDLIsDrive($pIDL)
    Local $iType = _IDLGetType($pIDL)
    Return $pIDL And ($iType=0x23 Or $iType=0x25 Or $iType=0x29 Or $iType=0x2F)
EndFunc
; Проверка: входит ли буква диска в строку
Func _IDLIsDriveIn($pIDL, $sDrv)
    Local $u = DllStructCreate("ushort;byte;char", $pIDL)
    If _IDLIsDrive($pIDL) Then Return $pIDL And StringInStr($sDrv, DllStructGetData($u,3),2)
    Return 0
EndFunc
; Проверка: является ли объектом файл
Func _IDLIsFile($pIDL)
    Local $iType = _IDLGetType($pIDL)
    Return $pIDL And ($iType = 0x32 Or $iType = 0x34)
EndFunc
; Проверка: является ли объектом каталог
Func _IDLIsFolder($pIDL)
    Local $iType = _IDLGetType($pIDL)
    Return $pIDL And ($iType = 0x30 Or $iType = 0x31)
EndFunc
; Проверка: является ли объектом компьютер
Func _IDLIsComputer($pIDL)
    Local $iType = _IDLGetType($pIDL)
    Return $pIDL And $iType=0x42
EndFunc
; Проверка: является ли объектом сетевой ресурс
Func _IDLIsShare($pIDL)
    Local $iType = _IDLGetType($pIDL)
    Return $pIDL And $iType=0xC3
EndFunc
; Проверка: является ли объектом "Рабочий стол"
Func _IDLIsDesktop($pIDL)
    Local $iSize = _IDLGetSize($pIDL)
    Return Not($pIDL And $iSize)
EndFunc
; Проверка: является ли объектом "Мой компьютер"
Func _IDLIsMyComputer($pIDL)
    Local $u = DllStructCreate("ushort;byte;byte;byte[16]", $pIDL)
    Return $pIDL And DllStructGetData($u,2)=0x1F And DllStructGetData($u,4)='0xE04FD020EA3A6910A2D808002B30309D'
EndFunc
; Проверка: является ли объектом папка "Мои документы"
Func _IDLIsMyDocuments($pIDL)
    Local $u = DllStructCreate("ushort;byte;byte;byte[16]", $pIDL)
    Return $pIDL And DllStructGetData($u,2)=0x1F And DllStructGetData($u,4)='0xBA8F0D4525ADD01198A80800361B1103'
EndFunc
; Проверка на соответствие регулярному выражению (только для файлов/каталогов)
Func _IDLPathRegExp($pIDL, $sRegExp)
    Local $ret, $res=0, $buf = DllStructCreate("char[260]")
    If $pIDL Then
        $ret = DllCall ("shell32.dll", "int", "SHGetPathFromIDList", "ptr", $pIDL, "ptr", DllStructGetPtr($buf))
        If $ret[0] Then $res = StringRegExp(DllStructGetData($buf,1),$sRegExp)
    EndIf
    Return $res
EndFunc


Creat0R 03-08-2007 00:54 622199

amel27,
Цитата:

можно примерчик?
Конечно, извеняюсь что сразу не привёл его...

Код:

#include <GuiConstants.au3>

Global $Width = 500
Global $Height = 360

$Gui = GuiCreate("Test", $Width, $Height, -1, -1, $WS_SIZEBOX+$WS_MINIMIZEBOX+$WS_MAXIMIZEBOX+$WS_BORDER)
GUIRegisterMsg(0x24, "MY_WM_GETMINMAXINFO")

$LV = GUICtrlCreateListView("Column", 20, 40, $Width-40, $Height-120)

$ButtonOK = GUICtrlCreateButton("OK", 20, $Height-60, 70, 20)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE)

$ButtonExit = GUICtrlCreateButton("Exit", 120, $Height-60, 70, 20)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE)

;Задаём новый размер ГУИ, это будет считано с инишки
$NewWidth = 700
$NewHeight = 400

$WinPosArr = WinGetPos($Gui) ;только для получения X и Y позиции
WinMove($Gui, "", $WinPosArr[0], $WinPosArr[1], $NewWidth, $NewHeight)

; Тут нужно выызвать ту самую имитацию, чтобы все контроли подстроились под новый размер.

GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case -3, $ButtonExit
            Exit
        Case Else

                EndSwitch
WEnd

; Функция для ограничения (минимального) размера окна гуи
Func MY_WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam)
    Local $MINMAXINFO = DllStructCreate("int;int;int;int;int;int;int;int;int;int",$lParam)
    Local $MINGuiX = 508, $MINGuiY = 368
    DllStructSetData($MINMAXINFO, 7, $MINGuiX)
    DllStructSetData($MINMAXINFO, 8, $MINGuiY)
    Return 0
EndFunc

Цитата:

обещанная CallBack-функция для _FileSelectFolder:
Спасибо!

Осталось несколько уточнении :shuffle:

1. Если начальный каталог не имеет слеша на конце (\), то этот каталог не задаётся функцией, а также если начальный каталог является буквой диска, то таких слешей должно быть аж два (C:\\).
Я конечно могу это решить стандартными средствами, поставив это в начало главной функции...

Код:

If StringLen($sIniDir) <= 3 Then $sIniDir &= "\"
If StringRight($sIniDir, 1) <> "\" Or StringLen($sIniDir) <= 3 Then $sIniDir &= "\"

(Кстати, $sIniDir это опечатка? может $sInitDir? :shuffle: )...

Но просто интересно, почему так происходит?

2. Может функцию диактивирования кнопки “ОК” сделать опционально? т.е чтобы это происходило только при использовании флага $BIF_RETURNONLYFSDIRS? (Сейчас оно в любом случае срабатывает).

3. При выборе обьекта рабочего стола, кнопка “ОК” тоже деактивируется, этот обьект вроде является папкой (т.е рабочий путь)?

4. Когда используется флаг $BIF_BROWSEINCLUDEFILES (для выбора файлов), то их выбрать невозможно :( - Кнопка “ОК” не активна.

Creat0R 03-08-2007 02:54 622217

С файлами разобрался, добавил ещё одно условие в функцию _MyFSFCallbackProc():

Цитата:

If _IDLIfDrive($iType) Or _IDLIfFolder($iType) Or _IDLIfFile($iType) Then

...

EndIf

amel27 03-08-2007 05:46 622249

Creat0R

1. $iniDir не причем - это у $BFFM_SETSELECTIONA такие требования... поправил через RegExp
2. Думал, но есть ряд трудностей... во-первых я не нашел аналога для $BIF_BROWSEFORPRINTER, во-вторых, это снизит гибкость CallBack-функции (сейчас можно задать любые условия на объект)
3. Добавил функцию _IDLIsDesktop()

Creat0R 03-08-2007 07:35 622270

amel27,
Цитата:

поправил через RegExp
Спасибо! кстати, а можно точно также править в обратную сторону? т.е очистить все символы с левой стороны? (только то что в начале).

Цитата:

есть ряд трудностей.
В принципе это не очень важно, редко когда понадобится возвращать эти элементы... в крайнем случае можно будет изменить ту серию условии ;)

Цитата:

Добавил функцию _IDLIsDesktop()
Спасибо, осталось только сделать функцию типа _IDLIsMyDocuments() :shuffle: - Документы весьма важная папка :)

amel27 04-08-2007 10:28 622814

Creat0R
Цитата:

а можно точно также править в обратную сторону? т.е очистить все символы с левой стороны?
конечно можно, какие нужно удалить?
Цитата:

В принципе это не очень важно
в дефолтовую функцию удалось добавить поддержку $BIF_RETURNONLYFSDIRS для любых стилей
Цитата:

осталось только сделать функцию типа _IDLIsMyDocuments()
добавил _IDLIsDriveIn(), _IDLIsMyComputer(), _IDLIsMyDocuments()


З.Ы. cмотрю, ты свою проблему с ресайзом решил?.. ;)

Creat0R 04-08-2007 12:20 622847

amel27,
Цитата:

какие нужно удалить?
Ну я как бы хотел это использовать в качестве параметра, т.е символ который нужно почистить будет передаваться как параметр в функции.

Ну к примеру символ |.

Цитата:

в дефолтовую функцию удалось добавить поддержку $BIF_RETURNONLYFSDIRS для любых стилей
А как это приминить? или я что-то не так понял? это ведь позволяет сделать опционально этот флаг?

Цитата:

cмотрю, ты свою проблему с ресайзом решил?
Почти, мне на оф. форуме подсказали альтернативу (и довольно простую)...

Код:

#include <GuiConstants.au3>

Global $Width = 500
Global $Height = 360

$Gui = GuiCreate("Test", $Width, $Height, -1, -1, $WS_SIZEBOX+$WS_MINIMIZEBOX+$WS_MAXIMIZEBOX+$WS_BORDER)
GUIRegisterMsg(0x24, "MY_WM_GETMINMAXINFO")

$LV = GUICtrlCreateListView("Column", 20, 40, $Width-40, $Height-120)

$ButtonOK = GUICtrlCreateButton("OK", 20, $Height-60, 70, 20)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE)

$ButtonExit = GUICtrlCreateButton("Exit", 120, $Height-60, 70, 20)
GUICtrlSetResizing(-1, $GUI_DOCKSIZE)

GUISetState(@SW_HIDE, $Gui)

$NewWidth = 700
$NewHeight = 500

$WinPosArr = WinGetPos($Gui) ;Just for get the X and Y positions
WinMove($Gui, "", $WinPosArr[0]-(($NewWidth-$Width)/2), $WinPosArr[1]-(($NewHeight-$Height)/2), $NewWidth, $NewHeight)
GUISetState(@SW_SHOW, $Gui)

GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case -3, $ButtonExit
            Exit
        Case Else

                EndSwitch
WEnd

Func MY_WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam)
    Local $MINMAXINFO = DllStructCreate("int;int;int;int;int;int;int;int;int;int",$lParam)
    Local $MINGuiX = 508, $MINGuiY = 368
    DllStructSetData($MINMAXINFO, 7, $MINGuiX)
    DllStructSetData($MINMAXINFO, 8, $MINGuiY)
    Return 0
EndFunc

Т.е сначала задать GuiSetState() (в невидимом режиме - @SW_HIDE), и только потом менять размер окна, тогда все контроли в соответствии с новым размером ГУИ меняют и своё положение).

amel27 04-08-2007 14:13 622887

Creat0R
Цитата:

я как бы хотел это использовать в качестве параметра
Код:

Func _StripLead($str, $chars)
    ;$chars = StringRegExpReplace($chars, '([][{}()|.?+*\\^])', '\\\1')
    $chars = StringRegExpReplace($chars, '([]\\^])', '\\\1') ; укороченный вариант для классов
    Return StringRegExpReplace($str,'^['& $chars &']+([^'& $chars &'])', '\1')
EndFunc

Цитата:

А как это приминить?
да как обычно... если задан флаг, то для "калассики" работает штатный метод, а для "нового стиля" автоматом подключается CallBack-функция... для этого ей передается указатель на структуру с флагами... ну, а если флаг не задан то никаких действий не проводится... Единственное ограничение - для "нового стиля" флаг $BIF_RETURNONLYFSDIRS будет подавлять действие штатного флага $BIF_SHAREABLE, поэтому (в текущей редакции) вместе их применять нельзя.

З.Ы. к тексту _MyFSFCallbackProc() добавил функцию _IDLPathRegExp()... может быть полезна при выборе конкретных типов файлов, например "*.EXE", маска передается в формате RegExp()

ADD: зачеркнул - постоянно забываю, что $BIF_SHAREABLE не влияет на "Ок", он меняет тип выводимых объектов в дереве

Creat0R 06-08-2007 04:28 623431

amel27,
Цитата:

_StripLead...
Спасибо!
Я кстати нашёл ещё один способ как это можно сделать, только не уверен надёжен ли он:

Код:

StringRegExpReplace($Str, '\A' & $Char & '+', '')

И для конечных символов...

StringRegExpReplace($Str, $Char & '+\z', '')



Цитата:

как обычно... если задан флаг, то для "калассики" работает штатный метод, а для "нового стиля" автоматом подключается CallBack-функция
Я флаги вовсе не ставлю, но кнопка всё ровно не активна, как будто флаг $BIF_RETURNONLYFSDIRS используется :idontnow:

Заметил один глюк при использовании $BIF_BROWSEINCLUDEFILES - Если сразу после появления окна нажать Отмена или ОК (на выбранном элементе), то функция не сразу возвращает (проходит около секунды).

И ещё, значки для файлов (если есть таковы в начальном каталоге), все имеют иконку Internet Explorer :) - А остальные значки (для папок и системные элементы), вовсе не имеют значков, все как будто папки... это длится также около секунды, потом всё нормально становится.

amel27 06-08-2007 07:46 623447

Creat0R
Цитата:

кстати нашёл ещё один способ как это можно сделать
угу, в принципе то же самое, только у тебя для одного символа, а у меня для произвольного набора начальных символов... а "плюсик" ты правильно подметил ;) ... у себя тоже поправил, и укоротил строку замены
Цитата:

флаги вовсе не ставлю, но кнопка всё ровно не активна
исправил (с битовыми операциями намутил), и еще добавил симуляцию "селекта" для дефолтовой папки - на ней не срабатывало затенение "Ок" (так как не было сообщения $BFFM_SETSELECTION)
Цитата:

Если сразу после появления окна нажать Отмена или ОК (на выбранном элементе), то функция не сразу возвращает (проходит около секунды).
да нет, у меня вроде без тормозов :dont-know
Цитата:

значки для файлов (если есть таковы в начальном каталоге), все имеют иконку Internet Explorer - А остальные значки (для папок и системные элементы), вовсе не имеют значков, все как будто папки... это длится также около секунды, потом всё нормально становится.
ну, это експлорер так обновляет элементы... тут видимо ничего не поделать

Creat0R 06-08-2007 08:57 623471

amel27,
Цитата:

в принципе то же самое, только у тебя для одного символа
Да нет вроде... (для этого там и плюсик ;) ) - Я понял что ты имел в виду - если в качестве символа задана серия разных символов, то в моём случае только первое вхождение будет заменено...
Но и с ствоим методом есть небольшая проблема:

Код:

$Char = '\t'

$Char = StringRegExpReplace($Char, '([][{}()|.?+*\\^])', '\\\1')
$Ret = StringRegExpReplace("\\test", '(?i)^[' & $Char & ']+([^' & $Char & '])', '\1')

ConsoleWrite($Ret)

Т.е под символ \ подставляется ещё один такой символ (для его отмены), и тогда неверно возвращается (должно в этом случае вернуться исходное значение - без изменении, так как в начале не найдено вхождение \t).



Вот функция (для чего вообще мне и требовалось сия опция), позволяет стриппить (обножать) определённый(е) символ(ы):

Код:

;=======================================
;$Flag = 0 (или любое значение кроме 1,2, и 3) - обычная замена всех вхождении заданного символа
;$Flag = 1 - убирание заданного символа в начале $String
;$Flag = 2 - убирание заданного символа в конце $String
;$Flag = 3 - убирание заданного символа в начале и в конце $String
;
;$ReplaceAll = 0 (по умолчанию) - заменяется только первое вхождение заданного(ных) символа(ов)
;$ReplaceAll = 0 - заменяются все вхождения символов с заданой стороны (в зависимости от значения $Flag)
;=======================================
Func _StringStripChars($String, $Char, $Flag=0, $ReplaceAll=0)
    If StringLen($String) = 0 Or Not StringInStr($String, $Char) Then Return SetError(1, 0, $String)
    Local $Patern, $RetStr = $String
    $Char = StringRegExpReplace($Char, '([][{}()|.?+*\\^])', '\\\1')
    Switch $Flag
        Case 1
            $Patern = '(?i)\A' & $Char
            If $ReplaceAll = 1 Then $Patern = '(?i)\A' & $Char & '+'
            $RetStr = StringRegExpReplace($String, $Patern, '')
            Return $RetStr
        Case 2
            $Patern = '(?i)' & $Char & '\z'
            If $ReplaceAll = 1 Then $Patern = '(?i)' & $Char & '+\z'
            $RetStr = StringRegExpReplace($String, $Patern, '')
            Return $RetStr
        Case 3
            $Patern = '(?i)\A' & $Char & '|' & $Char & '\z'
            If $ReplaceAll = 1 Then $Patern = '(?i)\A' & $Char & '+|' & $Char & '+\z'
            $RetStr = StringRegExpReplace($String, $Patern, '')
            Return $RetStr
        Case Else
            $String = StringReplace($String, $Char, '')
            Return SetError(0, @extended, $String)
    EndSwitch
    Return SetError(2, 0, $String)
EndFunc

В этой функции хотелось бы реализовать ещё одну тему - чтобы в качестве $ReplaceAll можно было задать параметр для указания того, сколько символов следует убирать. Т.е если передать к примеру 3, тогда только три первых(/последних/с обоих сторон) символа (заданных через $Char) будут убираться, если же оставить этот параметр по умолчанию (0), то чтобы убирался только первый символ, для убирания всех начальных/конечных символов, задавать -1.
Это конечно можно сделать проверкой длины и т.п... но хотелось именно средствами RegExp...

Цитата:

исправил
Что-то я если честно запутался уже - где следует использовать функцию _MyFSFCallbackProc(), а где _FileSFCallbackProc() :dont-know

Цитата:

у меня вроде без тормозов
Это при использовании флага $BIF_BROWSEINCLUDEFILES? без него всё нормально.

amel27 06-08-2007 11:49 623560

Creat0R
Цитата:

должно в этом случае вернуться исходное значение - без изменении, так как в начале не найдено вхождение \t
дык это уже получается замена подстроки, а не символов... у меня удаляются любые символы (из заданного множества) в любом сочетании, в твоей функции в это множество входит только один символ
Цитата:

В этой функции хотелось бы реализовать ещё одну тему - чтобы в качестве $ReplaceAll можно было задать параметр для указания того, сколько символов следует убирать.
Код:

; $Chars - удаляемые символы
; $Flags - тип замены:
;  $Flag = 0 - удаление символов по всей строке
;  $Flag = 1 - удаление символов в начале строки
;  $Flag = 2 - удаление символов в конце строки
;  $Flag = 3 - удаление символов в начале И в конце строки
;  другие значения флагов равносильны $Flag = 0, $Count=0
; $Count - количество удаляемых символов
;  $Count<=0 - глобальное удаление всех вхождений (для заданных значений флагов)

Func _StringStripChars($String, $Chars, $Flag=0, $Count=0)
    $Chars = StringRegExpReplace($Chars, '([]\\^])', '\\\1')
    Local $Pattern = '(?i)[' & $Chars & ']', $sCnt = '{1,'& $Count &'}'
    If $Count<=0 Then $sCnt='+'
    If $Flag <>0 Then $Count = 0
    If $Flag=1 Then $Pattern= '(?i)^['& $Chars &']'& $sCnt
    If $Flag=2 Then $Pattern= '(?i)[' & $Chars &']'& $sCnt &'$'
    If $Flag=3 Then $Pattern= '(?i)^['& $Chars &']'& $sCnt &'|[' & $Chars &']'& $sCnt &'$'
    Return StringRegExpReplace($String, $Pattern, '', $Count)
EndFunc

Цитата:

Цитата Creat0R
Что-то я если честно запутался уже - где следует использовать функцию _MyFSFCallbackProc(), а где _FileSFCallbackProc()

пока хватает штатной имхо _MyFSFCallbackProc не нужна

Creat0R 06-08-2007 21:07 623797

amel27,
Цитата:

Цитата amel27
это уже получается замена подстроки, а не символов...

Ну почему, мы как бы заменяем набор символов с определённой стороны (или с обоих), на оф форуме часто спрашивают про подобные действия, такая функция во многих случаях бывает очень полезной.

Спасибо за (довольно укороченную) функцию _StringStripChars() :) - но в ней тоже есть проблема...

К примеру:

Код:

$Ret = _StringStripChars("_test_", '-_', 1, 0)

ConsoleWrite($Ret)

Получаем на выходе test_ - а должно вернуться _test_, т.е должно заменяться только найденное в начале (из за того что указан $Flag = 1), ведь там нету символа -.

А вот к примеру если имеем такую строку: -_-_test_, то используя $Count = 1 должно вернуться -_test_

Код:

$Ret = _StringStripChars("-_-_test_", '-_', 1, 1)

ConsoleWrite($Ret)

А возвращается _-_test_ - я понимаю что заменяется только первое вхождение, но суть этой функции в том, чтобы заменялось то вхождение, которое передаётся через $Chars, вне зависимости от количества символов, т.е чтобы оно расматривалось как одно целое значение (символ).

У меня получилось это сделать обычными средствами (циклами и проверками String...), но это не так быстро как через RegExp :(.

Цитата:

пока хватает штатной
Спасибо, теперь всё стало ясно! в принципе больше от этой функции (я имею в виду вообще всё что касается _FileSelectFolder() ), ничего и не требуется, достигнут как говорится - идеал! :)

amel27 07-08-2007 03:45 623881

Creat0R
Цитата:

т.е чтобы оно расматривалось как одно целое значение (символ)
"несколько символов как одно целое" вроде и есть строка ;) тогда и UDF должна по другому называться:
Код:

; $SubString - удаляемая подстрока
; $Flags - тип замены:
;  $Flag = 0 - удаление вхождений подстроки по всей строке
;  $Flag = 1 - удаление вхождений подстроки в начале строки
;  $Flag = 2 - удаление вхождений подстроки в конце строки
;  $Flag = 3 - удаление вхождений подстроки в начале И в конце строки
;  другие значения флагов равносильны $Flag = 0, $Count=0
; $Count - количество удаляемых вхождений
;  $Count<=0 - глобальное удаление всех вхождений (для заданных значений флагов)

Func _StringStripString($String, $SubString, $Flag=0, $Count=0)
    $SubString = StringRegExpReplace($SubString, '([][{}()|.?+*\\^])', '\\\1')
    Local $Pattern = '(?i)(' & $SubString & ')', $sCnt = '{1,'& $Count &'}'
    If $Count<=0 Then $sCnt='+'
    If $Flag <>0 Then $Count = 0
    If $Flag=1 Then $Pattern= '(?i)^('& $SubString &')'& $sCnt
    If $Flag=2 Then $Pattern= '(?i)(' & $SubString &')'& $sCnt &'$'
    If $Flag=3 Then $Pattern= '(?i)^('& $SubString &')'& $sCnt &'|(' & $SubString &')'& $sCnt &'$'
    Return StringRegExpReplace($String, $Pattern, '', $Count)
EndFunc

Цитата:

достигнут как говорится - идеал
тут идеала ИМХО не бывает :) ... к примеру, есть идея добавить автоматическое "раскрытие" содержимого папки для флага $BIF_BROWSEINCLUDEFILES... как ты думаешь?.. Ну и далеко не все возможности SHBrowseForFolder() еще использованы ;)

З.Ы. в функции _StringStripChars() была ошибка - слово "Pattern" кое-где было с одной "t" (исправил)

Creat0R 07-08-2007 04:34 623887

amel27,
Цитата:

тогда и UDF должна по другому называться:
Название мне нравится :) - а функционал ещё больше! Спасибо!

Цитата:

есть идея добавить автоматическое "раскрытие" содержимого папки для флага $BIF_BROWSEINCLUDEFILES... как ты думаешь?
Да, было бы полезно.

Кстати, теперь почему то не нужно проверять окончание начального каталога, т.е работает без тех двух добавленных строк (с ними кстати НЕ работает :) ).

Цитата:

в функции _StringStripChars() была ошибка - слово "Pattern" кое-где было с одной "t" (исправил)
Да, я заметил, забыл сказать ;)

amel27 07-08-2007 11:23 623984

Creat0R
Цитата:

Да, было бы полезно
обломс... :( помучил я сообщение $BFFM_SETEXPANDED и мне не понравилось. Да, оно открывает папку, но не всегда - если файлов в папке многовато, то папка отображается вообще как пустая (без "плюсика"), причем не нашел возможности потом "обновить" список папок, хотя может только у меня такой глюк? Странно, что нигде в тырнете не нашел ничего подобного... Одно радует - в "классическом" варианте папка всегда открывается. Можешь сам проверить - попробуй в CallBack-функции вместо:
Код:

DllCall ("user32.dll","int","SendMessage", "hwnd", $hWnd, "int", $BFFM_SETSELECTIONA, "int", 1, "ptr", DllStructGetPtr($uCB,1))
подставить:
Код:

DllCall ("user32.dll","int","SendMessage", "hwnd", $hWnd, "int", $BFFM_SETEXPANDED, "int", 1, "wstr", DllStructGetData($uCB,1))
Цитата:

Кстати, теперь почему то не нужно проверять окончание начального каталога, т.е работает без тех двух добавленных строк (с ними кстати НЕ работает )
прямо мистика... :dont-know тут я ничего не менял, хотя первую-то строчку наверное надо оставить?

spooll 07-08-2007 12:43 624039

Премного извиняюсь, почитал документацию, немного разобрался, стал скрипты писать, все ок, но теперь понадобилось сделать так, чтобы если программа уже установлена, то скрипт завершался, сразу не нашел , а тут страниц очень много, подскажите пожалуйста :)
Типа такого:
if exists ("c:\1c\1c.exe") Then Exit

Maza Faka 07-08-2007 14:13 624090

spooll,
Либо так и проверять, к примеру:
Код:

If FileExists(@ProgramFilesDir & "\MyProgram\Program.exe") Then
    Exit
Else
    ;...Your script
EndIf

Либо проверять ключ в реестре:
Код:

If RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ICQLite", 1) Then
    Exit
Else
    ;...Your script
EndIf


spooll 07-08-2007 15:35 624155

Цитата:

If FileExists(@ProgramFilesDir & "\MyProgram\Program.exe") Then
С полным путем получилось!Спасибо огромное :)

Creat0R 07-08-2007 17:16 624197

amel27,
Цитата:

Одно радует - в "классическом" варианте папка всегда открывается. Можешь сам проверить - попробуй в CallBack-функции вместо:
У меня с этой заменой вообще не задаётся начальный каталог в "классическом" стиле :dont-know

Цитата:

хотя первую-то строчку наверное надо оставить?
У меня и без неё всё нормально работает.

P.S
У меня такой вопрос - если я использую новый стиль, а скрипт будет запущен на старой машине (где он не поддерживается, т.е где ещё нету IE 5), что произойдёт с этой функцией? она перейдёт в старый стиль, или сразу вернёт ошибку? или вообще скрипт выпадет? :)

spooll 07-08-2007 17:36 624210

Вот еще ребят!Почему-то не работает время winWaitActive , т.е когда я указываю время:

PHP код:

WinWaitActive ("notepad" "new document" 100000

то если даже через секунду после запуска, я это окно сделаю активным, то все остальные команды, как send enter и т.д уже не работают на этом окне !:)

Maza Faka 07-08-2007 18:02 624217

spooll
У меня работает:
Код:

WinWaitActive("Безымянный - Блокнот", "", 100000)
ControlSend("Безымянный - Блокнот", "", "Edit1", "Hello world")

Проверь правильно ли указан заголовок окна.

Diamond 07-08-2007 18:29 624229

spooll
Зачем выставлять сто тысяч секунд? (Обычно 2-3 секунды бывает достаточно.) :)
Код:

$ret = WinWaitActive ("Текстовый документ", "" , 3)
If $ret = 1 Then
;~        Send()  и т.д
Else
        MsgBox(0,"","Команда не дождалась активного окна")
Endif

А лучше не дожидаться активности окна, а активизировать его принудительно:
Код:

$ret = WinWait ("Текстовый документ", "" , 3)
If $ret = 1 Then
        WinActivate("Текстовый документ","")
        Sleep(100)
;~        Send()  и т.д
Else
        MsgBox(0,"","Окно не существует")
Endif


spooll 07-08-2007 18:55 624238

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

Цитата Diamond
$ret

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

If FileExists("C:\Program Files\1Cv77\BIN\1CV7s.exe") Then
    Exit
    Else
Run("\\192.168.11.198\Distrib\1s_install\B770023\Disk1\setup.exe")
WinWaitActive("Добро пожаловать", "Добро пожаловать в программу установки")
Send("{ENTER}")
WinWaitActive("Выбор варианта установки", "Выберите вариант установки программы")
Send("{ENTER}")
WinWaitActive("Информация о пользователе", "Введите Ваше имя и название")
Send("{ENTER}")
WinWaitActive("Информация о пользователе", "Вы сообщили следующую информацию")
Send("{ENTER}")
WinWaitActive("Выбор каталога для установки", "Программа установки поместит 1С")
Send("{ENTER}")
WinWaitActive("Создание нового каталога")
Send("{ENTER}")
WinWaitActive("Выбор программной группы", "Выберите из существующих или")
Send("{ENTER}")
WinWaitActive("Установка 1С:Предприятия", "Программа установки скопировала файлы")
Send("{ENTER}")
WinWaitActive("Установка 1С:Предприятия", "Установка программы 1С")
Send("{ENTER}")
Run("\\192.168.11.198\Distrib\1s_install\B770025\Disk1\setup.exe")
WinWaitActive("Добро пожаловать", "Добро пожаловать в программу установки")
Send("{ENTER}")
WinWaitActive("Список установленных программ", "Из списка найденных на данном компьютере")
Send("{ENTER}")
WinWaitActive("Обновление 1С:Предприятия", "При работе с сетевыми версиями")
Send("{ENTER}")
WinWaitActive("Обновление 1С:Предприятия", "Обновление программы 1С")
Send("{ENTER}")
Run("\\192.168.11.198\Distrib\1s_install\B770025\1C_patch_7725\1Cv77SQL_025_Patch.exe")
WinWaitActive("Патч 1С:Предприятие 7.7.025", "Вы запустили программу")
ControlClick ("Патч 1С:Предприятие 7.7.025", "Вы запустили программу", "Button1")
WinWaitActive("PatchWise Updater")
Send("{ENTER}")
ControlClick ("Патч 1С:Предприятие 7.7.025", "Вы запустили программу", "Button2")
EndIf

Это выходит перед каждой строкой нужно ставить WinActivate +заголовок последующего окно +время в секундах сколько ему ждать?! :) Просто вроде несложная задача и хотелось бы сначала попроще . Спасибо что помогаете.

Maza Faka 07-08-2007 19:16 624247

spooll
Цитата:

Цитата spooll
Это выходит перед каждой строкой нужно ставить WinActivate

Нет. Вставь в начало скрипта
Код:

BlockInput(1)
а в конец скрипта
Код:

BlockInput(0)
пока приложение не установится, ввод будет заблокирован.

Creat0R 07-08-2007 23:45 624340

spooll,
Цитата:

чтобы при утсановки пользователю на комп, он случайно не сбил активность окна
Советую использовать вместо Send() - ControlSend(), ну или ControlClick(), это действует даже для не активных окон.

Можно ещё поставить на выполнение чтобы все окна постоянно сворачивалось (хотя не идеальный вариант):

Код:

AdlibEnable("MinimizeWindows", 100)

Func MinimizeWindows()
        WinMinimizeAll()
EndFunc

а потом в конце восстановить всё:

Код:

WinMinimizeAllUndo()

Creat0R 08-08-2007 05:32 624392

Как можно узнать заголовок окна сохранения?
На каждой системе, в зависимости от язка системы, этот заголовок будет разным, на английской к примеру Save As, на русской Сохранить как, а как быть с системами на других языках? может можно как то получить это имя с конфигов системы? где оно всё хранится?

amel27 08-08-2007 05:36 624393

Creat0R
Цитата:

У меня с этой заменой вообще не задаётся начальный каталог в "классическом" стиле
дык в классике она и не нужна - там каталог, выбранный по $BFFM_SETSELECTION итак открывается, а в "новом стиле" выбирается но остается закрытым и если нужен файл приходится кликать плюсик... Кстати, это сообщение не поддерживается не только старым стилем, но и Windows 2000.
Цитата:

У меня и без неё всё нормально работает
хм... у меня тоже, тогда уберу... попозжа
Цитата:

если я использую новый стиль, а скрипт будет запущен на старой машине (где он не поддерживается, т.е где ещё нету IE 5), что произойдёт с этой функцией? она перейдёт в старый стиль, или сразу вернёт ошибку? или вообще скрипт выпадет?
Если рассуждать логически, то отсутствие поддержки "нового стиля" равносильно отсутствию поддержки флага $BIF_NEWDIALOGSTYLE, из чего следует что должен отработать старый стиль. Кстати, для проверки версии достаточно вернуть версию "comctl32.dll", линк: http://msdn2.microsoft.com/en-us/library/ms649534.aspx

На заметку. Незадействованные возможности SHBrowseForFolder():

- сообщение $BFFM_SETEXPANDED. По ходу толку от него мало, так как работает глючно (у меня).
- сообщение $BFFM_VALIDATEFAILED. Имеет смысл только при использовании поля редактирования (флаг $BIF_EDITBOX), можно к примеру выводить текст предупреждения или затенять "Ок" если набран несуществующий путь.... реализуется просто, вот только надо ли?
- сообщение $BFFM_SETOKTEXT, поддержка минимальная (только для $BIF_RETURNONLYFSDIRS), для расширенной проверки атрибутов выбранного элемента придется ваять свой вариант CallBack-функции (как в _MyFSFCallbackProc)... либо нужно сочинять свой набор флагов и через него передавать какие типы нам нужны;
- есть возможность по ходу возвращать код картинки (иконки) выбранного элемента;
- есть возможность фильтрации отображаемых элементов, это более мощное средство чем затенение "Ок", но средствами одного скрипта нереализуемо, т.к. нужно создавать свой COM-объект.... как варианты: 1) использовать DLL, 2) использовать скрипты WSH. Первый сложней в реализации, но быстрей, второй - проще (через VBS-скрипт), но дюже медленный.... особенно если учесть, что объект будет вызываться для КАЖДОГО элемента списка.

amel27 08-08-2007 06:50 624399

Цитата:

Цитата Creat0R
Как можно узнать заголовок окна сохранения?

интересно, зачем?... это внешнее окно или AutoIT-овское?... логично предположить, что в comdlg32.dll ;)

ADD: DLL тоже не гарантия - если на английский WIN накатить MUI (к примеру - русский), то текст заголовка будет взят из файла \WINDOWS\MUI\FallBack\0419\comdlg32.dll.mui

spooll 08-08-2007 10:48 624493

Maza Faka,

:laugh:

Я конечно подозревал, но всеравно запустил скрипт с
Цитата:

Цитата Maza Faka
BlockInput(1)

естественно, при любой ошибке или просто косяке (у меня например почему-то не прошло окно выбора каталога установки) у меня все заблокировалось и пришлось жать ресет =)))
Как сделать чтобы допустим при заминки или просто не выполнения скрипта, блок снимался? :)

Diamond 08-08-2007 12:40 624587

spooll
Цитата:

Как сделать чтобы допустим при заминки или просто не выполнения скрипта, блок снимался?
Нужно чтобы скрипт достиг конца и выполнил команду BlockInput(0).
Другой вопрос, почему этого не происходит? - Причин может быть несколько, вот одна из них: Если в WinWaitActive() или WinWait() время ожидания не указано или указан 0, то в случае ошибки, ожидание будет бесконечным.

spooll 08-08-2007 13:03 624609

То есть если имеем
Код:

BlockInput(1)
Run("\\192.168.11.198\Distrib\1s_install\B770023\Disk1\setup.exe")
WinWaitActive("Добро пожаловать", "Добро пожаловать в программу установки")
Send("{ENTER}")
WinWaitActive("Выбор варианта установки", "Выберите вариант установки программы")
Send("{ENTER}")
BlockInput(0)

То если к WinWaitActive добавить 10сек к примеру, то скрипт останавливится в случае простоя?

Diamond 08-08-2007 13:12 624617

spooll
Тогда WinWaitActive подождёт 10 секунд и затем перейдёт к следующей команде , а если WinWaitActive дождалась активного окна раньше 10 секунд, то переход произойдёт сражу же.

Добавлено:

Например можно заключит всё это в функцию, чтобы в случае ошибки выйти из неё.
Код:

test()

Func test()
        BlockInput(1)
        Run("\\192.168.11.198\Distrib\1s_install\B770023\Disk1\setup.exe")
        $ret=WinWaitActive("Добро пожаловать", "Добро пожаловать в программу установки",10)
        If $ret Then
                Send("{ENTER}")
        Else
                BlockInput(0)
                Return ; Выход из функции
        EndIf
        $ret=WinWaitActive("Выбор варианта установки", "Выберите вариант установки программы",10)
        If $ret Then
                Send("{ENTER}")
        Else
                BlockInput(0)
                Return ; Выход из функции
        EndIf
EndFunc


Maza Faka 08-08-2007 14:28 624683

spooll,
Цитата:

Цитата spooll
Как сделать чтобы допустим при заминки или просто не выполнения скрипта, блок снимался?

Волшебное сочетание клавиш: Ctrl + Alt + Delete :-)

spooll 08-08-2007 14:42 624701

Diamond, спасибо за пример, переделал весь скрипт, немогу протестить как он поведет в случае ошибки, но все прошло гладко. Надеюсь завтра с утра мне не посыпятся звонки :)
И еще, я так понял, т.к AutoIT работает с активными окнами, то тихую установку без известия пользователя не сделать!Так ведь? Типа как параметр /quiet у msi пакетов?! :dont-know

Maza Faka 08-08-2007 15:03 624718

Код:

Case $msg = $playlist
      $m3u = FileOpenDialog("Add playlist", "", "Playlist (*.m3u)", 1)
      If @error Then ContinueLoop
          _FileReadToArray($m3u, $m3u_array)
              $sound = _SoundOpen($m3u_array[1])
              _SoundPlay($sound)

Если в плейлисте прописаны пути к mp3-файлам, которые находятся в каталоге откуда запускается скрипт, то файлы проигрываются, если прописаны пути к mp3-файлам которые находятся в другом каталоге, то не проигрываются, как я понял, игнорируются пути, почему?

spooll 08-08-2007 16:15 624765

Блин, чегойто я натворил непонятно, только все работало...
PHP код:

$ret=WinWaitActive("Создание нового каталога"20)
    If 
$ret Then
        Send
("{ENTER}")
    Else
        
BlockInput(0)
        Return ; 
Выход из функции
    
EndIf
$ret=WinWaitActive("Выбор программной группы""&Папки с Программами:"10)
    If 
$ret Then
        Send
("{ENTER}")
    Else
        
BlockInput(0)
        Return ; 
Выход из функции
    
EndIf 

Когда появляется окно с "Выбор программной группы", то enter не жмется и блок не снимается, как-будто он жмет enter раньше окна, но судя по скрипту такого быть не может =( Что можно сделать? ControlClick и ControlSend пробовал!

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

VelDmi 08-08-2007 16:40 624786

Некоторое время назад здесь приводился скрипт, для отключения монитора. Я его запустил, да только при любом шевелении мышкой или клавиатурой монитор включается! Как сделать так, чтобы монитор включался ТОЛЬКО по горячей клавише. Хочется управлять винампом горячими клавишами клавиатуры не включая монитор.

Maza Faka 08-08-2007 16:41 624787

spooll
У тебя ошибка в синтаксисе функции "$ret=WinWaitActive("Создание нового каталога", 20)"
Цитата:

Если нужно указать опциональный параметр, то все его предшественники должны быть тоже указаны!
Код:

WinWaitActive("Создание нового каталога", "", 20)
Не проще ли проверять так:
Код:

If WinWaitActive("Создание нового каталога", "", 20) Then
    Send("{ENTER}")
Else
    BlockInput(0)
    Return
EndIf


spooll 08-08-2007 17:30 624814

Maza Faka,
лично у меня не пашет вот эта строка
PHP код:

$ret=WinWaitActive("Выбор программной группы""&Папки с Программами:"10)
    If 
$ret Then
        Send
("{ENTER}")
    Else
        
BlockInput(0)
        Return ; 
Выход из функции
    
EndIf 

Цитата:

Цитата Maza Faka
If WinWaitActive("Создание нового каталога", "", 20) Then Send("{ENTER}") Else

всеравно не работает, окно просто "зависает". :(

Diamond 08-08-2007 23:06 624953

spooll
Цитата:

всеравно не работает, окно просто "зависает".
Возможно, Send("{ENTER}") попадает не по "адресу"...
Лично я бы использовал только WinWait() и ControlClick(). Во-первых, при этом отпадает необходимость в BlockInput(), во-вторых, ControlClick() обращается непосредственно к элементу(кнопке), поэтому вероятность ошибки здесь минимальна.

Creat0R 08-08-2007 23:10 624955

amel27
Цитата:

достаточно вернуть версию "comctl32.dll"
Т.е вот так?:

Код:

Round(FileGetVersion(@SystemDir & "\system32\comctl32.dll"), 1)
Цитата:

- есть возможность фильтрации отображаемых элементов
Т.е можно будет к примеру задавать отображение содержимого одного конкретного каталога (с определёнными именами папок/файлов) ? это было бы вообще супер!

Цитата:

т.к. нужно создавать свой COM-объект
ptrex (тоже один из "великих умов" оф форума :biggrin: ) вроде на эту тему что то делал тут, утверждает что можно всё же собственные обьекты создавать на Аутоите.

Цитата:

интересно, зачем?
Нужно для изменения формата в диалоге сохранения страницы браузера (Opera), т.е окно естественно не аутоитовское :).
Цитата:

логично предположить, что в comdlg32.dll
А как с него вытянуть это? :dont-know

Я пока остановился на таком решении:

Код:

Opt("WinTitleMatchMode", 4)
$Title = WinGetTitle("classname=#32770", "FolderView")

Можешь плиз потвердить, возвращает ли оно у тебя правильный заголовок с окна сохранения (любой программы)?

spooll,
Во-первых для ручного отключения BlockInput() не нужно жать ресет, нужно вызвать сочетания клавиш Ctrl Alt Del ;)

Во-вторых, зачем тебе постоянно ждать активность окна? можно просто ждать появление окна (WinWait()).

Цитата:

Везде поставил время WinWaitActive 20, но всеравно виснет
Потому что окно не активируется....

Вот пример как ты можешь это сделать:

Код:


;Предотвращаем вылет скрипта в случае не удачного запуска программ
Opt("RunErrorsFatal", 0)

If FileExists("C:\Program Files\1Cv77\BIN\1CV7s.exe") Then Exit

BlockInput(1)

Run("\\192.168.11.198\Distrib\1s_install\B770023\Disk1\setup.exe")
If @error Then Quit()

WinWait("Добро пожаловать", "Добро пожаловать в программу установки", 20)
ControlClick("Добро пожаловать", "Добро пожаловать в программу установки", "Button")

WinWait("Выбор варианта установки", "Выберите вариант установки программы", 20)
ControlClick("Выбор варианта установки", "Выберите вариант установки программы", "Button")

WinWait("Информация о пользователе", "Введите Ваше имя и название", 20)
ControlClick("Информация о пользователе", "Введите Ваше имя и название", "Button")

WinWait("Информация о пользователе", "Вы сообщили следующую информацию", 20)
ControlClick("Информация о пользователе", "Вы сообщили следующую информацию", "Button")

WinWait("Выбор каталога для установки", "Программа установки поместит 1С", 20)
ControlClick("Выбор каталога для установки", "Программа установки поместит 1С", "Button")

WinWait("Создание нового каталога", "", 20)
ControlClick("Создание нового каталога", "", "Button")

WinWait("Выбор программной группы", "Выберите из существующих или", 20)
ControlClick("Выбор программной группы", "", "Button")

WinWait("Установка 1С:Предприятия", "Программа установки скопировала файлы", 20)
ControlClick("Установка 1С:Предприятия", "Программа установки скопировала файлы", "Button")

WinWait("Установка 1С:Предприятия", "Установка программы 1С", 20)
ControlClick("Установка 1С:Предприятия", "Установка программы 1С", "Button")

Run("\\192.168.11.198\Distrib\1s_install\B770025\Disk1\setup.exe")
If @error Then Quit()

WinWait("Добро пожаловать", "Добро пожаловать в программу установки", 20)
ControlClick("Добро пожаловать", "Добро пожаловать в программу установки", "Button")

WinWait("Список установленных программ", "Из списка найденных на данном компьютере", 20)
ControlClick("Список установленных программ", "Из списка найденных на данном компьютере", "Button")

WinWait("Обновление 1С:Предприятия", "При работе с сетевыми версиями", 20)
ControlClick("Обновление 1С:Предприятия", "При работе с сетевыми версиями", "Button")

WinWait("Обновление 1С:Предприятия", "Обновление программы 1С", 20)
ControlClick("Обновление 1С:Предприятия", "Обновление программы 1С", "Button")

Run("\\192.168.11.198\Distrib\1s_install\B770025\1C_patch_7725\1Cv77SQL_025_Patch.exe")
If @error Then Quit()

WinWait("Патч 1С:Предприятие 7.7.025", "Вы запустили программу", 20)
ControlClick("Патч 1С:Предприятие 7.7.025", "Вы запустили программу", "Button1")

WinWait("PatchWise Updater", "", 20)
ControlClick("PatchWise Updater", "", "Button")

ControlClick("Патч 1С:Предприятие 7.7.025", "Вы запустили программу", "Button2")

Quit()

Func Quit()
    BlockInput(0)
    Exit
EndFunc



Везде где в функции ControlClick встречается "Button", замени на настоящее имя контроля (используя утилиту Au3Info.exe).

Creat0R 08-08-2007 23:27 624964

Maza Faka,
Цитата:

если прописаны пути к mp3-файлам которые находятся в другом каталоге, то не проигрываются, как я понял, игнорируются пути, почему?
Пути не игнорируются...

Дело в том, что многие плейлисты содержат пути относительно корню диска, т.е типа такого:

\My Music\Vechnoya Moladast.mp3

Если скрипт лежит к примеру в папке C:\test, и файл находится по этому пути: C:\My Music\Vechnoya Moladast.mp3, то считав тот относительный путь файл будет проирываться.

Я у себя в плеере для этого сделал поддержку глобальных путей, при каждой попытке проиграть файл, проверяются все пути (записанные в массив при открытии плейлиста и проигрывании файла), в первую очередь естественно проверяется корень диска, затем по очереди все остальные пути, в которых кстати включён рабочий каталог (потому как он задаётся авоматом функцией FileOpenDialog) и каталог в котором находится сам скрипт.

Creat0R 08-08-2007 23:59 624976

VelDmi,
Цитата:

при любом шевелении мышкой или клавиатурой монитор включается!
Можно попробовать это обойти проверокой на ввод пользователя:

Код:

#NoTrayIcon

Opt("WinTitleMatchMode", 4)

Global $MonitorIsOff = False

HotKeySet("{F11}", "Monitor_Off")
HotKeySet("{F10}", "Monitor_On")
HotKeySet("{Esc}", "Quit")

While 1
    Sleep(10)
WEnd

Func Quit()
    Monitor_On()
    Exit
EndFunc

Func Monitor_On()
    Local $hwnd = WinGetHandle('classname=Progman')
    DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $hwnd, 'int', 274, 'int', 61808, 'int', -1)
    $MonitorIsOff = False
EndFunc

Func Monitor_Off()
    $MonitorIsOff = True
    Local $hwnd = WinGetHandle('classname=Progman')

        While $MonitorIsOff = True
        DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $hwnd, 'int', 274, 'int', 61808, 'int', 2)
        Sleep(10)
        _IdleWaitCommit(0)
    WEnd
EndFunc

Func _IdleWaitCommit($idlesec)
    Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword")
    DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo))
    DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
    Do
        $iSave = DllStructGetData ($LastInputInfo, 2)
        Sleep(100)
        DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
    Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec Or $MonitorIsOff = False
    Return DllStructGetData ($LastInputInfo, 2)-$iSave
EndFunc

Просто по запуску скрипта нажми F11, монитор выключится, при каждом вводе (м клавиатуры или мышки) монитор будет отключаться по новой, для включения монитора нужно нажать F10, для полного выхода со скрипта ESC.
При этом любые сочетания клавиш действуют как обычно.

Это конечно не то что требуется, наверняка(?) можно полностью выключить монитор, но это тоже решение ;)

Creat0R 09-08-2007 04:57 625015

Накалякал тут функцию для конвертирования даты и времени в настойщий фрмат, но может это возможно сделать более укророченным путём?, а главное, чтобвы срабатывало быстрее:

Код:

$FullDateTime = _DateTimeConvertFormat("DD/MM/YYYY, HH:MM:SS")
MsgBox(64, "Date/Time Convert Results", $FullDateTime)

Func _DateTimeConvertFormat($sFormat)
    Local $RetDateTime
    Local $Year_Raw = @YEAR
    Local $Year_Part = StringRight($Year_Raw, 2)

        Local $Mounth_Raw = @MON
    Local $Mounth_Part = StringRight($Mounth_Raw, 1)
    If $Mounth_Raw > 9 Then $Mounth_Part = $Mounth_Raw

        Local $Day_Raw = @MDAY
    Local $Day_Part = StringRight($Day_Raw, 1)
    If $Day_Raw > 9 Then $Day_Part = $Day_Raw

        Local $Hours_Raw = @HOUR
    Local $Hours_Part = StringRight($Hours_Raw, 1)
    If $Hours_Raw > 9 Then $Hours_Part = $Hours_Raw

        Local $Minutes_Raw = @MIN
    Local $Minutes_Part = StringRight($Minutes_Raw, 1)
    If $Minutes_Raw > 9 Then $Minutes_Part = $Minutes_Raw

        Local $Seconds_Raw = @SEC
    Local $Seconds_Part = StringRight($Seconds_Raw, 1)
    If $Seconds_Raw > 9 Then $Seconds_Part = $Seconds_Raw

            $RetDateTime = StringReplace($sFormat, "yyyy", $Year_Raw)
    $RetDateTime = StringRegExpReplace($RetDateTime, "(?i)y+", $Year_Part)

        $RetDateTime = StringReplace($RetDateTime, "mm", $Mounth_Raw)
    $RetDateTime = StringReplace($RetDateTime, "m", $Mounth_Part)

        $RetDateTime = StringReplace($RetDateTime, "dd", $Day_Raw)
    $RetDateTime = StringReplace($RetDateTime, "d", $Day_Part)

            $RetDateTime = StringReplace($RetDateTime, "hh", $Hours_Raw)
    $RetDateTime = StringReplace($RetDateTime, "h", $Hours_Part)

        $RetDateTime = StringReplace($RetDateTime, "mm", $Minutes_Raw)
    $RetDateTime = StringReplace($RetDateTime, "m", $Minutes_Part)

        $RetDateTime = StringReplace($RetDateTime, "ss", $Seconds_Raw)
    $RetDateTime = StringReplace($RetDateTime, "s", $Seconds_Part)

        Return $RetDateTime
EndFunc

Или может уже есть подобная функция? :unsure:

amel27 09-08-2007 08:23 625052

VelDmi
Цитата:

Хочется управлять винампом горячими клавишами клавиатуры не включая монитор
немного погуглив сделал вывод, что для блокировки включения монитора без вызовов недокументированных функций ядра не обойтись.... Впрочем, если в монитор встроена защита от дурака (щас вроде все такие) аналогичного эффекта можно добиться переводом его в нестандартный режим (по частоте или по разрешению) - это можно сделать AutoIT-ом.


Creat0R
Цитата:

Т.е вот так?
угу, только "system32" лишний ;)
Цитата:

ptrex (тоже один из "великих умов" оф форума ) вроде на эту тему что то делал тут, утверждает что можно всё же собственные обьекты создавать на Аутоите
дык енто как раз WSH-метод, как минимум потребуется дополнительный WSF-файл, описывающий объект, а кстати - как ты предполагаешь настраивать фильтр - через RegExp-выражение?... ведь прежде чем ваять компоненту нужно утвердить интерфейс ;)
Цитата:

Можешь плиз потвердить, возвращает ли оно у тебя правильный заголовок с окна сохранения (любой программы)?
твой вариант работает лучше чем импорт системного заголовка, так как приложение может его подменять - к примеру SciTE имеет "Save As" даже на русской Windows... хотя насчет "любой программы" ты загнул - MS Office на этот случай имеет свои окна. :)
Цитата:

Накалякал тут функцию для конвертирования даты и времени в настойщий фрмат
у тебя в скрипте ошибка - минуты и месяцы имеют одинаковое обозначение, соответственно вместо минут пробивается месяц, имхо выхода два: либо делать отдельные функции для даты и времени, либо вводить свою кодировку.

VlhOwn 09-08-2007 08:52 625066

Написан скрипт автоматической установки ПО. При обычном запуске все работает отлично. При включении этого скрипта во входной скрипт подключения к домену он начинает работать, скачивает необходимые файлы, распаковывает, запускает, но затем появляется окно мастера установки, и инструкции ControlClick не отрабатываются, хотя на обычное нажатие кнопок реагирует адекватно.
Предполагаю, что это может быть связано с тем, что входной скрипт отрабатывается в фоновом режиме, но решения придумать не могу.

Creat0R 09-08-2007 09:05 625068

amel27,
Цитата:

только "system32" лишний
Упс... забыл что @SystemDir это и есть C:\Windows\System32 :shuffle:

Цитата:

как ты предполагаешь настраивать фильтр - через RegExp-выражение?
Без понятия если честно, я просто от восторга данной возможности вообразил приимущества :clever-ma

Цитата:

к примеру SciTE имеет "Save As"
он имеет “Save file” ;)

Цитата:

хотя насчет "любой программы" ты загнул - MS Office на этот случай имеет свои окна
И вправду, но для этого случая можно использовать такой метод:

Код:

Opt("WinTitleMatchMode", 4)
$Title = WinGetTitle("classname=#32770", "FolderView")
If $Title = 0 Then $Title = WinGetTitle("classname=bosa_sdm_Microsoft Office Word 11.0", "FolderView")

ConsoleWrite($Title)

Вот жалко что нельзя(?) совмещать classname с regexp, типа такого:

Код:

Opt("WinTitleMatchMode", 4)
$Title = WinGetTitle("classname+regexp=bosa_sdm(.*)", "FolderView")

Просто не во всех приложениях офиса одинаковые класы, в Word к примеру bosa_sdm_Microsoft Office Word 11.0, но почти во всех есть это: bosa_sdm - тогда можно было бы просто по RegExp подобрать класс.... нужно бы запостить в Feature Request на оф. форум :).

Цитата:

у тебя в скрипте ошибка - минуты и месяцы имеют одинаковое обозначение
Точно, увлёкся... Спасибо.

Цитата:

имхо выхода два: либо делать отдельные функции для даты и времени, либо вводить свою кодировку.
Свою кодировку? это как? :unsure:

А по поводу двух функции, не обязательно:

Код:

$RetDateTime = StringReplace($RetDateTime, "mm", $Mounth_Raw, 1)
;$RetDateTime = StringReplace($RetDateTime, "m", $Mounth_Part)

Правда в этом случае формат месяца может быть передан только как MM.

VelDmi 09-08-2007 09:50 625101

Creat0R,
Цитата:

Цитата Creat0R
Это конечно не то что требуется, >>>

Ну почему же, идея отличная, ведь мы будем знать нажатую клавишу! Кстати, в какой переменной она хранится?
Жаль только у меня код не работает. Монитор выключается и тут же включается. Я сделал следующим образом и это работает:
Код:

Opt("WinTitleMatchMode", 4)

HotKeySet("{F11}", "Monitor_Off")
HotKeySet("{F10}", "Monitor_On")

$Monitor = 'On'

While 1
    Sleep(100)
        If $Monitor = 'On' Then
                Local $hwnd = WinGetHandle('classname=Progman')
                DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $hwnd, 'int', 274, 'int', 61808, 'int', -1)
        EndIf
        If $Monitor = 'Off' Then
                Local $hwnd = WinGetHandle('classname=Progman')
                Sleep(100)
                DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $hwnd, 'int', 274, 'int', 61808, 'int', 2)
        EndIf
WEnd

Func Quit()
    Monitor_On()
    Exit
EndFunc

Func Monitor_On()
        $Monitor = 'On'
EndFunc

Func Monitor_Off()
        $Monitor = 'Off'
EndFunc

но мне не нравится, что он постоянно в цикле мотает и выключает моник.

Maza Faka 09-08-2007 11:58 625176

Creat0R
Плз глянь скрипт, что не так?
Скрипт запускается из корня диска "C:\". Если открываю mp3-файл на диске "C:\", то файл проигрывается нормально, если открываю mp3-файл на диске "D:\", скажем "D:\Music\Taxi\TAXY-4.mp3", то тоже всё нормально, но если в пути или имени файла есть пробелы, то файл не проигрывается, причём такой глюк, только если файл на "D:\" диске, с "C:\" диском, всё нормально.

Код:

#include <GUIConstants.au3>
#include <Sound.au3>
#include <Array.au3>
#Include <File.au3>

Dim $m3u_array, $sound, $sleep, $i = 1

$file = ""
GUICreate("Player", 300, 200, -1, -1, -1)
GUISetIcon(@ProgramFilesDir & "\Winamp\winamp.exe", 0)
GUISetBkColor(0xA6CAF0)
GUICtrlCreateLabel("Simple player", 100, 5, 100, 15, -1)

;Menu
$menu = GUICtrlCreateMenu("File", -1)
$playlist = GUICtrlCreateMenuItem("Open playlist", $menu)
GUICtrlCreateMenuItem("", $menu)
$quit = GUICtrlCreateMenuItem("Quit", $menu)

;Button
$play = GUICtrlCreateButton("Play", 10, 115, 60)
$open = GUICtrlCreateButton("Open", 10, 10, 60)
$stop = GUICtrlCreateButton("Stop", 210, 115, 60)
$pause = GUICtrlCreateButton("Pause", 210, 10, 60)

;Slider
$slider = GUICtrlCreateSlider(83, 115, 100, 30, -1)
GUICtrlSetLimit($slider, 100, 0)
GuiCtrlSetData($slider, 100)

GUISetState()

AdlibEnable("Check", 1000)

While 1
    $msg = GUIGetMsg()

        Select
    Case $msg = $open
        _SoundClose($sound)
        $file = FileOpenDialog("Open music file", @MyDocumentsDir & "\Моя музыка", "Music files(*.mp3;*.wav)", 3)

                        Case $msg = $play
            If (Not $file = "") And (Not _SoundStatus($sound) = "played") Then
                $sound = _SoundOpen($file)
                _SoundPlay($sound)
            EndIf

                    Case $msg = $slider
            $Read_slider = GUICtrlRead($slider)
            SoundSetWaveVolume($Read_slider)

                    Case $msg = $Gui_Event_Close Or $msg = $quit
            Exit

                    Case $msg = $playlist
            $m3u = FileOpenDialog("Add playlist", "", "Playlist (*.m3u)", 1)
            If @error Then ContinueLoop
                _FileReadToArray($m3u, $m3u_array)
                $sound = _SoundOpen($m3u_array[$i])
                _SoundPlay($sound)

                        Case $msg = $stop
            _SoundStop($sound)
            _SoundClose($sound)
            ContinueLoop

                    Case $msg = $pause
            If Not $sound = "" Then
                If $sleep = 1 Then
                    _SoundResume($sound)
                    $sleep = 0
                Else
                    $sleep = _SoundPause($sound)
                EndIf
            EndIf
        EndSelect
    WEnd

    Func Check()
    $stat = _SoundStatus($sound)
    If $stat = "stopped" Then
        If IsArray($m3u_array) Then
            _SoundClose($sound)
            $i += 1
            $sound = _SoundOpen($m3u_array[$i])
            If @error Then Return
            _SoundPlay($sound)
        EndIf
    EndIf
EndFunc


Creat0R 09-08-2007 13:17 625244

VelDmi,
Цитата:

ведь мы будем знать нажатую клавишу
Хм, не уверен что понял для чего? все клавиши (кроме заданных) работают как обычно.

Цитата:

в какой переменной она хранится?
Что хранится? нажатая клавиша? нигде вроде :) - кстати для этого тоже есть функция, возвращает значение вызванной клавиши/нажатой кнопки мышки, если нужно могу выложить (с оф. форума стащил ;) ).

Цитата:

мне не нравится, что он постоянно в цикле мотает и выключает моник.
И при этом нагружает систему... именно поэтому я и подумал использовать проверку ввода, не могу понять почему у тебя не работает, я запускаю скрипт, жму F11, монитор выключается, пока не нажать F10 или Esc он выключается при любом другом вводе...

Ради проверки, попробуй поставь Beep() после функции _IdleWaitCommit(0) (в цикле где она вызывается), по идее звук должен прозвучать только после первого выключения, и каждый раз при вводе с клавиатуры или мышки.


Maza Faka,
Цитата:

Плз глянь скрипт, что не так?
Ок, чуть позже гляну...

Maza Faka,
Для начала я бы проверил тот же путь который "не работает" напрямую - т.е возьми укажи сразу этот путь (в отдельном скрипте), и просто сделай так:

Код:

$OpSound = _SoundOpen("D:\полный путь к файлу")
_SoundPlay($OpSound)

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

Maza Faka 09-08-2007 15:39 625377

Creat0R
Не понимаю, вот с таким путём проигрывается:

Код:

#include <Sound.au3>
$OpSound = _SoundOpen("D:\Music\Taxi\TAXY-4.mp3")
_SoundPlay($OpSound)
While 1
        Sleep(1000)
WEnd

А с таким нет:
Код:

#include <Sound.au3>
$OpSound = _SoundOpen("D:\Music\Steve Vai\01 - Bad Horse.mp3")
_SoundPlay($OpSound)
While 1
        Sleep(1000)
WEnd

Глючная какая-то библиотека :(

Creat0R 09-08-2007 16:25 625402

Maza Faka,
Цитата:

А с таким нет:
Во-первых проверь что возвращает функция _SoundOpen() (проверь переменную $OpSound).
Во-вторых, чтобы окончательно "отсеять вину" самого пути/файла, попробуй проиграть этот же файл используя встроенную функцию SoundPlay().

Я создал у себя точно такой путь, поместил туда файл с точно таким именем, всё нормально играет..

Проблема видимо в самом файле.
Если хочешь залей файл, я проверю у себя.

Maza Faka 09-08-2007 17:22 625431

Creat0R
Мистика какая-то. Запускаю скрипт:
Код:

#include <Sound.au3>
$open = _SoundOpen("D:\Music\Steve Vai\01 - Bad Horse.mp3")
$play = _SoundPlay($open)
MsgBox(0, "", $play)

While 1
        Sleep(1000)
WEnd

Музыка не играет, хотя _SoundPlay возвращает 1, что означает успех. Создал каталог "D:\Super Dance Lolli pop\", скопировал туда этот же "проблемный" файл ("01 - Bad Horse.mp3"), файл проигрывается. Ничего не понимаю :dont-know

Похоже глюк Винды, из каталога "D:\Music\Steve Vai" скопировал все файлы в другой каталог, удалил каталог "D:\Music\Steve Vai", создал его же заново, скопировал туда все mp3-файлы, которые там раньше находились, и о чудо! музыка заиграла! Что за хрень такая?

Creat0R 09-08-2007 23:20 625568

Maza Faka,
Цитата:

Музыка не играет, хотя _SoundPlay возвращает 1
а что возвращает _SoundOpen()?
Вообще можно проверять ошибки используя пример из справки:

Код:

#include <Sound.au3>
;open sound file
$sound = _SoundOpen("D:\Music\Steve Vai\01 - Bad Horse.mp3")
If @error = 2 Then
    MsgBox(0, "Error", "The file does not exist")
    Exit
ElseIf @error = 3 Then
    MsgBox(0, "Error", "The alias was invalid")
    Exit
ElseIf @extended <> 0 Then
    $extended = @extended ;assign because @extended will be set after DllCall
    $errorstring = DllCall("winmm.dll","int","mciGetErrorStringA","str",$extended,"str","","int",65534) ;,"hwnd",0) - Это лишнее, у меня с этим скрипт вылетает
    MsgBox(0, "Error", "The open failed." & @CRLF & "Error Number: " & $extended & @CRLF & "Error Description: " & $errorstring[2] & @CRLF & "Please Note: The sound may still play correctly.")
Else
    MsgBox(0, "Success", "The file opened successfully")
EndIf
_SoundPlay($sound, 1)

_SoundClose($sound)

Цитата:

удалил каталог "D:\Music\Steve Vai", создал его же заново
Возможно в пути попались русские буквы, а когда пересоздал путь, писал строго латинскими.
Как получал путь к файлу? ручной ввод? или копирование с адресной строки? (или ещё другими методами).

Maza Faka 10-08-2007 10:15 625723

Creat0R

Цитата:

Цитата Creat0R
а что возвращает _SoundOpen()?

Набор символов, типа "pvprlccwfo", причём каждый раз разный, хотя открывается один и тот же файл.

Цитата:

Цитата Creat0R
Возможно в пути попались русские буквы, а когда пересоздал путь, писал строго латинскими.

Нет, в пути не могло быть кириллицы, в этом я уверен, так, как лично создавал каталоги.

Цитата:

Как получал путь к файлу? ручной ввод? или копирование с адресной строки? (или ещё другими методами)
Да без разницы, и вручную вводил и из буфера обмена.

Ладно, прекратим этот оффтоп, думаю это частный случай, связанный с моим компом.

Diamond 10-08-2007 15:16 625901

Creat0R
Цитата:

кстати для этого тоже есть функция, возвращает значение вызванной клавиши/нажатой кнопки мышки, если нужно могу выложить >>>
Заинтригован. :) Выложи пожалуйста. :shuffle:

Creat0R 10-08-2007 16:08 625941

Maza Faka,
Цитата:

Набор символов, типа "pvprlccwfo", причём каждый раз разный, хотя открывается один и тот же файл.
Он разный потому что гинерируется используя Random ;) - это типа самопального идентификатора :) - Загляни в саму библиотеку, поймёшь как оно вообще сделано ;)

Diamond,
Цитата:

Выложи пожалуйста
Нет проблем...
Немного(?) переделал под свои нужды:

Код:

While 1
    $KeyIsPressed = _KeyIsPressed()
    If $KeyIsPressed Then MsgBox(64, "Pressed/Clicked:", $KeyIsPressed)
    Sleep(10)
WEnd

Func _KeyIsPressed()
    Local $KeyBoardLayoutArr = StringSplit("{LMouse}|{RMouse}|{}|(MMouse}|{}|{}|{}|{BACKSPACE}|{TAB}|{}|{}|{}|{ENTER}|{}|{}|{SHIFT}|{CTRL}|{ALT}|{PAUSE}|{CAPSLOCK}|{}|{}|{}|{}|{}|{}|{ESC}|{}|{}|{}|{]|{SPACE}|{PGUP}|{PGDN}|{END}|{HOME}|{LEFT}|{UP}|{RIGHT}|{DOWN}|{SELECT}|{PRINTSCREEN}|{}|{PRINTSCREEN}|{INSERT}|{DEL}|{}|0|1|2|3|4|5|6|7|8|9|{}|{}|{}|{}|{}|{}|{}|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|{LWIN}|{RWIN}|{APPSKEY}|{}|{SLEEP}|{numpad0}|{numpad1}|{numpad2}|{numpad3}|{numpad4}|{numpad5}|{numpad6}|{numpad7}|{numpad8}|{numpad9}|{NUMPADMULT}|{NUMPADADD}|{}|{NUMPADSUB}|{NUMPADDOT}|{NUMPADDIV}|{F1}|{F2}|{F3}|{F4}|{F5}|{F6}|{F7}|{F8}|{F9}|{F10}|{F11}|{F12}|{F13}|{F14}|{F15}|{F16}|{F17}|{F18}|{F19}|{F20}|{F21}|{F22}|{F23}|{F24}|{}|{}|{}|{}|{}|{}|{}|{}|{NUMLOCK}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{SHIFT}|{SHIFT}|{CTRL}|{CTRL}|{ALT}|{ALT}|{BROWSER_BACK}|{BROWSER_FORWARD}|{BROWSER_REFRESH}|{BROWSER_STOP}|{BROWSER_SEARCH}|{BROWSER_FAVORITES}|{BROWSER_HOME}|{VOLUME_MUTE}|{VOLUME_DOWN}|{VOLUME_UP}|{MEDIA_NEXT}|{MEDIA_PREV}|{MEDIA_STOP}|{MEDIA_PLAY_PAUSE}|{LAUNCH_MAIL}|{LAUNCH_MEDIA}|{LAUNCH_APP1}|{LAUNCH_APP2}|{}|{}|;|{+}|,|{-}|.|/|`|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|[|\|]|'", "|")
    Local $a_R
    For $i = 0 To 165
        $a_R = DllCall("user32.dll", "int", "GetAsyncKeyState", "int", '0x' & Hex($i,2))
        If Not @error And BitAND($a_R[0], 0x8000) = 0x8000 Then Return $KeyBoardLayoutArr[$i]
    Next
    Sleep(40)
    Return 0
EndFunc


Diamond 10-08-2007 17:20 625986

Creat0R
Цитата:

Немного(?) переделал под свои нужды
Спасибо. Правда у меня антивирус ругается на Клавиатурный перехватчик, хотя это вполне логично.
А зачем Sleep() добавлена дважды? И ещё, постоянно происходит открытие/закрытие dll'ки, имхо лучше использовать один раз DllOpen(), а затем обращатся только к хэндлу (я поправил, и у меня CPU уменьшилось в полтора раза) - Хотя, на самом деле, всё это мелочи, ;) спасибо ещё раз! :)

Diamond 11-08-2007 11:56 626187

Реестровый способ установки обоев рабочего стола.
Код:

;~ Этот метод только для BMP-файлов, (!проверено только на Windows XP!)
;~ $BMP - Путь к BMP-файлу
;~ $STYLE - Расположение:
;~ 0 - По центру; 1 - Замостить; 2 - Растянуть
Func SetWallpaper($BMP,$STYLE=0)
    Local $Tile=0
    If $STYLE=1 Then $Tile=1
    RegWrite("HKCU\Control Panel\Desktop","Wallpaper","REG_SZ",$BMP)
    RegWrite("HKCU\Control Panel\Desktop","WallpaperStyle","REG_SZ",$STYLE)
    RegWrite("HKCU\Control Panel\Desktop","TileWallpaper","REG_SZ",$Tile)
    RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","Wallpaper","REG_SZ",$BMP)
    RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","WallpaperStyle","REG_SZ",$STYLE)
    RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","TileWallpaper","REG_SZ",$Tile)
    DllCall("user32.dll","int","UpdatePerUserSystemParameters","int",0,"int",0)
EndFunc

P.S.
К сожалению этот способ работает только с BMP-файлами, поэтому для конвертации из *.jpg во временный *.bmp я пользуюсь консольной утилитой
P.P.S.
Хотелось бы конечно решить проблему конвертации средствами AutoIt. Думаю это возможно, поскольку при ручной установке обоев через апплет(desk.cpl) система сама конвертирует их в bmp, но как она это делает - для меня пока загадка.

Diamond 11-08-2007 14:38 626240

1. Как создать MDI-окно($WS_EX_MDICHILD) внутри родительского и как переключаться между ними? Наподобие того, как это делает программа установки... (типа страничного перелистывания: NextPage - PreviewPage).
2. Зачем нужен стиль $WS_GROUP? Я читал справку но так ничего и не понял...

Creat0R 11-08-2007 18:41 626325

Diamond,
Цитата:

при ручной установке обоев через апплет(desk.cpl) система сама конвертирует их в bmp
А может просто переименовывает? может немного глупо и банально, но ты пробовал переименовывать просто формат файла? :shuffle:

Цитата:

Как создать MDI-окно($WS_EX_MDICHILD) внутри родительского и как переключаться между ними? Наподобие того, как это делает программа установки... (типа страничного перелистывания: NextPage - PreviewPage).
Не думаю что тут нужно MDI-окно, тут просто нужно построить функции в начачле которых будут прятаться все динамичные контроли, а в теле просто показываться нужные (созданные предварительно в самом начале строения ГУИ) - И потом при каждом переключении (нажатии Next/Back) вызывать соответственно эти функции.

Хотя в принципе для MDI-окон (почти) можно попробовать типа такого:

Код:

#include <GuiConstants.au3>

$Gui = GuiCreate("MDI Demo", 400, 300)

$Back = GUICtrlCreateButton("<<Back", 240, 270, 60)
$Next = GUICtrlCreateButton("Next>>", 320, 270, 60)

$ChildGui_1 = GuiCreate("Child window 1", 400, 260, 5, 5, $WS_POPUP)
$LabelGui1 = GUICtrlCreateLabel("Test 1", 20, 60)

$ChildGui_2 = GuiCreate("Child window 2", 400, 260, 5, 5, $WS_POPUP)
$LabelGui2 = GUICtrlCreateLabel("Test 2", 20, 60)

DllCall("user32.dll", "int", "SetParent", "hwnd", $ChildGui_1, "hwnd", $GUI)
DllCall("user32.dll", "int", "SetParent", "hwnd", $ChildGui_2, "hwnd", $GUI)

GUISetState(@SW_SHOW, $Gui)
GUISetState(@SW_SHOW, $ChildGui_1)

While 1
    $Msg = GUIGetMsg(1)
    Select
        Case $Msg[1] = $Gui And $Msg[0] = -3
            Exit
        Case $Msg[0] = $Next
            GUISetState(@SW_HIDE, $ChildGui_1)
            GUISetState(@SW_SHOW, $ChildGui_2)
        Case $Msg[0] = $Back
            GUISetState(@SW_HIDE, $ChildGui_2)
            GUISetState(@SW_SHOW, $ChildGui_1)
    EndSelect
WEnd

Цитата:

Зачем нужен стиль $WS_GROUP?
Ну он как бы групирует все последующие контроли (до следующего использования этого стиля), но в каких целях, я честно сам не понял.

Diamond 11-08-2007 21:36 626378

Creat0R
Цитата:

...ты пробовал переименовывать просто формат файла?
Именно bmp, и именно конвертация! Было бы слишком просто, хотя, такая мысль приходила раньше и ко мне.
Цитата:

Хотя в принципе для MDI-окон (почти) можно попробовать типа такого:
Идея хорошая, спасибо. Всё-таки хотелось бы увидеть как работает MDI, и хотелось бы точно знать как на самом деле правильно.
Цитата:

Ну он как бы групирует все последующие контроли (до следующего использования этого стиля), но в каких целях, я честно сам не понял.
Я просто предположил что этот стиль как-то связан с моим первым вопросом, т.е. группирует окна.

Creat0R 11-08-2007 23:50 626405

Diamond,
Цитата:

хотелось бы увидеть как работает MDI
Вот так (изменённый пример с оф. форума):

Код:

#include <GuiConstants.au3>

Global $gui[100000]
$x = 1

$Mother_GUI = GUICreate("Thinking box",-1,-1,-1,-1,BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS))
$Button_1 = GUICtrlCreateButton("New Box", 5, 5, 70, 20)
GUICtrlSetResizing(-1,$GUI_DOCKALL)
$Button_2 = GUICtrlCreateButton("Delete Box",5,30,70,20)
GUICtrlSetResizing(-1,$GUI_DOCKALL)
$Input_1 = GUICtrlCreateInput("1",5,60,70,20)
GUICtrlSetResizing(-1,$GUI_DOCKALL)
GUISetState(@SW_SHOW, $Mother_GUI)

$Main_GUI = GUICreate("",220,300,80,5,$WS_POPUPWINDOW)
GUISetBkColor(0xCCCCCC)

DllCall("user32.dll", "int", "SetParent", "hwnd", WinGetHandle($Main_GUI), "hwnd", WinGetHandle($Mother_GUI))

$LeftCounter = 0
$TopPlus = 20
Makebox()

GUISetState(@SW_SHOW,$Main_GUI)

While 1
    setsize()
    $msg = GUIGetMsg()
    if $msg = $GUI_EVENT_CLOSE then Exit
    if $msg = $Button_1 then Makebox()
    if $msg = $Button_2 then GUIDelete($Gui[GUICtrlRead($Input_1)])
    sleep(10)
WEnd

Func Makebox()
    if $x < 100000 then
                $Mother_GUI_Pos_Arr = WinGetPos($Mother_GUI)
                $LeftCounter += 1
               
                If 250+$LeftCounter*5 > $Mother_GUI_Pos_Arr[2] Then
                        $LeftCounter = 1
                        $TopPlus -= 20
                        If $TopPlus < 0 Then $TopPlus = 60
                EndIf
               
                $Left = 40+$LeftCounter*5
                $Top = $TopPlus+$LeftCounter*5
               
                $gui[$x] = GUICreate("", 200, 90, $Left, $Top, $WS_POPUPWINDOW, $WS_EX_TOOLWINDOW)
        $label = GUICtrlCreateLabel("  Box number: " & $x,0,0,200,20,-1,$GUI_WS_EX_PARENTDRAG)
        GUICtrlSetFont(-1,12,14,0,"Comic Sans MS")
        settopbarcolor()
        GUICtrlCreateEdit("",0,20,200,70,$WS_VSCROLL)
        DllCall("user32.dll", "int", "SetParent", "hwnd", WinGetHandle($Gui[$x]), "hwnd", WinGetHandle($Main_GUI))
        GUISetState(@SW_SHOW,$gui[$x])
                $x += 1
    EndIf
EndFunc

Func settopbarcolor($s_control=-1)
    $Random = Random(1,6,1)
    if $Random = 1 Then
        GUICtrlSetBkColor($s_control,0x0000FF)
    elseif $Random = 2 Then
        GUICtrlSetBkColor($s_control,0x00FF00)
    elseif $Random = 3 then
        GUICtrlSetBkColor($s_control,0xFF0000)
    elseif $Random = 4 then
        GUICtrlSetBkColor($s_control,0x00FFFF)
    elseif $Random = 5 then
        GUICtrlSetBkColor($s_control,0xFF00FF)
    elseif $Random = 6 Then
        GUICtrlSetBkColor($s_control,0xFFFF00)
    EndIf
EndFunc

Func setsize()
    $Motherpos = WinGetPos($Mother_GUI)
    $Mainpos = WinGetPos($Main_GUI)
    if $Mainpos[2] <> $Motherpos[2]-98 or $Mainpos[3] <> $Motherpos[3]-40 then WinMove($Main_GUI,"",85,5,$Motherpos[2]-98,$Motherpos[3]-45)
EndFunc

Func SpecialEvents()
    Select
        Case @GUI_CTRLID = $GUI_EVENT_CLOSE
            Exit
    EndSelect
EndFunc

То что ты задумал, имхо, не имеет отношения к MDI - Multiple document interface.

И стиль $WS_EX_MDICHILD не совсем делает нужный “эффект”:
Цитата:

Цитата Справка по AutoIT
Create a child window included in its parent window (simulation not real MDI).

Вот ещё примерчик MDI:

Код:

#include <GuiConstants.au3>

$MainGui = GuiCreate("Main", 485, 280)
$Child_1_Gui = GuiCreate("Child 1", 150, 100, 5, 5)
$Child_2_Gui = GuiCreate("Child 2", 150, 100, 165, 5)
$Child_3_Gui = GuiCreate("Child 3", 150, 100, 325, 5)
$Child_4_Gui = GuiCreate("Child 4", 150, 100, 5, 135)
$Child_5_Gui = GuiCreate("Child 5", 150, 100, 165, 135)
$Child_6_Gui = GuiCreate("Child 6", 150, 100, 325, 135)

GUISetState(@SW_SHOW, $MainGui)
DllCall("user32.dll", "int", "SetParent", "hwnd", $Child_1_Gui, "hwnd", $MainGui)
GUISetState(@SW_SHOW, $Child_1_Gui)
DllCall("user32.dll", "int", "SetParent", "hwnd", $Child_2_Gui, "hwnd", $MainGui)
GUISetState(@SW_SHOW, $Child_2_Gui)
DllCall("user32.dll", "int", "SetParent", "hwnd", $Child_3_Gui, "hwnd", $MainGui)
GUISetState(@SW_SHOW, $Child_3_Gui)
DllCall("user32.dll", "int", "SetParent", "hwnd", $Child_4_Gui, "hwnd", $MainGui)
GUISetState(@SW_SHOW, $Child_4_Gui)
DllCall("user32.dll", "int", "SetParent", "hwnd", $Child_5_Gui, "hwnd", $MainGui)
GUISetState(@SW_SHOW, $Child_5_Gui)
DllCall("user32.dll", "int", "SetParent", "hwnd", $Child_6_Gui, "hwnd", $MainGui)
GUISetState(@SW_SHOW, $Child_6_Gui)

While 1
        $Msg = GUIGetMsg()
        Switch $Msg
                Case -3
                        Exit
                Case Else
                       
        EndSwitch
WEnd

Цитата:

как на самом деле правильно.
Смотря что тебе требуется, если нужно создать устновщик используя стиль с Next/Back кнопками, тогда как я и упоминал ранее, нужно в начале построения ГУИ создать ВСЕ контроли (кнопки, лейблы, инпуты и т.д :)), спрятать их (GuiCtrlSetState($ID, $GUI_HIDE)), потом на первой стадии показать нужные ($GUI_SHOW); или просто не прятать их изначально ;), и при нажатии Next/Back прятать предыдущие (можно сделать счётчик нажатии кнопок вперёд/назад) и показывать нужные для следующего этапа.

Creat0R 12-08-2007 00:40 626410

Diamond,
По поводу смены обоев - вот тут нашёл кое что:

Код:

DllCall('shell32', 'long', 'SetWallpaper', 'string', $sFile, 'int', 0)
Но у меня почему то не работает :dont-know

Creat0R 12-08-2007 10:40 626467

Пытаюсь сделать функцию для массовой замены по тексту используя флаг “Whole word only” (только слово целиком) - Но всё что у меня получилось, так это замена нужного текста + тех символов которые считаются как разделителями между словами (Таб, пробел, перевод строки, возврат каретки, начало строки, и конец строки):

Код:

$Ret = _StringReplace_WholeWord(@TAB & "test" & @CRLF & "_test_" & @CRLF, "test", "000", 0)
ConsoleWrite($Ret) ;@TAB'а уже нету :(

Func _StringReplace_WholeWord($String, $WhatToFind, $Replace, $MatchCaseParam=0)
    Local $CaseSenceStr = '(?i)'
    If $MatchCaseParam = 1 Then $CaseSenceStr = ''

        Local $RetVal = StringRegExpReplace($String, $CaseSenceStr & GetRegExpPattern($WhatToFind), $Replace)
    Return SetExtended(@extended, $RetVal)
EndFunc

Func GetRegExpPattern($Var)
    Return '\t' & $Var & '\z|\A' & _
        $Var & '\t|\t' & $Var & '\t|\t' & $Var & '\s|\s' & _
        $Var & '\t|\A' & $Var & '\s|\s' & $Var & '\z|\s' & _
        $Var & '\s|\n' & $Var & '\s|\n' & $Var & '\t|\n' & _
        $Var & '\r|\n' & $Var & '\z|\A' & $Var & '\n|\A' & _
        $Var & '\r|\t' & $Var & '\n|\t' & $Var & '\r|\r' & _
        $Var & '\s|\r' & $Var & '\t|\r' & $Var & '\n|\r' & _
        $Var & '\z|\n' & $Var & '\r|\A' & $Var & '\z'
EndFunc

Как можно построить подобную функцию? :clever-ma

amel27 12-08-2007 12:49 626496

Creat0R
Цитата:

Но у меня почему то не работает
и не пытайся - код нерабочий. Это не функция и даже не объект, а интерфейс. Уже не раз пытался заюзать аналогичные... пока AutoIT не способен сконвертить обычный указатель в объект

Цитата:

Пытаюсь сделать функцию для массовой замены по тексту используя флаг “Whole word only”
не совсем понял что надо, но может пригодится:
Код:

$s = @TAB & "test" & @CRLF & "_test_" & @CRLF
ConsoleWrite('---'&@CRLF&$s&@CRLF&'---'&@CRLF)
$r = _StringReplace_WholeWord($s, "test", "000", 0)
ConsoleWrite('---'&@CRLF&$r&@CRLF&'---'&@CRLF)

Func _StringReplace_WholeWord($String, $WhatToFind, $Replace, $MatchCaseParam=0)
    Local $CaseSenceStr = '(?i)'
    If $MatchCaseParam = 1 Then $CaseSenceStr = ''
    Local $RetVal = StringRegExpReplace($String, $CaseSenceStr & '\b'& $WhatToFind &'\b', $Replace)
    Return SetExtended(@extended, $RetVal)
EndFunc


Diamond 12-08-2007 14:05 626520

Creat0R
Спасибо за примеры. Получил полное моральное удовлетворение. :)
Цитата:

То что ты задумал, имхо, не имеет отношения к MDI
Убедил! :) Хотя, взяв за основу приведённые тобой примеры наверное ещё немного поколдую. :wizard: А для себя я всё-таки решил показывать/прятать контроли, думаю, так будет проще и удобнее.
Цитата:

По поводу смены обоев - вот тут
Попытался зайти по ссылке, но там пишут что ссылка устарела либо битая. :(
Цитата:

Но у меня почему то не работает
В shell32.dll нету функции "SetWallpaper"

Нашёл!!! :yahoo: http://www.autoitscript.com/forum/in...howtopic=50753 - конвертирует в BMP и устанавливает обои, но для самой функции нужна библиотека AutoItLib.au3 (Библиотеку можно найти там же)
Вот эта функция:
Код:

#include <.\AutoItLib.au3>

Func _ChangeDesktopBackground($sFile, $iPosition=3)
    Local $sCLSID, $tBuffer, $hImage, $sTemp

    ; Convert JPG image to BMP image
    _GDI_Startup()
    $hImage = _GDI_LoadFromFile($sFile)
    $sCLSID = _GDI_GetEncoderCLSID("BMP")
    $sTemp  = _Str_ChangeFileExt($sFile, ".bmp")
    _GDI_SaveToFile($hImage, $sTemp, $sCLSID)
    _GDI_DisposeImage($hImage)
    _GDI_Shutdown()

    ; Set wallpaper position
    Switch $iPosition
        Case 1 ; Tile
            RegWrite('HKCU\Control Panel\Desktop', 'TileWallpaper' , 'reg_sz', '1')
            RegWrite('HKCU\Control Panel\Desktop', 'WallpaperStyle', 'reg_sz', '0')
            RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","TileWallpaper", "REG_SZ",'1')
            RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","WallpaperStyle","REG_SZ",'0')
        Case 2 ; Center
            RegWrite('HKCU\Control Panel\Desktop', 'TileWallpaper' , 'reg_sz', '0')
            RegWrite('HKCU\Control Panel\Desktop', 'WallpaperStyle', 'reg_sz', '0')
            RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","TileWallpaper", "REG_SZ",'0')
            RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","WallpaperStyle","REG_SZ",'0')
        Case 3 ; Stretch
            RegWrite('HKCU\Control Panel\Desktop', 'TileWallpaper' , 'reg_sz', '0')
            RegWrite('HKCU\Control Panel\Desktop', 'WallpaperStyle', 'reg_sz', '2')
            RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","TileWallpaper", "REG_SZ",'0')
            RegWrite("HKCU\Software\Microsoft\Internet Explorer\Desktop\General","WallpaperStyle","REG_SZ",'2')
    EndSwitch

    ; Set wallpaper
    $tBuffer = DllStructCreate("char Text[" & StringLen($sTemp) + 1 & "]")
    DllStructSetData($tBuffer, "Text", $sTemp)
    _API_SystemParametersInfo($SPI_SETDESKWALLPAPER, 0, DllStructGetPtr($tBuffer), BitOR($SPIF_UPDATEINIFILE, $SPIF_SENDCHANGE))
EndFunc

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

Creat0R 13-08-2007 02:51 626741

amel27,
Цитата:

не совсем понял что надо
Я пытаюсь (с твоей помощью почти закончил :)) сделать UDF с гуи для поиска и замены по тексту (текст передаётся как параметр, т.ч это предназначено не только для однократного использования) - Саму функцию выложу чуть позже.

Цитата:

может пригодится
Ещё как... Я сколько не лазил в справке, но этот момент упустил:

Цитата:

\b - Matches at a word boundary.
А я столько мучался подбирал разные вариации с табами/пробелами и т.д :biggrin:
Спасибо!

Creat0R 13-08-2007 03:52 626742

По поводу функции конвертирования формата даты - всё таки пришлось делать две функции, проверьте плиз кто нибудь, как оно работает:

Код:

$FullDateTime = _TimeConvertFormat("HH:MM:SS") & ", " & _DateConvertFormat("DD/MM/YY")
MsgBox(64, "Date/Time Convert Results", $FullDateTime)

Func _TimeConvertFormat($sFormat)
    Local $RetDateTime = $sFormat

        Local $Hours_Raw = @HOUR
    Local $Hours_Part = StringRight($Hours_Raw, 1)
    If $Hours_Raw > 9 Then $Hours_Part = $Hours_Raw

        Local $Minutes_Raw = @MIN
    Local $Minutes_Part = StringRight($Minutes_Raw, 1)
    If $Minutes_Raw > 9 Then $Minutes_Part = $Minutes_Raw

        Local $Seconds_Raw = @SEC
    Local $Seconds_Part = StringRight($Seconds_Raw, 1)
    If $Seconds_Raw > 9 Then $Seconds_Part = $Seconds_Raw

        $RetDateTime = StringReplace($RetDateTime, "hh", $Hours_Raw)
    $RetDateTime = StringReplace($RetDateTime, "h", $Hours_Part)

        $RetDateTime = StringReplace($RetDateTime, "mm", $Minutes_Raw)
    $RetDateTime = StringReplace($RetDateTime, "m", $Minutes_Part)

        $RetDateTime = StringReplace($RetDateTime, "ss", $Seconds_Raw)
    $RetDateTime = StringReplace($RetDateTime, "s", $Seconds_Part)

        Return $RetDateTime
EndFunc

Func _DateConvertFormat($sFormat)
    Local $RetDateTime = $sFormat

        StringReplace($RetDateTime, "y", "")
    Local $Year = StringRight(@YEAR, @extended)

        Local $Mounth_Raw = @MON
    Local $Mounth_Part = StringRight($Mounth_Raw, 1)
    If $Mounth_Raw > 9 Then $Mounth_Part = $Mounth_Raw

        Local $Day_Raw = @MDAY
    Local $Day_Part = StringRight($Day_Raw, 1)
    If $Day_Raw > 9 Then $Day_Part = $Day_Raw

        $RetDateTime = StringReplace($RetDateTime, "y", $Year, 1)
    $RetDateTime = StringReplace($RetDateTime, "y", "")

        $RetDateTime = StringReplace($RetDateTime, "mm", $Mounth_Raw)
    $RetDateTime = StringReplace($RetDateTime, "m", $Mounth_Part)

        $RetDateTime = StringReplace($RetDateTime, "dd", $Day_Raw)
    $RetDateTime = StringReplace($RetDateTime, "d", $Day_Part)
    Return $RetDateTime
EndFunc


amel27 13-08-2007 05:28 626746

Цитата:

Цитата Creat0R
проверьте плиз кто нибудь, как оно работает

вроде работает... при условии что год встречается не больше 1 раза, немного изменил:
Код:

Func _TimeConvertFormat($sFormat)
    Local $Hours_Raw = @HOUR
    Local $Minutes_Raw = @MIN
    Local $Seconds_Raw = @SEC

    $sFormat = StringReplace($sFormat, "hh",$Hours_Raw)
    $sFormat = StringReplace($sFormat, "h", $Hours_Raw+0)

    $sFormat = StringReplace($sFormat, "mm",$Minutes_Raw)
    $sFormat = StringReplace($sFormat, "m", $Minutes_Raw+0)

    $sFormat = StringReplace($sFormat, "ss",$Seconds_Raw)
    $sFormat = StringReplace($sFormat, "s", $Seconds_Raw+0)

    Return $sFormat
EndFunc

Func
_DateConvertFormat($sFormat)
    StringReplace($sFormat, "y", "")
    Local $Year = StringRight(@YEAR, @extended)
    Local $Mounth_Raw = @MON
    Local $Day_Raw = @MDAY

    $sFormat = StringRegExpReplace($sFormat, '(?i)y+', $Year)

    $sFormat = StringReplace($sFormat, "mm",$Mounth_Raw)
    $sFormat = StringReplace($sFormat, "m", $Mounth_Raw+0)

    $sFormat = StringReplace($sFormat, "dd",$Day_Raw)
    $sFormat = StringReplace($sFormat, "d", $Day_Raw+0)

    Return $sFormat
EndFunc


Creat0R 13-08-2007 06:12 626748

amel27,
Цитата:

немного изменил:
Спасибо - Я как то не подумал что прибавляя ноль на втором этапе замены, получается тот же результат :) - И код короче стал...

Но мне всё же нужно доделать чтобы оно работало с одной строкой (где может встречаться и дата, и время)... вот что пока получилось:

Код:

$Str = 'DD/MM/YYYY, [HH;MM;SS]'

ConsoleWrite(_DateTimeConvertFormat($Str))

Func _DateTimeConvertFormat($sFormat)
    Local $RetDateTime = $sFormat

        If StringRegExp($sFormat, '(?i)\[(.*)\]') Then
        $TPos_1 = StringInStr($sFormat, "[")
        $TPos_2 = StringInStr($sFormat, "]")

                $TruimVal = 1
        If StringInStr(StringMid($sFormat, $TPos_2 + 1), "]") Then $TruimVal = 0

                $TimeStr = StringMid($sFormat, $TPos_1+1, ($TPos_2 - $TPos_1) - $TruimVal)
        $TimeStr = _TimeConvertFormat($TimeStr)
        $DateStr = _DateConvertFormat(StringRegExpReplace($sFormat, '(?i)\[(.*)\]', '', 1))
        If StringRegExp(StringMid($sFormat, $TPos_2), '(?i)D|MM/Y') Then
            $RetDateTime = $TimeStr & $DateStr
        Else
            $RetDateTime = $DateStr & $TimeStr
        EndIf
    Else
        $RetDateTime = _DateConvertFormat($sFormat)
    EndIf

        If $RetDateTime = $sFormat Then $RetDateTime = _DateConvertFormat($sFormat)
    Return $RetDateTime
EndFunc

Время может быть задано только обрамлённое квадратными скобками, другого выхода пока не вижу :dont-know

amel27 13-08-2007 11:19 626840

Цитата:

Цитата Creat0R
Но мне всё же нужно доделать чтобы оно работало с одной строкой (где может встречаться и дата, и время)...

например так - опознавать месяц по наличию вблизи "M" символов "D" и "Y":
Код:

$Str = 'DD/MM/YYYY, [HH;MM;SS]'
ConsoleWrite(_DateTimeConvertFormat($Str))

Func _DateTimeConvertFormat($sFormat)
    StringReplace($sFormat, "y", "")
    Local $Year = StringRight(@YEAR, @extended)
    Local $Stamp = '<'& Random(10000000,99999999,1) &'>'
    Local $Mounth_Raw = @MON
    Local $Day_Raw = @MDAY
    Local $Hours_Raw = @HOUR
    Local $Minutes_Raw = @MIN
    Local $Seconds_Raw = @SEC

    $sFormat = StringRegExpReplace($sFormat, "(?i)(?:(d+|y+)(\W*)(mm)|(mm)(\W*)(d+|y+))", '\1\2'& $Stamp &'\5\6')
    If @extended Then $sFormat = StringReplace($sFormat, $Stamp, $Mounth_Raw)
    $sFormat = StringRegExpReplace($sFormat, "(?i)(?:(d+|y+)(\W*)(m)|(m)(\W*)(d+|y+))", '\1\2'& $Stamp &'\5\6')
    If @extended Then $sFormat = StringReplace($sFormat, $Stamp, $Mounth_Raw+0)

    $sFormat = StringRegExpReplace($sFormat, '(?i)y+', $Year)

    $sFormat = StringReplace($sFormat, "mm",$Minutes_Raw)
    $sFormat = StringReplace($sFormat, "m", $Minutes_Raw+0)

    $sFormat = StringReplace($sFormat, "dd",$Day_Raw)
    $sFormat = StringReplace($sFormat, "d", $Day_Raw+0)

    $sFormat = StringReplace($sFormat, "hh",$Hours_Raw)
    $sFormat = StringReplace($sFormat, "h", $Hours_Raw+0)

    $sFormat = StringReplace($sFormat, "ss",$Seconds_Raw)
    $sFormat = StringReplace($sFormat, "s", $Seconds_Raw+0)

    Return $sFormat
EndFunc


Maza Faka 13-08-2007 12:17 626876

Упрощённая схема кода:

Код:

#include <GuiConstants.au3>
Dim $msg, $time = 3000

GUICreate("Test", 300, 200)
GUISetState()

AdlibEnable("Play", $time)

While $msg <> $Gui_Event_Close
    $msg = GUIGetMsg()
WEnd

Func Play()
    SoundPlay(@ScriptDir & "\24.wav")
    $time = 10000
EndFunc

Как присвоить переменной $time значение 10000, что бы
Код:

AdlibEnable("Play", $time)
вызывал функцию с этим новым значением переменной?

SvetlanaK 13-08-2007 17:16 627039

Добрый день!
не подскажет ли кто по сочетаниям клавиш в AutoIt...SendKey.
программа выполняет сохранение файла в Exel. Меню "Файл"- >Enter->-5 раз Down - будет "сохранить как"
Но! другие пользователи поменяли меню "Файл", удалив из него открыть и закрыть...в результате 5 раз Down получилось - печать! скрипт не работает:( по идее надо бы сделать сочетание клавиш Ctrl+S, но
ControlSend("^{S}") просто печатает в ячейке S. не могу понять в чем дело( в кодировках? как быть?
Буду благодарна за любой ответ.

Maza Faka 13-08-2007 17:33 627052

SvetlanaK
Попробуй так:
Код:

Opt("WinTitleMatchMode", 1)
If WinExists("Microsoft Excel") Then WinActivate("Microsoft Excel")
        Send("^s")


Sanja Alone 13-08-2007 21:43 627154

SvetlanaK
Можно и с помощью COM:
Код:

$sFilePath = 'D:\MyDoc\Sample.xls' ;путь файла для выполнения действий над ним

$oExcel = ObjGet("", "Excel.Application") ; "схватить" существующий объект Excel (например, файл уже открыт в Excel)
If @error Then ; в случае неудачи создаем новый объект Excel и открываем требуемый файл
    $oExcel = ObjCreate("Excel.Application") ; создать объект Excel
    If Not IsObj($oExcel) Then Exit ; выйти, если не удалось создать объект Excel
    If FileExists($sFilePath) Then $oExcel.Workbooks.Open ($sFilePath) ; открыть в Excel указанный файл
EndIf

$oExcel.CalculateFull ; пересчитать формулы (это просто для примера, здесь можно выполнять массу других действий)
$oExcel.DisplayAlerts = 0 ; отключить предупреждения
$oExcel.Save ; сохранить файл
$oExcel.Quit ; выйти

P.S. Все вышеприведенные действия будут выполнены в hidden-режиме (за одним исключением - если на момент запуска скрипта файл открыт в Excel "руками"). Скрытый режим использован потому, что при данных условиях нет смысла отображать окно Excel - это приведет к неприятному мельканию...

Creat0R 13-08-2007 21:46 627156

amel27,
Цитата:

например так
Гинеально! Работает лучше чем ожидалось! :up:

Я правда добавил небольшую подстраховку на $Stamp :)

Код:

Func _DateTimeConvertFormat($sFormat)
    Local $Stamp = '<_>'
    While StringInStr($sFormat, $Stamp)
        $Stamp = '<'& Random(10000000,99999999,1) &'>'
    WEnd

        StringReplace($sFormat, "y", "")
    Local $Year = StringRight(@YEAR, @extended)
    Local $Mounth = @MON
    Local $Day = @MDAY
    Local $Hours = @HOUR
    Local $Minutes = @MIN
    Local $Seconds = @SEC

    $sFormat = StringRegExpReplace($sFormat, "(?i)(?:(d+|y+)(\W*)(mm)|(mm)(\W*)(d+|y+))", '\1\2' & $Stamp & '\5\6')
    If @extended Then $sFormat = StringReplace($sFormat, $Stamp, $Mounth)
    $sFormat = StringRegExpReplace($sFormat, "(?i)(?:(d+|y+)(\W*)(m)|(m)(\W*)(d+|y+))", '\1\2' & $Stamp & '\5\6')
    If @extended Then $sFormat = StringReplace($sFormat, $Stamp, $Mounth+0)

        $sFormat = StringRegExpReplace($sFormat, '(?i)y+', $Year)

        $sFormat = StringReplace($sFormat, "mm",$Minutes)
    $sFormat = StringReplace($sFormat, "m", $Minutes+0)

        $sFormat = StringReplace($sFormat, "dd",$Day)
    $sFormat = StringReplace($sFormat, "d", $Day+0)

        $sFormat = StringReplace($sFormat, "hh",$Hours)
    $sFormat = StringReplace($sFormat, "h", $Hours+0)

        $sFormat = StringReplace($sFormat, "ss",$Seconds)
    $sFormat = StringReplace($sFormat, "s", $Seconds+0)

        Return $sFormat
EndFunc

Шанс конечно очень маленький (а точнее мизерный) на то что будет сгенерирован штамп существующий в передаваемом формате даты/времени, но он всё же есть ;)

Maza Faka,
Цитата:

Как присвоить переменной $time значение 10000, что бы
AdlibEnable("Play", $time)
вызывал функцию с этим новым значением переменной?
Просто вызови по новой функцию ;) :

Код:

#include <GuiConstants.au3>
Dim $msg, $time = 3000

GUICreate("Test", 300, 200)
GUISetState()

AdlibEnable("Play", $time)

While $msg <> $Gui_Event_Close
    $msg = GUIGetMsg()
WEnd

Func Play()
    SoundPlay(@ScriptDir & "\24.wav")
    $time = 10000
    AdlibEnable("Play", $time)
EndFunc

SvetlanaK,
Цитата:

ControlSend("^{S}") просто печатает в ячейке S
Потому что там фокус находится...
Попробуй активировать окно Excel (тем самым убрав фокус с ячеек), затем вызвать клавиши.
Но тут возможна всплывёт другая проблема - если раскладка языка клавиатуры по умолчанию будет русской к примеру, тогда это сочетание не сработает, нужно будет делать так:

Код:

If @KBLayout = 0419 Then
    Send("^ы")
Else
    Send("^s")
EndIf

Есть ещё один такой подводный камушек - а если изменять профиль сочетании клавиш в Excel? не знаком с ним, но полагаю там есть такая возможность? :)

SvetlanaK 14-08-2007 10:27 627273

Maza Faka, Sanja Alone,
к сожалению эксель появляется открыто, "мелькает" так сказать...потому что файл появляется в результате принудительной выгрузки из другой программы (та программа так делает, по-другому никак).
вот и висит этот листик на экране, и сохранить его в нужное место с нужным именем и закрыть- задача номер один....
спасибо за подсказку, Objekt - это интересная идея, но результат выполнения такого скрипта - "лежащее " окно "сохранение документа":( , и вытящить его на поверхность чтобы ввести наконец нужное имя файла никак не удается(((
и еще в связи с этим, в вашем примере $sFilePath = 'D:\MyDoc\Sample.xls' ;путь файла для выполнения действий над ним
непонятно , а каком месте оно применимо( ведь команда Save не предполагает опций - куда и с каким именем...
в англоязычном хелпе ничего не нашлось по этому поводу(((
Спасибо за ответ.

Creat0R, не работает этот вариант( все равно пишет s(((
кстати пробовала WinMenuSelectItem - не могу добиться чтобы работало хоть где-нибудь! хотя бы в том же самом вордпаде(((

spooll 14-08-2007 12:07 627323

Блин, протестил на нескольких компах, все ок. Добавил в автозагрузку 100 юзерям и у всех на разных окнах позависало просто, подскажите вариант более надежный :(
PHP код:

Opt("RunErrorsFatal"0)

If 
FileExists("C:\Program Files\1Cv77\BIN\1CV7s.exe"Then Exit

BlockInput(1)

Run("\\192.168.11.198\Distrib\1s_install\B770023\Disk1\setup.exe")
If @
error Then Quit()

WinWait("Добро пожаловать""Добро пожаловать в программу установки"20)
ControlClick("Добро пожаловать""Добро пожаловать в программу установки""Button1")

WinWait("Выбор варианта установки""Выберите вариант установки программы"20)
ControlClick("Выбор варианта установки""Выберите вариант установки программы""Button6")

WinWait("Информация о пользователе""Введите Ваше имя и название"20)
ControlClick("Информация о пользователе""Введите Ваше имя и название""Button2")

WinWait("Информация о пользователе""Вы сообщили следующую информацию"20)
ControlClick("Информация о пользователе""Вы сообщили следующую информацию""Button1")

WinWait("Выбор каталога для установки""Программа установки поместит 1С"20)
ControlClick("Выбор каталога для установки""Программа установки поместит 1С""Button1")

WinWait("Создание нового каталога"""20)
ControlClick("Создание нового каталога""""Button1")

WinWait("Выбор программной группы""Выберите из существующих или"20)
ControlClick("Выбор программной группы""""Button2")

WinWait("Установка 1С:Предприятия""Программа установки скопировала файлы"20)
ControlClick("Установка 1С:Предприятия""Программа установки скопировала файлы""Button2")

WinWait("Установка 1С:Предприятия""Установка программы 1С"20)
ControlClick("Установка 1С:Предприятия""Установка программы 1С""Button1")

Run("\\192.168.11.198\Distrib\1s_install\B770025\Disk1\setup.exe")
If @
error Then Quit()

WinWait("Добро пожаловать""Добро пожаловать в программу установки"20)
ControlClick("Добро пожаловать""Добро пожаловать в программу установки""Button1")

WinWait("Список установленных программ""Из списка найденных на данном компьютере"20)
ControlClick("Список установленных программ""Из списка найденных на данном компьютере""Button4")

WinWait("Обновление 1С:Предприятия""При работе с сетевыми версиями"20)
ControlClick("Обновление 1С:Предприятия""При работе с сетевыми версиями""Button2")

WinWait("Обновление 1С:Предприятия""Обновление программы 1С"20)
ControlClick("Обновление 1С:Предприятия""Обновление программы 1С""Button1")
 
BlockInput(0)

Run("\\192.168.11.198\Distrib\1s_install\B770025\1C_patch_7725\1Cv77SQL_025_Patch.exe")
WinWaitActive("Патч 1С:Предприятие 7.7.025""Вы запустили программу"25)
ControlClick ("Патч 1С:Предприятие 7.7.025""Вы запустили программу""Button1")

WinWait("PatchWise Updater""ОК"20)
ControlClick("PatchWise Updater""ОК""Button1")

WinWait("Патч 1С:Предприятие 7.7.025""&Обновить"20)
ControlClick("Патч 1С:Предприятие 7.7.025""&Обновить""Button2")
Run("\\192.168.11.198\distrib\1s_install\link.cmd")

Quit()

Func Quit()   
    Exit
EndFunc 


Sanja Alone 14-08-2007 18:26 627551

SvetlanaK
Цитата:

и сохранить его в нужное место с нужным именем и закрыть- задача номер один
Не проблема, привожу решение данной задачи без лишних мышкодвижений:
Код:

$dFilePath = "D:\MyDoc\Результирующий_файл.xls" ; путь целевого файла

;константы, определяющие формат сохраняемого файла
const $xlCSV = 6 ; формат файла - coma separated values
const $xlTextMSDOS = 21 ; формат файла - текст MSDOS
const $xlWorkbookNormal = -4143 ; формат файла - xls

$oExcel = ObjGet("", "Excel.Application") ; "схватить" существующий объект Excel
If @error Then Exit ; выйти в случае неудачи

$oExcel.DisplayAlerts = 0 ; отключить предупреждения
$oExcel.ActiveWorkbook.SaveAs($dFilePath, $xlWorkbookNormal) ; сохранить файл как (здесь даже можно его сразу конвертировать во что-нибудь другое - некоторые константы описаны выше)
$oExcel.Quit ; выйти

Цитата:

непонятно , а каком месте оно применимо( ведь команда Save не предполагает опций - куда и с каким именем...
Туда же и с тем же именем, т.е. в самого себя :) Так как условия задачи были сформулированы расплывчато, то я подумал, что ее суть в выполнении определенных действий над существующим файлом с последующим сохранением оного.

SvetlanaK 15-08-2007 15:58 628061

Sanja Alone, что-то не получилось...но вообще пример ваш интересен, пригодится в написании логов...
откуда только Вы это берете - не знаю, я весь хэлп перерыла, ничего подобного не нашла...видимо вы гений, или автор автоита:)
нашла я очень простое решение, публикую его. может кому-то пригодится.
Send("{Alt}{Ф}")
Send("{с}")
сочетание букв с альтом почему-то работает в отличие от контрола...
альт - ф активизация меню файл, а потом нажатие клавиши с и открывается окно сохранения.
а почему с контролом ни одна буква не работает - для меня большая загадка....
В общем - большое Вам спасибо за тепрение и внимание к моей проблеме.

Sanja Alone 15-08-2007 16:32 628088

SvetlanaK
Цитата:

что-то не получилось...
Должно было получиться. Правда, может в момент запуска скрипта в Excel-е открыто больше одного файла, а тогда могло и не получиться... А еще могла отстутствовать на диске директория, куда нужно поместить результирующий файл. В данной ситуации лучше дописать в скрипт (до вызова метода SaveAs) такой фрагмент:
Код:

If Not FileExists(StringLeft($dFilePath, StringInStr($dFilePath, '\', 0, -1))) Then DirCreate(StringLeft($dFilePath, StringInStr($dFilePath, '\', 0, -1)))
Цитата:

откуда только Вы это берете
Гуглю

Цитата:

сочетание букв с альтом почему-то работает в отличие от контрола...
Так и должно быть - так работают все контролы (элементы управления), для которых определены хоткеи.
Узнать хоткей для любого контрола легко - это будет Alt+буква с подчеркиванием в тексте. Если "посмотреть" на этот контрол с пом. AutoIt Window Info, то перед этой буквой будет амперсанд:
Код:

;фрагмент информационного окна AutoIt Window Info:
Control ID: 1
ClassNameNN: Button2
Text: &Next >

Цитата:

альт - ф активизация меню файл, а потом нажатие клавиши с и открывается окно сохранения.
Применительно к менюшкам так и есть - сначала Alt+хоткей менюшки, а затем просто хоткей пункта в этой менюшке.

Maza Faka 15-08-2007 19:37 628191

PHP код:

HotKeySet("{LWIN}""MyFunc")
HotKeySet("{Esc}""Quit")

While 
1
    Sleep
(1000)
WEnd

Func MyFunc
()
    
MsgBox(0"""You pressed Windows Key")
EndFunc

Func Quit
()
    Exit
EndFunc 

Почему не работает, кто-нить может обьяснить?

Sanja Alone 15-08-2007 21:11 628243

Maza Faka
Цитата:

Почему не работает
Ну, допустим {ESC} то работает. А {LWIN} попадает в список исключений (я выделил красным). Цитирую AutoIt.chm:
Код:

The following hotkeys cannot be set:

Ctrl+Alt+Delete - It is reserved by Windows
F12 - It is also reserved by Windows, according to its API.
NumPad's Enter Key - Instead, use {Enter} which captures both Enter keys on the keyboard.
Win+B,D,E,F,L,M,R,U; and Win+Shift+M - These are built-in Windows shortcuts. Note: Win+B and Win+L might only be reserved on Windows XP and above.
Alt, Ctrl, Shift, Win - These are the modifier keys themselves!
Other - Any global hotkeys a user has defined using third-party software,
any combos of two or more "base keys" such as '{F1}{F2}',
and any keys of the form '{LALT}' or '{ALTDOWN}'.


Angelus 16-08-2007 11:22 628429

Я извеняюсь........может этот подымался.......просто интересно.......при установке винды устанавливается руская раскладка клавиатуры по умолчанию(есть люди которые так ставят).....в автоскрипт вписана смена раскладки на ангиский, работает........но вместо ввода с клавиатуры допустим...C:\Alcohol Soft......вводится......\A Ї.....че за бред может быть??.....англиский язык тоже установлен....но не основным!......когда чтоит Англиский по умолчанию...то все отлично....

Maza Faka 16-08-2007 18:42 628669

Накарябал скрипт для поиска и удаления строк дубликатов, в принципе работает, но только если заменять строку дубликат любым символом, а вот просто удалить строку не заменяя её каким либо символом никак не получается, посоветуйте, как исправить?

PHP код:

#include <File.au3>
#include <Array.au3>
Dim $strArray$file "c:\test.txt"
_FileReadToArray($file ,$strArray)

For 
$i 1 To $strArray[0]
    
$search _ArraySearch($strArray$strArray[$i])
    If 
$search <> $i Then _FileWriteToLine($file$i" "1)
    
Next 

Если заменять строку-дубликат вот так:
PHP код:

_FileWriteToLine($file$i""1

то, после удаления первого дубликата, строки смещаются на одну строку вверх и соответственно удаляются строки не являющиеся дубликатами.

Maza Faka 16-08-2007 19:13 628678

Всё, разобрался. :)
Код:

#include <File.au3>
#include <Array.au3>
Dim $strArray, $file = "c:\test.txt"

Write($strArray)

Func Write($strArray)
_FileReadToArray($file ,$strArray)
For $i = 1 To $strArray[0]
    $search = _ArraySearch($strArray, $strArray[$i])
    If $search <> $i Then
        _FileWriteToLine($file, $i, "", 1)
        $strArray = 0
        Write($strArray)
    EndIf
Next
EndFunc

А, что скажут знатоки? Можно ли так обрабатывать текст?

Creat0R 17-08-2007 09:49 628901

Angelus

Цитата:

вместо ввода с клавиатуры допустим...C:\Alcohol Soft......вводится......\A Ї.....
Посылаются латинские символы при не латинской раскладке клавиатуры - с точки зрения AutoIT, нормальное пведение, хотя я сам хотел бы чтобы этого не происходило...
Как вариант менять раскладку перед посыланием символов, либо (намного надёжнее) писать текст используя ControlSetText(), ведь как я поняол нужно вписать текст в определёное поле другого приложения?

Цитата:

Можно ли так обрабатывать текст?
Не желательно, это медлено и не надёжно, там каждую строку открывается файл, пишется в него, и потом закрывается файл (функция _FileWriteToLine()), лучше перечитать весь файл в массив, а потом обрабатывать сам массив...

Я лично такой метод использую:

Код:

$File = "C:\test.txt"

$Ret = _FileDeleteDuplicates($File, -1)

If $Ret = 1 Then
    MsgBox(64, "", "Was deleted <" & @extended & "> duplicates in file [" & $File & "]")
ElseIf @error Then
    MsgBox(48, "", "File [" & $File & "] was not found.")
EndIf

Func _FileDeleteDuplicates($sFile, $sDirection=-1)
    If Not FileExists($sFile) Then Return SetError(1, 0, -1)
    Local $sFileArray = StringSplit(StringStripCR(FileRead($sFile)), @LF)
    _ArrayDeleteClones($sFileArray, $sDirection)
    Local $Extended = @extended
    If $Extended = 0 Then Return SetError(0, 0, 0)
    Local $hFile = FileOpen($sFile, 130), $LF = @LF
    For $i = 1 To $sFileArray[0]
        If $i = $sFileArray[0] Then $LF = ""
        FileWrite($hFile, $sFileArray[$i] & $LF)
    Next
    FileClose($hFile)
    Return SetError(0, $Extended, 1)
EndFunc

Func _ArrayDeleteClones(ByRef $sArray, $sDirection=-1)
    If Not IsArray($sArray) Then Return SetError(1)
    If UBound($sArray, 0) > 1 Then Return SetError(2)
    Local $NewArr[1], $Extended=0, $FindDuplicate

        For $i = 1 To UBound($sArray)-1
        $FindDuplicate = _FindInArray($sArray, $sArray[$i], $i-1, $sDirection)
        If $FindDuplicate = -1 Then
            ReDim $NewArr[UBound($NewArr)+1]
            $NewArr[UBound($NewArr)-1] = $sArray[$i]
        Else
            $Extended += 1
        EndIf
    Next

        $NewArr[0] = UBound($NewArr) - 1
    $sArray = $NewArr
    Return SetError(0, $Extended, $sArray)
EndFunc

Func _FindInArray(ByRef $Array, $WhatToFind, $StartFrom=1, $sDirection=-1)
    If UBound($Array) < 2 Then Return -1
    Local $iFor = $StartFrom, $iTo = 1, $iStep = -1
    If $sDirection = 1 Then
        $iFor = $StartFrom + 2
        $iTo = UBound($Array)-1
        $iStep = 1
    EndIf

        For $iArr = $iFor To $iTo Step $iStep
        If $Array[$iArr] = $WhatToFind Then Return $iArr
    Next
    Return -1
EndFunc


Maza Faka 17-08-2007 17:59 629122

Creat0R
Красиво, но для меня пока сложновато :(
Непонятно вот это
Код:

SetError(1, 0, -1)
, зачем столько значений?

Creat0R 17-08-2007 18:21 629130

Maza Faka,
Цитата:

зачем столько значений?
Первое задаёт уровень ошибочности, второе нам не нужно в этом случае (расширенное значение содержащееся в макросе @extended на выходе с функции - если функция завершилась удачно, этот макрос будет содержать число произведённых замен в файле), но нужно третье, оно задаёт возвращаемое значение, подобно Return "Value"... таким образом можно проверить что функция завершилась неудачно (файл не найден), не всегда проверяется @error... хотя именно в этом случае, возможно и не нужно возвращать значение, но всё же так положенно :) (такое поведение наблюдается во многих встроенных функциях).

amel27 18-08-2007 07:34 629304

Maza Faka, Creat0R

еще два варианта удаления дублей: в 1-м случае файл подается в виде строки, во 2-м как массив строк
Код:

#include <array.au3>

Func _TextStripDupLines($text)
    If StringRight($text,2)<>@CRLF Then $text &= @CRLF
    Do
        $text = StringRegExpReplace($text,'(?s)(?m)(^[^\n]+\n)(.*?)(^\1)','\1\2')
    Until @extended=0
    Return $text
EndFunc

Func
_ArrayDeleteClones($strArray)
    Local $search, $newArray[1]=[0]
    For $i = 1 To $strArray[0]
        $search = -1
        If $i<$strArray[0] Then $search = _ArraySearch($strArray, $strArray[$i], $i+1)
        If $search=-1 Then
            $newArray[0]+=1
            ReDim $newArray[$newArray[0]+1]
            $newArray[$newArray[0]]=$strArray[$i]
        EndIf
    Next
    Return
$newArray
EndFunc


Creat0R 18-08-2007 07:56 629308

amel27,
Цитата:

в 1-м случае файл подается в виде строки
Не перестаю удивляться мощности этого инструмента (Регулярных выражении), ну и конечно твоему умению его использовать ;)
Правда этот метод расчитан только если попадаются как разделители строк @CRLF, а как быть с теми случаями когда строки поделены только лишь @LF/@CR? пробовал похимичить с Pattern, ничего не вышло :( .

Maza Faka 18-08-2007 11:17 629366

amel27
Немного исправил твой код:
Код:

#include <Array.au3>
#include <File.au3>

Dim $strArray, $newArray

_FileReadToArray("C:\test.txt", $strArray)
_ArrayDeleteClones($strArray, $newArray)

Func _ArrayDeleteClones($strArray, $newArray)
    Dim $search, $newArray[1]=[0]
    For $i = 1 To $strArray[0]
        $search = $i
        If $i <= $strArray[0] Then $search = _ArraySearch($strArray, $strArray[$i], $i+1)
        If $search = -1 Then
            $newArray[0] += 1
            ReDim $newArray[$newArray[0]+1]
            $newArray[$newArray[0]]=$strArray[$i]
        EndIf
    Next
    _ArrayDisplay($newArray, "Result")
EndFunc

а то последняя строка игнорировалась.

amel27 18-08-2007 12:17 629387

Цитата:

Цитата Maza Faka
последняя строка игнорировалась

ты прав - была ошибка, но так ее править нельзя, так как поиск ведется со следующего элемента... ошибка была строчкой выше. ;)
Цитата:

Цитата Creat0R
как быть с теми случаями когда строки поделены только лишь @LF/@CR?

RegExp распознает начало/конец строки только на основании @LF, а вот @CR является "лишним балластом" и без него можно обойтись... хотя без @CR из-за "+" пустые строки будут игнорироваться ("*" ставить нельзя!) Как вариант - использовать StringAddCR() и StringStripCR().

З.Ы. На самом деле AutoIT поддерживает не все возможности регулярных выражений, поэтому приходится выкручиваться.

Maza Faka 18-08-2007 13:26 629421

amel27
В итоге сделал так:
Код:

#include <Array.au3>
#include <File.au3>

Dim $strArray, $newArray

_FileReadToArray("C:\test.txt", $strArray)
_ArrayDeleteClones($strArray, $newArray)
_ArrayDisplay($newArray, "Result")

Func _ArrayDeleteClones($strArray, ByRef $newArray)
    Dim $search, $newArray[1]=[0]
    For $i = 1 To $strArray[0]
        $search = _ArraySearch($strArray, $strArray[$i], $i+1)
        If $search = -1 Then
            $newArray[0] += 1
            ReDim $newArray[$newArray[0]+1]
            $newArray[$newArray[0]]=$strArray[$i]
        EndIf
    Next
EndFunc

сойдёт или нет?

amel27 18-08-2007 14:22 629438

Maza Faka

я тут подумал насчет твоего варианта - почему он работает хотя вроде не должен... ведь действительно, если использовать встроенную защиту _ArraySearch() код можно еще сократить :)
Код:

#include <array.au3>
#include <file.au3>

Dim $a, $f = 'c:\test.txt'
_FileReadToArray($f, $a)
_FileWriteFromArray($f,_ArrayDeleteClones($a),1)

Func _ArrayDeleteClones($strArray)
    Local $newArray[1]=[0]
    For $i = 1 To $strArray[0]
        If _ArraySearch($strArray, $strArray[$i], $i+1)<0 Then
            $newArray[0]+=1
            ReDim $newArray[$newArray[0]+1]
            $newArray[$newArray[0]]=$strArray[$i]
        EndIf
    Next
    Return $newArray
EndFunc


Maza Faka 18-08-2007 19:21 629533

amel27
Цитата:

Цитата amel27
почему он работает хотя вроде не должен

:)

amel27 19-08-2007 03:08 629631

Creat0R
еще немного поразмыслил - про "+" я пожалуй не прав (были и другие варианты) - если поставить "*" функция должна корректно отрабатывать @LF/@CRLF, ну а про @CR я уже сказал... Кстати, из каждой пары одинаковых строк остается первая а вторая удаляется, если нужно наоборот достаточно поменять подстановку "\1\2" на "\2\1".

Maza Faka 19-08-2007 08:01 629643

amel27
Откуда такие познания в синтаксисе регулярных выражений? Может FAQ есть какой подробный?

Creat0R 19-08-2007 08:14 629646

amel27,
Вобщем видимо это оптимальный вариант, без никаких массивов, и сторонних библиотек:

Код:

$File = "C:\Test.txt"

$Ret = _FileDeleteDuplicates($File, -1)

If $Ret = 1 Then
    MsgBox(64, "Results", "Was deleted <" & @extended & "> duplicates in file [" & $File & "]")
ElseIf @error Then
    MsgBox(48, "Error", "File [" & $File & "] was not found.")
EndIf

Func _FileDeleteDuplicates($sFile, $sDirection=-1)
    If Not FileExists($sFile) Or StringInStr(FileGetAttrib($sFile), "D") Then Return SetError(1, 0, 0)

        Local $FileStr = FileRead($sFile), $FileHasEndCRLF = True, $Extended = 0
    Local $ReplDirectVal = '\1\2'
    If $sDirection <> -1 Then $ReplDirectVal = '\2\1'

        If StringRight($FileStr, 2) <> @CRLF Then
        $FileStr &= @CRLF
        $FileHasEndCRLF = False
    EndIf

        Do
        $FileStr = StringRegExpReplace($FileStr, '(?s)(?m)(^[^\n]+\n)(.*?)(^\1)', $ReplDirectVal)
        $Extended += @extended
    Until @extended = 0
    If $Extended = 0 Then Return SetExtended(0, 0)

        If Not $FileHasEndCRLF Then $FileStr = StringTrimRight($FileStr, 2)

        Local $hFile = FileOpen($sFile, 2)
    FileWrite($hFile, $FileStr)
    FileClose($hFile)
    Return SetExtended($Extended/2, 1)
EndFunc


Maza Faka
Цитата:

Цитата Maza Faka
Может FAQ есть какой подробный?

Есть тут что-то: http://shop.piter.com/lib/978531800056/regvir.phtml
И вот ещё ресурс посвящённый RegExp.

amel27 19-08-2007 10:45 629677

Creat0R
Цитата:

видимо это оптимальный вариант
Ну ты прям почти все учел. ;) Кстати, в RegExp-шаблоне последние скобки можно опустить (подстановка "\3" не используется, они у меня от отладки остались) - это должно немного ускорить обработку.

Maza Faka
Цитата:

Откуда такие познания в синтаксисе регулярных выражений?
почти все мои познания из книжки по первому линку Creat0R'а... правда у меня вторая редакция - там примеров побольше... к сожалению, только в бумажном варианте.

Maza Faka 19-08-2007 11:37 629701

amel27, Creat0R,
Цитата:

Цитата amel27
почти все мои познания из книжки по первому линку Creat0R'а

Уже скачал, в DJVU-формате :)

amel27
Сохранил весь топик в версии для печати и изучаю. Наткнулся на твой скрипт(я его немного изменил, вернее упростил для себя):
Вот так работает:
Код:

$Dir2 = LinesDelete("c:\dir2\xxx.sif", "text_1")

Func LinesDelete($path, $string)
    Local $StrArray
    _FileReadToArray($path, $StrArray)
    For $i = $StrArray[0] To 1 Step -1
        If StringInStr($StrArray[$i], $string) Then _ArrayDelete($StrArray, $i)
            _FileWriteFromArray($path, $StrArray, 1)
        Next
    EndFunc

А вот так выдаёт ошибку, хотя тоже отрабатывает:
Код:

Func LinesDelete($path, $string)
    Local $StrArray
    _FileReadToArray($path, $StrArray)
    For $i = 1 To $StrArray[0] Step 1
        If StringInStr($StrArray[$i], $string) Then _ArrayDelete($StrArray, $i) ;Здесь выдаёт ошибку
            _FileWriteFromArray($path, $StrArray, 1)
        Next
    EndFunc

Можешь обьяснить почему?

13ghost 19-08-2007 19:55 629826

Всем здравствовать!!!
Вопрос такой,как с помощью АвтоИт сравнить дату создания двух файлов.С ехе файлами проше,их я сравниваю при помощи FileGetVersion (),но мне надо сравнивать не только ехе ,но и
другие типы файлов.Подскажите что-нибудь или ссылку дайте где можно почитать.Спасибо

Алексей Н. 19-08-2007 21:57 629874

13ghost
В скриптовом языке AutoIt есть функция FileGetTime, с помощью которой можно получить информацию о дате и времени последней модификации указанного файла.
Поробнее можно посмотреть в справке.
Узнать именно дату создания файла вряд ли возможно. Так как она храниться не в файлах, а служебных таблицах ОС.

Creat0R 19-08-2007 22:09 629882

amel27,
Цитата:

в RegExp-шаблоне последние скобки можно опустить
Т.е так:

Код:

'(?s)(?m)(^[^\n]+\n)(.*?)^\1'
?

Или вовсе убрать (^\1)? хотя так не работает :) - цикл не прерывается.

Цитата:

к сожалению, только в бумажном варианте.
Вот кажется второе изданеие тоже в формате djvu - http://www.softtime.ru/info/fridl.php

А тут вообще этого добра полно ;)

Maza Faka,
Цитата:

А вот так выдаёт ошибку
В этом случае массив обрабатывается с начала к концу, поэтому при удалении элемента (_ArrayDelete()), массив уменьшается, хотя обработка задана по последнему его значению (до входа в цикл). Поэтому ошибка происходит когда в цикле досигается не существующий элемент массива (удалённый).
Для этого и потребовалось перербирать массив с конца к началу (For $i = $StrArray[0] To 1 Step -1), где будут проверяться меньшие элементы, в данном случае ошибки быть не может.

Алексей Н.,
Цитата:

Узнать именно дату создания файла вряд ли возможно
Ну почему, есть ведь флаг 1...

Цитата:

Цитата AutoIt3.chm
[optional] Flag to indicate which timestamp
0 = Modified (default)
1 = Created
2 = Accessed

Код:

$FileTimeArr = FileGetTime(@SystemDir & "\Notepad.exe", 1)

MsgBox(64, "Results", "Create Date/Time is:" & @LF & _
    $FileTimeArr[2] & "/" & $FileTimeArr[1] & "/" & $FileTimeArr[0] & ", " & _
    $FileTimeArr[3] & ":" & $FileTimeArr[4] & ":" & $FileTimeArr[5])


mikola1983 20-08-2007 06:51 629987

Доброго времени уважаемые...нет ли какой нибуть возможности сделать автоустановку приложения пользователем без прав, если ему надо устанавливает, нет удаляет... возможно ли как нибуть зашить в код строчку типа RunAs

Maza Faka 20-08-2007 08:08 629999

Creat0R
Цитата:

Цитата Creat0R
В этом случае массив обрабатывается с начала к концу, поэтому при удалении элемента (_ArrayDelete()), массив уменьшается, хотя обработка задана по последнему его значению (до входа в цикл). Поэтому ошибка происходит когда в цикле досигается не существующий элемент массива (удалённый).

Значит, как я понял, когда массив обрабатывается с начала к концу, то после удаления элемента (_ArrayDelete()), меняется размерность массива ($StrArray[0]), а в цикле идёт обращение к прежней размерности массива, поэтому возникает ошибка?

Цитата:

Цитата Creat0R
Ну почему, есть ведь флаг 1...
Цитата AutoIt3.chm:[optional] Flag to indicate which timestamp
0 = Modified (default)
1 = Created
2 = Accessed

Вот млин, а в русской справке такого нет :(, когда нужно было, я мучился, прикручивал батник.

Maza Faka 20-08-2007 08:30 630006

mikola1983
Цитата:

Цитата AutoIt help
Код:

If Not IsAdmin() Then
    RunAsSet('USER', @Computername, 'PASSWORD')
    Run("C:\Program\program.exe")
    Exit
EndIf



Creat0R 20-08-2007 09:35 630036

Maza Faka,
Цитата:

после удаления элемента (_ArrayDelete()), меняется размерность массива ($StrArray[0]), а в цикле идёт обращение к прежней размерности массива, поэтому возникает ошибка?
Да, всё верно, кстати, размерность меняется, но в отличие от твоего примера в скобках, нулевой элемент может и не содержать этих данных , проверяется как по Ubound()-1 ;)

Цитата:

в русской справке такого нет
Я давно пришёл к выводу, что оригинал всегда надёжнее, при переводе можно что-то упустить, что то забыть, не так уж и прост весь процесс перевода, особенно такого файла как справка по AutoIt :)

Но тут конечно нужны знания (основные) Английского, хотя куда без них учиться программировать ;)

amel27 20-08-2007 11:12 630085

Цитата:

Цитата Creat0R
Т.е так:
Код:
Код:

'(?s)(?m)(^[^\n]+\n)(.*?)^\1'

угу, теоретически на сохранение скобок тратится какое-то время

Цитата:

Цитата Maza Faka
Можешь обьяснить почему?

ну, CreatOR уже все объяснил... могу только предложить как альтернативу RegExp-вариант:
Код:

Func _LinesDelete ($text, $string)
    If StringRight($text,2)<>@CRLF Then $text &= @CRLF
    $string = StringRegExpReplace($string, '([][^()?.|{}*+\\])', '\\\1')
    Return StringRegExpReplace($text, '(?m)(?i)^'& $string &'[\r\n]+', '')
EndFunc


mikola1983 20-08-2007 15:31 630253

Maza Faka,

If Not IsAdmin() Then
RunAsSet('a.pupkin', 'trew', '123qwe')
Run('\\Distr\XnView-win.exe')
Exit
EndIf
MsgBox(0, 'Message', 'Now running with admin rights.')

не хочет работать .в чем проблемма?

spooll 20-08-2007 16:05 630270

Вложений: 2
Creat0R,

Лично на моем компе, хоть тресни, но виснет в этом моменте
PHP код:

WinWait("Выбор программной группы""Выберите из существующих или")
ControlClick("Выбор программной группы""""Button2"

(см скрин)

Тот что ты предложил с .

PHP код:

Opt("RunErrorsFatal"0)
Opt("WinTitleMatchMode", -3)
Opt("WinTextMatchMode"2

Зависает на первом же окне :(((

WinWait("Добро пожаловать", "&Далее >")
ControlClick("Добро пожаловать", "&Далее >", "Button1")

приложу скрин этих окон с AutoIT info.

если все верно и не ясно почему не работает, я пойду повешусь и не буду больше доставать, но может я че не так делаю?!

Maza Faka 20-08-2007 16:32 630291

mikola1983
Цитата:

Run('\\Distr\XnView-win.exe')
Попробуй прописать полный путь к запускаемому файлу.

Maza Faka 20-08-2007 16:53 630305

Почему функция возвращает переменную $count равную нулю, хотя файлы были найдены и удалены? Сначала я подумал, что это происходит если существуют подкаталоги, так, как при нахождении каталога функция вызывает саму себя и соответсвенно снова происходит декларирование переменной: Local $count = 0, но удалив подкаталоги, я обнаружил, что проблема не исчезла, функция всё так же возвращает переменную $count равной нулю. Я понимаю, что это даже не проблема, так как переменную можно обьявить вне функции и тогда счётчик будет приращиваться, но всё же интересно, почему так происходит?

Код:

Dim $delFile[3] = [2, "soccer5.bmp", "soccer9.bmp"], $path[3] = [2, "c:\test", "c:\1"]

For $p = 1 To $path[0]
    For $f = 1 To $delFile[0]
        $Del = DeleteFile($path[$p], $delFile[$f])
    Next
Next
MsgBox(64, "Result", $Del)

Func DeleteFile($path, $delfile)
    Local $count = 0
    $search = FileFindFirstFile($path & "\*.*")
    While 1
        $file = FileFindNextFile($search)
        If @error Then ExitLoop
            $Full_file = $path & "\" & $file
            If FileGetAttrib($Full_file) = "D" Then
                DeleteFile($Full_file, $delfile)
            ElseIf $file = $delFile Then
                If FileDelete($Full_file) Then $count += 1
            EndIf
        WEnd
        FileClose($search)
        Return $count & " files deleted"
    EndFunc


Creat0R 20-08-2007 17:52 630330

spooll,
Цитата:

виснет в этом моменте
Значит пробуй так:

Код:

Opt("RunErrorsFatal", 0)
Opt("WinTitleMatchMode", -2)
Opt("WinTextMatchMode", 2)

WinWait("Выбор программной группы", "Папки с Программами:")

...

Текст лучше подбирать полный.
Если программа 1c небольшая, залей куда нибудь (или дай линк на неё), попробую потестить у себя.

Maza Faka,
Цитата:

Почему функция возвращает переменную $count равную нулю, хотя файлы были найдены и удалены? Сначала я подумал, что это происходит если существуют подкаталоги, так, как при нахождении каталога функция вызывает саму себя и соответсвенно снова происходит декларирование переменной: Local $count = 0, но удалив подкаталоги, я обнаружил, что проблема не исчезла, функция всё так же возвращает переменную $count равной нулю.
Именно потому, что в начале функции обнуляется переменная $count...

На мой взгляд тут есть два варианта решения - 1) Проверять не обьявлена ли уже переменная (If Not IsDeclared($count) Then Local $count = 0), 2) (более правильный) - добавлять к $count возвращённое значение от повторного вызова функции DeleteFile()...

Код:

Dim $delFile[3] = [2, "soccer5.bmp", "soccer9.bmp"], $path[3] = [2, "c:\test", "c:\1"]

For $p = 1 To $path[0]
    For $f = 1 To $delFile[0]
        $Del = DeleteFile($path[$p], $delFile[$f])
    Next
Next
MsgBox(64, "Result", $Del & " files deleted")

Func DeleteFile($path, $delFile)
    Local $count = 0
    $search = FileFindFirstFile($path & "\*.*")
    While 1
        $file = FileFindNextFile($search)
        If @error Then ExitLoop
        $Full_file = $path & "\" & $file
        If FileGetAttrib($Full_file) = "D" Then
            $count += DeleteFile($Full_file, $delFile)
        ElseIf $file = $delFile Then
            $count += FileDelete($Full_file)
        EndIf
    WEnd
    FileClose($search)
    Return $count
EndFunc


spooll 20-08-2007 18:25 630345

Creat0R
весит 27 мб, желательно опробовать на паре компов(или несколько раз), т.к слабые у нас грузят окна бывает порядком больше времени, но что характерно, даже если убрать время, то при появлении окна всеравно ничего не происходит =\
http://www.rapidshare.ru/376488
заранее большое спасибо ;)

Maza Faka 20-08-2007 19:04 630369

Creat0R
Цитата:

Цитата Creat0R
На мой взгляд тут есть два варианта решения - 1) Проверять не обьявлена ли уже переменная (If Not IsDeclared($count) Then Local $count = 0), 2) (более правильный) - добавлять к $count возвращённое значение от повторного вызова функции DeleteFile()...

Первый вариант я попробовал сразу же, как обнаружил проблему с приращением счётчика, не помогло, сейчас попробовал 2-ой вариант, тоже не работает. Интересная задачка :)

Creat0R 20-08-2007 23:29 630487

spooll,
Цитата:

желательно опробовать на паре компов
Ага, мнеб один мой родной (единственный) в порядок привести... ;)

Попробую скачаю, завтра отпишусь о результатах..

Maza Faka,
Цитата:

2-ой вариант, тоже не работает
У меня работает, ты просто не считаешь счётчики в двух циклах... я так понял нужно во всех каталогах удалить все файлы?

Код:

Dim $PathFile[2][2] = [["c:\test", "c:\1"], ["soccer5.bmp", "soccer9.bmp"]]

Dim $Del = 0

For $i = 0 To UBound($PathFile)-1
    For $j = 0 To UBound($PathFile)-1
        $Del += DeleteFile($PathFile[0][$i], $PathFile[1][$j])
    Next
Next

MsgBox(64, "Result", $Del & " files deleted")

Func DeleteFile($path, $delFile)
    Local $count = 0
    $search = FileFindFirstFile($path & "\*.*")
    While 1
        $file = FileFindNextFile($search)
        If @error Then ExitLoop
        $Full_file = $path & "\" & $file
        If FileGetAttrib($Full_file) = "D" Then
            $count += DeleteFile($Full_file, $delFile)
        ElseIf $file = $delFile Then
            $count += FileDelete($Full_file)
        EndIf
    WEnd
    FileClose($search)
    Return $count
EndFunc


Maza Faka 21-08-2007 11:21 630646

Как правильно изменять размерность массива? Вот так не работает:
Код:

#include <Array.au3>
$var = DriveGetDrive("All")

_ArrayDelete($var, 1)
$var[0] -= 1
ReDim $var[$var[0]-1]

MsgBox(0, "", $var[0])
For $i = 1 To $var[0]
    MsgBox(64, "", $var[$i])
Next


amel27 21-08-2007 11:35 630657

Цитата:

Цитата Maza Faka
Вот так не работает

а зачем ReDim()?.. _ArrayDelete() и без него уменьшает размерность на 1

Creat0R 21-08-2007 15:14 630765

spooll

Кажется нашёл твою проблему(ы)...

У тебя видимо в настройках автоматом подставляется Организация:, если там пусто (у тех у кого этого не происходит), то кнопка Далее не активна, отсюда могут быть многие зависания.
Поэтому нужно проверять это дело...

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

У тебя ожидается окно "Создание нового каталога", как ты уверен что оно появится? а вдруг каталог уже существует?

С такими скриптами нужно стараться учитывать все варианты ;)

Вот что у меня получилось:

Код:

Opt("RunErrorsFatal", 0)
Opt("WinTitleMatchMode", -4)

$RegRead1CPath = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\1C\1Cv7\7.7\1С:Предприятие для SQL", "1CPath")
If FileExists($RegRead1CPath) Then Exit

$1c_InstallPath = "\\192.168.11.198\Distrib\1s_install"

BlockInput(1)

Run($1c_InstallPath & "\B770023\Disk1\setup.exe")
If @error Then Quit()

WinWait("Добро пожаловать", "Добро пожаловать в программу установки 1С:Предприятия.")
ControlClick("Добро пожаловать", "Добро пожаловать в программу установки 1С:Предприятия.", "Button1")

WinWait("Выбор варианта установки", "Выберите вариант установки программы 1С:Предприятие.")
ControlClick("Выбор варианта установки", "Выберите вариант установки программы 1С:Предприятие.", "Button6")

$UserInfoInputText = "Введите Ваше имя и название Вашей организации."
WinWait("Информация о пользователе", $UserInfoInputText)
$GetText_1 = ControlGetText("Информация о пользователе", $UserInfoInputText, "Edit1")
$GetText_2 = ControlGetText("Информация о пользователе", $UserInfoInputText, "Edit2")
If $GetText_1 = "" Then ControlSetText("Информация о пользователе", $UserInfoInputText, "Edit1", @UserName)
If $GetText_2 = "" Then ControlSetText("Информация о пользователе", $UserInfoInputText, "Edit2", @UserName)
ControlClick("Информация о пользователе", "Введите Ваше имя и название", "Button2")

WinWait("Информация о пользователе", "Верна ли информация для регистрации?")
WinActivate("Информация о пользователе", "Верна ли информация для регистрации?")
ControlClick("Информация о пользователе", "Верна ли информация для регистрации?", "Button1")

WinWait("Выбор каталога для установки", "Программа установки поместит 1С:Предприятие в выбранный каталог.")
$GetPathText = ControlGetText("Выбор каталога для установки", _
    "Программа установки поместит 1С:Предприятие в выбранный каталог.", "Static2")
WinActivate("Выбор каталога для установки", "Программа установки поместит 1С:Предприятие в выбранный каталог.")
ControlClick("Выбор каталога для установки", "Программа установки поместит 1С:Предприятие в выбранный каталог.", "Button1")

If Not FileExists($GetPathText) Then
    WinWait("Создание нового каталога", "Вы ввели следующее имя каталога:", 5)
    If WinExists("Создание нового каталога", "Вы ввели следующее имя каталога:") Then
        WinActivate("Создание нового каталога", "Вы ввели следующее имя каталога:")
        ControlClick("Создание нового каталога", "", "Button1")
    EndIf
EndIf

WinWait("Выбор программной группы", "Выберите из существующих или")
WinActivate("Выбор программной группы", "Выберите из существующих или")
ControlClick("Выбор программной группы", "Выберите из существующих или", "Button2")

WinWait("Установка 1С:Предприятия", "Программа установки скопировала файлы")
WinActivate("Установка 1С:Предприятия", "Программа установки скопировала файлы")
ControlClick("Установка 1С:Предприятия", "Программа установки скопировала файлы", "Button2")

WinWait("Установка 1С:Предприятия", "Установка программы 1С:Предприятие успешно завершена.")
WinActivate("Установка 1С:Предприятия", "Установка программы 1С:Предприятие успешно завершена.")
ControlClick("Установка 1С:Предприятия", "Установка программы 1С:Предприятие успешно завершена.", "Button1")

Run($1c_InstallPath & "\B770025\Disk1\setup.exe")
If @error Then Quit()

WinWait("Добро пожаловать", "Добро пожаловать в программу установки")
WinActivate("Добро пожаловать", "Добро пожаловать в программу установки")
ControlClick("Добро пожаловать", "Добро пожаловать в программу установки", "Button1")

WinWait("Список установленных программ", "Из списка найденных на данном компьютере")
ControlClick("Список установленных программ", "Из списка найденных на данном компьютере", "Button4")

WinWait("Обновление 1С:Предприятия", "При работе с сетевыми версиями")
WinActivate("Обновление 1С:Предприятия", "При работе с сетевыми версиями")
ControlClick("Обновление 1С:Предприятия", "При работе с сетевыми версиями", "Button2")

WinWait("Обновление 1С:Предприятия", "Обновление программы 1С")
WinActivate("Обновление 1С:Предприятия", "Обновление программы 1С")
ControlClick("Обновление 1С:Предприятия", "Обновление программы 1С", "Button1")
BlockInput(0)

Run($1c_InstallPath & "\B770025\1C_patch_7725\1Cv77SQL_025_Patch.exe")
If @error Then Quit()

$PathTitle = "regexp=Патч 1С:Предприятие [0-9]"

WinWait($PathTitle, "Вы запустили программу")
ControlClick($PathTitle, "Вы запустили программу", "Button1")

WinWait("PatchWise Updater", "ОК")
WinActivate("PatchWise Updater", "ОК")
ControlClick("PatchWise Updater", "ОК", "Button1")

WinWait($PathTitle, "&Обновить")
ControlClick($PathTitle, "&Обновить", "Button2")

Run($1c_InstallPath & "\link.cmd")

Quit()

Func Quit()
    BlockInput(0)
    Exit
EndFunc

Maza Faka,
Если я правильно понял, то в этом случае можно вообще не трогать массив:

Код:

$var = DriveGetDrive("All")

MsgBox(0, "", $var[0])

For $i = 2 To $var[0]
    MsgBox(64, "", $var[$i])
Next


Maza Faka 21-08-2007 16:39 630811

Creat0R
Цитата:

Цитата Creat0R
можно вообще не трогать массив:

$var = DriveGetDrive("All") я привёл для примера, просто интересует корректное изменение размерности массива при помощи "Redim".

amel27,
Цитата:

Цитата amel27
_ArrayDelete() и без него уменьшает размерность на 1

Да, он удаляет элемент из массива, но размерность остаётся прежней:
Код:

#include <Array.au3>
$var = DriveGetDrive("All")

_ArrayDelete($var, 1)

MsgBox(64, "", $var[0]) ;Размерность остаётся неизменной
For $i = 1 To UBound($var) - 1
    MsgBox(64, "", $var[$i])
Next

Приведите ПЛЗ пример с использованием "Redim".

Creat0R 21-08-2007 17:37 630843

Maza Faka,
Цитата:

размерность остаётся прежней:
Это не размерность, а значение в нулевом элементе, видимо ошибка _ArrayDelete()...

Цитата:

Приведите ПЛЗ пример с использованием "Redim".
Код:

#include <Array.au3>

Dim $Array[5] = [4, 1, 2, 3, 4]

_ArrayDisplay($Array)

ReDim $Array[4]
$Array[0] = 3

_ArrayDisplay($Array)


Maza Faka 21-08-2007 18:42 630872

Creat0R
Спасибо за пример.
Так вроде тоже работает:
Код:

#include <Array.au3>

Dim $Array[5] = [4, 1, 2, 3, 4]

_ArrayDisplay($Array)

ReDim $Array[4]
;$Array[0] = 4

_ArrayDisplay($Array)


Maza Faka 21-08-2007 19:33 630901

Как сделать, что бы работал $Gui_Event_Close в цикле "For"?

Код:

#include <GUIConstants.au3>

$gui = GUICreate("My GUI", 300, 200, -1, -1)
$Button = GUICtrlCreateButton("Start", 115, 20, 70)
$Progress = GUICtrlCreateProgress(10, 60, 280, 15)
GUISetState(@SW_SHOW)

While 1
    $msg = GUIGetMsg()

        Select
    Case $msg = $Button
        While $msg <> $GUI_EVENT_CLOSE
            $msg = GUIGetMsg()
            For $i = 10 To 100 Step 10
                Sleep(300)
                GUICtrlSetData($Progress, $i)
                If $i = 100 Then $i = 0
                Next
            WEnd

                Case $msg = $Gui_Event_Close
            ExitLoop
        EndSelect
    WEnd


Creat0R 22-08-2007 00:27 631060

Maza Faka,
Цитата:

Так вроде тоже работает:
Тут же не вопрос о работоспособности :) - Я просто привёл пример, и то что ты закоментировал, как раз и предназначено для присвоения нового значения размерности массива нулевому элементу.

Кстати, amel27 как то у меня спрашивал, откуда у меня такое недоверие к $Array[0], вот именно функция _ArrayDelete() и доказывает, что надёжнее использовать Ubound($Array)-1 ;)

Вот ещё пример с ReDim...

Код:

#include <Array.au3>

Dim $NewArray[1] ;Массив практический пуст...

;Отобразим его...
_ArrayDisplay($NewArray)

; А теперь заполним добавляя каждый раз новый элемент
For $i = 1 To 10
    ReDim $NewArray[ UBound($NewArray) + 1 ]
    $NewArray[ UBound($NewArray) - 1 ] = "Array Element Data #" & $i
Next
$NewArray[0] = UBound($NewArray) - 1

;Отобразим его снова, но уже заполненный ;)...
_ArrayDisplay($NewArray)


Цитата:

Как сделать, что бы работал $Gui_Event_Close в цикле "For"?
Уменьшить Sleep (до 30 к примеру) и проверять GUIGetMsg() в теле цикла...
Хотя я бы в данном случае использовал Events (события) метод...

Код:

#include <GUIConstants.au3>

$gui = GUICreate("My GUI", 300, 200, -1, -1)
$Button = GUICtrlCreateButton("Start", 115, 20, 70)
$Progress = GUICtrlCreateProgress(10, 60, 280, 15)
GUISetState(@SW_SHOW)

While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = $Button
            For $i = 10 To 100 Step 1
                If GUIGetMsg() = $GUI_EVENT_CLOSE Then ExitLoop 2
                Sleep(30)
                GUICtrlSetData($Progress, $i)
                If $i = 100 Then $i = 0
            Next
        Case $msg = $GUI_EVENT_CLOSE
            ExitLoop
    EndSelect
WEnd


Creat0R 22-08-2007 01:09 631077

А многие ли знают о том, что скомпилированный скрипт работает почти как полноценный интерпритатор кода AutoIt?
Т.е если мы скомпилируем скрипт, перенесём екзешник на компьютер где нет аутоита, и совершенно в любом файле (текстового характера), впишем код с синтаксисом AutoIt, то примерно следующая строка сможет выполнить этот файл как любой au3 файл где установлен AutoIt:

Код:

Run(@AutoItExe & ' /ErrorStdOut /AutoIt3ExecuteScript "test.app"')
Это же открывает ворота в совсем иное измерение! :yahoo:
Таким образом к примеру, можно даже создавать собственный (примитивный однако) язык программирования :clever-ma .
А ещё можно выполнять код программы без вывода критических сообщении (если скрипт выпадает).

amel27 22-08-2007 04:41 631108

Цитата:

Цитата Creat0R
amel27 как то у меня спрашивал, откуда у меня такое недоверие к $Array[0], вот именно функция _ArrayDelete() и доказывает, что надёжнее использовать Ubound($Array)-1

ничего это не доказывает - нужно просто внимательно читать документацию по функции, в _ArrayDelete() индекс может быть равен нулю значит она не поддерживает счетчики. Строго говоря, "массив со счетчиком" - это специальный пользовательский тип данных (UDT), отличный от обычного массива... соответственно, функция должна "понимать" этот тип

Цитата:

Цитата Creat0R
примерно следующая строка сможет выполнить этот файл как любой au3 файл где установлен AutoIt

для полноты картины - можно выполнять не только файлы, но и отдельные команды:
Код:

Run(@AutoItExe & " /ErrorStdOut /AutoIt3ExecuteLine " & chr(34) &"MsgBox(0, 'Привет', 'Привет от:'& @CR & @computername)"& chr(34))

Creat0R 22-08-2007 05:18 631109

amel27,
Цитата:

индекс может быть равен нулю значит она не поддерживает счетчики.
Я просто ориентируюсь на встроенных функциях, все они возвращают в нулевом элементе массива общее число элементов.

Цитата:

ожно выполнять не только файлы, но и отдельные команды
Я вкурсе :) - Это то и дало мне толчок в эту сторону... я раньше думал, что используя @AutoItExe & " /AutoIt3ExecuteLine ...", нужен обязательно установленный AutoIt... но оказывается нужен всего лишь закомпилированный скрипт.

Maza Faka 22-08-2007 08:26 631146

Creat0R
Спасибо за примеры с Redim и Progress!

Цитата:

Цитата Creat0R
А многие ли знают о том, что скомпилированный скрипт работает почти как полноценный интерпритатор кода AutoIt?

Цитата:

Цитата Справка
Запустить AutoIt3 скрипт на выполнение из скомпилированного AutoIt3 сценария:
Compiled.exe [/ErrorStdOut] [/AutoIt3ExecuteScript file] [params ...]
Эта форма позволяет сэкономить размер установки и использовать копию интерпретатора AutoIT3.exe, который уже находится внутри скомпилированного скрипта

P.S.
Цитата:

ErrorStdOut Позволяет перенаправить все фатальные ошибки на стандартное устройство вывода (StdOut), которое можно перенаправить в приложения, например, редактор Scite
И как это сделать?

Creat0R 22-08-2007 08:36 631147

Maza Faka,
Цитата:

И как это сделать?
Что именно? пренаправить? вроде это приложение само должно перехватывать из этого устройства (методом StdRead).
А вот как заставить первичный скрипт не выпадать с фатальной ошибкой (т.е выпадть, но без сообщении), я если честно и сам не могу сообразить... разве что писать весь код программы во временный файл, и запускать с нужными параметрами из закомпилированного скрипта... но это кажется не очень практично.

mikola1983 22-08-2007 09:21 631165

как сделать предложение пользователю. хочешь установить? если да то происходит установка если нет то генерится сообщение и высылается на емайлесли у кого есть готовый скрипт поделитесь пожалуйста.

Creat0R 22-08-2007 09:34 631170

mikola1983,
Цитата:

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

Код:

$Ask = MsgBox(36, "Вопрос", "хочешь установить?")
If $Ask = 6 Then
    MsgBox(64, "Ответ", "Отлично, устанавливаем!")
    ;тут устанавливаем
Else
    MsgBox(48, "Ответ", "А жаль :(")
    ;тут отсылаем на email ;)
EndIf


Maza Faka 22-08-2007 09:40 631171

Creat0R
Как сделать это-же, только в режиме OnEvent?
Код:

#include <GUIConstants.au3>
Dim $i = 1
$gui = GUICreate("My GUI", 300, 200, -1, -1)
$Button = GUICtrlCreateButton("Start", 115, 20, 70)
$Progress = GUICtrlCreateProgress(10, 60, 280, 15)
GUISetState(@SW_SHOW)

While 1
    $msg = GUIGetMsg()

        Select
    Case $msg = $Button
        GUICtrlSetData($Button, "Abort")
        For $i = $i To 100
            If GUIGetMsg() = $Button Then
                GUICtrlSetData($Button, "Start")
                ExitLoop
            EndIf
            Sleep(30)
            GUICtrlSetData($Progress, $i)
            If $i = 100 Then $i = 0
            Next

            Case $msg = $Gui_Event_Close
            ExitLoop
        EndSelect
    WEnd

Пока топчусь на том, что не могу даже закрыть Gui-окно, во время цикла For :(

Код:

#include <GUIConstants.au3>
Opt("GuiOnEventMode", 1)
Dim $end = 1
$gui = GUICreate("My GUI", 300, 200, -1, -1)
$Button = GUICtrlCreateButton("Start", 115, 20, 70)
$Progress = GUICtrlCreateProgress(10, 60, 280, 15)
GUISetOnEvent($GUI_EVENT_CLOSE, "CloseGui")
GUICtrlSetOnEvent($Button, "Progress")
GUISetState(@SW_SHOW)

While 1
    Sleep(500)
WEnd

Func Progress()
    For $i = 10 To 100 Step 10
        GUISetOnEvent($GUI_EVENT_CLOSE, "CloseGui")
        Sleep(300)
        If $i = 100 Then $i = 0
            GuiCtrlSetData($Progress, $i)
        Next
    EndFunc

Func CloseGui()
    Exit
EndFunc


amel27 22-08-2007 10:07 631191

Creat0R
Цитата:

А вот как заставить первичный скрипт не выпадать с фатальной ошибкой (т.е выпадть, но без сообщении), я если честно и сам не могу сообразить... разве что писать весь код программы во временный файл, и запускать с нужными параметрами из закомпилированного скрипта... но это кажется не очень практично
Не понял... Зачем временный файл? Ключ "/ErrorStdOut" вроде никак не связан с "/AutoIt3ExecuteScript". :blink:

mikola1983 22-08-2007 10:16 631196

Пасипа ... а есть какой нибуть вообще вариант отчета ....возможно 1 файл в который дабавятся имена ПК или логоны юзеров ...что нибуть такое по чему можно былобы определить кто отказался от установки.?

spooll 22-08-2007 11:16 631231

Creat0R,

Огромный труд, поклон тебе, мне до такого не дорасти наверное;)
У меня на компе также виснет 1ый экран, но тут явно, что я его затаскал уже вконец:)
Буду ставить юзерям, думаю все ок будет.Спасибо еще раз 8)

Maza Faka 22-08-2007 12:06 631257

mikola1983,
Цитата:

Цитата mikola1983
Пасипа ... а есть какой нибуть вообще вариант отчета ....возможно 1 файл в который дабавятся имена ПК или логоны юзеров ...что нибуть такое по чему можно былобы определить кто отказался от установки.?

Попробуй так:
Код:

$Ask = MsgBox(36, "Вопрос", "хочешь установить?")
If $Ask = 6 Then
    MsgBox(64, "Ответ", "Отлично, устанавливаем!")
    ;тут устанавливаем
Else
    MsgBox(48, "Ответ", "А жаль :(")
    $open = FileOpen("c:\test.txt", 1)
    FileWrite($open, @LogonDomain & " - " & @UserName & @CRLF)
    FileClose($open)
    ;тут отсылаем на email ;)
EndIf


Creat0R 22-08-2007 20:15 631592

Maza Faka,
Цитата:

Как сделать это-же, только в режиме OnEvent?
Я бы сделал так:

Код:

#include <GUIConstants.au3>
Opt("GuiOnEventMode", 1)

Global  $iProgr = -1

$gui = GUICreate("My GUI", 300, 200, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "CloseGui")

$Button = GUICtrlCreateButton("Start", 115, 20, 70)
GUICtrlSetOnEvent($Button, "SetProgress")

$Progress = GUICtrlCreateProgress(10, 60, 280, 15)

GUISetState(@SW_SHOW)

While 1
    Sleep(100)
WEnd

Func SetProgress()
    If $iProgr = -1 Then AdlibEnable("SetProgress", 300)
    $iProgr += 10
    If $iProgr > 100 Then $iProgr = 0
    GuiCtrlSetData($Progress, $iProgr)
EndFunc

Func CloseGui()
    Exit
EndFunc

Только зачем пауза именно в 300 мс? таким образом прогресс не очень гладко прогрессирует :)

amel27,
Цитата:

Не понял... Зачем временный файл? Ключ "/ErrorStdOut" вроде никак не связан с "/AutoIt3ExecuteScript"
Теперь я кажется тоже начинаю не понимать - используя ключ /ErrorStdOut, можно запустить скрипт без вывода всяких сообщении о фатальных ошибках (или просто ошибки о неверном синтаксисе и т.п), но как это использовать в закомпилированном скрипте, при этом не создавая временный файл? (чтобы в него всё прописать и запустить с этим ключом).

Связь у этих ключей тут одна, запуск скрипта в "тихом режиме" :)

Maza Faka 23-08-2007 09:12 631769

Creat0R,
Цитата:

Цитата Creat0R
Я бы сделал так:

Спасибо за наводку! В итоге сделал так:
Код:

#include <GUIConstants.au3>
Opt("GuiOnEventMode", 1)

Global $iProgress = 0, $i = 0

$gui = GUICreate("My GUI", 300, 200, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "CloseGui")

$Button = GUICtrlCreateButton("Start", 115, 20, 70)
GUICtrlSetOnEvent($Button, "SetProgress")

$Progress = GUICtrlCreateProgress(10, 60, 280, 15)

GUISetState(@SW_SHOW)

While 1
    Sleep(300)
WEnd

Func SetProgress()
    If $iProgress = 0 Then
        $iProgress = 1
        GUICtrlSetData($Button, "Abort")
        AdlibEnable("Test", 300)
    Else
        GUICtrlSetData($Button, "Start")
        $iProgress = 0
        AdlibDisable()
    EndIf
EndFunc

Func CloseGui()
    Exit
EndFunc

Func Test()
    $i += 10
    If $i > 100 Then $i = 0
        GuiCtrlSetData($Progress, $i)
EndFunc


Creat0R 23-08-2007 10:42 631818

Maza Faka,
Цитата:

В итоге сделал так
Тогда можно так (без использования функции Test() и AdlibEnable() :) )...

Код:

#include <GUIConstants.au3>
Opt("GuiOnEventMode", 1)

Global $iProgress = 0, $i = 0

$gui = GUICreate("My GUI", 300, 200, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "CloseGui")

$Button = GUICtrlCreateButton("Start", 115, 20, 70)
GUICtrlSetOnEvent($Button, "SetProgress")

$Progress = GUICtrlCreateProgress(10, 60, 280, 15)

GUISetState(@SW_SHOW)

While 1
    Sleep(100)
    While $iProgress
        Sleep(30)
        $i += 1
        If $i > 100 Then $i = 0
        GuiCtrlSetData($Progress, $i)
    WEnd
WEnd

Func SetProgress()
    If $iProgress = 0 Then
        $iProgress = 1
        GUICtrlSetData($Button, "Abort")
    Else
        $iProgress = 0
        GUICtrlSetData($Button, "Start")
    EndIf
EndFunc

Func CloseGui()
    Exit
EndFunc

Я так и не понял, зачем ставить паузу в 300 мс и прогресс по 10? :blink:

Maza Faka 23-08-2007 13:51 631934

Creat0R,
Цитата:

Цитата Creat0R
Тогда можно так (без использования функции Test() и AdlibEnable()

Да! Сенкс! :)

Цитата:

Цитата Creat0R
Я так и не понял, зачем ставить паузу в 300 мс и прогресс по 10?

А как лучше?

amel27 23-08-2007 14:29 631970

Creat0R
Цитата:

как это использовать в закомпилированном скрипте, при этом не создавая временный файл? (чтобы в него всё прописать и запустить с этим ключом).
например так:
Код:

; Проверка ключей и перезапуск в "тихом" режиме
If Not(StringRegExp($CmdLineRaw,'(?i)^/ErrorStdOut(?:\s|$)')) Then
    $pid = Run (@ScriptFullPath &' /ErrorStdOut '& $CmdLineRaw, @ScriptDir, 0, 2)
    _ScriptWriteLog($pid)
    Exit
EndIf

; Текст скрипта (пример ошибочной команды)
Run('Фигня всякая')
; Сохранение ошибок в лог-файле
Func _ScriptWriteLog($pid)
    Local Const $log = StringTrimRight(@ScriptFullPath,3) &'log'
    Local $text = ''
    FileWrite($log, @YEAR&'/'&@MON&'/'&@MDAY&' '&@HOUR&':'&@MIN&':'&@SEC&@CRLF)
    While 1
        $text = StdoutRead($pid)
        If @error Then ExitLoop
        FileWrite($log, $text)
    Wend
    FileWrite($log, @CRLF)
EndFunc

З.Ы. С одной стороны неудобно, что запускаются два процесса, но с другой - есть возможность перехватывать ошибки средствами того же EXE-файла.

nns 23-08-2007 16:26 632039

Здравствуйте всем.
Не подскажете, как с помощью AutoIT'а отловить окно с неизвестным заголовком. Проблема в том, что заголовок частично на другом языке, частично на английском. WinWait() по описанию должен отлавливать по подстроке заголовка (англ части), но в данном случае этого не происходит.
Можно ли как-то отловить окно, не зная заголовка, зная, к пример, что оно запустится через Run("..") ?
Спасибо.

Maza Faka 23-08-2007 17:32 632058

nns
При помощи утилиты "AutoIt Window Info" определи класс окна и сопостовляй поиск окна с пользовательским режимом.
Пример на блокноте:
Код:

Opt("WinTitleMatchMode", 4)
$title = "Classname=Notepad"
Run("notepad.exe")
WinWait($title)
ControlSend($title, "", "Edit1", "Hello World")


Creat0R 23-08-2007 19:02 632095

Maza Faka,
Цитата:

А как лучше?
Я уже в третьем примере привожу более плавный вариант ;) - паузу ставим примерно в 30, а степень прогресса по единичке (1).

nns,
Цитата:

Можно ли как-то отловить окно, не зная заголовка, зная, к пример, что оно запустится через Run("..") ?
Можно получить PID (идентификатор процесса), и по нему узнать заголовок (вот тут есть для эого функция)... но это проблематично, так как в разных случаях процесс может быть уже запущен, а окно всё ещё не появилось, нужно знать заранее хотябы поведение запускаемого приложения.

amel27,
Цитата:

например так:
Wow! Спасибо большое! я думал что это не прокатит с закомпилированным скриптом :)...

Цитата:

С одной стороны неудобно, что запускаются два процесса
Это только если нужно читать ошибки, в противном случае скрипт можно запустить, а родительский процесс сразу же закрывается.. я даже не успеваю разглядеть его в диспетчере задач.

Maza Faka,
Цитата:

Пример на блокноте:
Я пришёл к выводу, что именно для блокнота (хотя и ещё для многих и многих приложении), самый подходящий вариант получить заголовок таков:

Код:

Opt("WinTitleMatchMode", 2)

$NotepadTitle = WinGetTitle("- Notepad")

MsgBox(64, "", "Title of Notepad is: " & $NotepadTitle)

Получать заголовок по classname не всегда идеальный метод, у меня к примеру стоит всместо стандартного Notepad -> Notepad2, и класс у него естественно другой (Notepad2 :) ).

Я на оф. форуме запостил предложение о том чтобы добавили поддержку совмещения classname и regexp при расширенном поиске окон, но они вроде не собираются ничего предпринимать :(
Если они это сделают, тогда можно будет искать окно примерно так:

Код:

Opt("WinTitleMatchMode", 4)
$NotepadTitle = WinGetTitle("classname+regexp=Notepad[0-9]")


Maza Faka 23-08-2007 19:49 632122

Цитата:

Цитата Creat0R
Получать заголовок по classname не всегда идеальный метод, у меня к примеру стоит всместо стандартного Notepad -> Notepad2, и класс у него естественно другой (Notepad2 ).

Не понял, ты имеешь в виду, что могут быть глюки из-за схожих названий классов? Или что, бы схожие по названию классы классифицировались, как один? Плз обьясни подробней.

Creat0R 23-08-2007 20:11 632129

Maza Faka,
Цитата:

ты имеешь в виду, что могут быть глюки из-за схожих названий классов?
Они будут ;) класс должен быть в точности, частичной подборки классов пока не реализовано...

Цитата:

Плз обьясни подробней
Ну к примеру если имеем класс окна IEFrame (у Internet Explorer), то подбирая так: classname=IEFrame всё будет ок, но если к примеру класс окна таков: classname=bosa_sdm_Microsoft Office Word 11.0 (у MS Word), тогда нужно быть уверенным что именно такой класс имеет это окно, а если нам к примеу нужно подобрать другой заголовок приложения Office, к примеру от Power Point, то там заголовок немного другой, но схожесть есть, он также начинается с bosa_sdm... - Вот тут то нам и пригодилась бы подборка по regexp (прописав regexp+classname=bosa_sdm(.*)).

Creat0R 24-08-2007 06:43 632298

Обновил скрипт который предназначен для вставки AutoIt-кода в разукрашенном виде на форум - Au3ToPost 1.4:






История версии:

Цитата:

v1.4
* Все временные файлы теперь хранятся в @TempDir & "\Временная папка" - "Временная папка" генерируется при каждом запуске скрипта - таким образом легче хранить и удалять временные файлы.
* Некоторые уточнения в интерфейсе GUI.
* Теперь при запуске фокус сразу переходит на поле с кодом скрипта.
* Также фокус переходит на поле с кодом при зажатии птички "Ввести код вручную".
* Данные о входном и выходном файле теперь пишутся (запоминаются) при выходе с программы.
+ Добавлена возможность использования клавиши Tab в процессе ручной правки кода скрипта.
+ Добавлено отображение количества символов при выводе результата (на разных форумах разные ограничения на количество символов в посте).
+ Добавлено главное меню:
****Меню;
********"Интегрировать программу в SciTE" - Добавляет пункт в меню Tools для удобного доступа к программе.
********"Выход" - Выход из программы ;)
****
****О программе - Отображает детали о программе :)

+ Добавлена поддержка командной строки - Если в качестве ком. строки передавать в программу путь к исходному файлу-скрипту, то этот файл будет использоваться как входной файл для обработки.

v1.3
* Улучшена обработка нажатии чекбоксов.
* Добавлена проверка на ошибки.
* Общая оптимизация программы.
* Многие уточнения и коррекции в программе.

Закачать можно отсюда...

mikola1983 24-08-2007 07:47 632303

а есть ли возможность в автоит работать с чек боксами или радио кнопками? иногда не удобно писать {SPACE}{DOWN}{SPACE}{DOWN}{SPACE}...особенно если их много....есть ли более простой способ указывать чек бокс.

Creat0R 24-08-2007 08:02 632308

mikola1983,
Цитата:

а есть ли возможность в автоит работать с чек боксами или радио кнопками?
Конечно!
К примеру используя ControlCommand() или ControlClick()...

Код:

#include <GuiConstants.au3>

$Gui = GuiCreate("Test")

$Radio1 = GUICtrlCreateRadio("Radio1", 20, 60)
$Radio2 = GUICtrlCreateRadio("Radio2", 20, 80)

$CheckBox1 = GUICtrlCreateCheckbox("CheckBox1", 20, 120)
$CheckBox2 = GUICtrlCreateCheckbox("CheckBox2", 20, 140)

$Button_Radio = GUICtrlCreateButton("Check Radio", 20, 200)

$Button_CheckBox = GUICtrlCreateButton("Check CheckBox", 120, 200)

GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case -3
            Exit
        Case $Button_Radio
            ControlCommand($Gui, "", $Radio1, "Check", "")
        Case $Button_CheckBox
            ControlClick($Gui, "", $CheckBox2)
    EndSwitch
WEnd


Maza Faka 24-08-2007 08:04 632309

Цитата:

Цитата mikola1983
есть ли возможность в автоит работать с чек боксами или радио кнопками?

Да, например:
Код:

ControlCommand ( "title", "text", controlID, "Check", "")
Для снятия отметки "Uncheck".

P.S.
Ты в справку заглядываешь? ;)

mikola1983 24-08-2007 08:11 632310

Пасипа ) заглядываю но совет гуру луччи любой справки ....тем более я только начал осваивать данную программу и пока тяжеловато мне со справкой.

Maza Faka 24-08-2007 10:37 632355

Почему функция StdOutRead() так странно работает? Вот к примеру скрипт:

Код:

$foo = Run(@ComSpec & " /c @dir /b e:\", @SystemDir, @SW_HIDE, 4+2)

While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop
    MsgBox(0, "STDOUT read:", $line)
Wend

While 1
    FileWrite("c:\error.log", $line)
    $line = StderrRead($foo)
    If @error Then ExitLoop
    MsgBox(0, "STDERR read:", $line)
Wend

сначала отображается один файл, а затем все остальные, кроме файла, который отобразился в первый раз, почему так происходит?

Maza Faka 24-08-2007 13:58 632451

Почему функция возвращает ноль?

Код:

Dim $path
MsgBox(64, "Done", WritePathToReg("icqlite.exe", @ProgramFilesDir))

Func WritePathToReg($icq, $path)
    $search = FileFindFirstFile($path & "\*.*")
    While 1
        $file = FileFindNextFile($search)
        If @error Then ExitLoop
            $full_path = $path & "\" & $file
            If FileGetAttrib($full_path) = "D" Then WritePathToReg($icq, $full_path)
                If StringInStr($file, $icq) Then
                    MsgBox(0, "", $path)
                    Return $path
                EndIf
            WEnd
            FileClose($search)
        EndFunc


Angelus 24-08-2007 14:18 632460

Никто не в курсе почему часть скрипта

Код:

$ex = 0
Do
    If ProcessExists ( 'iexplore.exe' ) Then
        Run ( 'tskill.exe iexplore', 'c:\windows\system32' )
        Run ( 'tskill.exe wow', 'c:\windows\system32' )
        Sleep (1000)
        MsgBox ( 64, 'Сообщение', 'Не пытайтесь запустить EXPLORER, вас только выкинет с игры!!!', 7 )
        $ex = $ex + 1
    ElseIf Not ProcessExists ( 'wow.exe' ) Then
        Exit
    EndIf
Until $ex = 1

загружает процессор на 100%????

Maza Faka 24-08-2007 15:42 632497

Angelus
Попробуй так:
Код:

AdlibEnable("Wow")

While 1
    Sleep(100)
WEnd

Func Wow()
    If ProcessExists ( 'iexplore.exe' ) Then
        Run ( 'tskill.exe iexplore', 'c:\windows\system32' )
        Run ( 'tskill.exe wow', 'c:\windows\system32' )
        Sleep (1000)
        MsgBox ( 64, 'Сообщение', 'Не пытайтесь запустить EXPLORER, вас только выкинет с игры!!!', 7 )
    ElseIf Not ProcessExists ( 'wow.exe' ) Then
        Exit
    EndIf
EndFunc


Creat0R 24-08-2007 19:44 632590

Maza Faka,
Цитата:

сначала отображается один файл, а затем все остальные, кроме файла, который отобразился в первый раз, почему так происходит?
Через StdOutRead можно читать данные те что доступны в момент выполнения (ком. строки).
Видимо отдаются не все данные сразу, можно их склеивать ;)

Код:

$foo = Run(@ComSpec & " /c @dir /b e:\", @SystemDir, @SW_HIDE, 4+2)
$line = ""
$Errline = ""

While 1
    $line &= StdoutRead($foo)
    If @error Then ExitLoop
Wend

While 1
    FileWrite("c:\error.log", $line)
    $Errline &= StderrRead($foo)
    If @error Then ExitLoop
Wend

MsgBox(0, "STDERR read:", $line)
MsgBox(0, "STDOUT read:", $Errline)

Цитата:

Почему функция возвращает ноль?
По умолчанию функция так и возвращает если не задано значение по Return, видимо у тебя в функции дело не доходит до Return :) - MsgBox показывается перед выходом с функции?
Кстати, у тебя проверяется на папку, но проверять нужно содержится ли буква D в возвращённом значении от FileGetAttrib(), потому как папка может ещё иметь атрибут скрытый и т.п ;)


Angelus,
Цитата:

загружает процессор на 100%????
Если нет процесса iexplore.exe и существует процесс wow.exe, то цикл продолжает без паузы, для предотвращения загрузкий ЦП нужна пауза хотябы в 10 мс.
Кстати, вместо Run('tskill...') можно использовать ProcessClose() ;)

Creat0R 25-08-2007 00:32 632693

Накалякал тут функцию для отображения MsgBox со счётчиком отсчёта + возможностью указывания hWnd (идентификатор окна к которому будет относится сообщение):

Код:

_MsgBoxCount(36, "Hello World!", "Hi!", 5, WinGetHandle(""))

Func _MsgBoxCount($Flag, $Title, $Text, $Time=0, $hWnd=0, $ButtonIDName='Button1')
    Run(@AutoItExe & ' /ErrorStdOut /AutoIt3ExecuteLine "DllCall(''user32.dll'', ''int'', ''MessageBox'', ''hwnd'', ' & _
        $hWnd & ', ''str'', ''' & $Text & ''', ''str'', ''' & $Title & ''', ''int'', ' & $Flag & '")')

        Local $OldWTMM = Opt("WinTextMatchMode", 2)
    If $Time > 0 Then
        WinWait($Title, $Text)
        Local $ButtonText = ControlGetText($Title, $Text, $ButtonIDName)
        For $i = $Time To 1 Step -1
            If Not WinExists($Title, $Text) Then ExitLoop
            ControlSetText($Title, $Text, $ButtonIDName, $ButtonText & ' (' & $i & ')')
            Sleep(1000)
        Next
    EndIf
    Opt("WinTextMatchMode", $OldWTMM)
    If WinExists($Title, $Text) Then ControlClick($Title, $Text, $ButtonIDName)
EndFunc

Вот только не знаю как организовать возвращаемое значение...
Пробовал через StdOutRead, но не выходит :( - Пример попытки через обычный MsgBox():

Код:

$Ret = _MsgBoxCount(36, "Hello World!", "Hi!", 5)
MsgBox(0, "", $Ret)

Func _MsgBoxCount($Flag, $Title, $Text, $Time=0, $ButtonIDName='Button1')
    Local $Pid = Run(@AutoItExe & ' /ErrorStdOut /AutoIt3ExecuteLine "StdinWrite(''' & @AutoItPID & ''', MsgBox(' & _
        $Flag & ', ''' & $Title & ''', ''' & $Text & ''',' & $Time & '))"', '', '', 6)

        Local $OldWTMM = Opt("WinTextMatchMode", 2)
    If $Time > 0 Then
        WinWait($Title, $Text)
        Local $ButtonText = ControlGetText($Title, $Text, $ButtonIDName)
        For $i = $Time To 0 Step -1
            If Not WinExists($Title, $Text) Then ExitLoop
            ControlSetText($Title, $Text, $ButtonIDName, $ButtonText & ' (' & $i & ')')
            Sleep(1000)
        Next
    EndIf
    Opt("WinTextMatchMode", $OldWTMM)
    Return StdoutRead($Pid)
EndFunc

Пробовал по разному использовать StdOutRad, StdinWrite, но так ничего и не вышло...

Maza Faka 25-08-2007 09:02 632745

Creat0R,
Цитата:

Цитата Creat0R
По умолчанию функция так и возвращает если не задано значение по Return, видимо у тебя в функции дело не доходит до Return - MsgBox показывается перед выходом с функции?

Да, MsgBox показывается с путём C:\Program Files\IsqLite, но скрипт не завершает работу, а пару секунд, чего то там делает, и возвращает ноль. Такое ощущение, что после появления MsgBox скрипт продолжает работу.

Код:

Dim $path
MsgBox(64, "Done", WritePathToReg("icqlite.exe", @ProgramFilesDir))

Func WritePathToReg($icq, $path)
    $search = FileFindFirstFile($path & "\*.*")
    While 1
        $file = FileFindNextFile($search)
        If @error Then ExitLoop
            $full_path = $path & "\" & $file
            If StringInStr(FileGetAttrib($full_path), "D") Then WritePathToReg($icq, $full_path)
                If $file = $icq Then
                    MsgBox(0, "", $path)
                    Return $path
                EndIf
            WEnd
            FileClose($search)
        EndFunc


Creat0R 25-08-2007 09:36 632756

Maza Faka,
Цитата:

скрипт не завершает работу, а пару секунд, чего то там делает, и возвращает ноль
Он ищет далее по папкам ;)

Какого назначение этой функции? сюдя по названию что-то пишет в реестер, но судя по содержанию, рекурсивно ищет определённый файл... :)

Во-первых у тебя при выходе не закрывается поиск, это уже ошибка.
Во-вторых, если ничего не найдено, нужно решить что возвращать, иначе будет 0... и тогда ты сможешь определить ошибку...
А в третьих, зачем обьявлять переменную $path в начале скрипта? она ведь используется как параметр в функции, обьявлять в этом случае незачем, имхо.

Код:

Func WritePathToReg($icq, $path)
        $search = FileFindFirstFile($path & "\*.*")
        While 1
                $file = FileFindNextFile($search)
                If @error Then ExitLoop
                $full_path = $path & "\" & $file
                If StringInStr(FileGetAttrib($full_path), "D") Then WritePathToReg($icq, $full_path)
                If $file = $icq Then
                        FileClose($search)
                        Return $path
                EndIf
        WEnd
        FileClose($search)
        Return -1
EndFunc

После этого, я сразу вижу что функция ВСЕГДА возвращает значение -1, потому как цикл заканчивается (после рекурсива). Но я если честно даже не знаю что она на самом деле должна возвращать, все пути где найден файл, или что? или может писать в реестер каждый путь? :) - Тогда зачем возвращать значения путей?

amel27 25-08-2007 10:23 632765

Maza Faka
Цитата:

Почему функция возвращает ноль?
Кроме ошибки с атрибутами, на которую указал Creat0R у тебя в скрипте есть еще ряд мелких ошибок: используемые в функции переменные не объявлены как Local; выход из функции по Return происходит без закрытия хэндла FileClose().

Теперь к вопросу о возвращаемом значении… Во-первых, функция не является рекурсивной, так как нарушено одно из правил рекурсии: возвращаемое функцией значение должно передаваться по всей цепочке рекурсивных вызовов, у тебя же значение, возвращаемое WritePathToReg() вообще игнорируется… из этого имеем два следствия:
- дальше первого уровня подкаталогов функция и не пытается заглянуть, если бы файл лежал глубже чем на один уровень функция бы его не нашла;
- функция, осуществившая рекурсивный вызов не знает о результате этого вызова… поэтому даже если файл найден (как в твоем случае) на возвращаемое значение это никак не повлияет и результат будет зависеть только от содержимого текущего каталога ($path).

один из возможных вариантов,
ключевой переменной, передаваемой между рекурсивными вызовами является $sRetPath:
Код:

MsgBox(64, "Done", _FindFile("icqlite.exe", @ProgramFilesDir))

Func _FindFile($sFile, $sPath)
    Local $sRetPath='', $sFullPath
    Local $hSearch = FileFindFirstFile($sPath & "\*.*"), $sName = FileFindNextFile($hSearch)
    While @error=0 And $sRetPath = ''
        $sFullPath = $sPath &'\'& $sName
        If $sName = $sFile Then $sRetPath = $sPath
        If StringInStr(FileGetAttrib($sFullPath), "D") Then $sRetPath = _FindFile($sFile, $sFullPath)
        $sName = FileFindNextFile($hSearch)
    WEnd
    FileClose($hSearch)
    Return $sRetPath
EndFunc


Maza Faka 25-08-2007 10:46 632772

amel27
Спасибо! Отличный код! Работает в 3 раза быстрее чем мой корявый код. :)

amel27 25-08-2007 10:55 632775

Maza Faka
Всегда пожалуйста :) ИМХО единственный случай, когда оправдано применение глобальных данных в рекурсии это массивы, во всех остальных случаях можно обойтись правильным выбором передаваемого значения.... И еще важное замечание - если в функции используются глобальные переменные их нужно обязательно объявлять в параметрах через ByRef, иначе потом легко забыть и запутаться.

Maza Faka 25-08-2007 11:06 632781

Цитата:

Цитата amel27
ключевой переменной, передаваемой между рекурсивными вызовами является $sRetPath:

If StringInStr(FileGetAttrib($sFullPath), "D") Then $sRetPath = _FindFile($sFile, $sFullPath)
Но ведь переменная $sRetPath заново обьявляется в начале функции:
Local $sRetPath='', $sFullPath, какой смысл присваивать ей значение?

Ммм...голова уже пухнет, кажется, что начинаю, что-то понимать, но оказывается, что понимаю не так. :)

amel27 25-08-2007 11:43 632801

Цитата:

Цитата Maza Faka
какой смысл присваивать ей значение?

Что возвращает функция _FindFile() ?... либо "пусто" (файл в каталоге не найден), либо путь к каталогу с файлом, поэтому: при входе в функцию $sRetPath "пусто", далее устанавливаем его значение для каждого элемента каталога:

для файлов: просто проверяем условие - если подходит, то присваиваем значение $sRetPath = $sPath;
для каталогов: функция _FindFile() сама устанавливает требуемое значение $sRetPath.

Может тебе так будет понятней (пожалуй, это будет и правильней):
Код:

MsgBox(64, "Done", _FindFile("icqlite.exe", @ProgramFilesDir))

Func _FindFile($sFile, $sPath)
    Local $sRetPath='', $sFullPath
    Local $hSearch = FileFindFirstFile($sPath &"\*"), $sName = FileFindNextFile($hSearch)
    While @error=0 And $sRetPath = ''
        $sFullPath = $sPath &'\'& $sName
        If StringInStr(FileGetAttrib($sFullPath), "D") Then
            $sRetPath = _FindFile($sFile, $sFullPath)
        Else
            If
$sName = $sFile Then $sRetPath = $sPath
        EndIf
        $sName = FileFindNextFile($hSearch)
    WEnd
    FileClose($hSearch)
    Return $sRetPath
EndFunc

Цитата:

Цитата Maza Faka
голова уже пухнет

для рекурсий это нормально :)

Creat0R 25-08-2007 13:46 632841

Есть такая нестандартная задачка:

Имеется массив содержащий 6 значимых элементов:

Код:

Global $PlayersArray[7] = [6, "Вася", "Петя", "Паша", "Толик", "Лёня", "Кеша"]
Элементы массива, как видно, представляют имена игроков (скажем в настольный теннис :) ), нужно чтобы каждый игрок, поиграл со всеми остальными пятью игроками, но таким образом, чтобы все игроки ждали одинаковое количество игр между своими встречами, и при этом чтобы не получилось такого что один игрок играет более одной игры подряд :wacko: ...

Результат желательно вывести в качесте подобной таблицы:

Цитата:

Вася vs Паша
Лёня vs Петя
Толик vs Кеша

И т.д.
Пытался решить циклами типа такого:

Код:

Global $TotalPlayers = 6
Global $PlayersArray[$TotalPlayers+1] = [$TotalPlayers, "Вася", "Петя", "Паша", "Толик", "Лёня", "Кеша"]

$GamesList = ''

For $i = 1 To $TotalPlayers
    $CurrentGameArr = GetRandomGame()

        While StringInStr($GamesList, $CurrentGameArr[0] & " vs " & $CurrentGameArr[1]) Or _
        StringInStr($GamesList, $CurrentGameArr[1] & " vs " & $CurrentGameArr[0])
        $CurrentGameArr = GetRandomGame()
    WEnd
    $GamesList &= $CurrentGameArr[0] & " vs " & $CurrentGameArr[1] & @LF
Next

MsgBox(0, "", $GamesList)

Func GetRandomGame()
    Local $Player_1 = $PlayersArray[Random(1, $TotalPlayers, 1)]
    Local $Player_2 = $PlayersArray[Random(1, $TotalPlayers, 1)]
    While $Player_2 = $Player_1
        $Player_2 = $PlayersArray[Random(1, $TotalPlayers, 1)]
    WEnd
    Local $RetArr[2] = [$Player_1, $Player_2]
    Return $RetArr
EndFunc

Но как видно результат не впечатляющий :(
Если кто то сможет решить задачку, буду очень благодарен, я если честно после трёхчасового просижывания потерял надежду на то что это вообще реально... оч нужно :blush2: ..

Maza Faka 25-08-2007 16:56 632906

amel27,
Цитата:

Цитата amel27
ключевой переменной, передаваемой между рекурсивными вызовами является $sRetPath

Значит получается, что переменная совсем не пуста, и в ней хранятся временные данные при вызове функции?

amel27 27-08-2007 10:30 633529

Maza Faka
Цитата:

получается, что переменная совсем не пуста, и в ней хранятся временные данные при вызове функции?
практически она все время пуста, как только ей присваивается значение функция немедленно завершает свою работу и возвращает это значение.... а если ничего не найдено, то возвращает значение инициализации - "пусто".

Creat0R
Цитата:

чтобы все игроки ждали одинаковое количество игр между своими встречами
Это как понимать? Что-то мне подсказывает, что с таким условием задача не имеет решения... Как минимум, из этого следует, что для каждого игрока должен быть СВОЙ уникальный период ожидания, в противном случае игроки с одинаковым интервалом однажды встретившись играли бы только друг с другом... :)
ADD:
Цитата:

Накалякал тут функцию для отображения MsgBox со счётчиком отсчёта + возможностью указывания hWnd
чем тебя не устраивает штатный GUI?.. хотелось бы знать причину

Creat0R 27-08-2007 19:46 633791

amel27,
Цитата:

Что-то мне подсказывает, что с таким условием задача не имеет решения
После двух дней колдования, я пришёл к тому же выводу :biggrin:
Всегда получается что кто-то ждёт дольше или меньше.. даже если речь идёт о 5-ти, и даже 4-тёх игроках...

В результате сделал типа такого (набросок с реальной бумаги :)) :

Код:

#include <Array.au3>

Global $PlayersString = "Вася|Петя|Паша|Толик|Лёня|Кеша"
Global $TotalPlayers = UBound(StringSplit($PlayersString, "|"))-1
Global $TotalGames = ($TotalPlayers * ($TotalPlayers-1)) / 2
Global $GamesListArr = GetRandomGames($PlayersString, $TotalPlayers, $TotalGames)

_ArrayDisplay($GamesListArr)

Func GetRandomGames($PlayersString, $TotalPlayers, $TotalGames)
    Local $GamesList = ''
    Local $PlayersArray = StringSplit($PlayersString, "|")

    Local $SortArray[$TotalPlayers+1], $GamesStr = ''

        For $i = 1 To $TotalPlayers
        $SortArray[$i] = $PlayersArray[Random(1, $TotalPlayers, 1)]
        While StringInStr($GamesStr, $SortArray[$i])
            $SortArray[$i] = $PlayersArray[Random(1, $TotalPlayers, 1)]
        WEnd
        $GamesStr &= $SortArray[$i] & @CRLF
    Next

        Local $GamesListArr[$TotalGames+1]

        Switch $TotalPlayers
        Case 6
            $GamesListArr[1] = $SortArray[1] & @Tab & " [vs] " & @Tab & $SortArray[3]
            $GamesListArr[2] = $SortArray[2] & @Tab & " [vs] " & @Tab & $SortArray[4]
            $GamesListArr[3] = $SortArray[5] & @Tab & " [vs] " & @Tab & $SortArray[6]
            $GamesListArr[4] = $SortArray[1] & @Tab & " [vs] " & @Tab & $SortArray[4]
            $GamesListArr[5] = $SortArray[3] & @Tab & " [vs] " & @Tab & $SortArray[2]
            $GamesListArr[6] = $SortArray[4] & @Tab & " [vs] " & @Tab & $SortArray[6]
            $GamesListArr[7] = $SortArray[1] & @Tab & " [vs] " & @Tab & $SortArray[5]
            $GamesListArr[8] = $SortArray[2] & @Tab & " [vs] " & @Tab & $SortArray[6]
            $GamesListArr[9] = $SortArray[4] & @Tab & " [vs] " & @Tab & $SortArray[3]
            $GamesListArr[10] = $SortArray[1] & @Tab & " [vs] " & @Tab & $SortArray[2]
            $GamesListArr[11] = $SortArray[5] & @Tab & " [vs] " & @Tab & $SortArray[4]
            $GamesListArr[12] = $SortArray[6] & @Tab & " [vs] " & @Tab & $SortArray[3]
            $GamesListArr[13] = $SortArray[2] & @Tab & " [vs] " & @Tab & $SortArray[5]
            $GamesListArr[14] = $SortArray[1] & @Tab & " [vs] " & @Tab & $SortArray[6]
            $GamesListArr[15] = $SortArray[3] & @Tab & " [vs] " & @Tab & $SortArray[5]
    EndSwitch
    Return $GamesListArr
EndFunc

Т.е сначала играет первый с третьим (разбросано по элементам массива [1] vs [3]), потом второй с четвёртым, и т.д... вобщем сначала я на бумаге расписал оптимальные(?) вариации, таким образом чтобы никто долго не ждал следующей игры, а также чтобы не получилось такого что кто-то играет много игр подряд... а потом всё это перенёс в формат массива.
Сделать всё это без бумаги (т.е программно сгененрировать оптимальные варианты) у меня не удалось, а оно очень помогло бы, т.к могут быть и не 6 игроков, а, скажем 7 или 5 и т.д... для каждого количества игроков я конечно могу также выкрутиться с бумагой (что я и сделал для 5-ти и 4-ёх игроков, для этого в принципе и оставлен Switch в функции ;)), но каждый раз так подбирать вручную весьма утомительно :( .

Цитата:

чем тебя не устраивает штатный GUI?.. хотелось бы знать причину
Во-первых мне просто как припятствие хотелось это решить :) (оно мне надо?!)...
А на счёт GUI, ну, у меня есть пару вариации с отсчётом и обычные, но дело в том, что довольно сложно подобрать оптимальный вариант когда речь идёт о размерах диалога MsgBox в соответствии с передаваемым текстом, т.е мне до сих пор не удалось просчитать точно какой размер должен иметь гуи, чтобы поместить в себе указанный текст, и при этом не "покрыть" кнопки текстом (ведь передаваться могут также и символы перевода строки, это само по себе припятствие), а также ещё не знаю на какой системный файл можно понадеятся чтобы украсть с него иконки для отображения :)

amel27 28-08-2007 05:51 633965

Цитата:

Цитата Creat0R
каждый раз так подбирать вручную весьма утомительно

не вижу смысла в Random(), ИМХО нужно тупо перебрать все возможные варианты... Вообще-то ввиду критичности к скорости для таких переборов обычно используют ASM, но для отладки алгоритма вполне подойдет любой язык, а использование эвристических ограничений на перебор, найденных при анализе задачи может существенно сократить количество вариантов.

Вот вариант скрипта, пытающегося перебрать все варианты, в качестве условий я задал постоянство периода для одного игрока и разный период для разных игроков (найдены при анализе задачи). Удачной комбинацией считается использование всех возможных партий хотя бы по разу.
Код:

Global Const $iCNT = 6 ; Количество игроков
Global Const $iMAX = _Factorial($iCNT) / (_Factorial($iCNT-2)*_Factorial(2)) ; Количество всевозможных пар игроков

; Массив "игроки"
; $aPlayers[$i][0] - кол-во сыгранных игроком партий
; $aPlayers[$i][1] - время последней партии игрока (индекс $aTimeLine[])
; $aPlayers[$i][2] - временной интервал между последней и предпоследней партиями игрока


Global $aPlayers[$iCNT+1][3]
; Массив "игровые пары"
; $aPatterns[$i][1] - битовый паттерн пары (не используется)
; $aPatterns[$i][2] - битовый паттерн 1-го игрока (не используется)
; $aPatterns[$i][3] - битовый паттерн 2-го игрока (не используется)
; $aPatterns[$i][4] - номер 1-го игрока
; $aPatterns[$i][5] - номер 2-го игрока


Global $aPatterns[$iMAX+1][6], $k=0
; Заполнение массива всевозможных пар
For $i=1 To $iCNT
    For $j=$i+1 To $iCNT
        $k
+=1
        $aPatterns[$k][4]=$i
        $aPatterns
[$k][5]=$j
        $aPatterns
[$k][2]=BitRotate(1, $i-1)
        $aPatterns[$k][3]=BitRotate(1, $j-1)
        $aPatterns[$k][1]=BitOR($aPatterns[$k][2],$aPatterns[$k][3])
    Next
Next


; Массив "линия времени"
;  $i - порядковый номер игры (aka "дискретное время")
;  $aTimeLine[$i] - пара игроков (индекс массива $aPatterns)

Global $aTimeLine[2] = [1,0]

; Основной цикл перебор:
;  выход по завершению перебора всех вариантов,
;  либо при нахождении нужного

While $aTimeLine[0]>0 And Not(_CheckTimeLine())
    $ret = _PatternNext() ; ищем следующего предендента
    If $ret Then
        _PatternAdd($ret)
        $aTimeLine[0]+=1
    Else
        _PatternDel()
        $aTimeLine[0]-=1
    EndIf
    ReDim
$aTimeLine[$aTimeLine[0]+1]
    ; вывод промежуточного результата
    _TimeLinePrint()
WEnd

; Поиск следующей партии, подходящей по условию
Func _PatternNext()
    Local $i
    For $i=$aTimeLine[$aTimeLine[0]]+1 To $iMAX
        If _PatternCheck($i) Then Return $i
    Next
    Return
0
EndFunc

; Процедура удаления предыдущей комбинации:
;  (все возможные партии исчерпаны)

Func _PatternDel()
    Local $iDEL=$aTimeLine[$aTimeLine[0]] ; код последней проверенной партии
    If $iDEL Then
        Local
$i, $aP[3]=[2, $aPatterns[$iDEL][4], $aPatterns[$iDEL][5]] ; номера игроков
        ; Обновляем характеристики игроков

        For $i=1 To $aP[0]
            $aPlayers[$aP[$i]][0]-=1 ; уменьшаем счетчик игр
            $aPlayers[$aP[$i]][1]-=$aPlayers[$aP[$i]][2] ; расчет индекса предыдущей игры
        Next
        $aPatterns[$iDEL][0]-=1 ; уменьшаем счетчик для партии
    EndIf
EndFunc


; Процедура формирования следующей комбинации:
;  (добавление очередной партии)

Func _PatternAdd($iNext)
    _PatternDel() ; удаление предыдущего вариата
    $aPatterns[$iNext][0]+=1 ; увеличиваем счетчик для партии
    $aTimeLine[$aTimeLine[0]]=$iNext ; устанавливаем новое значение партии
    Local $aP[3]=[2, $aPatterns[$iNext][4], $aPatterns[$iNext][5]] ; номера игроков
    ; Обновляем характеристики игроков

    For $i=1 To $aP[0]
        $aPlayers[$aP[$i]][0]+=1 ; увеличиваем счетчик игр
        If $aPlayers[$aP[$i]][0]=2 Then $aPlayers[$aP[$i]][2]=$aTimeLine[0]-$aPlayers[$aP[$i]][1] ; интервал игр
        $aPlayers[$aP[$i]][1]=$aTimeLine[0] ; индекс последней игры
    Next
EndFunc


; Условие на добавляемую в конец "линии времени"
;  партию ("пару игроков")

Func _PatternCheck($iPattern)
    Local $i, $k, $aL[3]=[2,0,0], $aB[3]=[2,0,0] ; интервалы и результат проверки игроков
    Local $aP[3]=[2, $aPatterns[$iPattern][4], $aPatterns[$iPattern][5]] ; номера игроков
    ; Проверка параметров каждого игрока

    For $k=1 To $aP[0]
        If $aPlayers[$aP[$k]][0]=1 Then ; для 2-й партии
            $aL[$k] = $aTimeLine[0]-$aPlayers[$aP[$k]][1] ; устанавливаем значение интервала
            ; Условия на интервал между играми:

            If $aL[$k]=1 Then Return False ; запрет на непрерывную игру
            For $i=1 To $iCNT ; запрет на одинаковые интервалы разных игроков
                If $i<>$k Then
                    If
$aL[$k]=$aPlayers[$i][2] Then Return False
                EndIf
            Next
        ElseIf
$aPlayers[$aP[$k]][0]>1 Then ; для последующих партий
            If $aTimeLine[0]-$aPlayers[$aP[$k]][1]<>$aPlayers[$aP[$k]][2] Then Return False ; проверка на постоянство интервала
        EndIf
    Next

    ; проверка совместных параметров двух игроков
    If $aPlayers[$aP[1]][0]=1 And $aPlayers[$aP[2]][0]=1 Then
        If
$aL[1]=$aL[2] Then Return False
    EndIf
    Return True
EndFunc


; Условие на всю последовательность игр, по выполнении которого
 ;  программа считает, что искомый вариант найден

Func _CheckTimeLine()
    Local $i
    ; проверка на использование всех возможных "пар игроков"
    For $i=1 To $iMAX
        If $aPatterns[$i][0]=0 Then Return False
    Next
    Return True
 EndFunc


; Вывод на консоль обрабатываемого варианта
Func _TimeLinePrint()
    Local $s1='', $s2=''
    For $i=1 To $aTimeLine[0]
        If $aTimeLine[$i] Then
            $s1&=$aPatterns[$aTimeLine[$i]][4] &' '
            $s2&=$aPatterns[$aTimeLine[$i]][5] &' '
        EndIf
    Next
    If
$aTimeLine[0] Then
        ConsoleWrite($s1&@CRLF&$s2&@CRLF&@CRLF)
    Else
        ConsoleWrite("NULL"&@CRLF)
    EndIf
EndFunc


; Расчет факториала
Func _Factorial($int)
    Local $i, $res=1
    For $i=1 To $int
        $res
*=$i
    Next
    Return
$res
EndFunc


Creat0R 28-08-2007 06:20 633969

amel27,
Цитата:

не вижу смысла в Random()
Это для того чтобы каждый раз гинерировался разный список игр..

Цитата:

Вот вариант скрипта, пытающегося перебрать все варианты, в качестве условий я задал постоянство периода для одного игрока и разный период для разных игроков (найдены при анализе задачи). Удачной комбинацией считается использование всех возможных партий хотя бы по разу. Я намеренно закомментировал запрет на игры без отдыха (период=1), как видно это не спасает задачу - решения все равно нет.
Хм... что-то не могу понять как это теперь применить на действии, т.е как в результате этой обработки получить список предстоящих игр?

Я понимаю что задачка немного(?) может показаться смутной, возможно если я приведу пример того что я уже сделал в виде ГУИ интерфейса (где я уже использую выше-приведённый мной метод), это поможет иметь более чёткое представление о задаче?


Цитата:

; Количество всевозможных пар игроков
Это имеется в виду общее (максимальное) количество игр?
Мне кажется это можно подсчитать таким образом - (Количество игроков * (количество игроков - 1)) / 2... т.е типа такого:

Код:

$iMAX = ( $iCNT * ($iCNT-1) ) / 2
Ведь каждый должен сиграть с каждым, и тогда получается что при 6-ти игроках имеем 6 раз по 5, но так как сам с собой игрок играть не может :), игр на самом деле в два раза меньше.

amel27 28-08-2007 06:53 633975

Цитата:

Цитата Creat0R
не могу понять как это теперь применить на действии

никак :), скрипт не генерит последовательности, а перебирает по очереди все возможные (по условию) из доступных до первого успешного варианта... если таких нет, то результат "NULL". В данном случае как раз так - нет ни одного варианта... Зато позволяет поиграть ограничительными условиями и посмотреть как это повлияет на результат.(см. - исправил ошибку)
Цитата:

Цитата Creat0R
Мне кажется это можно подсчитать таким образом

угу, это тоже самое... вдруг в будущем понадобится подсчитать число игр "пара на пару"? ;)

Creat0R 28-08-2007 07:15 633978

amel27,
Цитата:

скрипт не генерит последовательности, а перебирает по очереди все возможные (по условию) из доступных до первого успешного варианта... если таких нет, то результат "NULL". В данном случае как раз так - нет ни одного варианта... Зато позволяет поиграть ограничительными условиями и посмотреть как это повлияет на результат
Т.е просто(?) проверка на "реальность" выполнения данной задачки (с указанными условиями)? Тоже полезное занятие :) Спасибо.

Цитата:

вдруг в будущем понадобится подсчитать число игр "пара на пару"?
Это уже слишком, пара на пару нечего считать, победители остаются :biggrin:

Чуть позже выложу скрипт с тем что я уже сделал, там всё вручную и никаких проверок, но зато я горжусь там одной функцией CalculateWinner() :yu: - функция для подсчёта победителей и очков у каждого в отдельности или у нескольких игроков сразу (если к примеру они делят первое-второе место, ну или другие места) на основе ввода результатов игр (1:0, 0:1 и т.д. для каждой сыгранной игры).

amel27 28-08-2007 09:10 634013

Creat0R
Цитата:

Т.е просто(?) проверка на "реальность" выполнения данной задачки (с указанными условиями)?
да, как-то одно время увлекался решением различных головоломок на компьютере, почти все решаются аналогичным "лобовым" перебором с применением некоторых общих соображений... чтобы уложиться в осмысленные сроки :)
Цитата:

также ещё не знаю на какой системный файл можно понадеятся чтобы украсть с него иконки для отображения
ну, логично предположить, что "user32.dll" ;)

Creat0R 28-08-2007 09:32 634027

amel27,
Цитата:

логично предположить, что "user32.dll"
Ок, вот что получилось с MsgBox (_GuiMsgBox() :) )...

Код:

#Include <GuiConstants.au3>

$Title = "My Custom MsgBox"
$Promt = "Are you sure?"
$CheckBoxText = "Don't show again"

$hWnd = WinGetHandle("")

$Ask = _GuiMsgBox(32, 2, $Title, $Promt, 330, 120, $CheckBoxText, 10, $hWnd, "OK", "Cancel")

$CheckBitAnd = BitAND($Ask, 8)

$Var = "Pressed "
Select
        Case $Ask - $CheckBitAnd = 1
                $Var &= "'OK'"
        Case $Ask - $CheckBitAnd = 6
                $Var &= "'Yes' or 'OK'"
        Case $Ask - $CheckBitAnd = 7
                $Var &= "'No' or 'Cancel'"
EndSelect

If $CheckBitAnd = 8 Then $Var &= @LF & "And CheckBox <" & $CheckBoxText & "> was Checked"

MsgBox(64, "Message", "Returned values:" & @LF & @LF & $Var)


Func _GuiMsgBox($IcoType,$Butt_Num,$Title,$Text,$Width,$Height,$CB_Text=-1,$Timer=-1,$hWnd=0,$B1Text=-1,$B2Text=-1,$ExStyle=-1)
        Local $Yes, $No, $OK, $CheckBox=-1, $Gui, $GuiHeight = $Height, $TitleType = $WS_CAPTION+$WS_POPUP, $Msg, $ReturnVal = 0
        Local $DefButton = $OK, $DefButtonText = $B1Text, $Counter
       
        Switch $IcoType
                Case 16
                        $IcoType = 103
                Case 32
                        $IcoType = 102
                Case 48
                        $IcoType = 101
                Case 64
                        $IcoType = 104
                Case Else
                        $IcoType = 102
        EndSwitch
       
        Local $Old_Opt_GOEM = Opt('GuiOnEventMode', 0)
        Local $Old_Opt_GCOE = Opt('GUICloseOnESC', 0)
       
        If $hWnd <> 0 Then WinSetState($hWnd, "", @SW_DISABLE)
        If $Butt_Num = 1 Then $TitleType += $WS_SYSMENU
        If $CB_Text <> -1 Then $GuiHeight += 25
       
        If $B1Text = -1 Then $B1Text = 'OK'
        If $B2Text = -1 Then $B2Text = 'Cancel'
       
        $Gui = GuiCreate($Title, $Width, $GuiHeight, -1, -1, $TitleType, $ExStyle, $hWnd)
       
        GUICtrlCreateIcon('user32.dll', $IcoType, 10, 10)
        GUICtrlCreateLabel($Text, 70, 15, $Width-80, $Height-50)
       
        Select
                Case $Butt_Num = 2
                        $Yes = GUICtrlCreateButton($B1Text, ($Width/2)-90, $Height-35, 70, 20)
                        $DefButton = $Yes
                       
                        $No = GUICtrlCreateButton($B2Text, ($Width/2)+20, $Height-35, 70, 20)
                       
                        GUICtrlSetState($No, $GUI_ONTOP)
                        GUICtrlSetState($Yes, $GUI_ONTOP+$GUI_DEFBUTTON)
                Case Else
                        $OK = GUICtrlCreateButton($B1Text, ($Width-70)/2, $Height-35, 70, 20)
                        GUICtrlSetState($OK, $GUI_DEFBUTTON+$GUI_ONTOP)
                        $DefButton = $OK
        EndSelect
       
        If $CB_Text <> -1 Then $CheckBox = GUICtrlCreateCheckbox($CB_Text, 15, $Height-10)
        GuiSetState(@SW_SHOW, $Gui)
       
        If $Timer > 0 Then
                $Counter = $Timer
                $Timer = TimerInit()
                $DefButtonText = GUICtrlRead($DefButton)
                GUICtrlSetData($DefButton, $DefButtonText & ' (' & $Counter & ')')
        EndIf
       
        While 1
                $Msg = GUIGetMsg()
               
                If $Timer > 0 And TimerDiff($Timer) >= 1000 Then
                        $Timer = TimerInit()
                        $Counter -= 1
                        GUICtrlSetData($DefButton, $DefButtonText & ' (' & $Counter & ')')
                        If $Counter < 0 Then $Msg = $DefButton
                EndIf
               
                Select
                        Case $Butt_Num = 2 And $Msg = $Yes
                                $ReturnVal = 6
                                ExitLoop
                        Case $Butt_Num = 2 And $Msg = $No
                                $ReturnVal = 7
                                ExitLoop
                        Case $Msg = -3 Or ($Msg = $OK And $Butt_Num <> 2)
                                $ReturnVal = 1
                                ExitLoop
                EndSelect
        Wend
       
        If GUICtrlRead($CheckBox) = 1 Then $ReturnVal += 8
       
        If $hWnd <> 0 Then WinSetState($hWnd, "", @SW_ENABLE)
        GUIDelete($Gui)
        Opt('GuiOnEventMode', $Old_Opt_GOEM)
        Opt('GUICloseOnESC', $Old_Opt_GCOE)
        Return $ReturnVal
EndFunc

Пока только 2 кнопки поддерживаются, на больше если честно сил не хватило.

Возвращаемое значение:

6 = Кнопка ОК / Yes была нажата.
7 = Кнопка Cancel / No была нажата.
6+8 = Кнопка ОК / Yes была нажата и была поставлена птичка.
7+8 = Кнопка Cancel / No была нажата и была поставлена птичка.

amel27 28-08-2007 09:51 634039

Цитата:

Цитата Creat0R
вот что получилось

вчепятляет... особенно количество параметров :)

по поводу системного окна можно предположить два варианта:
1. Запускать тот же скрипт в другом процессе с передачей ключевого параметра, но тогда возникает проблема с возвратом результата, ее можно решить (к примеру) передачей сообщения основному окну через SendMessage().
2. Запускать функцию в отдельном потоке того же процесса с использованием CallBack.

Creat0R 29-08-2007 18:46 635067

amel27,
Цитата:

вчепятляет... особенно количество параметров
Спасибо, а параметров было ещё больше (на три), был параметр $OnTop, $Left, и $Right :) - Но я решил что этих достаточно ($OnTop заменил $ExStyle где можно указать ещё другие опции отображения).

Цитата:

2. Запускать функцию в отдельном потоке того же процесса с использованием CallBack.
Это я пробовал, ничего не вышло, таже проблема (у меня) с получением возвращаемых значении :(.





Вышла себе в тихую новая версия AutoIt 3.2.6.0 :blush2::

Цитата:

Цитата http://www.autoitscript.com/autoit3/docs/history.htm
  • Changed: IconId in all GUI functions is now the same as GUICtrlSetImage().

    WARNING: Previous scripts using GUICtrlSetImage(), GUISetIcon(), TraySetIcon() and TraySetPauseIcon()
    may display a wrong Icon. To get the same icon "if nId > 0 Then newId = - nId - 1".


  • Changed: AutoIt .a3x and compiled script format. Exe2Aut will only decompile 3.2.5.1 and earlier files. No ExeAut utility is supplied for ongoing versions.
  • Changed: General performance improvements (currently around 30-40% over 3.2.4.9)
  • Changed: Limited Unicode support added in regular expressions.
  • Changed: ControlMove() just resizing as WinMove() if X=Y=Default.
  • Changed: PCRE engine updated from 7.0 to 7.1
  • Changed: Suppress delay when speed=0 in MouseMove().
  • Added: GUIGetStyle().
  • Added: byte and ubyte type to DllCall().
  • Added: ClassnameNN in control and summary info in Au3Info.
  • Added: Float type to dllCall. (Thanks PaulIA)
  • Added: AU3Check v1.54.8 support for both "#AutoIt3Wrapper_plugin_funcs" and "#Compiler_plugin_funcs".
  • Added: Extra parameter in ProcessClose() to close Stream handles.

И ещё кучу фиксов тут (среди которых есть несколько отрепортенных мной ;) ).

Creat0R 30-08-2007 05:27 635312

Существует ли где нибудь Dll'ка которая позволит выполнять код AutoIt (или хотябы скомпилированный скрипт) передавая ему те параметры, с которыми была запущена Dll'ка? (сам путь к запускаемому скрипту будет естественно передаваться также как параметр).

Дело в том, что я хотел в контекстное меню проводника внедрить свой пункт, но это возможно только(?) если запускаемый модуль этим пунктом является Dll, вот если есть подобная Dll'ка, то я смог бы пункт повесить на неё, а она уже запускала мой скрипт.

amel27 30-08-2007 12:18 635557

Цитата:

Цитата Creat0R
это возможно только(?) если запускаемый модуль этим пунктом является Dll

если не секрет - откуда инфа?

Creat0R 30-08-2007 12:26 635564

amel27,
Цитата:

если не секрет - откуда инфа?
Не секрет :) - Сам пытался прописать подобный пункт, а также тут давно уже поднимал этот вопрос... и в соответствующей теме задавал вопрос ;)

И как выяснилось, запуск обычного Exe нельзя прописать :(

amel27 31-08-2007 09:37 636147

Цитата:

Цитата Creat0R
Существует ли где нибудь Dll'ка которая позволит выполнять код AutoIt (или хотябы скомпилированный скрипт) передавая ему те параметры, с которыми была запущена Dll'ка?

Вроде нашел: http://forum.oszone.net/post-636150-19.html

fak1r 31-08-2007 21:04 636546

Подскажите пожалуйста как вытащить текст который находиться между двух тегов на html странице, например так:
HTML код:

<h1>text</h1>
Я пробЫвал искать текст между тэгами при помощи функции StringRegExp, но я так и не понял как же добиться от этой функции результатов, может конечно я указал не правильное регулярное выражение.

Creat0R 31-08-2007 22:11 636571

amel27,
Цитата:

Вроде нашел:
Спасибо, ответил в том топике ;)


fak1r
Цитата:

как вытащить текст который находиться между двух тегов на html странице
В справке этот пример и есть, вот немного изменил:

Код:

$Html = '<h1>text</h1>'
$Array = StringRegExp($Html, '(?i)<h1>(.*?)</h1>', 3)

MsgBox(0, "", $Array[0])

Цитата:

может конечно я указал не правильное регулярное выражение.
Ну никто этого знать не может, так как ты не привёл код для примера (того что пытался сделать) ;) .

DenchikK 02-09-2007 19:03 637223

А возможно ли такое осуществить с помощью AutoIT.
У меня всё время компьютер подключен к интернету, стоит Radmin, с помощью которого я могу управлять своим компом с работы и от друзей. Так как IP динамический, стоит программа, отсылающая на мой почтовый ящик IP, при его изменении. Но вот проблемма - иногда рвётся связь, и реконнект невозможен, нужно перезагружать комп.
Вот задача такая - определить, что связь разорвалась, и перезапустить комп.
Возможно ли такое осуществить с помощью AutoIT?

Creat0R 02-09-2007 21:39 637275

DenchikK,
Цитата:

определить, что связь разорвалась, и перезапустить комп
Полагаю что можно так:

Код:

If Not IsConnected() Then Shutdown(2 + 4)

Func IsConnected()
    Local $OpenWinInetDll = DllOpen("wininet.dll")
    If $OpenWinInetDll = -1 Then Return SetError(1, 0, -1)
    Local $IsConnected = DllCall($OpenWinInetDll, "int", "InternetGetConnectedState", "int", 0, "int", 0)

        DllClose($OpenWinInetDll)
    If IsArray($IsConnected) Then Return $IsConnected[0]
    Return False
EndFunc


DenchikK 02-09-2007 21:50 637279

Creat0R
Спасибо огромное! Буду пробовать!

Добавлено:
Видимо что то не так я делаю - не работает...

yukko 03-09-2007 19:18 637657

Подскажите пожалуйста.
Как с помощью AutoIt получить информацию из графического приложения в котором AutoIt Window Info ничего не опознает кроме самого окна приложения. Все внутри окна нарисовано, написано и работает автономно. Хочу написать бот для некоторых манипуляций в онлайн игре.

Creat0R 03-09-2007 20:32 637680

yukko,
Цитата:

Как с помощью AutoIt получить информацию из графического приложения в котором AutoIt Window Info ничего не опознает кроме самого окна приложения
Это весьма широкий вопрос - информация бывает разная, что именно требуется? :)

Diamond 04-09-2007 02:23 637818

Как-то я задавал вопрос по поводу перетаскивания окна за форму ...недавно эксперементировал с GUIRegisterMsg() и совешенно случайно обнаружил способ, думаю это хорошая замена для стиля $GUI_WS_EX_PARENTDRAG:
Код:

#include <GuiConstants.au3>
Global Const $WM_SYSCOMMAND  = 0x0112
Global Const $WM_LBUTTONDOWN = 0x0201
$HWnd = GUICreate("DRAG_COMMAND",240,180,-1,-1,$WS_OVERLAPPEDWINDOW)
GUIRegisterMsg($WM_LBUTTONDOWN,"DRAG_COMMAND")
GUISetState()

While 1
  $msg = GUIGetMsg(0)
  Switch $msg
      Case $GUI_EVENT_CLOSE
        Exit
  EndSwitch
WEnd

Func DRAG_COMMAND($HWnd,$command,$wParam,$lParam)
  If BitAND(WinGetState($HWnd),32) Then Return
  DllCall("user32.dll","long","SendMessage","hwnd",$HWnd,"int",$WM_SYSCOMMAND,"int",0xF009,"int",0)
EndFunc


Creat0R 04-09-2007 02:52 637820

Diamond,
Можно ещё так..

Код:

#include <GuiConstants.au3>

Global Const $WM_NCHITTEST = 0x0084
Global $GUI = GuiCreate("Drag using any place on GUI - Demo", -1, -1, -1, -1, $WS_OVERLAPPEDWINDOW)

GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")

GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case -3
            Exit
    EndSwitch
WEnd

Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    If $hWnd = $GUI And $iMsg = $WM_NCHITTEST Then
        Local $id = _API_DefWindowProc($hWnd, $iMsg, $iwParam, $ilParam)
        If $id = 1 Then
            Return 2
        Else
            Return $id
        EndIf
    EndIf
EndFunc

Func _API_DefWindowProc($hWnd, $iMsg, $iwParam, $ilParam)
    Local $aResult
    $aResult = DllCall("User32.dll", "int", "DefWindowProc", "hwnd", $hWnd, "int", $iMsg, "int", $iwParam, "int", $ilParam)
    Return $aResult[0]
EndFunc

Вопрос только в том, какой метод болшье использует ресурсов, ведь в твоём примере используется Dll'ка (посылая сообщения) при каждом нажатии мышки... а в моём примере при движении мышки :) ...

Maza Faka 04-09-2007 09:40 637904

Хочу написать скрипт со "сфетофором", что бы при копировании файла отображался прогресс-бар, но почему-то функция AdlibEnable() начинает работать после того как скопируется файл, что я делаю не так:

Код:

Dim $source = "d:\Video\Films\Адреналин.avi", $dest = "c:\Адреналин.avi", $i = 0
ProgressOn("Please wait...", "Now copying file", "", -1, -1, 16)
AdlibEnable("Rename", 500)

FileCopy($source, $dest, 1)

AdlibDisable()
ProgressSet(100, "Done")
Sleep(100)
ProgressOff()

Func Rename()
    $i += 1
    If $i = 100 Then $i = 0
        ProgressSet($i, $i & " percent")
    EndFunc


Creat0R 04-09-2007 11:06 637936

Maza Faka,
Цитата:

Хочу написать скрипт со "сфетофором", что бы при копировании файла отображался прогресс-бар
Тут нужно использовать либо _CallBack функции, либо ещё один скрипт (потому как функции типа FileCopy() останавливают выполнение всего скрипта на момент копирования), но проблема в другом - Как определить сколько уже скопировалось..
Если требуется просто "голый" светофор, тогда будет достаточно вышеупомянутых действии ;) ....

Код:

Dim $source = "d:\Video\Films\Адреналин.avi", $dest = "c:\Адреналин.avi"

$DummyGui = GUICreate("#_Dummy_Gui_#")

$ProgressStr = '#NoTrayIcon' & @CRLF & _
    'ProgressOn("Please wait...", "Now copying file", "", -1, -1, 16)' & @CRLF & _
    'Dim $i = 0' & @CRLF & _
    'While WinExists(Hwnd(' & $DummyGui & '))' & @CRLF & _
    '  $i += 1' & @CRLF & _
    '  If $i = 100 Then $i = 0' & @CRLF & _
    '  ProgressSet($i, $i & " percent")' & @CRLF & _
    '  Sleep(200)' & @CRLF & _
    'Wend' & @CRLF & _
    'ProgressSet(100, "Done")' & @CRLF & _
    'Sleep(1000)' & @CRLF & _
    'ProgressOff()'

FileWrite(@TempDir & "\Temp_au3_Script.tmp", $ProgressStr)

Run(@AutoItExe & ' /ErrorStdOut /AutoIt3ExecuteScript "' & @TempDir & '\Temp_au3_Script.tmp"')

FileCopy($source, $dest)
GUIDelete($DummyGui)

FileDelete(@TempDir & "\Temp_au3_Script.tmp")


yukko 04-09-2007 11:14 637944

Искомая информация - строка, состоящая из английских букв и пробелов (название объекта). Строка известна, может быть такой и никакой другой. Нужно идентифицировать обьект. Так же есть строка поиска, в которую можно поместить название объекта, нажать на кнопку и произойдет поиск обьектов, которые после этого все равно нужно идентифицировать. Обьект - статический прямоугольник. Название в верхней части прямоугольника, по высоте текст приблизительно 1/15 от высоты прямоугольника.

Creat0R 04-09-2007 11:26 637952

yukko,
Нужно видеть приложение (сомневаюсь что видно только заголовок окна, возможно текст элементов скрытый?), а по сути, функции ControlGetText, ControlSetText, ControlCommand и т.п помогут в этой задаче.

yukko 04-09-2007 12:10 637985

Сами обьекты отсканированные/нарисованы, но если есть поиск, то наверное текст где то в клиентской части есть. Утилита не видит ничего кроме заголовка окна. Подскажите пожалуйста где можно поискать текст ?

Creat0R 04-09-2007 12:17 637990

yukko
Цитата:

Сами обьекты отсканированные/нарисованы
Это изображение? Тогда будет сложновато, нужно задействовать OCR.. на оф. форуме кажется есть решение с использованием Microsoft Document Imaging (нужен Office 2003 как минимум), но распознаёт далеко не все виды изображении.

Приведи хотябы снимок приложения :)

Maza Faka 04-09-2007 16:12 638093

Creat0R
В итоге сделал так:
Код:

Dim $dest = "c:\Адреналин.avi", $i = 0
Run(@ComSpec & " /c copy /y d:\Video\Films\Адреналин.avi " & $dest, "", @SW_HIDE)

ProgressOn("Please wait...", "Copying file", "", -1, -1, 16)
AdlibEnable("Check", 500)

While 1
    Sleep(100)
WEnd

Func Check()
    If FileMove($dest, $dest, 1) Then
        AdlibDisable()
        ProgressSet(100, "Done")
        Sleep(500)
        Exit
    Else
        $i += 10
        If $i > 100 Then $i = 0
            ProgressSet($i, "file copyied")
        EndIf
    EndFunc


Creat0R 04-09-2007 17:18 638118

Maza Faka,
Цитата:

В итоге сделал так:
Тоже вариант. А зачем делать If FileMove($dest, $dest, 1) Then? можно просто проверять завершился ли дочерний процесс (PID возвращённый от Run() ).
Я кстати в своём примере немного переборщил :) - Нужно было наоборот, запускать в главном цикле сам прогресс, а в отдельном процессе копирование, и тогда скррипт намного аккуратнее и короче:

Код:


Dim $source = "d:\Video\Films\Адреналин.avi", $dest = "c:\Адреналин.avi", $i = 0

ProgressOn("Please wait...", "Now copying file", "", -1, -1, 16)

$CopyPid = Run(@AutoItExe & ' /ErrorStdOut /AutoIt3ExecuteLine "FileCopy(''' & $source & ''', ''' & $dest & ''')"')
While ProcessExists($CopyPid)
    $i += 1
    If $i = 100 Then $i = 0
    ProgressSet($i, $i & " percent")
    Sleep(200)
 Wend

ProgressSet(100, "Done")
Sleep(1000)
ProgressOff()


Diamond 05-09-2007 03:52 638337

Creat0R
Цитата:

Вопрос только в том, какой метод болшье использует ресурсов, ведь в твоём примере используется Dll'ка (посылая сообщения) при каждом нажатии мышки... а в моём примере при движении мышки
А может наоборот... В твоём примере при каждом движении мышки, а в моём примере только при нажатии? ;) Как бы там ни было у тебя используются две функции, а у меня всего одна. :tongue:
P.S. ...имхо, не предмет для спора, оба варианта хороши. :)

Creat0R 05-09-2007 04:08 638338

Diamond,
Цитата:

А может наоборот... В твоём примере при каждом движении мышки, а в моём примере только при нажатии?
Ну я вроде так и написал ;) (в обратном порядке).

Цитата:

у тебя используются две функции, а у меня всего одна
Да, вторая чтобы определить где находиться курсор, чтобы не тащить окно если курсор мышки, к примеру, над линией границы окна, или над Title Bar...

Цитата:

не предмет для спора
Я не ради спора (вообще спорить не люблю), я просто привёл альтернативу которой до сих пор сам пользовался, теперь точно буду использовать твой метод, он менее требователен к ресурсам и быстро применим к разным скриптам ;).

Diamond 06-09-2007 08:03 638977

Creat0R,
Цитата:

Ну я вроде так и написал (в обратном порядке).
Значит я неправильно понял... :)
Цитата:

я просто привёл альтернативу которой до сих пор сам пользовался, теперь точно буду использовать твой метод, он менее требователен к ресурсам и быстро применим к разным скриптам
А я использовал метод со стилем, думаю что он совсем не требователен к ресурсам, но считаю что этот метод "не оригинален":
Код:

#include <GuiConstants.au3>
$HWnd = GUICreate("DRAG_ELEMENT",320,240,-1,-1,$WS_OVERLAPPEDWINDOW)

;~ --- Фоновое изображение (должно быть первым элементом!):
$BgPic=GUICtrlCreatePic(@WindowsDir & '\Web\Wallpaper\Windows XP.jpg',0,0,800,600)
  GUICtrlSetPos      (-1,0,0,320,240)
  GUICtrlSetResizing (-1,$GUI_DOCKBORDERS)
  GUICtrlSetState    (-1,$GUI_DISABLE)

;~ --- Все остальные элементы:
$butt1=GUICtrlCreateButton("test_button",10,10,70,20)
;~ ...и т.д.

;~ --- Элемент перетаскивания (должен быть последним!):
$DRAG_ELEMENT=GUICtrlCreatePic('',0,0,320,240,-1,$GUI_WS_EX_PARENTDRAG)
  GUICtrlSetResizing(-1,$GUI_DOCKBORDERS)

GUISetState()

While 1
  $msg = GUIGetMsg()
  Switch $msg
      Case $GUI_EVENT_CLOSE
        Exit
  EndSwitch
WEnd


gvshil 07-09-2007 17:17 639777

Помогите разобраться:
при установке из командной строки - все ОК!

Код:

start /wait msiexec.exe /i "PROMT Expert 7 Giant.msi"KBRIYPGWNEULCSJAQHXOFVM=хххххххх pidkey=хххххххххх-хххх /qb
а из под AutoIt ну ни как :(

Код:

Global $file=@ScriptDir & '\PROMT Expert 7 Giant.msi'
  ;установка PROMT Expert 7 Giant
  RunWait ( 'msiexec /i' & $file & " KBRIYPGWNEULCSJAQHXOFVM=" & 'хххххххх' & " pidkey=" & 'хххххххххх-хххх' & ' /qb' )

переименовываю PROMT Expert 7 Giant.msi в setup.msi

Код:

Global $file=@ScriptDir & '\setup.msi'
  ;установка PROMT Expert 7 Giant
  RunWait ( 'msiexec /i' & $file & " KBRIYPGWNEULCSJAQHXOFVM=" & 'хххххххх' & " pidkey=" & 'хххххххххх-хххх' & ' /qb' )

все ставится.
В чем моя проблема?

Creat0R 07-09-2007 17:46 639798

gvshil,
Цитата:

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

Код:

Global $file=@ScriptDir & '\PROMT Expert 7 Giant.msi'  ;установка PROMT Expert 7 Giant
 RunWait ('msiexec.exe /i "' & $file & '" KBRIYPGWNEULCSJAQHXOFVM=хххххххх pidkey=хххххххххх-хххх /qb')


gvshil 07-09-2007 18:13 639810

Creat0R,
Цитата:

Цитата Creat0R
из за того что присутствуют пробелы путь оказывается неверным.. »

а как это исправить? Не знаю, как в командной стоке не получается (с кавычками..)

Creat0R 07-09-2007 20:42 639844

gvshil,
Цитата:

а как это исправить?
Ты пробовал пример что я дал? он не работает?

gvshil 07-09-2007 20:58 639849

Creat0R,
Спасибо огромное, все работает. Не посмотрел, думал, что повтор моего куска!

Creat0R 07-09-2007 21:05 639851

Спросил я на оф. форуме про такую фичу как пристыковка окна GUI к краям экрана, дали мне почти полноценное решение...

Осталось решить две значительные проблемы перед тем как можно будет использовать данную фичу:

1) В момент смещения окна к краям (в процессе пристыковки) курсор мышки как бы остаётся позади и смещается, что в конце (если достаточно поиграться :)) приводит к тому, что курсор мышки "гуляет" по приделам GUI-окна ;).

2) Панель задачь не всегда находится внизу, и не всегда имеет один размер, нужно как то получать размеры рабочей области, т.е только те границы между панелью задач и краями экрана - и соответственно пристыковывать окно.

Вот что на данный момент имеется:

Код:

#include <GUIConstants.au3>

Const $Range = 20
Const $WM_MOVING = 0x0216
Const $WM_ENTERSIZEMOVE = 0x0231
Global $X_START, $Y_START

$Gui = GUICreate("Attach Window GUI to screen edge", 350, 200)
GUISetState()

GUICtrlCreateLabel("Притащите окно к краям экрана ;)", 0, 80, 350, 30, $ES_CENTER)
GUICtrlSetFont(-1, 14, 800)

GUIRegisterMsg($WM_ENTERSIZEMOVE, "WM_ENTERSIZEMOVE")
GUIRegisterMsg($WM_MOVING, "WM_MOVING")

While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd

Func WM_ENTERSIZEMOVE()
    Local $aMPos = MouseGetPos()
    $X_START = $aMPos[0]
    $Y_START = $aMPos[1]
EndFunc

Func WM_MOVING($hWnd, $Msg, $wParam, $lParam)
    Local $TaskBarPos = WinGetPos("[CLASS:Shell_TrayWnd]")
    Local $hWndPos = WinGetPos($hWnd)
    Local $aMPos = MouseGetPos()

        Local $Rect = DllStructCreate("long left; long top; long right; long bottom", $lParam)
    $Left = DllStructGetData($Rect, "left")
    $Top = DllStructGetData($Rect, "top")
    $Right = DllStructGetData($Rect, "right")
    $Bottom = DllStructGetData($Rect, "bottom")

        If $Left <= $Range And $aMPos[0] < $X_START Then
        DllStructSetData($Rect, "left", 0)
        DllStructSetData($Rect, "right", $Right-$Left)
    EndIf

        If $Top <= $Range And $aMPos[1] < $Y_START Then
        DllStructSetData($Rect, "top", 0)
        DllStructSetData($Rect, "bottom", $Bottom-$Top)
    EndIf

        If $Right >= (@DesktopWidth - $Range) And $aMPos[0] > $X_START Then
        DllStructSetData($Rect, "right", @DesktopWidth)
        DllStructSetData($Rect, "left", (@DesktopWidth-$Right)+$Left)
    EndIf

        If $Bottom >= ($TaskBarPos[1] - $Range) And $aMPos[1] > $Y_START Then
        DllStructSetData($Rect, "bottom", $TaskBarPos[1])
        DllStructSetData($Rect, "top", ($TaskBarPos[1]-$Bottom)+$Top)
    EndIf
    WM_ENTERSIZEMOVE()
EndFunc

Может у кого то есть время/желание с этим разобраться, очень полезная фича получается (для некоторых задумок).

Maza Faka 10-09-2007 12:15 640829

Как сделать, что бы элемент "Нет", менял позицию при наведении на него курсора мыши?

Код:

#include <GUIConstants.au3>
Opt("MouseCoordMode", 2)
Dim $x, $y
GUICreate("Test", 300, 200)
$yes = GUICtrlCreateButton("Да", 20, 50, 50)
$no = GUICtrlCreateButton("Нет", 200, 50, 50)
$label = GUICtrlCreateLabel("Довольны ли вы своей зарплатой?", 50, 10, 200, 20)

GUISetState()

While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
        ExitLoop
    Case $msg = $yes
        MsgBox(64, "Да", "Мы так и думали!")
        ExitLoop
    Case $msg = $no
        GUICtrlSetPos($no, Random(250), Random(170))
    EndSelect
WEnd


Creat0R 10-09-2007 16:51 640983

Maza Faka,
Цитата:

что бы элемент "Нет", менял позицию при наведении на него курсора мыши?
Можно так:

Код:

#include <GUIConstants.au3>
Opt("MouseCoordMode", 2)
Dim $x, $y, $ChangedPos = False
$Gui = GUICreate("Test", 300, 200)
$yes = GUICtrlCreateButton("Да", 20, 50, 50)
$no = GUICtrlCreateButton("Нет", 200, 50, 50)
$label = GUICtrlCreateLabel("Довольны ли вы своей зарплатой?", 50, 10, 200, 20)

GUISetState()

While 1
    $msg = GUIGetMsg()
    $CurInfo = GUIGetCursorInfo($Gui)
    If $CurInfo[4] = $no And Not $ChangedPos Then
        GUICtrlSetPos($no, 20, 50)
        GUICtrlSetPos($yes, 200, 50)
        $ChangedPos = True
    ElseIf $CurInfo[4] = $no And $ChangedPos Then
        GUICtrlSetPos($no, 200, 50)
        GUICtrlSetPos($yes, 20, 50)
        $ChangedPos = False
    EndIf

        Select
    Case $msg = $GUI_EVENT_CLOSE
        ExitLoop
    Case $msg = $yes
        MsgBox(64, "Да", "Мы так и думали!")
        ExitLoop
    Case $msg = $no
        GUICtrlSetPos($no, Random(250), Random(170))
    EndSelect
WEnd


Maza Faka 11-09-2007 09:54 641332

Creat0R
Спасибо, сделал так:
Код:

#include <GUIConstants.au3>
Dim $x, $y, $ChangedPos = False
$Gui = GUICreate("Test", 300, 200)
$yes = GUICtrlCreateButton("Да", 20, 50, 50)
$no = GUICtrlCreateButton("Нет", 200, 50, 50)
$label = GUICtrlCreateLabel("Довольны ли вы своей зарплатой?", 50, 10, 200, 20)

GUISetState()

While 1
    $msg = GUIGetMsg()
    $CurInfo = GUIGetCursorInfo($Gui)
    If $CurInfo[4] = $no Then GUICtrlSetPos($no, Random(240), Random(180))
        Select
        Case $msg = $GUI_EVENT_CLOSE
            ExitLoop
        Case $msg = $yes
            MsgBox(64, "Да", "Мы так и думали!")
            ExitLoop
        EndSelect
    WEnd


Creat0R 11-09-2007 10:32 641358

Maza Faka,
Я так понял нужно чтобы при навидении на кнопку “Нет” кнопка постоянно "пряталась"? :)
Тогда желательно найти уникальные координаты, т.е убедиться что текущие найденные по Random не являются координатами кнопки "Да" (что не исключено ;) ) ...

Код:

#include <GUIConstants.au3>
Dim $x, $y, $ChangedPos = False
$Gui = GUICreate("Test", 300, 200)
$yes = GUICtrlCreateButton("Да", 20, 50, 50, 25)
$no = GUICtrlCreateButton("Нет", 200, 50, 50, 25)
$label = GUICtrlCreateLabel("Довольны ли вы своей зарплатой?", 50, 10, 200, 20)

GUISetState()

While 1
    $msg = GUIGetMsg()
    $CurInfo = GUIGetCursorInfo($Gui)
    If $CurInfo[4] = $no Then
        $CurrentCoords = ControlGetPos($Gui, "", $no)
        $Random_Left_Coords = Random(20, 250, 1)
        $Random_Top_Coords = Random(30, 160, 1)

        While $Random_Left_Coords > 20 And $Random_Left_Coords < 70
            $Random_Left_Coords = Random(20, 250, 1)
        WEnd

        While $Random_Top_Coords > 30 And $Random_Top_Coords < 75
            $Random_Top_Coords = Random(30, 160, 1)
        WEnd

        GUICtrlSetPos($no, $Random_Left_Coords, $Random_Top_Coords)
    EndIf

        Select
        Case $msg = $GUI_EVENT_CLOSE
            ExitLoop
        Case $msg = $yes
            MsgBox(64, "Да", "Мы так и думали!")
            ExitLoop
    EndSelect
WEnd

P.S
Я подобными приколами тоже по началу баловался, правда тема была другая - "Вы желаете форматировать диск C:\ ?" :biggrin:

Creat0R 12-09-2007 01:29 641908

Вышла новая версия AutoIt v3.2.8.1 (10th September, 2007)

Список изменении по сравнению с 3.2.6.0:

Цитата:

Цитата http://www.autoitscript.com/autoit3/docs/history.htm
8th September, 2007 - v3.2.8.1

Fixed: Possible crash with StringRegExp().


8th September, 2007 - v3.2.8.0

Changed: General speed improvements (currently up to 24% in some cases compared to 3.2.6.0).
Changed: PCRE regular expression engine updated to 7.3.
Changed: Recursion-based code limits relaxed.

Added: wchar type added to DllStructCreate().
Added: WinMove() speed parameter.

Fixed: Crash on AutoIt exit if TrayCreateItem() is not deleted.
Fixed: AutoIt crash on bad parameter when calling TrayCreateMenu()
Fixed: Character positions used in StringRegExp() not correct for characters > 127 (accents, non-Western)
Fixed: ProcessExist() under Windows 9x.
Fixed: GUISetState(@SW_DISABLE) not disabling keyboard input.
Fixed: Sometimes AutoIt crashes on DllStructGetData() with char[] types.
Fixed: Au3Info restoring last settings at startup.
Fixed: Better handling of notifications when using colored buttons.
Fixed: ControlGetText() crash on Scite windows.
Fixed: $LVSCW_AUTOSIZE column truncates display string.
Fixed: Incorrect listview creation with GUICtrlCreateListView().
Fixed: Memory leak when AutoIt needed to get long file name.
Fixed: ListviewItem not created after other child Window creation/deletion.
Fixed: ControlGetFocus() returning bad ClassNN values.
Fixed: Detection of invalid CONTINUELOOP statement.

P.S
3 бага из этого списка я зарепортил:

1. GUISetState(@SW_DISABLE) not disabling keyboard input.
2. ListviewItem not created after other child Window creation/deletion.
3. Detection of invalid CONTINUELOOP statement.

;)

mikola1983 12-09-2007 09:27 641957

а как скопировать файл с помошью автоит... желательно зашить его в файл.ехе подскажите плис)

Diamond 12-09-2007 10:08 641979

mikola1983,
Цитата:

а как скопировать файл с помошью автоит... желательно зашить его в файл.ехе
Если ты имеешь ввиду как вложить файл в скомпилированный скрипт - с помощью функции FileInstall()
Например:
Код:

FileInstall("C:\image.jpg", @TempDir & "\image.jpg", 1)
Первый параметр - путь к файлу (путь не должен содержать переменных или макросов)
Второй параметр - путь для извлечения
И наконец третий параметр определяет, будет ли перезаписываться файл при извлечении если файл с таким же именем в этом пути уже существует.

Добавлено:
Совсем не факт что файл будет извлечён сразу при запуске скомпилированного скрипта.
Эту фунцию можно закрыть условием или событием, тогда файл будет извлечён только если событие произошло (В моём примере при нажатии кнопки "Да")
Код:

If MsgBox(4+32,"Извлечение файла","Хотите извлечь файл?") = 6 Then
        $install = FileInstall("C:\image.jpg", @ScriptDir & "\image.jpg")
        If $install Then
                MsgBox(0,"Извлечение файла","Файл " & @ScriptDir & "\image.jpg успешно извлечён.")
        Else
                MsgBox(16,"Извлечение файла","Ошибка извлечения!")
        EndIf
EndIf


Diamond 12-09-2007 10:56 642010

Функция Get_KeyDown() прекрасно реагирует на нажатие кнопок на клавиатуре, но стоит только прописать кнопку или другой элемент, и событие перестаёт обрабатываться. :dont-know
Кто нибудь может объяснить подобное поведение?
Код:

#include <GUIConstants.au3>
$HWnd = GUICreate("KEYDOWN_TEST",400,300)
;~ $BUTTON = GUICtrlCreateButton("Button",10,10,50,20)
Global Const $WM_KEYDOWN = 0x0100
GUIRegisterMsg($WM_KEYDOWN,"Get_KeyDown")
GUISetState()

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case -3
            Exit
    EndSwitch
WEnd

Func Get_KeyDown($HWnd,$Command,$wParam,$lParam)
    MsgBox(262144,"Код нажатой кнопки:",BitAND($wParam,0xFF))
EndFunc


Oldschool 12-09-2007 17:48 642313

Ищу репетитора по AutoIt на пару - тройку уроков в Москве.

предложения в ПМ

Creat0R 12-09-2007 18:38 642343

Diamond,
Цитата:

Кто нибудь может объяснить подобное поведение?
Полагаю что это из за того, что фокус на себя берёт созданный элемент, и любое нажатиие клавиш посылается именно этому элементу, хотя WM_KEYDOWN как я понял, принимает события только от самого GUI (т.е только если не сфокусирован ни один элемент).

Я попробовал убрать фокус с элемента, но это не помагает (точнее фокус не убирается, баг?)...

Код:

$BUTTON = GUICtrlCreateButton("Button",10,10,50,20)
GUICtrlSetState(-1, $GUI_NOFOCUS)

Diamond,
Очень странно, но если создать элемент после GuiSetState(), то всё работает:

Код:

#include <GUIConstants.au3>
Global Const $WM_KEYDOWN = 0x0101

$HWnd = GUICreate("KEYDOWN_TEST",400,300)
GUIRegisterMsg($WM_KEYDOWN, "Get_KeyDown")

GUISetState()

$BUTTON = GUICtrlCreateButton("Button",10,10,50,20)

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case -3
            Exit
    EndSwitch
WEnd

Func Get_KeyDown($HWnd,$Command,$wParam,$lParam)
    MsgBox(262144,"Код нажатой кнопки:", BitAND($wParam,0xFF))
EndFunc


Diamond 12-09-2007 19:00 642349

Creat0R,
Действительно, должны обрабатываться только те нажатия, которые посылаються в окно гуи.
А насчёт бага, если это даже и не баг, то использование $WM_KEYDOWN полностью теряет смысл... кому оно нужно если GUI будет пустым...
Кстати, я сначала тоже предположил что дело в фокусе или табуляции.
Цитата:

Очень странно, но если создать элемент после GuiSetState(), то всё работает
Действительно странно... а если по каким либо причинам придётся повторно использовать GUISetState() - то событие снова перестанет обрабатываться.

Creat0R 12-09-2007 19:16 642362

Diamond,
Цитата:

использование $WM_KEYDOWN полностью теряет смысл... кому оно нужно если GUI будет пустым...
См. пример в моём предыдущем посте, я запостил его почти сразу после первого, но они склеились :)

P.S
Может пойти попробовать репортануть о баге(?) с фокусом? :shuffle:

Diamond 12-09-2007 19:24 642366

Creat0R,
А может быть дело совсем не в фокусе...?

Добавлено:
...имхо, дело не в фокусе, иначе это не работало бы ни до ни после GUISetState().
Репортануть то можно бы... правда у меня знания английского почти нулевые. :blush:

Creat0R 12-09-2007 21:10 642415

Diamond,
Цитата:

Репортануть то можно бы
Пока оставил пост в разделе по GUI, может у разработчиков (или опытных AutoIt-ГУРУ :)) найдётся более правильное обьяснение, или даже решение.

Diamond,
Видимо не суждено это побороть:

Цитата:

Цитата AutoIt3 Help File
Some controls consume internally specific Windows Message ID, so registrating them will have no effect, e.g; WM_CHAR, WM_KEYDOWN, WM_KEYUP are consumed by an edit control.

:(

Diamond 13-09-2007 09:57 642618

Creat0R,
Цитата:

Пока оставил пост в разделе по GUI
Спасибо!

Вот ещё пример с колёсиком мыши и слайдером - наверное здесь тоже происходит "поглощение":

При изменении позиции слайдера колесом мыши, GUIGetMsg() не срабатывает, а загружать основной цикл постоянными запросами тоже не хочется. Вот как раз здесь-то и пригодилась бы $WM_MOUSEWHEEL - для того чтобы получать значение слайдера при повороте колеса мыши (если он в фокусе). Но увы... именно когда он в фокусе, событие $WM_MOUSEWHEEL перестаёт обрабатываться.
Код:

#include <GUIConstants.au3>
$HWnd = GUICreate("MOUSEWHEEL_TEST",400,300)
$BUTTON  =  GUICtrlCreateButton("Get Value",10,10,70,20)
$SLIDER =  GUICtrlCreateSlider(10,70,300,20)
$INPUT  =    GUICtrlCreateInput("0",10,100,30,18,BitOR($ES_READONLY,$ES_CENTER))
Global Const $WM_MOUSEWHEEL = 0x020A
GUIRegisterMsg($WM_MOUSEWHEEL,"Get_MouseWheel")
GUISetState()

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case -3
            Exit
        Case $SLIDER
            GUICtrlSetData($INPUT,GUICtrlRead($SLIDER))
        Case $BUTTON
            MsgBox(0,"Текущее значение слайдера:",GUICtrlRead($SLIDER))
    EndSwitch
WEnd

Func Get_MouseWheel($HWnd,$Command,$wParam,$lParam)
    Switch $wParam
        Case 0x00780000 ; UP
            Beep(100,40)
        Case 0xFF880000 ; DOWN
            Beep(80,40)
    EndSwitch
EndFunc


Creat0R 13-09-2007 10:18 642627

Diamond,
Цитата:

загружать основной цикл постоянными запросами тоже не хочется. Вот как раз здесь-то и пригодилась бы $WM_MOUSEWHEEL
Очень кстати по поводу Slider, как раз сегодня на оф. форуме кто-то спросил про эту же функциональность, я сначала тоже предложил решение с использованием главного цикла, но позже поискал в MSDN и нашёл более практичное решение:

Код:

#include <GuiConstants.au3>

Global Const $WM_HSCROLL = 0x0114
Global Const $WM_VSCROLL = 0x0115

$Gui = GuiCreate("Slider Update Demo", 250, 200)

GUIRegisterMsg($WM_HSCROLL, "WM_HVSCROLL")
GUIRegisterMsg($WM_VSCROLL, "WM_HVSCROLL")

$Vertical_Label = GUICtrlCreateLabel("Vertical Slider Read: 0", 20, 20, 200)
$Horizontal_Label = GUICtrlCreateLabel("Horizontal Slider Read: 0", 80, 120, 200)

$Vertical_Slider = GUICtrlCreateSlider(20, 50, 30, 120, BitOr($GUI_SS_DEFAULT_SLIDER, $TBS_VERT))
$Horizontal_Slider = GUICtrlCreateSlider(60, 150, 160, 30)

GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case -3
            Exit
    EndSwitch
WEnd

Func WM_HVSCROLL($hWndGUI, $MsgID, $WParam, $LParam)
    Switch $MsgID
        Case 277
            GUICtrlSetData($Vertical_Label, "Vertical Slider Read: " & GUICtrlRead($Vertical_Slider))
        Case 276
            GUICtrlSetData($Horizontal_Label, "Horizontal Slider Read: " & GUICtrlRead($Horizontal_Slider))
    EndSwitch
EndFunc

И колёсико мышки работает, и обновляется в реальном времени ;)...
Аж самому не верится, я до сих пор сам то циклом пользовался :)

Diamond 13-09-2007 17:01 642920

Creat0R,
Да ты просто фокусник! :) Вот так вот запросто взял и нашёл отличное решение. Спасибо!
Я поправил твою функцию, это позволит обрабатывать сколько угодно слайдеров. ;)
Код:

Func WM_HVSCROLL($hWndGUI, $MsgID, $WParam, $LParam)
    Switch $LParam
        Case GUICtrlGetHandle($Vertical_Slider)
            GUICtrlSetData($Vertical_Label, "Vertical Slider Read: " & GUICtrlRead($Vertical_Slider))
        Case GUICtrlGetHandle($Horizontal_Slider)
            GUICtrlSetData($Horizontal_Label, "Horizontal Slider Read: " & GUICtrlRead($Horizontal_Slider))
    EndSwitch
EndFunc


Creat0R 13-09-2007 19:46 643008

Diamond,
Цитата:

Я поправил твою функцию, это позволит обрабатывать сколько угодно слайдеров
Класс! Спасибо.

Creat0R 13-09-2007 22:17 643122

Написал тут утилитку для сохранения и восстановления позиции иконок рабочего стола...



Прлучилось вроде неплохо :)

Скачать архив можно тут.

Diamond 17-09-2007 09:32 644720

Creat0R,
Цитата:

Написал тут утилитку для сохранения и восстановления позиции иконок рабочего стола...
Очень нужная вещь, спасибо. :)

Oldschool 17-09-2007 12:15 644824

Надо создать 3D array который открывает 5 окон internet explorer и делает на каждом окне timestamp после того как иссекает контрольное время, например 1 мин, надо закрыть конкретное окно и заменить его новым окном. Размер каждого окна должен быть 800х560.

я не совсем понимаю как это сделать...
вот что у меня есть пока:
Код:

HotKeySet("{ESC}", "Terminate")
; Set Coordinate mode to relative to window
AutoItSetOption ( "PixelCoordMode", 0 )
Run("C:\Program Files\Internet Explorer\IEXPLORE.EXE")
Sleep(2000)
;MsgBox(0, "Active window stats (x,y,width,height):", $WindowPosition[0] & " " & $WindowPosition[1] & " " & $WindowPosition[2] & " " & $WindowPosition[3], 1)
WinMove($WindowName, "", $array[1],[1])
Call("TimeStamp")

$array[1][1] = _ArrayCreate(0, 0)
$array[2][1] = _ArrayCreate(0, 0)
$array[2][2] = _ArrayCreate(0, 800)
$array[2][3] = _ArrayCreate(560, 0)
$array[2][3] = _ArrayCreate(560, 800)


Func TimeStamp()
    $TimeStampFileName = $TimeStampFilePath & TimerInit() &".tsp"
;MsgBox(0, $TimeStampFileName, $TimeStampFileName, 2)
    FileDelete($TimeStampFilePath & "*.tsp")
    _FileCreate ($TimeStampFileName)
EndFunc  ;==>TimeStamp

Func Terminate()
;MsgBox(0, "Entering Terminate Function...","",3)
    Exit 0
EndFunc  ;==>Terminate


Creat0R 21-09-2007 08:02 646976

Diamond,
Цитата:

Очень нужная вещь
Я тоже так подумал перед началом написания скрипта (а ведь иидея не моя ;) )...

Обновил программку...
Список изменении в добавленном Readme.txt, или в топике на оф. форуме ;)

Maza Faka 21-09-2007 09:33 647017

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

$url = "http://game.chirkom.uz/download/hard/cpu-z-123.zip"
$NameArr = StringSplit($url, "/")
$name = $NameArr[$NameArr[0]]
$size = InetGetSize($url)

If $size Then
    $answer = MsgBox(1, "Warning", "The file size = " & $size & " bytes download now?")
    If $answer = 2 Then
        MsgBox(64, "Cancel", "Donloading canceled")
        Exit 1
    ElseIf $answer = 1 Then
        $sGet = FileDownload($url)
        If $sGet = -1 Then
            MsgBox(16, "Error", "DownLoading error")
            Exit 1
        EndIf
        MsgBox(64, "Done", $sGet)
    Else
        Exit
    EndIf
Else
    MsgBox(16, "Error", "File not exist")
EndIf

Func FileDownload($url)
    Local $fileGet = InetGet($url, @TempDir & "\" & $name, 1, 1)
    If Not $fileGet Then Return SetError(1, 0, -1)
        ProgressOn("Please wait...", "Downloading file")
        $dec = $size / 100
        $dSize = $dec
        $percent = 0
        While @InetGetActive
            If @InetGetBytesRead >= $dSize Then
                $dSize += $dec
                $percent += 1
                ProgressSet($percent, $percent & " percent downloading")
            EndIf

                    TrayTip("DownLoading", "Bytes = " & @InetGetBytesRead, 10, 1)
        Sleep(10)
    WEnd
    ProgressSet(100, "Done")
    Sleep(1000)
    ProgressOff()
    Return "Downloading successfull"
EndFunc


Creat0R 21-09-2007 09:44 647019

Maza Faka,
Цитата:

может есть более красивое решение подсчёта и отображения процента закачки файла
Посмотри страниц где то 10-20 назад (легче в версии для печати), мы с amel27 вроде это обсуждали тут.

Maza Faka 21-09-2007 10:22 647051

Creat0R
Как сделать, что бы левой кнопкой мыши можно было перетаскивать (drag) элемент Label в пределах GUI-окна?
Никак не могу достучаться тебе в аську, мой ник DeVil :)

Creat0R 21-09-2007 10:54 647078

Maza Faka,
Цитата:

Как сделать, что бы левой кнопкой мыши можно было перетаскивать (drag) элемент Label в пределах GUI-окна?
Нужно отлавливать нажатие мышки, а потом MouseGetPos() + GuiCtrlSetPos() :)

Код:

#include <GuiConstants.au3>
Opt("MouseCoordMode", 2)

$Gui = GuiCreate("Test")
$Label = GUICtrlCreateLabel("My Label, Move me ;)", 20, 20)

GUISetState()

While 1
    $Msg = GUIGetMsg()

        Switch $Msg
        Case -3
            Exit
        Case Else
            $CurInfo = GUIGetCursorInfo($Gui)
            While $CurInfo[2] = 1 And $CurInfo[4] = $Label
                $CurInfo = GUIGetCursorInfo($Gui)
                $LabelPos = ControlGetPos($Gui, "", $Label)
                If $LabelPos[0] <> MouseGetPos(0) Or $LabelPos[1] <> MouseGetPos(1) Then
                    GUICtrlSetPos($Label, MouseGetPos(0), MouseGetPos(1))
                Else
                    Sleep(5)
                EndIf
            WEnd
    EndSwitch
WEnd


Diamond 21-09-2007 18:20 647346

Утилита для подбора цвета:
Код:

#NoTrayIcon
#include <GUIConstants.au3>
#include <Misc.au3>
Global Const $WM_HSCROLL = 0x0114
Global $red=255, $green=0, $blue=0, $x=0, $st=5, $N
$Colorizer=GUICreate("Сolorizer (RGB)","320","200",-1,-1,-1,$WS_EX_TOPMOST)
        GUISetBkColor (0x000000)
Dim $CTRL_edit[3]
$CTRL_edit[0] = GUICtrlCreateEdit ("0", 5, 5, 34, 18,$ES_NUMBER)
        GUICtrlSetTip (-1,"Red")
        GUICtrlSetLimit (-1, 3)
$CTRL_edit[1] = GUICtrlCreateEdit ("0", 5, 30, 34, 18,$ES_NUMBER)
        GUICtrlSetTip (-1,"Green")
        GUICtrlSetLimit (-1, 3)
$CTRL_edit[2] = GUICtrlCreateEdit ("0", 5, 55, 34, 18,$ES_NUMBER)
        GUICtrlSetTip (-1,"Blue")
        GUICtrlSetLimit (-1, 3)
Dim $CTRL_slider[3] = [GUICtrlCreateSlider(54,5,255,20), GUICtrlCreateSlider(54,30,255,20), GUICtrlCreateSlider(54,55,255,20)]
For $i=0 To 2
        GUICtrlSetLimit($CTRL_slider[$i],255,0)
        GUICtrlSetBkColor($CTRL_slider[$i],0x000000)
Next
$CTRL_edit_hex = GUICtrlCreateEdit ("0x000000", 5, 145, 80, 18,$ES_READONLY)
        GUICtrlSetTip (-1,"Шестнадцатиричное представление")
$Button_ChooseColor = GUICtrlCreateButton("Цвет",240,95,60,20)
$ButtonDr          = GUICtrlCreateButton("Пипетка",240,120,60,20)
$ButtonRnd        = GUICtrlCreateButton("Случайно",240,145,60,20)
For $i = $Button_ChooseColor To $ButtonRnd
        _ButtonClassicStyle($i)
        GUICtrlSetCursor ($i,0)
Next
$Gr=GUICtrlCreateGraphic(4,174,0,0)
$GrCover=GUICtrlCreatePic("",2,174,316,20,-1,$WS_EX_CLIENTEDGE)
Draw_ToneScale()
GUIRegisterMsg($WM_HSCROLL, "WM_SCROLL")
GUISetState(@SW_SHOWNORMAL)
;--------------------------------------
While 1
        $msg=GUIGetMsg()
        Switch $msg
                Case $GUI_EVENT_PRIMARYUP
                        GUIRegisterMsg($WM_HSCROLL, "WM_SCROLL")
                        ToolTip("")
                Case $GUI_EVENT_PRIMARYDOWN
                        GUIRegisterMsg($WM_HSCROLL, "WM_SCROLL_2")
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $ButtonRnd
                        randomize()
                Case $ButtonDr
                        dropper()
                Case $Button_ChooseColor
                        ChooseColor()
                Case $CTRL_edit[0] To $CTRL_edit[2]
                        $N = $msg - $CTRL_edit[0]
                        Input()
                Case $CTRL_slider[0] To $CTRL_slider[2]
                        $N = $msg - $CTRL_slider[0]
                        slEvent()
                Case $GrCover
                        DropperScale()
        EndSwitch
WEnd

;~ Тоновая шкала:
Func Draw_ToneScale()
For $i=0 To 255 Step $st
        $green=$i
        SetColor()
Next
For $i=0 To 255  Step $st
        $red=255-$i
        SetColor()
Next
For $i=0 To 255 Step $st
        $blue=$i
        SetColor()
Next
For $i=0 To 255 Step $st
        $green=255-$i
        SetColor()
Next
For $i=0 To 255 Step $st
        $red=$i
        SetColor()
Next
For $i=0 To 255 Step $st
        $blue=255-$i
        SetColor()
Next
EndFunc

Func SetColor()
        Local $color='0x' & Hex($red,2) & Hex($green,2) & Hex($blue,2)
        GUICtrlSetGraphic($Gr,$GUI_GR_COLOR, $color)
        GUICtrlSetGraphic($Gr,$GUI_GR_RECT,$x,0,1,20)
        $x+=1
EndFunc

Func Input()
Local $color[3] = [GUICtrlRead($CTRL_edit[0]),GUICtrlRead($CTRL_edit[1]),GUICtrlRead($CTRL_edit[2])]
Local $str, $i, $ret="0x"
For $i=0 To 2
        If $color[$i]="" Then
                $color[$i]="0"
        ElseIf $color[$i]>255 Then
                $color[$i]="255"
        EndIf
        $ret &= Hex($color[$i],2)
Next
GUICtrlSetData ($CTRL_edit_hex,$ret)
GUICtrlSetData($CTRL_edit[$N],$color[$N])
GUICtrlSetData($CTRL_slider[$N],$color[$N])
GUISetBkColor($ret,$Colorizer)
;~ Меняем фоновый цвет слайдеров:
For $j=0 To 2
        GUICtrlSetBkColor($CTRL_slider[$j],$ret)
Next
EndFunc

Func slEvent()
        Local $slColor=GUICtrlRead($CTRL_slider[$N])
        GUICtrlSetData ($CTRL_edit[$N],$slColor)
        GUICtrlSetState($CTRL_slider[$N],$GUI_FOCUS)
        Input()
        ;~ Возвращаем утраченный фокус элементу:
        GUICtrlSetState($CTRL_slider[$N],$GUI_FOCUS)
EndFunc

Func randomize()
        Local $i, $HexColor ='0x'
        For $i=0 to 2
                $rnd = int(Random(0,255))
                $HexColor &= Hex($rnd,2)
                GUICtrlSetData($CTRL_edit[$i],$rnd)
                GUICtrlSetData($CTRL_slider[$i],$rnd)
        Next
        For $i=0 to 2
                GUICtrlSetBkColor($CTRL_slider[$i],$HexColor)
        Next
        GUICtrlSetData($CTRL_edit_hex,$HexColor)
        GUISetBkColor($HexColor,$Colorizer)
EndFunc

Func dropper()
Local $Time=TimerInit()
GUICtrlSetState($ButtonDr,$GUI_DISABLE)
ToolTip("Кликните мышью в любом месте экрана",Default,Default,"",0,3)
While 1
        Sleep (1) ; Символический таймаут для уменьшения CPU!!!
        $click=GUIGetCursorInfo ($Colorizer)
        If TimerDiff($Time)>2300 Then ToolTip("")
        If $click[2] Then
                $Mouse=MouseGetPos()
                $x=$Mouse[0]
                $y=$Mouse[1]
                $DrColor=Hex(PixelGetColor ($x,$y ),6)
                $j=1
                For $i=0 to 2
                        $Dr=Dec(StringMid($DrColor,$j,2))
                        GUICtrlSetData($CTRL_edit[$i],$Dr)
                        GUICtrlSetData($CTRL_slider[$i],$Dr)
                        $j += 2
                Next
                For $i=0 to 2
                        GUICtrlSetBkColor($CTRL_slider[$i],'0x' & $DrColor)
                Next
                GUICtrlSetData($CTRL_edit_hex,'0x' & $DrColor)
                GUISetBkColor('0x' & $DrColor,$Colorizer)
                GUICtrlSetState($ButtonDr,$GUI_ENABLE)
                ExitLoop
        EndIf
WEnd
EndFunc

Func DropperScale()
        GUICtrlSetCursor($GrCover,3)
        $coord = _GetControlPos ($Colorizer, $GrCover)
        While 1
                $i_msg = GUIGetMsg()
                If $i_msg = $GUI_EVENT_PRIMARYUP Then ExitLoop
                _MouseTrap($coord[0]+2,$coord[1]+2,$coord[2]-2,$coord[3]-2)
        WEnd
        Local $Mouse=MouseGetPos()
        Local $DrColor=Hex(PixelGetColor ($Mouse[0],$Mouse[1]),6)
        _MouseTrap()
        GUICtrlSetCursor($msg,2)
        Local $j=1
        For $i=0 to 2
                $Dr=Dec(StringMid($DrColor,$j,2))
                GUICtrlSetData($CTRL_edit[$i],$Dr)
                GUICtrlSetData($CTRL_slider[$i],$Dr)
                $j += 2
        Next
        For $i=0 to 2
                GUICtrlSetBkColor($CTRL_slider[$i],'0x' & $DrColor)
        Next
        GUICtrlSetData($CTRL_edit_hex,'0x' & $DrColor)
        GUISetBkColor('0x' & $DrColor,$Colorizer)
EndFunc

;~ Author: Diamond
Func _GetControlPos($HWND, $ControlId)
        Local $Win        = WinGetPos($HWND)
        Local $Client    = WinGetClientSize($HWND)
        Local $Control    = ControlGetPos($HWND,"",$ControlId)
        Local $BorderSize = ($Win[2]-$Client[0])  / 2
        Local $PanelSize  = $Win[3] - $Client[1]  - $BorderSize
        Local $array[4]
        $array[0] = $Win[0]  + $BorderSize + $Control[0] ; left
        $array[1] = $Win[1]  + $PanelSize  + $Control[1] ; $top
        $array[2] = $array[0] + $Control[2]              ; right
        $array[3] = $array[1] + $Control[3]              ; bottom
        Return $array
EndFunc

Func ChooseColor()
        GUISetState(@SW_DISABLE)
        SetOnTop($Colorizer,1)
        Local $HexColor = '0x'
        Local $BGR=ColorPicker(SwitchColor(GUICtrlRead($CTRL_edit_hex)))
        GUISetState(@SW_ENABLE)
        SetOnTop($Colorizer,-1)
        If $BGR = -1 Then Return
        For $i=0 to 2
                $HexColor &= Hex($BGR[$i+1],2)
                GUICtrlSetData($CTRL_edit[$i],$BGR[$i+1])
                GUICtrlSetData($CTRL_slider[$i],$BGR[$i+1])
        Next
        For $i=0 to 2
                GUICtrlSetBkColor($CTRL_slider[$i],$HexColor)
        Next
        GUICtrlSetData($CTRL_edit_hex,$HexColor)
        GUISetBkColor($HexColor,$Colorizer)
EndFunc

Func ColorPicker($Default=0)
        Local $p = DllStructCreate("dword;int;int;int;ptr;dword;int;ptr;ptr")
                DllStructSetData($p, 1, DllStructGetSize($p))
                DllStructSetData($p, 2, 0)
                DllStructSetData($p, 4, $Default)
                DllStructSetData($p, 5, DllStructGetPtr(DllStructCreate("int[16]")))
                DllStructSetData($p, 6, BitOR(0x100, 0x2, 0x1))
        $ret = DllCall("comdlg32.dll", "long", "ChooseColor", "ptr",DllStructGetPtr($p))
        If $ret[0] = False Then Return -1
        Local $color_picked = DllStructGetData($p, 4)
        $color_picked = Hex(String($color_picked), 6)
        Local $array[4]
        $array[0]="0x" & StringRight($color_picked,2) & StringMid($color_picked,3,2) & StringLeft($color_picked,2)
        $array[1]=Number("0x" & StringRight($color_picked,2)) ; RED
        $array[2]=Number("0x" & StringMid($color_picked,3,2)) ; GREEN
        $array[3]=Number("0x" & StringLeft($color_picked,2))  ; BLUE
        Return $array
EndFunc

Func WM_SCROLL($hWndGUI, $MsgID, $WParam, $LParam)
        Switch $LParam
        Case GUICtrlGetHandle($CTRL_slider[0])
            $N = 0
                Case GUICtrlGetHandle($CTRL_slider[1])
                        $N = 1
                Case GUICtrlGetHandle($CTRL_slider[2])
                        $N = 2
        EndSwitch
                slEvent()
EndFunc

Func WM_SCROLL_2($hWndGUI, $MsgID, $WParam, $LParam)
        Local $title
        Switch $LParam
        Case GUICtrlGetHandle($CTRL_slider[0])
            $N = 0
                Case GUICtrlGetHandle($CTRL_slider[1])
                        $N = 1
                Case GUICtrlGetHandle($CTRL_slider[2])
                        $N = 2
        EndSwitch
                ToolTip(GUICtrlRead($CTRL_slider[$N]))
EndFunc

; Author - RazerM
Func SwitchColor ($iColor)
    Local $iMask
    $iMask = BitXOR(BitAND($iColor, 0xFF) , ($iColor / 0x10000))
        Return BitXOR($iColor, ($iMask * 0x10001))
EndFunc  ;==>SwitchColor

;~ Author: Diamond
Func _ButtonClassicStyle($controlID, $style=0)
        GUICtrlSetStyle($controlID, 0x0040) ; $BS_ICON
        GUICtrlSetImage($controlID, "shell32.dll",0,0)
        GUICtrlSetStyle($controlID, $style)
EndFunc

Func SetOnTop($HWND, $TOPMOST)
        DllCall("User32.dll","long","SetWindowPos","hwnd",$HWND, _
                                "int",$TOPMOST, _ ; Always On Top = -1
                                "int",0, _ ; Left
                                "int",0, _ ; Top
                                "int",0, _ ; Width
                                "int",0, _ ; Height
                                "int",3)  ; Flag: $SWP_NOSIZE=1 and $SWP_NOMOVE=2
EndFunc


Creat0R 22-09-2007 07:56 647530

Diamond,
Класная утилитка (это скорее в помощь более большой утилитке, как дочерний диалог для управлением цветами :))...

Немного(?) изменил - Теперь диалог для выбора цвета открывается как дочернее окно, также переделал немного методы обновления данных (чтобы всё обновлялось в реальном времени, правда "дёргание" элементов не удалось предотвратить), при выборе пипетки добавил функцию для установки курсора на момент выбора цвета (глобально, правда я пока не знаю как получить предварительно текущий курсор, поэтому будет сбиваться всегда на 3dwarro.cur - а курсор пипетки можно видимо подобрать и подходящий в системе, но я не нашёл), ну и поправил ввод полей - если ставить пустое значение, то сразу сбрасывается на 0 (у тебя сбрасывалось только после ввода в другое поле), если ставить выше 255, то также сразу ставиться на 255 ;)

Кстати, а почему используется API-шная функция SetOnTop? Я так понял для скрытия окна и затем показа в режиме Поверх всех окон? но ведь можно было просто прятать по WinSetState($Hwnd, "", @SW_HIDE), и потом показать, OnTop не сбивается при этом ;)

Вобщем вот скрипт:

Код:

#NoTrayIcon
#include <GUIConstants.au3>
#include <Misc.au3>
Global Const $WM_HSCROLL = 0x0114
Global Const $WM_COMMAND = 0x0111
Global $red=255, $green=0, $blue=0, $x=0, $st=5, $N, $LastDrColor = 0, $LastRetColor = 0
$Colorizer=GUICreate("Сolorizer (RGB)","320","200",-1,-1,-1,$WS_EX_TOPMOST)
        GUISetBkColor (0x000000)
Dim $CTRL_edit[3]
$CTRL_edit[0] = GUICtrlCreateEdit ("0", 5, 5, 34, 18,$ES_NUMBER)
        GUICtrlSetTip (-1,"Red")
        GUICtrlSetLimit (-1, 3)
$CTRL_edit[1] = GUICtrlCreateEdit ("0", 5, 30, 34, 18,$ES_NUMBER)
        GUICtrlSetTip (-1,"Green")
        GUICtrlSetLimit (-1, 3)
$CTRL_edit[2] = GUICtrlCreateEdit ("0", 5, 55, 34, 18,$ES_NUMBER)
        GUICtrlSetTip (-1,"Blue")
        GUICtrlSetLimit (-1, 3)
Dim $CTRL_slider[3] = [GUICtrlCreateSlider(54,5,255,20), GUICtrlCreateSlider(54,30,255,20), GUICtrlCreateSlider(54,55,255,20)]
For $i=0 To 2
        GUICtrlSetLimit($CTRL_slider[$i],255,0)
        GUICtrlSetBkColor($CTRL_slider[$i],0x000000)
Next
$CTRL_edit_hex = GUICtrlCreateEdit ("0x000000", 5, 145, 80, 18,$ES_READONLY)
        GUICtrlSetTip (-1,"Шестнадцатиричное представление")
$Button_ChooseColor = GUICtrlCreateButton("Цвет",240,95,60,20)
$ButtonDr          = GUICtrlCreateButton("Пипетка",240,120,60,20)
$ButtonRnd        = GUICtrlCreateButton("Случайно",240,145,60,20)
For $i = $Button_ChooseColor To $ButtonRnd
        _ButtonClassicStyle($i)
        GUICtrlSetCursor ($i,0)
Next
$Gr=GUICtrlCreateGraphic(4,174,0,0)
$GrCover=GUICtrlCreatePic("",2,174,316,20,-1,$WS_EX_CLIENTEDGE)
Draw_ToneScale()

GUIRegisterMsg($WM_HSCROLL, "WM_SCROLL")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUISetState(@SW_SHOWNORMAL)
;--------------------------------------
While 1
        $msg=GUIGetMsg()
       
        Switch $msg
                Case $GUI_EVENT_PRIMARYUP
                        ToolTip("")
                Case $GUI_EVENT_PRIMARYDOWN
                        $CurInfo = GUIGetCursorInfo($Colorizer)
                        If $CurInfo[4] = $GrCover Then
                                GUICtrlSetCursor($GrCover, 3)
                                $coord = _GetControlPos ($Colorizer, $GrCover)
                                _MouseTrap($coord[0]+2,$coord[1]+2,$coord[2]-2,$coord[3]-2)
                                While $CurInfo[4] = $GrCover And $CurInfo[2] = 1
                                        $CurInfo = GUIGetCursorInfo($Colorizer)
                                        If Not DropperScale() Then
                                                Sleep(100)
                                        Else
                                                Sleep(50)
                                        EndIf
                                WEnd
                                _MouseTrap()
                                GUICtrlSetCursor($GrCover, 2)
                        EndIf
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $CTRL_edit[0] To $CTRL_edit[2]
                        $N = $msg - $CTRL_edit[0]
        EndSwitch
WEnd

;~ Тоновая шкала:
Func Draw_ToneScale()
For $i=0 To 255 Step $st
        $green=$i
        SetColor()
Next
For $i=0 To 255  Step $st
        $red=255-$i
        SetColor()
Next
For $i=0 To 255 Step $st
        $blue=$i
        SetColor()
Next
For $i=0 To 255 Step $st
        $green=255-$i
        SetColor()
Next
For $i=0 To 255 Step $st
        $red=$i
        SetColor()
Next
For $i=0 To 255 Step $st
        $blue=255-$i
        SetColor()
Next
EndFunc

Func SetColor()
        Local $color='0x' & Hex($red,2) & Hex($green,2) & Hex($blue,2)
        GUICtrlSetGraphic($Gr,$GUI_GR_COLOR, $color)
        GUICtrlSetGraphic($Gr,$GUI_GR_RECT,$x,0,1,20)
        $x+=1
EndFunc

Func Input()
Local $color[3] = [GUICtrlRead($CTRL_edit[0]),GUICtrlRead($CTRL_edit[1]),GUICtrlRead($CTRL_edit[2])]
Local $str, $i, $ret="0x"

For $i = 0 To 2
        If $color[$i] = "" Then
                $color[$i] = 0
        ElseIf $color[$i] > 255 Then
                $color[$i] = 255
        EndIf
        $ret &= Hex($color[$i],2)
Next

GUICtrlSetData($CTRL_edit_hex,$ret)
GUICtrlSetData($CTRL_edit[$N],$color[$N])
GUICtrlSetData($CTRL_slider[$N],$color[$N])

If $LastRetColor = $ret Then Return
$LastRetColor = $ret

GUISetBkColor($ret, $Colorizer)
;~ Меняем фоновый цвет слайдеров:
For $j=0 To 2
        GUICtrlSetBkColor($CTRL_slider[$j],$ret)
Next
EndFunc

Func slEvent()
        Local $slColor=GUICtrlRead($CTRL_slider[$N])
        GUICtrlSetData ($CTRL_edit[$N],$slColor)
        GUICtrlSetState($CTRL_slider[$N],$GUI_FOCUS)
        Input()
        ;~ Возвращаем утраченный фокус элементу:
        GUICtrlSetState($CTRL_slider[$N],$GUI_FOCUS)
EndFunc

Func randomize()
        Local $i, $HexColor ='0x'
        For $i=0 to 2
                $rnd = int(Random(0,255))
                $HexColor &= Hex($rnd,2)
                GUICtrlSetData($CTRL_edit[$i],$rnd)
                GUICtrlSetData($CTRL_slider[$i],$rnd)
        Next
        For $i=0 to 2
                GUICtrlSetBkColor($CTRL_slider[$i],$HexColor)
        Next
        GUICtrlSetData($CTRL_edit_hex,$HexColor)
        GUISetBkColor($HexColor,$Colorizer)
EndFunc

Func dropper()
Local $Time=TimerInit()
GUICtrlSetState($ButtonDr,$GUI_DISABLE)
ToolTip("Кликните мышью в любом месте экрана",Default,Default,"",0,3)
_SetCursor(@WindowsDir & "\cursors\cross_m.cur", 32512)
While 1
        Sleep (1) ; Символический таймаут для уменьшения CPU!!!
        $click=GUIGetCursorInfo ($Colorizer)
        If TimerDiff($Time) > 2300 Then ToolTip("")
        If $click[2] = 1 And $click[4] <> $ButtonDr Then
                $Mouse=MouseGetPos()
                $x=$Mouse[0]
                $y=$Mouse[1]
                $DrColor=Hex(PixelGetColor ($x,$y ),6)
                $j=1
                For $i=0 to 2
                        $Dr=Dec(StringMid($DrColor,$j,2))
                        GUICtrlSetData($CTRL_edit[$i],$Dr)
                        GUICtrlSetData($CTRL_slider[$i],$Dr)
                        $j += 2
                Next
                For $i=0 to 2
                        GUICtrlSetBkColor($CTRL_slider[$i],'0x' & $DrColor)
                Next
                GUICtrlSetData($CTRL_edit_hex,'0x' & $DrColor)
                GUISetBkColor('0x' & $DrColor,$Colorizer)
                GUICtrlSetState($ButtonDr,$GUI_ENABLE)
                ToolTip("")
                ExitLoop
        EndIf
WEnd
_SetCursor(@WindowsDir & "\cursors\3dwarro.cur", 32512)
EndFunc

Func DropperScale()
        Local $Mouse=MouseGetPos()
        Local $DrColor=Hex(PixelGetColor($Mouse[0],$Mouse[1]),6)
       
        If $LastDrColor = $DrColor Then Return 0
        $LastDrColor = $DrColor
       
        Local $j=1
        For $i=0 to 2
                $Dr=Dec(StringMid($DrColor,$j,2))
                GUICtrlSetData($CTRL_edit[$i],$Dr)
                GUICtrlSetData($CTRL_slider[$i],$Dr)
                $j += 2
        Next
        For $i=0 to 2
                GUICtrlSetBkColor($CTRL_slider[$i],'0x' & $DrColor)
        Next
        GUICtrlSetData($CTRL_edit_hex,'0x' & $DrColor)
        GUISetBkColor('0x' & $DrColor,$Colorizer)
        Return 1
EndFunc

;~ Author: Diamond
Func _GetControlPos($HWND, $ControlId)
        Local $Win        = WinGetPos($HWND)
        Local $Client    = WinGetClientSize($HWND)
        Local $Control    = ControlGetPos($HWND,"",$ControlId)
        Local $BorderSize = ($Win[2]-$Client[0])  / 2
        Local $PanelSize  = $Win[3] - $Client[1]  - $BorderSize
        Local $array[4]
        $array[0] = $Win[0]  + $BorderSize + $Control[0] ; left
        $array[1] = $Win[1]  + $PanelSize  + $Control[1] ; $top
        $array[2] = $array[0] + $Control[2]              ; right
        $array[3] = $array[1] + $Control[3]              ; bottom
        Return $array
EndFunc

Func ChooseColor()
        Local $HexColor = '0x'
        Local $BGR=ColorPicker(SwitchColor(GUICtrlRead($CTRL_edit_hex)), $Colorizer)
        If $BGR = -1 Then Return
        For $i=0 to 2
                $HexColor &= Hex($BGR[$i+1],2)
                GUICtrlSetData($CTRL_edit[$i],$BGR[$i+1])
                GUICtrlSetData($CTRL_slider[$i],$BGR[$i+1])
        Next
        For $i=0 to 2
                GUICtrlSetBkColor($CTRL_slider[$i],$HexColor)
        Next
        GUICtrlSetData($CTRL_edit_hex,$HexColor)
        GUISetBkColor($HexColor,$Colorizer)
EndFunc

Func ColorPicker($Default=0, $hWnd=0)
        Local $p = DllStructCreate("dword;int;int;int;ptr;dword;int;ptr;ptr")
                DllStructSetData($p, 1, DllStructGetSize($p))
                DllStructSetData($p, 2, $hWnd)
                DllStructSetData($p, 4, $Default)
                DllStructSetData($p, 5, DllStructGetPtr(DllStructCreate("int[16]")))
                DllStructSetData($p, 6, BitOR(0x100, 0x2, 0x1))
        $ret = DllCall("comdlg32.dll", "long", "ChooseColor", "ptr",DllStructGetPtr($p))
        If $ret[0] = False Then Return -1
        Local $color_picked = DllStructGetData($p, 4)
        $color_picked = Hex(String($color_picked), 6)
        Local $array[4]
        $array[0]="0x" & StringRight($color_picked,2) & StringMid($color_picked,3,2) & StringLeft($color_picked,2)
        $array[1]=Number("0x" & StringRight($color_picked,2)) ; RED
        $array[2]=Number("0x" & StringMid($color_picked,3,2)) ; GREEN
        $array[3]=Number("0x" & StringLeft($color_picked,2))  ; BLUE
        Return $array
EndFunc

Func WM_COMMAND($hWndGUI, $MsgID, $WParam, $LParam)
        Local $FocusedHandel = ControlGetHandle($hWndGUI, "", ControlGetFocus($hWndGUI))
        Local $Continue = False, $i
        Switch $FocusedHandel
                Case GUICtrlGetHandle($ButtonRnd)
                        randomize()
                        Return
                Case GUICtrlGetHandle($ButtonDr)
                        dropper()
                        Return
                Case GUICtrlGetHandle($Button_ChooseColor)
                        ChooseColor()
                        Return
                Case Else
                        For $i = 0 To 2
                                If $FocusedHandel = GUICtrlGetHandle($CTRL_edit[$i]) Then
                                        $Continue = True
                                        ExitLoop
                                EndIf
                        Next
                        If Not $Continue Then Return
        EndSwitch
       
        $N = $CTRL_edit[$i] - $CTRL_edit[0]
        Local $CtrlRead = GUICtrlRead($CTRL_edit[$N])
        If StringLeft($CtrlRead, 1) = 0 And StringLen($CtrlRead) > 1 Then GUICtrlSetData($CTRL_edit[$N], StringTrimLeft($CtrlRead, 1))
       
        Input()
EndFunc

Func WM_SCROLL($hWndGUI, $MsgID, $WParam, $LParam)
        Local $FocusedHandel = ControlGetHandle($hWndGUI, "", ControlGetFocus($hWndGUI))
       
        For $i = 0 To 2
                If GUICtrlGetHandle($CTRL_slider[$i]) = $FocusedHandel Then
                        $N = $i
                        ExitLoop
                EndIf
        Next
       
        Local $CurInfo = GUIGetCursorInfo($hWndGUI)
        If $CurInfo[2] = 1 Then
                ToolTip(GUICtrlRead($CTRL_slider[$N]))
        Else
                ToolTip("")
        EndIf
        slEvent()
EndFunc

; Author - I think gafrost ;)
;==================================================================
; $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
        Return $lResult[0]
EndFunc  ;==>_SetCursor

; Author - RazerM
Func SwitchColor ($iColor)
    Local $iMask
    $iMask = BitXOR(BitAND($iColor, 0xFF) , ($iColor / 0x10000))
        Return BitXOR($iColor, ($iMask * 0x10001))
EndFunc  ;==>SwitchColor

;~ Author: Diamond
Func _ButtonClassicStyle($controlID, $style=0)
        GUICtrlSetStyle($controlID, 0x0040) ; $BS_ICON
        GUICtrlSetImage($controlID, "shell32.dll",0,0)
        GUICtrlSetStyle($controlID, $style)
EndFunc

Что скажешь? :shuffle:

Diamond 22-09-2007 15:57 647673

Creat0R
Спасибо за отклик! :)
Цитата:

это скорее в помощь более большой утилитке, как дочерний диалог для управлением цветами
Изначално я её задумал чтобы облегчить подбор цветов для новых GUI, начал писать давно, потом проект забросил, а решил дописать после того как ТЫ привёл на форум пример со слайдерами.
Кстати из-за давности проекта осталось несколько, неуклюже написанных функций, (ведь тогда у меня было поменьше опыта...) они так и остались :lazy: фактически без изменений...
Цитата:

Теперь диалог для выбора цвета открывается как дочернее окно
Когда переписывал udf-ую _ChooseColor я почему-то убрал эту возможность... а потом и вовсе про неё забыл. Вместо этого стал использовать API-SetOnTop(), а теперь раз окно выбора цвета стало дочерним, SetOnTop() больше не нужна. Спасибо. :)
Цитата:

также переделал немного методы обновления данных
Ты вернул то, что я так старательно убирал, :biggrin: как раз именно из-за постоянных мельканий элементов. В начале у меня тоже обновлялось в реальном времени. Думаю, обновление лучше оставить как было, чтобы при перемещении позиции слайдера мышкой - обновлялось только один раз, а при использовании мышинного колёсика - постоянно.
По поводу курсора - идея хорошая, но с точки зрения пользователя было бы некорректно заменять текущий курсор на новый... Вижу толька два выхода: либо искать способ для определения текущего курсора, либо искать другую API-функцию (хотелось бы верить что она существует)
Цитата:

поправил ввод полей
... с помощью $WM_COMMAND, ...давно искал решение для мгновенного определения ввода, спасибо!

Куда-то пропала моя любимая фича: :search: При нажатии на тоновую шкалу (точнее при отпускании мышки с $GrCover) происходило определение цвета тоновой шкалы, и это не зависило от Пипетки... :(
Вместо этого добавился глюк: При клике по $GrCover запускается последнее действие, т.е. если я до этого нажимал кнопку "Цвет", то при клике по $GrCover вызывается диалог выбора цвета и т.д. :swoon:

Добавлено:
Цитата:

Кстати, а почему используется API-шная функция SetOnTop? Я так понял для скрытия окна и затем показа в режиме Поверх всех окон? но ведь можно было просто прятать по WinSetState($Hwnd, "", @SW_HIDE), и потом показать, OnTop не сбивается при этом
Не @SW_HIDE а @SW_DISABLE... Наверное повторюсь... Сочетание функции SetOnTop() и @SW_DISABLE я тупо использовал из-за того, что "окно выбора цвета" не было дочерним, теперь всё это не потребуется ;)

Creat0R 22-09-2007 17:44 647716

Diamond,
Цитата:

как раз именно из-за постоянных мельканий элементов
Но они у меня и до этого мелькали ;)

Цитата:

с точки зрения пользователя было бы некорректно заменять текущий курсор на новый
Согласен, поищу на оф. форме, может есть метод получить текущий курсор (хотя я уверен что есть, нужно просто хорошенько поискать, ну или вежливо спросить :) ).

Цитата:

При нажатии на тоновую шкалу (точнее при отпускании мышки с $GrCover) происходило определение цвета тоновой шкалы, и это не зависило от Пипетки
Ну, не уверен, но у меня и сейчас всё нормально определяется (или я не понял про что речь?)...

Цитата:

Вместо этого добавился глюк: При клике по $GrCover запускается последнее действие
Хм.. видимо фокус остаётся на последнем элементе, и WM_COMMAND срабатывает намного быстрее чем фокус меняется на используемый элемент (на который была нажата мышка), поэтому чтобы это поправить, нужно всего лишь заменить строку получения сфокусирорванного элемента, на $LParam (твой метод ;)) :

Код:

Local $FocusedHandel = $LParam;ControlGetHandle($hWndGUI, "", ControlGetFocus($hWndGUI))
Цитата:

Не @SW_HIDE а @SW_DISABLE
Именно @SW_HIDE (для WinSetState()), ведь эффект там происходил скрытия окна а не деактивирования... но это не столь важно.

P.S
Я если честно, считаю что переделав весь подход к подобному скрипту (методы решения и использование функции/вызовы), можно добиться идеальных результатов (где ничего не будет мелькать, и при этом обновляться в реальном времени)... но у меня пока (и полагаю что у тебя тоже), времени на это совсем нету :(

SAOPP 23-09-2007 12:41 648014

Ребят, почитав ЧаВо понял, что реализовать скрипт, который будет выключать определённую галочку в настройках панели задач можно(?), но не силён я в AutoIt'е, можно сказать вообще. Ответьте на такой вопрос, можно ли автоматизировать следующее действие:



Maza Faka 23-09-2007 15:00 648065

SAOPP
Попробуй:
Код:

Opt("WinTitleMatchMode", 4)
$tray = "Classname=Shell_TrayWnd"
ControlFocus($tray, "", "ToolbarWindow322")
ControlClick($tray, "", "ToolbarWindow322", "right")
Send("{UP 8}")
Send("{RIGHT}")
Send("{DOWN 3}")
Send("{ENTER}")


SAOPP 23-09-2007 15:11 648066

Maza Faka, спасибо, сразу бросается тот факт, что если исполнять клик курсором ближе к трею, то
Цитата:

Цитата Maza Faka
Send("{RIGHT}") »

скорее всего нужно переводить в 'LEFT' - но не факт, если при первом логоне курсор из центра экрана переместится в центр панели задач - думаю всё пройдёт гладко, спасибо ещё раз, сейчас скомпилю испробую.

Ха-ха, Maza Faka, огромное спасибо, только пришлось по каким то причинам мне убрать на один пункт движение вниз :) получилось следующее:
Код:

Opt("WinTitleMatchMode", 4)
$tray = "Classname=Shell_TrayWnd"
ControlFocus($tray, "", "ToolbarWindow322")
ControlClick($tray, "", "ToolbarWindow322", "right")
Send("{UP 8}")
Send("{RIGHT}")
Send("{DOWN 2}")
Send("{ENTER}")

Осталось протестировать процесс во время тихого инсталлятора, собсно для чего и затевался с этим :)

SAOPP 23-09-2007 15:33 648078

Цитата:

Цитата SAOPP
только пришлось по каким то причинам мне убрать на один пункт движение вниз »

Этот факт обусловлин отсутствием у меня в этом меню Windows Media Player'а и ессно его минибара для панели задач, т.е. здесь уже нужно подстраиваться под "общий" вид, т.е. с медиаплеером. Ещё раз спасибо.

Creat0R 23-09-2007 18:17 648127

SAOPP,
Вместо LEFT/RIGHT можно использовать Enter ;) , а также Opt(...) не нужен, сегодня в Аутоите уже есть метод более практичнее...

Код:

$TrayTitle = "[CLASS:Shell_TrayWnd]"
ControlFocus($TrayTitle, "", "ToolbarWindow322")
ControlClick($TrayTitle, "", "ToolbarWindow322", "right")
Send("{DOWN}") ;почему 8 раз UP, когда можно в обратную сторону один раз DOWN? :)
Send("{ENTER}")
Send("{DOWN 2}")
Send("{ENTER}")


TERMINAL 24-09-2007 10:56 648402

Народ! помогите на скрипте написать прогу которая ждёт 10 минут и если пользователь не нажимал ни одной клавиши (короче отсутствовал) тогда комп просто выключается.

Creat0R 24-09-2007 11:22 648422

TERMINAL,
Цитата:

написать прогу которая ждёт 10 минут и если пользователь не нажимал ни одной клавиши (короче отсутствовал) тогда комп просто выключается.
Лови (функция _IdleWaitCommit() написана by amel27, я её лишь немного подправил для данного примера):

Код:

HotKeySet("^q", "Quit")

$Minutes = 10 ;Тут задаётся интервал ожидания в минутах

While 1
    $Timer = TimerInit()
    _IdleWaitCommit(0)
WEnd

Func _IdleWaitCommit($idlesec)
    Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword")
    DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo))
    DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
    Do
        $iSave = DllStructGetData ($LastInputInfo, 2)
        Sleep(100)
        DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
        If TimerDiff($Timer) >= $Minutes * 60000 Then
            MsgBox(64, "Внимание", "10 минут спустя, а хозяина нету ;)", 10)
            ;Shutdown(1 + 4) ;Force Shutdown
            ExitLoop
        EndIf
    Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec
    Return DllStructGetData ($LastInputInfo, 2)-$iSave
EndFunc

Func Quit()
    Exit
EndFunc

Я закоментировал на всякий случай строку с выключением компа (;Shutdown(1 + 4) ;Force Shutdown).

TERMINAL 24-09-2007 11:46 648438

Creat0R, Это всё хорошо, но а как сделать если он есть, то прога просто использует EXIT.
Суть такая - комп после 2х часовой задачи идёт на перезагрузку (например ставлю на ночь). После загрузки винды прога эта автоматом загружается и смотрит-если я нажал кнопку на клаве или открыл любое окно (эфект присутствия) то она просто делает выход, а если никто ничего не делал в течении 10 минут-прога выключает комп....

SAOPP 24-09-2007 12:05 648455

Цитата:

Цитата Creat0R
Вместо LEFT/RIGHT можно использовать Enter , а также Opt(...) не нужен, сегодня в Аутоите уже есть метод более практичнее... »

К сожалению я не силён в этом и разбираться нет времени, товарищ помог мне и я очень ему благодарен, что же касается описанного, то чем лучше и практичнее будет выглядеть эта операция? :)

Creat0R 24-09-2007 13:05 648498

TERMINAL,
Цитата:

как сделать если он есть, то прога просто использует EXIT
Просто вытащий из цикла:

Код:

#NoTrayIcon

$Minutes = 10 ;Тут задаётся интервал ожидания в минутах

Sleep(1000)
$Timer = TimerInit()
_IdleWaitCommit(0)

Func _IdleWaitCommit($idlesec)
    Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword")
    DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo))
    DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
    Do
        $iSave = DllStructGetData ($LastInputInfo, 2)
        Sleep(100)
        DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
        If TimerDiff($Timer) >= $Minutes * 60000 Then
            MsgBox(64, "Внимание", "10 минут спустя, а хозяина нету ;)", 10)
            ;Shutdown(1 + 4) ;Force Shutdown
            ExitLoop
        EndIf
    Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec
    Return DllStructGetData ($LastInputInfo, 2)-$iSave
EndFunc

Всё, теперь при первом запуске, если ничего не нажимать (и не двигать мышку), скрипт будет ждать 10 минут и выключит комп, если в течении этого времени юзер что-то сделает :), то скрипт завершит работу.

SAOPP,
Цитата:

чем лучше и практичнее будет выглядеть эта операция?
Во-первых тем что это быстрее, а во-вторых я подозреваю разработчики AutoIt вскоре совсем откажутся от Opt("WinTitleMatchMode", X)... и тогда придётся переделывать все наши скрипты которые использовали этот метод.

TERMINAL 24-09-2007 13:50 648517

Creat0R, Спасибо огромное (правда ещё не проверял, но верю). Пока ты мне помогал, то я написал одну прогу-может кому-то и пригодится... Суть вот в чём... Я Админ и у меня все работают в 1С, но есть удалённая точка которую нужно тоже контролировать (когда на работу пришёл, когда ушёл...), инет не всегда есть-поэтому можно отмазаться тому человеку. Каждый день я с ним обмениваюсь папкой для 1С ну и решил запустить такую прогу, которая будет сама стартовать и делать мне отчёт...
читать дальше »

Local $Den = @MDAY
Local $Mesyac = @MON
Local $God = @YEAR
Local $4as = @HOUR
Local $Minute = @MIN

Global $1C="1cv7.exe"
IniWrite ( @HomeDrive & "\Пакет\Time.ini", "Запуск компа ", "Включение " & $Den & "." & $Mesyac & "." & $God , " " & $4as & "." & $Minute)
FileSetAttrib ( @HomeDrive & "\Пакет\Time.ini","+H" )

For $i = 1 To 1000
If ProcessWait ($1C) Then
Local $Den1 = @MDAY
Local $Mesyac1 = @MON
Local $God1 = @YEAR
Local $4as1 = @HOUR
Local $Minute1 = @MIN
IniWrite ( @HomeDrive & "\Пакет\Time.ini", "1C", "Запуск программы 1С " & $i & " " & $Den1 & "." & $Mesyac1 & "." & $God1 , " " & $4as1 & "." & $Minute1)
ProcessWaitClose ($1C)
Local $Den2 = @MDAY
Local $Mesyac2 = @MON
Local $God2 = @YEAR
Local $4as2 = @HOUR
Local $Minute2 = @MIN
IniWrite ( @HomeDrive & "\Пакет\Time.ini", "1C", "Выход с программы 1С " & $i & " " & $Den2 & "." & $Mesyac2 & "." & $God2 , " " & $4as2 & "." & $Minute2)
EndIf
Next

SAOPP 24-09-2007 19:09 648759

Creat0R,
У меня встречный вопрос (и просьба если это осуществимо), можно ли сделать как предлагаете вы, только вот меня интересует следующее, можно ли заставить курсор "щёлкать" (входить в меню панели задач) на часах Windows а не на всей панели конкретно?

Если это осуществимо, решается вопрос о "загрязнённой" панели задач открытыми окнами - это когда места нету на панели задач свободного, а открыты приложения/окна занимающее всё пустое место, таким образом AutoIt щёлкает на любом окне и не выполняет поставленную задачу :(

Creat0R 24-09-2007 21:47 648848

SAOPP,
Цитата:

можно ли заставить курсор "щёлкать" (входить в меню панели задач) на часах Windows а не на всей панели конкретно?
Можно полагаю...

Код:

ControlClick("[Class:Shell_TrayWnd]", "", "TrayClockWClass1", "Right")
:)

SAOPP 24-09-2007 23:07 648893

Опаньки, к сожалению я не приложу ума к этому, а продолжения в виде опуститься один раз вниз или как вы писал ранее для того, что бы не бегать 10 раз вверх, плюс там выбрать 4ю позицию:


Creat0R 24-09-2007 23:36 648903

SAOPP,
Если я правильно понял, то вот:

Код:

$TrayTitle = "[CLASS:Shell_TrayWnd]"
ControlClick($TrayTitle, "", "TrayClockWClass1", "Right")
Send("{DOWN}")
Send("{ENTER}")
Send("{DOWN 2}")
Send("{ENTER}")


SAOPP 24-09-2007 23:49 648906

Благодарю. Огромное спасибо - теперь "проблема" как таковая решена вообще :)

adima 25-09-2007 13:22 649151

Нет ли у кого примера скрипта как убрать иконку из tray в винде при загрузке и не показывать ее до следующей перезагрузки

Maza Faka 25-09-2007 14:00 649180

adima
Какую иконку, какого приложения?

adima 25-09-2007 15:01 649216

например radmin

Maza Faka 25-09-2007 16:27 649266

adima
В настройках радмина есть опция скрытия иконки.

SAOPP 25-09-2007 16:30 649268

Creat0R, вот меня мысль посетила, к выше опубликованному скрипту можно привинтить (если такое возможно путём AutoIt'а) таймер, который запустит сам скрипт на выполнение через заданный промежуток времени?

Например: запускаю я скрипт, а он через минуту только выполнит своё назначение, т.е. задержка перед выполнением...

Creat0R 25-09-2007 16:41 649281

adima,
Цитата:

как убрать иконку из tray
На оф. форуме выкладывали библиотеку Systray_UDF, там есть функции для скрытия иконки по имени процесса, есть также и по заголовку окна, но у меня лично оно не работает, только по имени процесса...
Вот пример:

Код:

#include "SysTray_UDF.au3"

$ProcessName = "AutoIt3.exe"

$TrayIconIndex = _SysTrayIconIndex($ProcessName)

MsgBox(0, "", "Сейчас будет спрятана иконка AutoIt'а", 3)

_SysTrayIconVisible(1, $TrayIconIndex)

MsgBox(0, "", "Теперь вернём иконку AutoIt'а ;)", 3)

_SysTrayIconVisible(0, $TrayIconIndex)

Sleep(2000)

All
Если у кого-то получится сделать функцию для скрытия иконки по PID, буду безмерно благодарен. В той библиотеке есть вроде подобные приминения, но они не работают у меня :(.

SAOPP,
Цитата:

запускаю я скрипт, а он через минуту только выполнит своё назначение, т.е. задержка перед выполнением...
А чем обычная пауза не подходит? Sleep(1000 * 60) ;будет спать одну минуту ;)
Почитай справку, там много интересного.

SAOPP 25-09-2007 22:30 649454

Creat0R, последний вопрос, тот же самый скрипт (как это не странно ;)), но(!) - возможно ли кликнуть на индикаторе языковой панели Windows? И выбрать соответствующий пункт:



Но после выбора, появляется окно подтверждения данного действия - если возможно всё ДО этого окна, возможность и в этом окне ответить есть? :)


Creat0R 26-09-2007 01:06 649529

SAOPP,
Тебе в помощь инструмент Au3Info.exe (он входит в состав AutoIt пакета), когда его запускаешь, и наводишь мышку над элементами, то отображаются их классы/заголовки/текст и т.п... вот чтобы кликнуть по этой панели, узнаёшь её класс, и кликаешь ;):

Код:

$TrayTitle = "[CLASS:Shell_TrayWnd]"
ControlClick($TrayTitle, "", "CiceroUIWndFrame1", "Right") ;CiceroUIWndFrame1 это и есть класс языковой панели.
Send("{UP}")
Send("{ENTER}")

;Следующую строчку раскоментировать в случае если нужно отметить птичку "Больше не показывать это сообщение"
;ControlClick("[Class:#32770; Title:Языковая панель]", "Button1")

ControlClick("[Class:#32770; Title:Языковая панель]", "", "Button2")


Creat0R 26-09-2007 02:23 649548

Diamond
А вот и решение для установки курсора, и потом возвращение оригинального (используемого юзером)...
(По мативам примера от eltorro тут)

Код:

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

$hWaitCur = _LoadCursor($OCR_CROSS)
_SetSystemCursor($hWaitCur, $OCR_NORMAL)

Sleep(2000)

_SetSystemCursor($hWaitCur, $OCR_NORMAL)
$hWaitCur = 0

Func _LoadCursor($iCursor)
    Return SetError(@error,@extended ,_API(DllCall("user32.dll", "int", "LoadCursorA", "hwnd", 0, "int", $iCursor)))
EndFunc  ;==>_LoadCursor

Func _SetSystemCursor($hCursor, $iCursor)
    Return SetError(@error,@extended ,_API(DllCall("user32.dll", "int" ,"SetSystemCursor","int",$hCursor,"int",$iCursor)))
EndFunc

Func _API($v_ret)
    Local $err = @error
    Local $ext = @extended
    If Not $err Then
        If IsArray($v_ret) Then
            Return $v_ret[0]
        Else
            Return $v_ret
        EndIf
    EndIf
    Return SetError($err, $ext, 0)
EndFunc  ;==>_API


SAOPP 26-09-2007 10:10 649649

Creat0R, странно, но по каким то причинам не хочет нажимать на кнопочки окна 'Языковая панель', пока не смог разобраться :(

Creat0R 26-09-2007 10:25 649654

SAOPP,
Цитата:

по каким то причинам не хочет нажимать на кнопочки окна 'Языковая панель'
Запусти это окно, запусти Au3Info, наведи курсор мышки над нужно кнопкой, и посмотри что написано в Au3Info тут:


TERMINAL 26-09-2007 11:31 649683

ДSAOPP, Держи-если просто хочешь отключить отображение языковой панели,
читать дальше »

Run ("RunDll32.exe shell32.dll,Control_RunDLL intl.cpl,,1")
For $i = 0 To 1000
If WinWait("Язык и региональные стандарты","", 1) Then
ControlClick("Язык и региональные стандарты","","Button2")
EndIf
If WinWait("Языки и службы текстового ввода","", 1) Then
ControlClick("Языки и службы текстового ввода","","Button8")
EndIf
If WinWait("Добавление языка ввода","&Раскладка клавиатуры или мето", 1) Then
ControlClick("Добавление языка ввода","&Раскладка клавиатуры или мето","Button2")
WinWait("Языки и службы текстового ввода","Выберите один из установленных")
ControlClick("Языки и службы текстового ввода","Выберите один из установленных","Button11")
WinWait("Язык и региональные стандарты","Дополнительная языковая поддер")
ControlClick("Язык и региональные стандарты","Дополнительная языковая поддер","Button7")
Run ("RunDll32.exe shell32.dll,Control_RunDLL intl.cpl,,1")
EndIf
If WinWait("Параметры языковой панели","О&тображать текстовые метки на", 1) Then
ControlClick("Параметры языковой панели","О&тображать текстовые метки на","Button2")
ControlClick("Параметры языковой панели","О&тображать текстовые метки на","Button6")
WinWait("Языки и службы текстового ввода","Выберите один из установленных")
ControlClick("Языки и службы текстового ввода","Выберите один из установленных","Button10")
WinWait("Язык и региональные стандарты","Дополнительная языковая поддер")
ControlClick("Язык и региональные стандарты","Дополнительная языковая поддер","Button6")
Exit
EndIf
Next

а по другому ,помоему, способов больше нет если только мышь заставить двигать как тебе надо, но при условии что данный компонент будет находиться в одном и том же месте. Это я привожу тут ниже
читать дальше »

Opt("WinWaitDelay",100)
Opt("WinTitleMatchMode",4)
Opt("WinDetectHiddenText",1)
Opt("MouseCoordMode",0)
WinWait("classname=Shell_TrayWnd","TF_FloatingLangBar_W")
If Not WinActive("classname=Shell_TrayWnd","TF_FloatingLangBar_W") Then WinActivate("classname=Shell_TrayWnd","TF_FloatingLangBar_W")
WinWaitActive("classname=Shell_TrayWnd","TF_FloatingLangBar_W")
MouseMove(992,12)
MouseDown("right")
MouseUp("right")
MouseMove(899,-2)
MouseDown("left")
MouseUp("left")
MouseMove(1005,15)
MouseDown("right")
MouseUp("right")
MouseMove(908,-160)
MouseDown("left")
MouseUp("left")

Низнаю, правильно будет работать или нет, но я делал это на разрешении монитора 1024*768. На
других разрешения не пробовал...

SAOPP 26-09-2007 11:34 649686

Creat0R, всё тоже самое что и в скрипте, но не хочет нажимать ничего :(

Creat0R 26-09-2007 12:36 649725

TERMINAL,
Цитата:

Держи-если просто хочешь отключить отображение языковой панели
Этот скрипт не очень практичен, и не надёжен, если у SAOPP не сработал скрипт по проще, то этот точно не сработает.

P.S
Юзай теги [Cоde][/Cоde] ;)

TERMINAL 26-09-2007 12:40 649730

Creat0R, должен сработать, там хоть сама працедура не всегда срабатывает - поэтому мне скрипт побольше сделать чтобы обходил он ошибки. Вроде проверял раз 20 то пока он работает...

Creat0R 26-09-2007 12:46 649732

SAOPP,
Цитата:

не хочет нажимать ничего
Очень странно, может есть уже открыто подобное окошео где то? перезапустить систему пробовал?

TERMINAL,
Цитата:

проверял раз 20 то пока он работает...
У тебя работает ;)

Creat0R 26-09-2007 13:08 649742

Diamond
Как это я раньше не подумал, ведь текущий курсор можно брать с реестра :idea: ...

Код:

Local $Old_EES = Opt("ExpandEnvStrings", 1)
Local $OldCursor = RegRead("HKEY_CURRENT_USER\Control Panel\Cursors", "Arrow")
_SetCursor(@WindowsDir & "\cursors\cross_m.cur", 32512)
_SetCursor($OldCursor, 32512)
If @error Then _SetCursor(@WindowsDir & "\cursors\3dwarro.cur", 32512)
Opt("ExpandEnvStrings", $Old_EES)


SAOPP 27-09-2007 01:41 650190

Creat0R, что бы во время выполнения скрипта был другой курсор? :)

Creat0R 27-09-2007 02:38 650196

SAOPP,
Это для пипетки, вот тут мы обсуждали эту тему ;)

amel27 27-09-2007 06:35 650212

Creat0R,
Цитата:

у кого-то получится сделать функцию для скрытия иконки по PID, буду безмерно благодарен
если немного подправить UDF _SysTrayIconIndex(), то PID можно будет передавать наравне с именем:
Код:

Func _SysTrayIconIndex($name, $mode=0)
    Local $index = -1
    Local $process
    Local $i
    If $mode < 0 or $mode > 2 or Not IsInt($mode) Then
        SetError(1)
        return -1
    EndIf
        If
$mode = 0 Then
        If
IsString($name) Then
            $process = _SysTrayIconProcesses()
        Else
            $process = _SysTrayIconPids()
        EndIf
    Else

        $process = _SysTrayIconTitles()
    EndIf
        For
$i = 0 to Ubound($process)-1
        If $process[$i] = $name Then
            $index = $i
    EndIf
    Next
    return
$index
EndFunc


Creat0R 27-09-2007 07:26 650220

amel27,
Цитата:

если немного подправить UDF _SysTrayIconIndex(), то PID можно будет передавать наравне с именем:
Я это (почти) пробовал, но проблема не в этой функции, а в _SysTrayIconPids() - Если запущено приложение дважды (т.е две одинаковые иконки теперь в трее), то в массив попадает неверный порядок идентификаторов, и соответственно скрывается не всегда нужная иконка.. я уже как только не пробовал переделывать эти функии, но у меня не вышло :(, но в процессе написал функцию _SysTrayIconIndexArr() - возвращает массив всех индексов одного и того же процесса (имени процесса), чтобы скрыть все иконки (это лучше чем скрыть не ту иконку :)) - Могу выложить если нужно.

Maza Faka 27-09-2007 08:14 650245

Creat0R
Цитата:

у кого-то получится сделать функцию для скрытия иконки по PID, буду безмерно благодарен
Так?:
Код:

#include <SysTray_UDF.au3>
$pid = ProcessExists("server.exe")
$index = _SysTrayIconIndex($pid)
MsgBox(64, "Hide", "Now hide server.exe icon")
_SysTrayIconVisible(1, $index)
MsgBox(64, "Visible", "Now visible server.exe icon")
_SysTrayIconVisible(0, $index)


amel27 27-09-2007 08:35 650252

Creat0R
Цитата:

проблема не в этой функции, а в _SysTrayIconPids() - Если запущено приложение дважды (т.е две одинаковые иконки теперь в трее), то в массив попадает неверный порядок идентификаторов
точно, так как _SysTrayIconPids() возвращает PID (в основном) по имени процесса, может эту UDF тоже подправить и обрабатывать ВСЕ иконки как безымянные, т.е. по индексу?
Код:

Func _SysTrayIconPids()
    Local $i
    Local $titles = _SysTrayIconTitles()
    Local $processes[UBound($titles)]
    Local $ret

    For $i=0 to Ubound($titles)-1
        $ret = DLLCall("user32.dll","int","GetWindowThreadProcessId", "int", _SysTrayIconHandle($i), "int_ptr", -1)
        If Not @error Then $processes[$i] = $ret[2]
    Next

    Return
$processes
EndFunc


Creat0R 27-09-2007 08:36 650255

Maza Faka,
PID я получаю по пути к запускному файлу (_PathIsProcess()), но не тут проблема, всё(?) дело в функции _SysTrayIconPids().

amel27,
Цитата:

может эту UDF тоже подправить и обрабатывать ВСЕ иконки как безымянные, т.е. по индексу?
Гинеально!!! Работает!!! :yahoo: :clapping:
Спасибо!!!

Maza Faka 27-09-2007 09:33 650292

Как правильно создавать многомерные массивы? Например функция ProcessList возвращает двумерный массив:
Код:

$list = ProcessList()
for $i = 1 to $list[0][0]
  msgbox(0, $list[$i][0], $list[$i][1])
next

По аналогии пытаюсь создать свой двумерный массив, но не получается:
Код:

Global $TestArray[4][4] = [[3, "First", "Second", "Third"], [3, "John", "Steve", "Arnold"]]

For $i = 1 To $TestArray[0][0]
    MsgBox(0, $TestArray[$i][0], $TestArray[$i][1])
Next

Работает только, если сделать так:
Код:

MsgBox(0, $TestArray[0][$i], $TestArray[1][$i])
Кто нибудь может разжевать :)

Maza Faka 27-09-2007 09:59 650309

amel27
Ты ГУРУ! :pray:
Сделал так:
Код:

#include "SysTray_UDF.au3"

$ListArray = ProcessList("LA.exe")

MsgBox(0, "Hide", "Now hide is Light Alloy icons")
For $i = 1 To $ListArray[0][0]
    $index = _SysTrayIconIndex($ListArray[$i][1])
    _SysTrayIconVisible(1, $index)
Next

Sleep(1000)

MsgBox(0, "Visible", "Now visible is Light Alloy icons")
For $i = 1 To $ListArray[0][0]
    $index = _SysTrayIconIndex($ListArray[$i][1])
    _SysTrayIconVisible(0, $index)
Next

Работает! :kruto:

P.S.
Может сообщишь автору, о том, что изменил его библиотеку и теперь её можно считать не бетой, а релизом. ;)

Angelus 27-09-2007 10:00 650310

А как заставить GUI интерфейс использовать рисунки которые вшиты в EXE файл???

SAOPP 27-09-2007 10:13 650318

Т.е. закрыть языковую панель таким способом, что я предложил не получится? :(

Creat0R 27-09-2007 10:56 650340

Maza Faka,
Цитата:

Как правильно создавать многомерные массивы?
Я если честно сам до сих пор точно понять не могу, но для себя сделал функцию (не всегда подходящюю правда), которая создаёт двумерный массив из строк по разделителю:

Код:

#include <Array.au3>

Dim $Array = _Array2DCreate("Jimmy|Mike|George", "0|1|2")

_ArrayDisplay($Array)

Func _Array2DCreate($1DStr, $2DStr, $Delim="|")
    Local $2DArray[1][1], $iUbound
    Local $BiggestArray = StringSplit($1DStr, $Delim)
    Local $SmallestArray = StringSplit($2DStr, $Delim)

        If UBound($SmallestArray) > UBound($BiggestArray) Then
        Local $TempArray = $BiggestArray
        $BiggestArray = $SmallestArray
        $SmallestArray = $TempArray
    EndIf

        ReDim $SmallestArray[UBound($BiggestArray)]

        For $i = 1 To UBound($BiggestArray)-1
        $iUbound = UBound($2DArray)
        ReDim $2DArray[$iUbound+1][2]
        $2DArray[$iUbound][0] = $BiggestArray[$i]
        If $SmallestArray[$i] <> "" Then $2DArray[$iUbound][1] = $SmallestArray[$i]
    Next
    $2DArray[0][0] = $iUbound
    Return $2DArray
EndFunc

“Ведущий массив”, это самый большой найденный массив :).

Angelus,
Цитата:

как заставить GUI интерфейс использовать рисунки которые вшиты в EXE файл???
Смотря для чего, обычно можно использовать GuiCtrlSetImage(-1, "File.exe", 0)
Где 0 это имя ресурса изображения в Exe'шнике.

SAOPP,
Цитата:

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

может есть уже открыто подобное окошко где то? перезапустить систему пробовал?
У меня это работает :dont-know

amel27 27-09-2007 12:44 650407

Maza Faka
Цитата:

Ты ГУРУ
да ну брось - скрипт содержал весь нужный код... хотя не совсем понятна мотивация автора при выборе алгоритма, может из соображений производительности? :dont-know
Цитата:

Может сообщишь автору, о том, что изменил его библиотеку и теперь её можно считать не бетой, а релизом.
это надо просить Creat0R'а, я на офсайте редко бываю... его вопрос, ему и обосновывать перед автором :)

SAOPP 27-09-2007 14:31 650478

Цитата:

Цитата Creat0R
может есть уже открыто подобное окошко где то? перезапустить систему пробовал? »

Да нет, нету ничего. Ни на виртуалке ни на реальной машине ничего не происходит...

Сейчас протестировал, на виртуалке всё работает, хм странно, надеюсь это трабла этой ОС, поэтому думаю при установке на реальную машину скрипт сработает ;)

Creat0R 28-09-2007 17:19 651129

Многие (и наверное я сам) тут спрашивали, как копировать большой файл, и при этом получать данные прогресса...
Так вот, используя быстро набирающую популярность на оф. форуме библиотеку DllCallBack.au3, можно этого добиться очень просто!!!:

Код:

#include <DllCallBack.au3>

_FileCopyEx("C:\BigFile.avi", @ScriptDir & "\BigFile.avi")

Func _FileCopyEx($Source, $Dest)
    If Not FileExists($Source) Then Return SetError(1)
    ProgressOn("_FileCopyEx() Demo", "Копирование, ждите плиз...")
    $pCopyProgressRoutine = _DllCallBack("_CopyProgressRoutine", "uint64;uint64;uint64;uint64;dword;dword;ptr;ptr;ptr")
    DllCall("kernel32.dll", "int", "CopyFileExA", _
        "str", $Source, _
        "str", $Dest, _
        "ptr", $pCopyProgressRoutine, _
        "ptr", 0, _
        "int", 0, _
        "int", 0)
    _DllCallBack_Free($pCopyProgressRoutine)
    Sleep(1000)
    ProgressOff()
EndFunc

Func _CopyProgressRoutine($TotalFileSize, $TotalBytesTransferred, $StreamSize, $StreamBytesTransferred, $dwStreamNumber, $dwCallbackReason, $hSourceFile, $hDestinationFile, $lpData)
    $Precent = $TotalBytesTransferred/$TotalFileSize*100
    ProgressSet($Precent, "Проценты: " & Round($Precent, 1) & " %")
    Return 0
EndFunc  ;==>_CopyProgressRoutine

Вот и всё! ;)

TERMINAL 28-09-2007 17:28 651133

Creat0R, а как можно сделать если мне, например, нужно скопировать целую папку ( I386 c диска)и чтобы прогрес был и показывал сколько осталось минут и процентов? Можешь помочь?

Creat0R 28-09-2007 17:36 651141

Maza Faka,
Цитата:

Может сообщишь автору, о том, что изменил его библиотеку и теперь её можно считать не бетой, а релизом
А бибилиотека разве бетой считается? если ты про AutoIt3 Beta то это значит что библиотека требует (требовала) последнюю бетку самого AutoIt :)

amel27,
Цитата:

его вопрос, ему и обосновывать перед автором
Согласен, обосновал ;).

TERMINAL,
Цитата:

нужно скопировать целую папку ( I386 c диска)и чтобы прогрес был и показывал сколько осталось минут и процентов?
Можно с ситемным диалогом:

Код:


_FileCopy("C:\My Dir\*.*", "C:\Dest Dir")

Func _FileCopy($Source, $Dest)
    If Not FileExists($Dest) Then DirCreate($Dest)
    $WinShell = ObjCreate("shell.application")
    $WinShell.NameSpace($Dest).CopyHere($Source)
EndFunc


Maza Faka 28-09-2007 18:24 651165

Creat0R
Цитата:

Можно с ситемным диалогом:
:kruto: Огромное спасибо за код, давно искал нечто подобное! Респект!

TERMINAL 28-09-2007 18:29 651170

Creat0R, Спасибо ! А можно с перезаписью файлов (чтобы по умолчанию перезаписывало)?!

Maza Faka 28-09-2007 18:42 651173

Creat0R
И сразу вопрос, где можно найти описание синтаксиса COM - обьектов? :)

Цитата:

Цитата TERMINAL
А можно с перезаписью файлов (чтобы по умолчанию перезаписывало)? »

Так по умолчанию перезаписывает.

SAOPP 28-09-2007 21:04 651225

Creat0R, всё же как то скрипт странно работает, на виртуальной машине после применения скрипта, индикатор закрывается, но сразу же появляется "плавающая" языковая панель - здесь я просто бессильный, может быть скрипту дать задержку между выполнением его действий (внутри самого скрипта)?

Creat0R 29-09-2007 03:18 651383

TERMINAL, Maza Faka,
Цитата:

Цитата TERMINAL
можно с перезаписью файлов »

Я вспомнил, есть ещё и API методы для копирования с отображением системного диалога...

Вот функции прямо из оф. форума (ссылка на источник) включая константы и обработчик ошибок (я лишь немного подправил функции):

Код:

#Region consts
Global Const $FOR_MOVE                  = 0x0001
Global Const $FOR_COPY                  = 0x0002
Global Const $FOR_DELETE                = 0x0003
Global Const $FOR_RENAME                = 0x0004

Global Const $FOF_MULTIDESTFILES        = 0x0001
Global Const $FOF_CONFIRMMOUSE          = 0x0002
Global Const $FOF_SILENT                = 0x0004
Global Const $FOF_RENAMEONCOLLISION    = 0x0008
Global Const $FOF_NOCONFIRMATION        = 0x0010
Global Const $FOF_WANTMAPPINGHANDLE    = 0x0020
Global Const $FOF_ALLOWUNDO            = 0x0040
Global Const $FOF_FILESONLY            = 0x0080
Global Const $FOF_SIMPLEPROGRESS        = 0x0100
Global Const $FOF_NOCONFIRMMKDIR        = 0x0200
Global Const $FOF_NOERRORUI            = 0x0400
Global Const $FOF_NOCOPYSECURITYATTRIBS = 0x0800
Global Const $FOF_NORECURSION          = 0x1000
Global Const $FOF_NO_CONNECTED_ELEMENTS = 0x2000
Global Const $FOF_WANTNUKEWARNING      = 0x4000
Global Const $FOF_NORECURSEREPARSE      = 0x8000
#Endregion consts

Func _CopyWithProgress($sFrom, $sTo, $OPERATION_MODE, $GENERAL_MODE)
    ; version 1 by SumTingWong on 5/26/2006
    ; http://www.autoitscript.com/forum/index.php?showtopic=11888
    ; updated by lod3n on 6/5/2007
   
    Local $SHFILEOPSTRUCT
    Local $pFrom
    Local $pTo
    Local $aDllRet
    Local $nError = 0
    Local $i
   
        If FileExists($sTo) And StringRight($sFrom, 3) <> "*.*" And StringInStr(FileGetAttrib($sFrom), "D") Then $sFrom &= "\*.*"
       
    $SHFILEOPSTRUCT = DllStructCreate("int;uint;ptr;ptr;uint;int;ptr;ptr")
    If @error Then Return "nostruct"       
; hwnd
    DllStructSetData($SHFILEOPSTRUCT, 1, 0)
; wFunc
    DllStructSetData($SHFILEOPSTRUCT, 2, $OPERATION_MODE)
; pFrom
    $pFrom = DllStructCreate("char[" & StringLen($sFrom)+2 & "]")
; pFrom will now be null-terminated at StringLen($sFrom)+1
    DllStructSetData($pFrom, 1, $sFrom)
    For $i = 1 To StringLen($sFrom)+2
        If DllStructGetData($pFrom, 1, $i) = 10 Then DllStructSetData($pFrom, 1, 0, $i)
    Next
; We need a second null at the end
    DllStructSetData($pFrom, 1, 0, StringLen($sFrom)+2)
    DllStructSetData($SHFILEOPSTRUCT, 3, DllStructGetPtr($pFrom))
; pTo
    $pTo = DllStructCreate("char[" & StringLen($sTo)+2 & "]")
; pTo will now be null-terminated at StringLen($sTo)+1
    DllStructSetData($pTo, 1, $sTo)
; We need a second null at the end
    DllStructSetData($pTo, 1, 0, StringLen($sTo)+2)
    DllStructSetData($SHFILEOPSTRUCT, 4, DllStructGetPtr($pTo))
; fFlags
    DllStructSetData($SHFILEOPSTRUCT, 5, $GENERAL_MODE)
; fAnyOperationsAborted
    DllStructSetData($SHFILEOPSTRUCT, 6, 0)
; hNameMappings
    DllStructSetData($SHFILEOPSTRUCT, 7, 0)
; lpszProgressTitle
    DllStructSetData($SHFILEOPSTRUCT, 8, 0)
    $aDllRet = DllCall("shell32.dll", "int", "SHFileOperation", "ptr", DllStructGetPtr($SHFILEOPSTRUCT))
    $retcode = $aDllRet[0]
    $pFrom = 0
    $pTo = 0
    $SHFILEOPSTRUCT = 0
    If $retcode <> 0 Then
        ConsoleWrite(hex($retcode) & ": " & SHFileOperationErrDecode($retcode) & @crlf)
        SetError($nError)
        Return False
    EndIf
    Return True
EndFunc

Func SHFileOperationErrDecode($errNum)
    Switch $errNum
        case 113   
            return "The source and destination files are the same file."
        case 114   
            return "Multiple file paths were specified in the source buffer, but only one destination file path."
        case 115   
            return "Rename operation was specified but the destination path is a different directory. Use the move operation instead."
        case 116   
            return "The source is a root directory, which cannot be moved or renamed."
        case 117   
            return "The operation was cancelled by the user, or silently cancelled if the appropriate flags were supplied to SHFileOperation."
        case 118   
            return "The destination is a subtree of the source."
        case 120   
            return "Security settings denied access to the source."
        case 121   
            return "The source or destination path exceeded or would exceed MAX_PATH."
        case 122   
            return "The operation involved multiple destination paths, which can fail in the case of a move operation."
        case 124   
            return "The path in the source or destination or both was invalid."
        case 125   
            return "The source and destination have the same parent folder."
        case 126   
            return "The destination path is an existing file."
        case 128   
            return "The destination path is an existing folder."
        case 129   
            return "The name of the file exceeds MAX_PATH."
        case 130   
            return "The destination is a read-only CD-ROM, possibly unformatted."
        case 131   
            return "The destination is a read-only DVD, possibly unformatted."
        case 132   
            return "The destination is a writable CD-ROM, possibly unformatted."
        case 133   
            return "The file involved in the operation is too large for the destination media or file system."
        case 134   
            return "The source is a read-only CD-ROM, possibly unformatted."
        case 135   
            return "The source is a read-only DVD, possibly unformatted."
        case 136   
            return "The source is a writable CD-ROM, possibly unformatted."
        case 183
            return "MAX_PATH was exceeded during the operation."
        case 1026, 0000005
            return "An unknown error occurred. This is typically due to an invalid path in the source or destination. This error does not occur on Microsoft Windows Vista and later."
        case 65536 
            return "An unspecified error occurred on the destination."
        case 65652 
            return "Destination is a root directory and cannot be renamed."
                Case 0000002
                        return "Confirmation was canceled"
    EndSwitch
   
    return "SHFileOperation returned errorcode " & hex($errNum) & ", which is not recognized"
EndFunc

Вот примеры использования:

Код:

;Копирование содержимого папки с подтверждением на перезапись (подавляется диалог о создании папки - константа $FOF_NOCONFIRMMKDIR)
_CopyWithProgress("C:\Source", "C:\Dest", $FOR_COPY, $FOF_NOCONFIRMMKDIR)

;Копирование содержимого папки подавляя подтверждение на перезапись (перезапись без подтверждения)
_CopyWithProgress("C:\Source", "C:\Dest", $FOR_COPY, BitOR($FOF_NOCONFIRMMKDIR, $FOF_NOCONFIRMATION))

;Копирование содержимого папки без рекурсии (файлы только в указанной папке)
_CopyWithProgress("C:\Source\*.*", "C:\Dest", $FOR_COPY, $FOF_NORECURSION)

;Копирование только файлов с возможностью отмены действии (без каталогов)
_CopyWithProgress("C:\Source", "C:\Dest", $FOR_COPY, BitOR($FOF_FILESONLY, $FOF_ALLOWUNDO))

Maza Faka,
Цитата:

Цитата Maza Faka
где можно найти описание синтаксиса COM - обьектов? »

Ну как, в справке вообще то :)
Если ты про мой пример конкретно, я его с оф. форума стащил, но вообще то это нужно смотреть документацию к тому или инному приложению (в этом случае к Windows ;) ).

SAOPP,
Цитата:

сразу же появляется "плавающая" языковая панель
Это видимо такие настройки для этой панели (хотя у себя такого никогда не замечал), посмотри в панели управления её настройки.

Creat0R 29-09-2007 10:24 651425

Обновил Скрипт расскраски кода AutoIt для помещения в форумы (Au3ToPst):

Список изменении:

Цитата:

v1.5
* Исправлена проблема при открытии программы из редактора SciTE - если в последний раз использовалась опция ручного ввода кода, то естественно содержимое скрипта не отображалось, теперь птичка "Ввести код вручную" не будет ставиться если была передана ком. строка.
* Добавленна поддержка Ctrl + A (выделяет весь код в Edit поле).
* В пункт меню редактора SciTe при интеграции теперь подключается и горячая клавиша Ctrl + K.
* Исправлена большая загрузка ЦП при длительных колдовании курсора мышки над полем ввода кода :).
* Мелкие ошибки и недочёты поправлены.

Creat0R 29-09-2007 20:58 651634

amel27
Если при обработке раскраски присутствуют #Region Something, то обработка не может распознать стили - их можно как то добавить?

mariolast 30-09-2007 00:37 651741

При установке приложени устанавливаются файлы setup.msi -> EN.msi -> VBA.msi -> FontNav.msi. То есть setup.msi отрабатывает свое и передает "эстафетную палочку" дальше. Надо чтобы скрипт отслеживал выполнение каждоготиз четырех компонентов и во время выполнения каждого из них приостанавливал выполнение скрипта.
Я думал так

WinWaitActive ( "EN" )
WinWaitClose ( "EN")
WinWaitActive ( "VBA" )
WinWaitClose ( "VBA" )
WinWaitActive ( "FontNav" )
WinWaitClose ( "FontNav" )

Но слишком быстро нав. выполняется последний компонент и скрипт не успевает что ли увидеть окно "FontNav" (компонент FontNav.msi), в результате висит вечно в паузе.

amel27 30-09-2007 09:33 651804

mariolast
функция WinWaitClose() обязательна?.. попробуйте без них

Creat0R
Цитата:

Если при обработке раскраски присутствуют #Region Something, то обработка не может распознать стили - их можно как то добавить?
переделал базовый скрипт с целью уменьшения размера выходного текста и учетом новых познаний в регулярных выражениях :) , основные изменения:
- убрал промежуточные замены на "#", теперь этот символ можно использовать в коде;
- добавил черезстрочное объединение стилей, если стиль не изменяется от строки к строке;
- убрал из стилей жирный шрифт, опять же для уменьшения количества форматных символов.

скрипт лежит там же: http://forum.oszone.net/post-511410-474.html

З.Ы. Если требуется совпадения стилей с SciTE нужно будет кое-где добавить теги [b]

mariolast 30-09-2007 09:54 651809

amel27,
Цитата:

Цитата amel27
функция WinWaitClose() обязательна?.. попробуйте без них »

Застревает то как раз на
WinWaitActive ( "FontNav" )

amel27 30-09-2007 10:36 651818

mariolast
из вашего объяснения не видно каким образом происходит последовательный запуск - пакетным файлом, из MSI-пакетов, AU3-скрипта или еще каким образом... не исключено что предыдущий этап может завершаться после начала следующего. В качестве эксперимента запустите отдельный скрипт ожидающий только WinWaitActive ("FontNav") (чтобы исключить взаимное влияние) - если будет "застревать", значит нужно играть с параметрами идентификации окна - "AutoIt Window Info" в помощь :)

mariolast 30-09-2007 11:10 651824

Если запустить
setup.msi /qn, то он и так все установит, сначала сам отработает, а затем поочередно запустятся файлы EN.msi -> VBA.msi -> FontNav.msi
Что я делаю. Пакую все в саморасп. архив Winrar и в самом Винраре задаю запуск setup = setup.exe /qn
Так вот винрар после отработки установщика setup.msi считает работу завершенной, и остальные 3 файла ему по барабану, он закрывается и удаляет врем. файлы, так что успевает запустится только EN.msi и то не всегда, остальных два нет. Вот поэтому нужен скрипт, чтоб заставить ВинРАР работать, пока не поставится все что надо. Запускать вручную EN.msi -> VBA.msi -> FontNav.msi не подходит, ибо если вручную запущу, то винрар то будет работать, следовательно цепочка EN.msi -> VBA.msi -> FontNav.msi будет продолжать работать и при этом будет ошибка при вызове двух msi. Может как то через процессы отследить msiexec?

amel27,
Именно им и игрался "AutoIt Window Info"

amel27 30-09-2007 11:34 651828

mariolast
тогда тем более убери из скрипта обработку всех несущественных промежуточных окон - сконцентрируйся только на последнем, собственно только его и нужно дождаться

SAOPP 30-09-2007 12:05 651838

Цитата:

Цитата Creat0R
Это видимо такие настройки для этой панели (хотя у себя такого никогда не замечал), посмотри в панели управления её настройки. »

А что именно я должен увидеть там?

mariolast 30-09-2007 15:49 651901

Ограничился пока
WinWait ( "FontNav" )
WinWaitClose ( "FontNav" )

Creat0R 01-10-2007 05:01 652182

amel27,
Цитата:

переделал базовый скрипт с целью уменьшения размера выходного текста и учетом новых познаний в регулярных выражениях
Отлично, спасибо.

Цитата:

убрал из стилей жирный шрифт, опять же для уменьшения количества форматных символов.
Его можно добавлять в конце, как и тег [cоde] ;)

Уже занимаюсь импортом этой функции в Au3ToPost с GUI...

Creat0R 01-10-2007 11:51 652316

amel27 и Все,
Обновил и GUI версию - Au3ToPst 1.6
Список изменении...
читать дальше »

v1.6
  • Обновлена главная функция обработки:
    - Убраны промежуточные замены на "#", теперь этот символ можно использовать в коде;
    - Добавлено черезстрочное объединение стилей, если стиль не изменяется от строки к строке;
    - Убран из стилей жирный шрифт, опять же для уменьшения количества форматных символов.
    (Добавляется в конце обработкти).
  • Добавлена поддержка быстрого режима - если передаётся ком. строка (путь к обрабатываемому файлу), и поставлена соответствующая опция в главном Меню, то скрипт обрабатывается в тихом режиме (без GUI), обработанный код по окончанию помещается в буфер обмена.
  • Исправления и улучшения при интеграции в SciTE:
    - Значительно усовершенствован метод интеграции.
    - При повторной интеграции пункты в файле настроек (au3.properties) больше удваиваться не будут.
    - Теперь новые значения и пункты будут прописываться в любом случае.
    - Теперь при вызове программы из меню SciTE документ сразу будет сохранён.
  • Ещё одна поправка большой загрузки ЦП (в дочернем диалоге вывода результатов).
  • Поправки в некоторых элементах GUI.
  • Общие улучшения в коде.


amel27,
Кстати, #Region так и не распознавался, я добавил стиль t_12 с заменой на цвет #A00FF0 (текстового значения этого цвета я не знаю :( ).

amel27 01-10-2007 12:22 652334

Цитата:

Цитата Creat0R
Кстати, #Region так и не распознавался

а... так это новый стиль, а я думал только решетка мешалась
Цитата:

Цитата Creat0R
добавил стиль t_12 с заменой на цвет #A00FF0 (текстового значения этого цвета я не знаю )

[color=darkmagenta][i] почти подходит - как у чисел, только без жирного шрифта

Creat0R 01-10-2007 13:13 652376

amel27,
Цитата:

[color=darkmagenta][i] почти подходит
Вот этот вроде больше: [cоlor=DarkOrchid] - [сравнение (используется #A00FF0)]. Самая большая таблица цветов что я когда либо видел в сети есть тут.

Creat0R 01-10-2007 13:20 652379

Скрипт для конвертирования выделенного текста (a.k.a SwitchIt ;) ):

Запускаем скрипт, выделяем текст в почти любом Edit поле, и жмё Ctrl ` (ё на рус. раскладке) - текст конвертится в набор символов противоположного языка (Eng - Rus) -> Если функции ConvertText как второй параметр передать 0, то всегда будет конвертировать в Русский, если 1 то в Английский (-1 в противоположный).

Код:

#NoTrayIcon
Opt("SendKeyDelay", 0)
HotKeySet("^`", "ConvertProc")
HotKeySet("^q", "Quit")

While 1
    Sleep(100)
WEnd

Func
ConvertProc()
    Local $OldClip = ClipGet()
    ClipPut("")
    Send("^{Insert}")
    Local $SelectedText = ClipGet()
    If $SelectedText = "" Then Return

    Local
$NewClip = ConvertText($SelectedText)

    ClipPut($NewClip)
    Sleep(10)
    Send("+{Insert}")

    Local $NewClipLenght = StringLen(StringStripCR($NewClip))
    Send("+{LEFT " & $NewClipLenght & "}")
    Send("{CTRLDOWN}")
    Send("{CTRLUP}")

    ClipPut($OldClip)
EndFunc

;If $Mode <> 1 and $Mode <> -1 Then Russian language used
;If $Mode = 1 Then English language used

Func ConvertText($Text, $Mode=-1)
    Local $StringIsUpper = 0, $TextRet = ""
    Local $SplitTextArr = StringSplit($Text, "")
    Local $LettersArr = GetLettersArr()

    Local $i_0 = 0, $i_1 = 1
    If $Mode = 1 Then Local $i_0 = 1, $i_1 = 0

    For $i = 1 To $SplitTextArr[0]
        If StringIsUpper($SplitTextArr[$i]) Then
            $StringIsUpper = 1
        Else
            $StringIsUpper = 0
        EndIf

        If
$Mode = -1 Then
            If
StringIsASCII($Text) Then
                $i_0 = 0
                $i_1 = 1
            Else
                $i_0 = 1
                $i_1 = 0
            EndIf
        EndIf

        For
$j = 1 To $LettersArr[0][0]
            If $SplitTextArr[$i] = $LettersArr[$j][$i_0] Then
                $SplitTextArr[$i] = $LettersArr[$j][$i_1]
                ExitLoop
            EndIf
        Next

        If
$StringIsUpper = 1 Then $SplitTextArr[$i] = StringUpper($SplitTextArr[$i])
        $TextRet &= $SplitTextArr[$i]
    Next
    Return
$TextRet
EndFunc

Func
GetLettersArr()
    Local $LettersArr = _Array2DCreate("`|q|w|e|r|t|y|u|i|o|p|[|]|a|s|d|f|g|h|j|k|l|;|'|z|x|c|v|b|n|m|,|.|/", _
        "ё|й|ц|у|к|е|н|г|ш|щ|з|х|ъ|ф|ы|в|а|п|р|о|л|д|ж|э|я|ч|с|м|и|т|ь|б|ю|.")
    Return $LettersArr
EndFunc

Func
_Array2DCreate($1DStr, $2DStr, $Delim="|")
    Local $2DArray[1][1], $iUbound
    Local $BiggestArray = StringSplit($1DStr, $Delim)
    Local $SmallestArray = StringSplit($2DStr, $Delim)

    If UBound($SmallestArray) > UBound($BiggestArray) Then
        Local
$TempArray = $BiggestArray
        $BiggestArray
= $SmallestArray
        $SmallestArray
= $TempArray
    EndIf

    ReDim
$SmallestArray[UBound($BiggestArray)]

    For $i = 1 To UBound($BiggestArray)-1
        $iUbound = UBound($2DArray)
        ReDim $2DArray[$iUbound+1][2]
        $2DArray[$iUbound][0] = $BiggestArray[$i]
        If $SmallestArray[$i] <> "" Then $2DArray[$iUbound][1] = $SmallestArray[$i]
    Next
    $2DArray[0][0] = $iUbound
    Return $2DArray
EndFunc

Func
Quit()
    Exit
EndFunc


Creat0R 01-10-2007 13:23 652382

По поводу этого скрипта есть вопрос:
Возможно ли получить текст в реальном времени, даже если он не выделен? т.е каким то образом распознать (возможно через API-методы) расположение курсора, и получить текст со сфокусированного элемента?

amel27,
По поводу раскраски... как видно с моего последнего примера, все первые строки кода после одной пустой строки (если она имеет символ Tab'а в начале), сдвигаются как бы в право, я не могу понять в чём дело, это глюк форума или скрипта? и как это можно поправить?

Maza Faka 01-10-2007 17:06 652503

Как сделать, что бы при выборе любого элемента "WS", pattern- элемент "Выбрать всё" окрашивался в серый цвет?
Код:

#include <GUIConstants.au3>

Global $one, $two, $three, $four, $five, $six, $seven, $eight, $nine, $ten

GUICreate("Test", 460, 300)
$tree = GUICtrlCreateTreeView(250, 70, 130, 200, BitOR($TVS_HASBUTTONS, $TVS_LINESATROOT, $TVS_CHECKBOXES, $TVS_HASLINES))
$all = GUICtrlCreateTreeViewItem("Выбрать все", $tree)

Global $TreeArray[11] = [10, $one, $two, $three, $four, $five, $six, $seven, $eight, $nine, $ten]
For $i = 1 To $TreeArray[0]
    $TreeArray[$i] = GUICtrlCreateTreeViewItem("WS " & $i, $all)
Next

GUISetState()

While 1
    $msg = GUIGetMsg()

        Select
    Case $msg = $GUI_EVENT_CLOSE
        ExitLoop

            Case $msg = $all
        If AllTreeCheck($all) Then
            For $a = 1 To $TreeArray[0]
                GUICtrlSetState($TreeArray[$a], $GUI_CHECKED)
            Next
        Else
            For $a = 1 To $TreeArray[0]
                GUICtrlSetState($TreeArray[$a], $GUI_UNCHECKED)
            Next
        EndIf

            EndSelect
WEnd

Func AllTreeCheck($all)
    Return BitAND(GUICtrlRead($all), $GUI_CHECKED)
EndFunc


Creat0R 01-10-2007 20:38 652593

Maza Faka,
Если я правильно понял, то вот:

Код:

#include <GUIConstants.au3>
Opt("GuiOnEventMode", 1)

GUICreate("Test", 460, 300)
GUISetOnEvent($GUI_EVENT_CLOSE, "MainEvents")

$tree = GUICtrlCreateTreeView(20, 20, 420, 260, BitOR($TVS_HASBUTTONS, $TVS_LINESATROOT, $TVS_CHECKBOXES, $TVS_HASLINES), $WS_EX_DLGMODALFRAME+$WS_EX_CLIENTEDGE )
$all = GUICtrlCreateTreeViewItem("Select all", $tree)
GUICtrlSetOnEvent(-1, "MainEvents")

Global $TreeArray[11]
For $i = 1 To UBound($TreeArray)-1
    $TreeArray[$i] = GUICtrlCreateTreeViewItem("WS " & $i, $all)
    GUICtrlSetOnEvent(-1, "MainEvents")
Next

GUISetState()

While 1
    Sleep(10)
WEnd

Func
MainEvents()
    Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$all
            Local $State = $GUI_UNCHECKED

            If AllTreeCheck($all) Then
                $State = $GUI_CHECKED
                GUICtrlSetColor($all, 0x0)
            Else
                GUICtrlSetColor($all, 0x696969)
            EndIf

            For $a = 1 To UBound($TreeArray)-1
                GUICtrlSetState($TreeArray[$a], $State)
            Next
        Case Else
            If AllUnChecked() Then
                GUICtrlSetColor($all, 0x696969)
                GUICtrlSetState($all, $GUI_CHECKED)
            Else
                GUICtrlSetColor($all, 0x0)
                GUICtrlSetState($all, $GUI_UNCHECKED)
            EndIf
    EndSwitch
EndFunc

Func AllUnChecked()
    For $i = 1 To UBound($TreeArray)-1
        If BitAND(GUICtrlRead($TreeArray[$i]), $GUI_CHECKED) Then Return True
    Next
    Return False
EndFunc

Func AllTreeCheck($all)
    Return BitAND(GUICtrlRead($all), $GUI_CHECKED)
EndFunc


amel27 02-10-2007 07:41 652730

Цитата:

Цитата Creat0R
Скрипт для конвертирования выделенного текста

gjktpysq crhbgnbr... ой, полезный скриптик Ж) ...кста неплохой повод поюзать Scripting.Dictionary ;)
Цитата:

Цитата Creat0R
Возможно ли получить текст в реальном времени, даже если он не выделен?

а смысл?... и что есть "элемент" - весь документ, предложение или слово?.. я собственно потому и не юзаю всякие проги из-за их попыток сконвертировать все подряд... Кстати, предложения по интерфейсу проги: неудобно, что выделение снимается сразу после замены, по идее четное кол-во нажатий должно приводить к исходному тексту... соответственно, если ничего не выделено то и замены не должно быть.
Цитата:

Цитата Creat0R
я не могу понять в чём дело, это глюк форума или скрипта? и как это можно поправить?

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

samsobi 02-10-2007 18:06 653105

2Гуру
Задал вопрос в теме по Прагме, но там пока молчок. Не пинайте ногами, здесь вроде точно по AutoIt'у.
Проблема в активации переводчика Прагма5. Вот выдержки:

1. Перед установкой копируем словари в папку с инсталлятором
2. Во время установки программы вводим артикул 107F-B473
3. По окончании установки щелкаем правой кнопкой мышки по значку в системной панели и выбираем пункт "О программе"
4. Удерживая нажатой клавишу F2, щелкаем по кнопке "Активация... Интернет при этом ДОЛЖЕН быть отключен."
5. Переносим из формы активации в генератор ключей Holder Name и Identification Code, и щелкаем по кнопке "Сгенерировать"
6. Переносим из генератора ключей в форму активации Program Licence и Activation Key, и щелкаем по кнопке "Activate"
Первые 2 пункта по установке никаких сложностей не вызвали - стандартные окна и соответственно скрипт AutoIt в режиме "кликанья". НО вот пункт 3 как AutoIt должен понять? Ведь после установки Прагмы иконка может появиться в любом месте систрея? AU3Info показывает ClassNameNN = ToolbarWindow321 и там находятся все иконки ( в том числе иконка Прагмы и сегодня она в одном месте, завтра уже в другом). Как мне найти ее истинные координаты и щелкнуть правой кнопкой мыши?

Creat0R 02-10-2007 18:55 653127

amel27,
Цитата:

неплохой повод поюзать Scripting.Dictionary
А подробнее можно плиз?

Цитата:

а смысл?... и что есть "элемент" - весь документ, предложение или слово?
Смысл в том, чтобы менять текст введённый в адресную строку браузера не в той раскладке (в моём случае это Opera, там адрес. строка это не стандартный элемент, Au3Info его не видит), и всего лишь. Поэтому нужно получить текст с начала строки. Это реально вообще, т.е просто отслеживать набранный текст и проверять его сиволы? (если не StringIsASCII() тогда конвертить).

Цитата:

неудобно, что выделение снимается сразу после замены, по идее четное кол-во нажатий должно приводить к исходному тексту... соответственно, если ничего не выделено то и замены не должно быть.
Эх, еслиб я знал как это можно сделать... вот это одна из причин ("смысл") по которой нужно получать текст в реальном времени, и соответственно, если этого добиться (как мне кажется), то можно будет и выделять куски текста по количеству исходных символов...

Цитата:

перед экспортом удалять прям по тексту все "зависшие" табуляторы и пробелы.
Что значит "зависшие"? т.е это те строки которые содержат только пробелы и табы, и ничего больше?
Понял, всё сработало, написал функцию для очистки лишних пробелов и табов, и теперь нормально вставляется (см. мой пост со скриптом конвертирования ;) ).

amel27,
Цитата:

выделение снимается сразу после замены, по идее четное кол-во нажатий должно приводить к исходному тексту... соответственно, если ничего не выделено то и замены не должно быть.
Придумал как это сделать! :yahoo:

Код:

Func ConvertProc()
    Local $OldClip = ClipGet()
    Send("^{Insert}")
    Local $SelectedText = ClipGet()
    If $SelectedText = $OldClip Then Return
    Local
$NewClip = ConvertText($SelectedText)

    ClipPut($NewClip)
    Sleep(100)
    Send("+{Insert}")
    Local $NewClipLenght = StringLen($NewClip)
    Send("{SHIFTDOWN}")
    Send("{LEFT " & $NewClipLenght & "}")
    Send("{SHIFTUP}")
    ClipPut($OldClip)
EndFunc

Правда с длинными кусками текста немного замедлено выделение, но это всё что я пока могу придумать :).
P.S
Обновил свой пост.

Creat0R 03-10-2007 04:25 653329

amel27,
Цитата:

Цитата Creat0R
Правда с длинными кусками текста немного замедлено выделение, но это всё что я пока могу придумать

Придумал более лучшее решение, но мне нужна помощь..
Оказывается, нажатие клавиш «Ctrl Shift + Стрелка влево», выделяет предыдущее слово, вот я и подумал, ведь можно подсчитать количество исходных слов в тексте, и соответственно нажимать столько раз «Ctrl Shift Left N» (где N это количество слов)..
Вот примерно так:

Код:

$aArray = StringRegExp($NewClip, "[\s\.:;,]*([a-zA-Z0-9-_]+)[\s\.:;,]*", 3)
Send("^+{LEFT " & UBound($aArray) & "}")

Но проблема в том, что это работает только с “чистым” текстом, и при чём латинскими буквами. Т.е если имеем такой текст:

Цитата:

Любой ,не обычный) текст ;)
То выделение происходит не корректно... есть идеи как можно это поправить?

Diamond 03-10-2007 08:04 653352

Creat0R,
Цитата:

Скрипт для конвертирования выделенного текста...
Интересный скрипт, правда я не совсем понял в чём конкретно его предназначение... :sorry:

Вот ещё, как вариант... Скрипт для Транслитерации текста (работает только в одну сторону):
Код:

#NoTrayIcon
$Dict = ObjCreate("Scripting.Dictionary")
$ru = StringSplit("А|Б|В|Г|Д|Е|Ё|Ж|З|И|Й|К|Л|М|Н|О|П|Р|С|Т|У|Ф|Х|Ц|Ч|Ш|Щ|Ъ|Ы|Ь|Э|Ю|Я","|")
$en = StringSplit("A|B|V|G|D|E|E|Zh|Z|I|Y|K|L|M|N|O|P|R|S|T|U|F|H|Ts|Ch|Sh|Sch|'|Y|'|E|Yu|Ya","|")
For $i=1 To $ru[0]
    $Dict.Add($ru[$i],$en[$i])
Next
HotKeySet("^ё", "Translit")
HotKeySet("^й", "Quit")
;~ --------------------------

While 1
    Sleep(1000)
WEnd

Func
Translit()
    Local $String, $Key, $CheckStr, $str, $OldSymbol, $NewSymbol
    $CheckStr
= ClipGet()
    Send("^{INS}")
    Sleep(10)
    $str = ClipGet()
    If $CheckStr = $str Then Return
    For
$i=1 To StringLen($str)
        $OldSymbol = StringMid($str,$i,1)
        $Key = StringUpper($OldSymbol)
        If $Dict.Exists($Key) Then
            If
StringIsLower($OldSymbol) Then
                $NewSymbol = StringLower($Dict.Item($Key))
            Else
                $NewSymbol = $Dict.Item($Key)
            EndIf
            $String &= $NewSymbol
        Else
            $String &= $OldSymbol
        EndIf
    Next

    ClipPut($String)
    Sleep(10)
    Send("+{INS}")
EndFunc

Func
Quit()
    Exit
EndFunc


Creat0R 03-10-2007 08:35 653365

Diamond,
Цитата:

правда я не совсем понял в чём конкретно его предназначение
Он для конвертирования текста набранного не в той раскладке...
К примеру я пишу:

Ndjq crhbgn nj;t bynthtcty? rcnfnb z lkz 'njuj bcgjkmpe.jdfk <erdf P. ;)

Ой, забыл переключить раскладку на русский...

Твой скрипт тоже интересен, кстати я для этого используюовал Буква Зю ;)

amel27 03-10-2007 10:16 653438

Цитата:

Цитата Creat0R
А подробнее можно плиз?

как раз тот случай, когда для нахождения нового символа вместо перебора всех элементов массива и попарного сравнения можно в качестве индекса просто указать старый символ и сразу получить результат. Хотя кода для инициализации массива Scripting.Dictionary потребуется больше, зато сама перекодировка символа будет проходить одной командой.
Цитата:

Цитата Creat0R
нужно получить текст с начала строки

если навскидку - выделение всей строки и возврат текста текущего контрола:
Код:

Send("{HOME}+{END}")
Код:

$sText = ControlGetText ("", "", ControlGetFocus (""))
Цитата:

Цитата Creat0R
с длинными кусками текста немного замедлено выделение, но это всё что я пока могу придумать

да уж, мне тоже ничего лучше в голову пока не приходит, надо подумать :(

Creat0R 03-10-2007 13:30 653586

amel27,
Цитата:

выделение всей строки и возврат текста текущего контрола:
Я этого не могу делать, ведь нужно не выделяя получать текст, дав возможность набирать текст в это время юзеру (мне) :)

Цитата:

$sText = ControlGetText ("", "", ControlGetFocus (""))
Это первое что я попробовал ;) Спасибо. Там не стандартные элементы, и стандартными средставми AutoIt получить текст (или делать другие опирации), не реально.

Цитата:

надо подумать
Мне кажется тут нужно как то по RegExp получить нужное число “прыжков” влево (в соответствии с “законами выделения” по Ctrl Shit Left). Я пробовал, но всё что у меня получилось это разделить исходный текст на запятые, пробелы, и подобные символы.. но нужен более продвинуты Pattern, где будут учитываться идущие подряд разделители, разновидность разделителей идущих подряд :wacko: , и т.п.

Diamond 04-10-2007 00:58 653934

Creat0R,
Цитата:

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

amel27 04-10-2007 12:33 654131

samsobi
Цитата:

Как мне найти ее истинные координаты и щелкнуть правой кнопкой мыши?
ТУТ Creat0R давал линк на библиотеку функций для работы с треем (о нем речь?). Среди них есть _SysTrayIconPos() и _SysTrayIconIndex(), с помощью которых можно найти индекс иконки и определить ее координаты на рабочем столе, останется только" сделать клик".


Creat0R,
Цитата:

Там не стандартные элементы, и стандартными средставми AutoIt получить текст (или делать другие опирации), не реально
чем же он нестандартен?.. как я это себе представляю: 1) нужно найти HWND активного контрола, 2) пытаться "поговорить" с ним при помощи SendMessage(). Вот тестовый вариант для определения длины текста текущего контрола, попробуй для своего:
Код:

HotKeySet("^`", "TEST")
While 1
    Sleep(500)
WEnd

Func
TEST()
    ConsoleWrite (_ControlGetTextLength()&@CRLF)
EndFunc

Func
_ControlGetTextLength()
    Local $u = DllStructCreate("int;int;hwnd;hwnd;hwnd;hwnd;hwnd;hwnd;long;long;long;long")
    DllStructSetData ($u, 1, DllStructGetSize($u))

    Local $TopWnd = DllCall('user32.dll', 'hwnd', 'GetForegroundWindow')
    Local $TID = DllCall('user32.dll', 'int', 'GetWindowThreadProcessId', 'hwnd', $TopWnd[0], 'ptr', 0)
    DllCall('user32.dll', 'int', 'GetGUIThreadInfo', 'int', $TID[0], 'ptr', DllStructGetPtr($u))
    Local $Res = DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', DllStructGetData($u,8), 'int', 0xE, 'int', 0, 'ptr', 0)
    Return $Res[0]
EndFunc

Цитата:

Цитата Creat0R
Мне кажется тут нужно как то по RegExp получить нужное число “прыжков

для этого мало знать выделенный фрагмент - нужен вест текст... к тому же нет гарантий, что разные окна будут обрабатывать клавиши одинаково... к примеру Ctrl+A в IE у меня не сработал

Цитата:

Цитата Creat0R
А подробнее можно плиз? »

Вот что получилось (на базе твоего, но без сохранения выделения):
Код:

Global $objASC = ObjCreate("Scripting.Dictionary")
Global $objANS = ObjCreate("Scripting.Dictionary")

InitMatrix ($objASC, $objANS)
HotKeySet("^`", "ConvertProc")
While 1
    Sleep(500)
WEnd

Func
ConvertProc()
    Send("^{Insert}")
    Local $strSelect = ClipGet()
    If $strSelect='' Then Return
    ClipPut(InvertText($strSelect, $objASC, $objANS))
    Sleep(100)
    Send("+{Insert}")
    ClipPut('')
EndFunc

Func
InvertText($sText, ByRef $objASC, ByRef $objANS)
    If StringIsASCII($sText) Then
        Return
ConvertText($sText, $objASC)
    Else
        Return
ConvertText($sText, $objANS)
    EndIf
EndFunc

Func
ConvertText($sText, ByRef $objMatrix)
    Local $i, $s, $n, $sRes=''
    For $i=1 To StringLen($sText)
        $s = StringMid($sText,$i,1)
        $n = $objMatrix.Item ($s)
        If $n Then
            $sRes &= $n
        Else
            $sRes &= $s
        EndIf
    Next
    Return
$sRes
EndFunc

Func
InitMatrix(ByRef $objASC, ByRef $objANS)
    Local $aASC = "`qwertyuiop[]asdfghjkl;'zxcvbnm,./" & '~@#$^&QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?'
    Local $aANS = "ёйцукенгшщзхъфывапролджэячсмитьбю." & 'Ё"№;:?ЙЦУКЕНГШЩЗХЪ/ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,', $i
    For $i=1 To StringLen($aASC)
        $objASC.Add (StringMid($aASC,$i,1),StringMid($aANS,$i,1))
        $objANS.Add (StringMid($aANS,$i,1),StringMid($aASC,$i,1))
    Next
EndFunc


Creat0R 04-10-2007 18:21 654297

amel27,
Цитата:

Вот тестовый вариант для определения длины текста текущего контрола, попробуй для своего:
Попробовал, всегда возвращает 0 :( (текст ест-но набран).

Цитата:

нужен вест текст
Ctrl Shift Home :)

Цитата:

нет гарантий, что разные окна будут обрабатывать клавиши одинаково
Ну хотябы для тех которые обрабатывают стандартные клавиши (виндовские).

Цитата:

Вот что получилось
Класно получилось, спасибо, попробую это использовать в моё скрипте...
Я кстати ещё хотел бы сделать небольшой GUI-интерфейс для этого скрипта, чтобы “на лету” можно было править соотношения символов (т.е сопостовлять к одной клавише другую, у меня иногда не очень удобно получается, нужно руками править некоторые символы). Это поможет использовать не только Rus <-> Eng ;)

amel27 05-10-2007 03:51 654524

Creat0R
Цитата:

Попробовал, всегда возвращает 0
HWND возвращается корректно, хотя стандартные сообщения действительно не воспринимает... причем все тулзы класса WinInfo вообще не распознают текст окна... на всякий случай может кому пригодится - функция для возврата HWND окна/контрола текущего ввода:
Код:

Func _ControlGetFocus()
    Local $res, $u = DllStructCreate("int;int;hwnd;hwnd;hwnd;hwnd;hwnd;hwnd;long;long;long;long")
    DllStructSetData ($u, 1, DllStructGetSize($u))

    $res = DllCall('user32.dll', 'hwnd', 'GetForegroundWindow')
    $res = DllCall('user32.dll', 'int', 'GetWindowThreadProcessId', 'hwnd', $res[0], 'ptr', 0)
    DllCall('user32.dll', 'int', 'GetGUIThreadInfo', 'int', $res[0], 'ptr', DllStructGetPtr($u))
    Return DllStructGetData($u, 4)
EndFunc

Цитата:

Ctrl Shift Home
нет, при этом потеряется текущая позиция курсора... для полного обсчета требуется: полный текст, выделенный текст, текущая позиция курсора - положение выделенного фрагмента по отношению ко всему тексту... т.е. одними клавишами тут ИМХО не обойтись - нужны альтернативные способы получения инфы... но тогда потеряется универсальность (твой пример с OperaWindowClass).

Creat0R 05-10-2007 04:56 654532

amel27,
Цитата:

стандартные сообщения действительно не воспринимает
Может есть другие методы получения текста? вот интересно, как Punto Switcher распознаёт текст в любом месте?

Цитата:

тогда потеряется универсальность
Ну хотябы для стандартнных полей, не страшно если в строке адреса выделяться не будет, в крайнем случае там можно будет использовать текущий метод (Send(+{Left " & StringLen($ClipText) & "}")).

Но вообще то, вот как я имел в виду:

Откроем Notepad, и впишем туда это:

Цитата:

this is a test() and ; only test ;
Теперь поставим курсор в конец этого текста, зажмём Ctrl + Shift, и поодиночно будем нажимать клавишу влево - нам понадобится нажать 10 раз клавишу влево чтобы весь наш (нужный) текст был выделен.

Вот я и подумал, если мы заранее знаем наш текст (который изначально был выделен и конвертирован - но нам нужен уже “новый”, конвертированный текст), то всё что нам нужно сделать, так это распознать сколько раз в этом тексте, встречаются символы по которым Ctrl Shift Left будет переходить - т.е как я это вижу, нужно по RegExp подобрать условия замены (на основе нашего текста), чтобы получить в результате нужное количество сдвигов влево (в нашем случае должно получится 10) по @Extended, ну или через размерность массива если использовать только StringRegExp().

Maza Faka 05-10-2007 09:19 654594

При копировании с использованием
Код:

ObjCreate("shell.application")
, возвращаемое значение отсутствует, соответственно возникает вопрос, как отследить скопировался ли файл или во время процесса копирования пользователь отменил копирование и исходя из результата выдать итоговое сообщение. Пока проверяю сравнивая размер исходного и конечного файла, но может есть более красивое и практичное решение?
Код:

$copy = CopyFile("d:\Video\Films", "C:\", "video.avi")
If @error Then
    MsgBox(16, "Error", "Copying is canceled")
Else
    MsgBox(0, "Done", "Copying successful")
EndIf

Func CopyFile($source, $dest, $file)
    $WinShell = ObjCreate("shell.application")
    $WinSHell.NameSpace($dest).CopyHere($source &"\"& $file)
    If FileGetSize($source &"\"& $file) = FileGetSize($dest & $file) Then
        Return 0
    Else
        Return SetError(1)
    EndIf
EndFunc


Diamond 05-10-2007 10:11 654635

Вопрос по GUIRegisterMsg($WM_NCPAINT), как я понял если $wParam возвращает 1, значит произошла перерисовка всего окна.
Во всех остальных случаях можно ли как-то узнать координаты перерисовки?

Creat0R 05-10-2007 10:59 654657

amel27
Цитата:

Цитата Creat0R
нужно по RegExp подобрать условия замены (на основе нашего текста), чтобы получить в результате нужное количество сдвигов влево »

Вот оно! :clever-ma Сделал (после 3-ёх часов экспериментирования :wacko: ):

Код:

Func GetLeftJumps($Text)
    StringRegExpReplace($Text, '\n', '')
    Local $Extended = @extended

    $Text = StringStripWS($Text, 3)

    $Text = StringRegExpReplace($Text, '\s+|\t+', ' ')
    $Text = StringRegExpReplace($Text, '~|`|!|#|%|\^|&|\*|\(|\)|-|\+|=|\{|\}|''|"|;|:|/|\\|<|>|\?|,|\[|\]|ч|Ч|ё|Ё', '|')
    $Text = StringRegExpReplace($Text, '\|+', '|')
    If StringIsASCII($Text) Then $Text = StringRegExpReplace($Text, '\.', '|')

    Local $WordsCountArr = StringRegExp($Text, "[\s\.:;,]*([а-яА-Яa-zA-Z0-9-_]+)[\s\.:;,]*", 3)
    StringRegExpReplace($Text, '\|', '')
    Return $Extended + @extended + UBound($WordsCountArr)
EndFunc

Возможно это сделать и более короче, но я умею только так, а глвавное - оно работает!
Есть конечно пару(?) недостатков - к примеру, если выделить текст посредине общего текста, то выделяться будут и все предыдущие символы, идущие подряд до первого символа в выделенном тексте.

Вот полное применение + использование твоего примера:

Код:

#NoTrayIcon

Global $objASC = ObjCreate('Scripting.Dictionary')
Global $objANS = ObjCreate('Scripting.Dictionary')
InitMatrix($objASC, $objANS)

HotKeySet('`', 'ConvertProc')
HotKeySet('^q', 'Quit')

While 1
    Sleep(100)
WEnd

Func
ConvertProc()
    Local $OldClip = ClipGet()
    ClipPut('')
    Send('^{Insert}')
    Local $SelectedText = ClipGet()
    If $SelectedText = '' Then Return
    Local
$InvertedText = InvertText($SelectedText, $objASC, $objANS)

    ClipPut($InvertedText)
    Sleep(100)
    Send('+{Insert}')

    Local $LeftJumps = GetLeftJumps($InvertedText)
    Send('^+{LEFT ' & $LeftJumps & '}')

    Send('{CTRLDOWN}')
    Send('{CTRLUP}')

    ClipPut($OldClip)
EndFunc

Func
InvertText($sText, ByRef $objASC, ByRef $objANS)
    If StringIsASCII($sText) Then
        Return
ConvertText($sText, $objASC)
    Else
        Return
ConvertText($sText, $objANS)
    EndIf
EndFunc

Func
GetLeftJumps($Text)
    StringRegExpReplace($Text, '\n', '')
    Local $Extended = @extended

    $Text = StringStripWS($Text, 3)

    $Text = StringRegExpReplace($Text, '\s+|\t+', ' ')
    $Text = StringRegExpReplace($Text, '~|`|!|#|%|\^|&|\*|\(|\)|-|\+|=|\{|\}|''|"|;|:|/|\\|<|>|\?|,|\[|\]|ч|Ч|ё|Ё', '|')
    $Text = StringRegExpReplace($Text, '\|+', '|')
    If StringIsASCII($Text) Then $Text = StringRegExpReplace($Text, '\.', '|')

    Local $WordsCountArr = StringRegExp($Text, "[\s\.:;,]*([а-яА-Яa-zA-Z0-9-_]+)[\s\.:;,]*", 3)
    StringRegExpReplace($Text, '\|', '')
    Return $Extended + @extended + UBound($WordsCountArr)
EndFunc

Func
ConvertText($sText, ByRef $objMatrix)
    Local $i, $s, $n, $sRes = ''
    For $i = 1 To StringLen($sText)
        $s = StringMid($sText, $i, 1)
        $n = $objMatrix.Item ($s)
        If $n Then
            $sRes &= $n
        Else
            $sRes &= $s
        EndIf
    Next
    Return
$sRes
EndFunc

Func
InitMatrix(ByRef $objASC, ByRef $objANS)
    Local $aASC = "`qwertyuiop[]asdfghjkl;'zxcvbnm,./" & '~@#$^&QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?'
    Local $aANS = "ёйцукенгшщзхъфывапролджэячсмитьбю." & 'Ё"№;:?ЙЦУКЕНГШЩЗХЪ/ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,', $i
    For $i = 1 To StringLen($aASC)
        $objASC.Add (StringMid($aASC, $i, 1), StringMid($aANS, $i, 1))
        $objANS.Add (StringMid($aANS, $i, 1), StringMid($aASC, $i, 1))
    Next
EndFunc

Func
Quit()
    Exit
EndFunc

Главную клавишу конвертирования пришлось изменить, Ctrl ` вызывало проблемы - пока оставил только `.

samsobi 05-10-2007 20:56 654933

Цитата:

Цитата amel27
ТУТ Creat0R давал линк на библиотеку функций для работы с треем (о нем речь?). »

Да, о нем родимом! Большое спасибо за наводку, буду копать и изучать!

Maza Faka 06-10-2007 09:43 655084

Очень часто спрашивают, как кликнуть по иконке программы в трее. С помощью библиотеки SysTray_UDF.au3, которую доработал amel27 сделать это очень просто: ;)
Код:

#include <SysTray_UDF.au3>

$pid = ProcessExists("edialer.exe")
$index = _SysTrayIconIndex($pid)
If @error Then MsgBox(16, "Error", "This process not have tray icon")
$pos = _SysTrayIconPos($index)
MouseClick("right", $pos[0], $pos[1])


Creat0R 06-10-2007 10:52 655102

Maza Faka,
Хотел сделать ещё и возможность кликания без задействования мышки, но что то не выходит...
Полагаю я неправильно использую функцию ScreenToClient в User32.dll. Может кто-то знает как правильнее? (это кстати моя одна из первых попыток работать с Dll ;)).

Код:

#NoTrayIcon
#include
<SysTray_UDF.au3>

$Pid = ProcessExists("Opera.exe")
If Not $Pid Then
    MsgBox(16, "Error", "This process not exists")
    Exit
EndIf


$Index = _SysTrayIconIndex($Pid)
If @error Then
    MsgBox(16, "Error", "This process not have tray icon")
    Exit
EndIf


$Pos = _SysTrayIconPos($Index)

$hWnd = WinGetHandle("[Class:Shell_TrayWnd]")
$YPos = ScreenToClient($hWnd, $Pos[0])
$XPos = ScreenToClient($hWnd, $Pos[1])

ControlClick("[Class:Shell_TrayWnd]", "", "ToolbarWindow321", "Right", 1, $XPos, $YPos)

Func ScreenToClient($hWnd, $Point)
    Local $Struct = DllStructCreate("int;int")
    DllStructSetData($Struct, 1, $Point)
    DllStructSetData($Struct, 2, $Point)
    Local $Ret = DllCall("User32.dll", "int", "ScreenToClient", "hwnd", $hWnd, "ptr", DllStructGetPtr($Struct))
    Return $Ret[0]
EndFunc


Maza Faka 06-10-2007 14:02 655206

Creat0R
Задумка неплохая, но тут я тебе не советчик, для меня все эти функции с DLL пока тёмный лес :-)

Creat0R 06-10-2007 18:43 655268

Как можно проверить системные элементы (типа «Мой компьютер», «Мои документы» и т.п) находящиеся на рабочем столе?
Т.е имеется список подобных элементов (имена), нужно каждый из них по этому списку проверить существует ли он на рабочем столе.. как это можно сделать?
В реестре конкретной инфы я так и не нашёл, к примеру у меня «Корзина» называется так: «Mycop» (это латинские буквы) :) - поиск по реестру почти ничего не дал, т.е нет зацепки чтобы проверить именно это имя, и что именно этот элемент находится на рабочем столе.

Creat0R 07-10-2007 04:06 655485

Обновил Au3ToPost 1.7

Список изменении:
Цитата:

v1.7
  • Ещё более надёжная интеграция в SciTE (теперь если файл настроек пуст или не найден, то используется шаблон стандартного файла, в который и пишутся необходимые пункты).
  • Изменён метод вставки символа Tab - оказывается можно использовать CTRL TAB :)
  • Исправлена ошибка некорректной вставки раскрашенного кода в форум.
  • В Главное Меню добавлен пункт "Добавлять тег [В] к коду".
  • Пункт "О Программе" перемещён в новое меню "Справка".
  • Добавлен пункт "Проверить обновления..." в меню "Справка".
  • Исправлена проблема при закрытии дочернего окна с результатом (возврат в главное окно) - управление в главное окно возвращалось не сразу после закрытия.
  • Теперь при установленной русской раскладки клавиатуры как раскладка по умолчанию, нажатие <Ctrl A> приведёт к выделению всего текста в Edit поле.
  • Теперь рядом с исходником должна быть папка с ресурсами программы (Resources) - Содержит в себе все необходимые ресурсы для работы скрипта.
  • Мелкие поправки в коде.


Maza Faka 07-10-2007 08:51 655505

Цитата:

Цитата Creat0R
поиск по реестру почти ничего не дал »

Можно проверять по CLSID в ключе реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace
Например CLSID корзины выглядит так: {645FF040-5081-101B-9F08-00AA002F954E}

Maza Faka 07-10-2007 13:56 655592

Как отследить нажал ли пользователь определённую кнопку в приложении и в соотвествии с этим выполнить некое действие, что-то вроде этого:
Код:

Dim $command

While Not $command
    $command = ControlCommand("Aut2Exe v3 - AutoIt Script to EXE Converter", "", "Button2", "IsChecked")
    Sleep(30)
WEnd
MsgBox(0, "", "Checked")


Creat0R 07-10-2007 18:01 655722

Maza Faka,
Цитата:

Можно проверять по CLSID в ключе реестра
Там нет настоящих имён элементов :(

Цитата:

Как отследить нажал ли пользователь определённую кнопку в приложении
Твой пример не работает?
Ну можно ещё проверять нажатия кнопки мышки (используя _IsPressed()) по определённым коортдинатам.

amel27 08-10-2007 07:19 656037

Creat0R
Цитата:

Цитата Creat0R
Вот оно! »

во замутил! :) ...у меня вроде получилось без RegExp:
Код:

Func ConvertProc()
    Send("^{Insert}")
    Local $strSelect = ClipGet()
    If $strSelect='' Then Return
    ClipPut(InvertText($strSelect, $objASC, $objANS))
    Sleep(100)
    Send("+{Insert}")
    RestoreSelection(StringLen($strSelect))
    ClipPut('')
EndFunc

Func
RestoreSelection($iLen)
    Local $iOldLen=0, $iNewLen=0, $iFixLen=0
    Send("^+{RIGHT}^{Insert}")
    Local $sOld = ClipGet()
    Send("^+{LEFT}^{Insert}")
    Local $sNew = ClipGet()
    If $sOld<>$sNew Then
        $iFixLen = StringLen($sOld)
        $iNewLen = StringLen($sNew)
    EndIf
    While
$iNewLen<$iLen
        Send("^+{LEFT}^{Insert}")
        $iOldLen = $iNewLen
        $iNewLen
= StringLen(ClipGet())
    Wend
    If
$iNewLen=$iLen Then Return
    If
($iNewLen-$iLen)<(1+$iFixLen+$iLen-$iOldLen) Then
        Send('+{RIGHT ' & ($iNewLen-$iLen) & '}')
    Else
        Send('^+{RIGHT}+{LEFT ' & ($iLen+$iFixLen-$iOldLen) & '}')
    EndIf
EndFunc

Цитата:

Цитата Creat0R
Как можно проверить системные элементы (типа «Мой компьютер», «Мои документы» и т.п) находящиеся на рабочем столе? »

Ранее уже постил свой вариант через API, потом аналогичная тема появилась на оффсайте, там вроде обошлись только штатными функциями:Restore Icon Positions, on the Desktop and in Windows

ADD:через реестр: http://wiki.oszone.net/index.php/%D0...D0%B0/HKCU.REG

З.Ы. А зачем Send('{CTRLDOWN}') Send('{CTRLUP}'), от залипаний Ctrl?

Maza Faka 08-10-2007 08:26 656046

Creat0R
Цитата:

Твой пример не работает?
Работает, но только для RadioButton, а мне надо для Button.

Creat0R 08-10-2007 09:29 656086

amel27,
Цитата:

во замутил!
:biggrin:

Цитата:

у меня вроде получилось без RegExp:
Класс.. правда пока не понял как оно работает.. кстати, тут тоже проблема с буквами е/ё.. если выделить две буквы одна из которых буква е, то выделение неверно делается.
Но в сравнении моя функция всё же быстрее :tongue: - но полагаю твой пример будет надёжнее (если поправить недочёты с е/ё и т.п).

Цитата:

Ранее уже постил свой вариант через API
Спасибо, но это не совсем то, мне нужно не позиции, а проверить существование элементов - Я заранее не знаю как именуется Мой компьютер (к примеру), на разных машинах по разному, мне нужно получить универсальное название, и сравнить со списком (который я получаю с рабочего стола, но другим методом, используются функции от A3LLibrary).
Т.е по сути нужно проверить типа..
Код:

If FileExists(@DesktopDir & "\Мой компьютер") Then...
Естественно так не работает...

Цитата:

А зачем Send('{CTRLDOWN}') Send('{CTRLUP}'), от залипаний Ctrl?
да, от залипании, не знаю почему, но иногда залипает :) (сейчас наверно можно убрать, т.к Ctrl не используется при вызове конвертировании).

Maza Faka 08-10-2007 10:00 656097

Почему функция AdlibEnable начинает работать только после того, как файл скопировался?
Код:

#include <Misc.au3>
Opt("MouseCoordMode", 2)

AdlibEnable("Check", 100)

Dim $title = "Копирование..."
Dim $dll = DllOpen("user32.dll")

$sCopy = CopyFile("d:\Video\Films\video.avi", "c:\")

Func CopyFile($source, $dest)
    $WinShell = ObjCreate("shell.application")
    If Not @error Then
        $WinShell.NameSpace($dest).CopyHere($source)
        AdlibDisable()
    Else
        MsgBox(16, "Error", "Obj not create")
    EndIf
EndFunc

Func Check()
    MsgBox(0, "", "test") ;Это для проверки вызова функции
    If WinActive($title) Then
        If _IsPressed(01, $dll) Then
            $mousePos = MouseGetPos()
            If $mousePos[0] > 303 And $mousePos[0] < 362 And $mousePos[1] > 102 And $mousePos[1] < 124 Then MsgBox(0, "", "Button pressed")
            EndIf
        EndIf
    EndFunc


amel27 08-10-2007 11:55 656189

Цитата:

Цитата Creat0R
не понял как оно работает

если грубо... выделяем с CTRL пока размер выделенного фрагмента не превысит исходный (из буфера), потом возвращаемся обратно но уже без CTRL

Цитата:

Цитата Creat0R
тут тоже проблема

исправил, алгоритм не зависит от текста

Цитата:

Цитата Creat0R
не знаю как именуется Мой компьютер

там же добавил линк на параметры реестра

Creat0R 08-10-2007 13:23 656260

amel27,
Цитата:

выделяем с CTRL пока размер выделенного фрагмента не превысит исходный (из буфера), потом возвращаемся обратно но уже без CTRL
Вот если бы можно было быстрее это делать... при длинном выделении очень медленно получается.

Мне удалось в моей функции преодалеть проблемы когда выделялся весь текст если исходное выделение было посредине слова.. плюс я вспомнил, ведь есть ещё Opt("SendKeyDelay", 0) и Opt("SendKeyDownDelay", 0) - увеличивает скорость в несколько раз ;) (на коротком выделении почти мгновенно)...

Вот финальная версия (с использованием обычного массива, без Dictionary, мне если честно немного не привычно ориентироваться в нём):

Код:

#NoTrayIcon
Opt("SendKeyDelay", 0)
Opt("SendKeyDownDelay", 0)
HotKeySet("`", "ConvertProc")
HotKeySet("^q", "Quit")

While 1
    Sleep(100)
WEnd

Func
ConvertProc()
    Local $OldClip = ClipGet()
    ClipPut("")
    Send("^{Insert}")
    Local $SelectedText = ClipGet()
    If $SelectedText = "" Then
        HotKeySet("`")
        Send("`")
        HotKeySet("`", "ConvertProc")
        Return
    EndIf

    Local
$NewClip = ConvertText($SelectedText)

    ClipPut($NewClip)
    Send("+{Insert}")
    RestoreSelection($NewClip)
    ClipPut($OldClip)
EndFunc

;If $Mode = 0 Then Russian language used
;If $Mode = 1 Then English language used
;If $Mode = -1 Then String Inverted

Func ConvertText($Text, $Mode=-1)
    Local $StringIsUpper = 0, $TextRet = ""
    Local $SplitTextArr = StringSplit($Text, "")
    Local $LettersArr = GetLettersArr()

    For $i = 1 To $SplitTextArr[0]
        Local $i_0 = 1, $i_1 = 0
        $StringIsUpper = 0
        If StringIsUpper($SplitTextArr[$i]) Then $StringIsUpper = 1

        If $Mode = 0 Or ($Mode = -1 And StringIsASCII($Text)) Then Local $i_0 = 0, $i_1 = 1

        For $j = 1 To $LettersArr[0][0]
            If $SplitTextArr[$i] = $LettersArr[$j][$i_0] Then
                $SplitTextArr[$i] = $LettersArr[$j][$i_1]
                ExitLoop
            EndIf
        Next

        If
$StringIsUpper = 1 Then $SplitTextArr[$i] = StringUpper($SplitTextArr[$i])
        $TextRet &= $SplitTextArr[$i]
    Next
    Return
$TextRet
EndFunc

Func
GetLettersArr()
    Local $AnsiStr = "ёйцукенгшщзхъфывапролджэячсмитьбю.?"
    Local $AsciiStr = "`qwertyuiop[]asdfghjkl;'zxcvbnm,./&"
    Local $StrLenght = StringLen($AnsiStr)

    Local $LettersArr[$StrLenght+1][2]
    $LettersArr[0][0] = $StrLenght

    For $i = 1 To $StrLenght
        $LettersArr
[$i][0] = StringMid($AsciiStr, $i, 1)
        $LettersArr[$i][1] = StringMid($AnsiStr, $i, 1)
    Next

    Return
$LettersArr
EndFunc

Func
RestoreSelection($rText)
    Local $LeftJumps = GetLeftJumps($rText)
    Send("^+{LEFT " & $LeftJumps & "}")
    Send("^{Insert}")
    Local $NewSelText = ClipGet()
    If StringLen($NewSelText) > StringLen($rText) Then Send("+{RIGHT " & StringLen($NewSelText) - StringLen($rText) & "}")
EndFunc

Func
GetLeftJumps($Text)
    StringRegExpReplace($Text, '\n', '')
    Local $Extended = @extended

    $Text = StringStripWS($Text, 3)
    $Text = StringRegExpReplace($Text, '\s+|\t+', ' ')
    $Text = StringRegExpReplace($Text, '~|`|!|#|%|\^|&|\*|\(|\)|-|\+|=|\{|\}|''|"|;|:|/|\\|<|>|\?|,|\[|\]|ч|Ч|ё|Ё', '|')
    $Text = StringRegExpReplace($Text, '\|+', '|')

    Local $WordsCountArr = StringRegExp($Text, "[\s\.:;,]*([а-яА-Яa-zA-Z0-9-_]+)[\s\.:;,]*", 3)
    StringRegExpReplace($Text, '\|', '')
    $Extended += @extended + UBound($WordsCountArr)
    Return $Extended
EndFunc

Func
Quit()
    Exit
EndFunc


Цитата:

там же добавил линк на параметры реестра
Спасибо, полезный линк :) - правда нужной инфы я там не нашёл, а я прочитал каждую строчку на той страничке :(

Creat0R 08-10-2007 14:30 656318

Maza Faka,
Цитата:

Почему функция AdlibEnable начинает работать только после того, как файл скопировался?
Она не успевает срабатывать, и функция AdlibDisable() её отключает, попробуй уменьшить время запуска Adlib...
Просто ставим MsgBox под AdlibDisable и мы в этом убеждаемся ;)

Я так понял нужно определить было ли отменено копирование? попробуй использовать Callback функции из примера что я приводил ранее, там скрипт не останавливается на момент копирования.

Вот кстати полезная ссылка по обьекту shell.application - http://msdn2.microsoft.com/en-us/library/aa969392.aspx (в вот конкретно по CopyHere).

amel27 08-10-2007 15:03 656341

Цитата:

Цитата Creat0R
нужной инфы я там не нашёл »

Цитата:

Добавляет Мой Компьютер,Мои Документы,Мое Сетевое окружение,Internet Explorer на Рабочий Стол
Цитата:

Цитата Creat0R
как Punto Switcher распознаёт текст в любом месте? »

:dont-know как тебе точка зрения Absurd: http://forum.developing.ru/archive/i...hp/t-1365.html :gigi:
у меня получилось только открывать/читать URL непосредственно с вкладок:
Код:

Global Const $DMLERR_NO_ERROR = 0x0
Global Const $DMLERR_ADVACKTIMEOUT = 0x4000
Global Const $DMLERR_BUSY = 0x4001
Global Const $DMLERR_DATAACKTIMEOUT = 0x4002
Global Const $DMLERR_DLL_NOT_INITIALIZED = 0x4003
Global Const $DMLERR_DLL_USAGE = 0x4004
Global Const $DMLERR_EXECACKTIMEOUT = 0x4005
Global Const $DMLERR_INVALIDPARAMETER = 0x4006
Global Const $DMLERR_LOW_MEMORY = 0x4007
Global Const $DMLERR_MEMORY_ERROR = 0x4008
Global Const $DMLERR_NOTPROCESSED = 0x4009
Global Const $DMLERR_NO_CONV_ESTABLISHED = 0x400A
Global Const $DMLERR_POKEACKTIMEOUT = 0x400B
Global Const $DMLERR_POSTMSG_FAILED = 0x400C
Global Const $DMLERR_REENTRANCY = 0x400D
Global Const $DMLERR_SERVER_DIED = 0x400E
Global Const $DMLERR_SYS_ERROR = 0x400F
Global Const $DMLERR_UNADVACKTIMEOUT = 0x4010
Global Const $DMLERR_UNFOUND_QUEUE_ID = 0x4011

; Возвращает/открывает URL страницы на заданной вкладке Оперы.
; $sURL - адрес открываемой страницы,
;  если задана пустая строка возвращает адрес заданного окна.
; $hWin - номер вкладки обозревателя,
;    0 новая вкладка (при открытии),
;  -1 текущая вкладка.
; $iWait - таймаут ожидания в миллисекундах, при превышении будет выдана ошибка.

Func OperaOpenURL($sURL = "", $hWin = -1, $iWait = 10000)
    Local $ret, $err, $uIdInst = DllStructCreate("int")
    Local $hServer[1], $hTopic[1], $hItem[1], $hConv[1], $hData[1], $sData[1]
    Local $sTopic = "WWW_OpenURL", $sItem = $sURL&',,0x'&Hex($hWin)
    If $sURL='' Then
        $sTopic = "WWW_GetWindowInfo"
        $sItem = "0x"&Hex($hWin)
    EndIf
    Local
$hDll = DllOpen("user32.dll")
    If $hDll=-1 Then Return SetError(1, 0, "") ; Ошибка открытия DLL
    $ret = DllCall("user32.dll", "int", "DdeInitialize", "ptr", DllStructGetPtr($uIdInst), "ptr", 0, "int", 0, "int", 0)
    If $ret[0] Then Return SetError(2, $ret[0], "") ; Ошибка инициализации DDE
    $hServer = DllCall($hDll, "int", "DdeCreateStringHandle", "int", DllStructGetData($uIdInst,1), "str", "opera", "int", 1004)
    If $hServer[0] Then
        $hTopic = DllCall($hDll, "int", "DdeCreateStringHandle", "int", DllStructGetData($uIdInst,1), "str", $sTopic, "int", 1004)
        If $hTopic[0] Then
            $hItem = DllCall($hDll, "int", "DdeCreateStringHandle", "int", DllStructGetData($uIdInst,1), "str", $sItem, "int", 1004)
            If $hItem[0] Then
                $hConv = DllCall($hDll, "int", "DdeConnect", "int", DllStructGetData($uIdInst,1), "int", $hServer[0], "int", $hTopic[0], "int", 0)
                If $hConv[0] Then
                    $hData = DllCall($hDll, "int", "DdeClientTransaction", "ptr", 0, "int", 0, "int", $hConv[0], "int", $hItem[0], "int", 1, "int", 0x20B0, "int", $iWait, "ptr", 0)
                    If $hData[0] Then
                        $sData = DllCall($hDll, "str", "DdeAccessData", "int", $hData[0], "ptr", 0)
                    EndIf
                EndIf
            EndIf
        EndIf
    EndIf
    $err = DllCall($hDll, "int", "DdeGetLastError", "int", DllStructGetData($uIdInst,1))
    If $hData[0] Then DllCall($hDll, "int", "DdeFreeDataHandle", "int", $hData[0])
    If $hConv[0] Then DllCall($hDll, "int", "DdeFreeDataHandle", "int", $hConv[0])
    If $hItem[0] Then DllCall($hDll, "int", "DdeFreeDataHandle", "int", $hItem[0])
    If $hTopic[0] Then DllCall($hDll, "int", "DdeFreeDataHandle", "int", $hTopic[0])
    If $hServer[0] Then DllCall($hDll, "int", "DdeFreeDataHandle", "int", $hServer[0])
    If $err[0] Then Return SetError(3, $err[0], "") ; Другие ошибки DDE
    DllCall($hDll, "int", "DdeUninitialize", "int", DllStructGetData($uIdInst,1))
    DllClose($hDll)
    If $sURL='' Then $sURL = StringRegExpReplace($sData[0],'^"([^"]*?)".*','\1')
    Return $sURL
EndFunc


Maza Faka 09-10-2007 10:36 656844

Creat0R
Цитата:

Я так понял нужно определить было ли отменено копирование?
Сделал так:
Основной скрипт:
Код:

$sCopy = CopyFile("d:\Video\Films\video.avi", "c:\")

Func CopyFile($source, $dest)
    $WinShell = ObjCreate("shell.application")
    If Not @error Then
        Run("c:\Program Files\AutoIt3\AutoIt3.exe " & @ScriptDir & "\check.au3")
        $WinShell.NameSpace($dest).CopyHere($source)
    Else
        MsgBox(16, "Error", "Obj not create")
    EndIf
EndFunc

А это дополнительный, который вызывается перед копированием:
Код:

#include <Misc.au3>
Opt("MouseCoordMode", 2)

Dim $title = "Копирование..."
Dim $dll = DllOpen("user32.dll")

WinWait($title)

While WinExists($title)
    If WinActive($title) Then
        If _IsPressed(01, $dll) Then
            $mousePos = MouseGetPos()
            If $mousePos[0] > 303 And $mousePos[0] < 362 And $mousePos[1] > 102 And $mousePos[1] < 124 Then
                WinClose($title)
                MsgBox(16, "Error", "Copying aborted")
                Exit
            EndIf
        EndIf
    EndIf
    Sleep(10)
WEnd
MsgBox(64, "Success", "File copying successfuly")

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

Creat0R 09-10-2007 10:59 656861

amel27,
Цитата:

Добавляет Мой Компьютер,Мои Документы...
Это я видел, но это не помагает решить полностью проблему :( - У меня список содержит имена, как я проверю что именно эти имена (элементы) на рабочем столе?

Цитата:

как тебе точка зрения Absurd
Абсурдная :biggrin:

Цитата:

у меня получилось только открывать/читать URL непосредственно с вкладок:
Прямой доступ к DDE!!! я это давно искал, биг Thanks!!!

Maza Faka,
Такое лучше сделать через Callback... щас попробую нарисовать пример...

Цитата:

попробую нарисовать
Вот:

Код:

#include <GUIConstants.au3>
#include <Misc.au3>
#include "DllCallBack.au3"
Opt("GuiOnEventMode", 1)

Global $pTimerProc, $uiTimer

$sCopy
= CopyFile("d:\Video\Films\video.avi", "c:\")

MsgBox(64, "Success", "File copying successfuly")

Quit()

Func CopyFile($source, $dest)
    $WinShell = ObjCreate("shell.application")
    If Not @error Then
        InitializeCallBack(100)
        $WinShell.NameSpace($dest).CopyHere($source)
    Else
        MsgBox(16, "Error", "Obj not create")
    EndIf
EndFunc

Func
InitializeCallBack($CallEvery, $FuncName="MyCallBackFunc")
    $pTimerProc = _DllCallBack($FuncName, "hwnd;uint;uint;dword")
    $uiTimer = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", $CallEvery, "ptr", $pTimerProc)
    $uiTimer = $uiTimer[0]
EndFunc

Func
MyCallBackFunc($hWnd, $uiMsg, $idEvent, $dwTime)
    Opt("MouseCoordMode", 2)

    Local $Title = "Копирование..."
    If WinExists($Title) And WinActive($Title) Then
        If
_IsPressed(01) Then
            $mousePos = MouseGetPos()
            If $mousePos[0] > 303 And $mousePos[0] < 362 And $mousePos[1] > 102 And $mousePos[1] < 124 Then
                WinClose($Title)
                MsgBox(16, "Error", "Copying aborted")
                Quit()
            EndIf
        EndIf
    EndIf
EndFunc

Func
Quit($Exit=1)
    _DllCallBack_Free($pTimerProc)
    DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $uiTimer)
    If $Exit Then Exit
EndFunc

Саму библиотеку DllCallBack.au3 скачать можно тут.

amel27 09-10-2007 12:19 656903

Creat0R
Цитата:

У меня список содержит имена, как я проверю что именно эти имена (элементы) на рабочем столе? »
смотри HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID, параметр "по умолчанию"... если пусто, значит берется дефолтовый из HKLM\SOFTWARE\Classes\CLSID

Creat0R 09-10-2007 12:33 656908

amel27,
Цитата:

если пусто, значит берется дефолтовый из HKLM\SOFTWARE\Classes\CLSID
У меня там кроме Мой компьютер везде пусто...

А по второму адресу - к примеру тут HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{645FF040-5081-101B-9F08-00AA002F954E} должно быть имя корзины, там так и написано Корзина (в “по умолчанию”), но у меня корзина именуется как Mycop ;) - Вот тут то и проблема, список содержит именно Mycop (это латинские буквы кстати), в реестре я не нашёл это значение :(

amel27 09-10-2007 13:06 656920

Creat0R
ну не знаю :dont-know ... у меня после переименования новое имя сразу появилось в HKCU, правда чтобы я смог переименовать корзину с рабочего стола мне пришлось применить соответствующий твик

Creat0R 09-10-2007 13:21 656927

amel27,
А «Мои документы» тоже нормально отображаются в реестре?
У меня их вообще нигде нету, даже не в оригинальном названии :dont-know .

Maza Faka 09-10-2007 14:57 656998

Creat0R
Большое спасибо за пример, а если бы ты ещё нашёл время, что бы разжевать мне эту функцию:
Код:

Func InitializeCallBack($CallEvery, $FuncName="MyCallBackFunc")
    $pTimerProc = _DllCallBack($FuncName, "hwnd;uint;uint;dword")
    $uiTimer = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", $CallEvery, "ptr", $pTimerProc)
    $uiTimer = $uiTimer[0]
EndFunc

то было бы вообще здорово! А то ведь простое использование знаний не даст.

Creat0R 09-10-2007 17:13 657108

Maza Faka,
Цитата:

разжевать мне эту функцию:
Там всё просто...
вызывается функция _DllCallBack, которая как бы регистрирует для процесса (скрипта) указанную функцию (через параметр $FuncName), и возвращает на неё указатель..
Далее просто по этому указателю вызывается таймер (строка с вызовом Dll) с заданым временем промежутка между повторами вызова (a.k.a AdibEnable ;)) - Всё, наша функция вызывается каждый заданный промежуток времени, пока не высвободить таймер (см. в функции Quit()).




Пример-Скрипт для предотвращения ввода не цифр в Input-поле:

Код:

#include <GuiConstants.au3>

Global Const $WM_COMMAND = 0x0111
Global $GUIOldPos[2]

$GUI = GUICreate("<Only Numbers> in Input Demo GUI", 300, 100)

$Input = GUICtrlCreateInput("", 20, 40, 260, 20)
$Exit = GUICtrlCreateButton("Exit", 20, 70, 60, 20)

GUISetState()
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE, $Exit
            ExitLoop
        Case Else

            CheckToolTip()
    EndSwitch
WEnd

Func
CheckToolTip()
    Local $GetCurInfo = GUIGetCursorInfo($GUI)
    Local $GuiGetPos = WinGetPos($GUI)
    If $GetCurInfo[2] = 1 Or $GUIOldPos[0] <> $GuiGetPos[0] Or $GUIOldPos[1] <> $GuiGetPos[1] Then
        ToolTip("")
        $GUIOldPos = $GuiGetPos
    EndIf
EndFunc

Func
_Input_Changed()
    ToolTip("")
    Local $ReadInput = GUICtrlRead($Input)
    If StringRegExp($ReadInput, '[^0-9]') Then
        GUICtrlSetData($Input, StringRegExpReplace($ReadInput, '[^0-9]', ''))

        Local $GuiGetPos = WinGetPos($GUI)
        Local $XPos = $GuiGetPos[0] + 280
        Local $YPos = $GuiGetPos[1] + 80

        ToolTip("Here only numbers are allowed", $XPos, $YPos, "Not allowed symbol", 3, 1)
        DllCall("user32.dll", "int", "MessageBeep", "int", 0x0)
    EndIf
EndFunc
  ;==>_Input_Changed

Func MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam)
    Local $nNotifyCode = BitShift($wParam, 16)
    Local $nID = BitAND($wParam, 0xFFFF)
    Local Const $EN_CHANGE = 0x300
    Local Const $EN_SETFOCUS = 0x100

    Switch $nID
        Case $Input
            Switch $nNotifyCode
                Case $EN_CHANGE
                    _Input_Changed()
                Case $EN_SETFOCUS
                    ToolTip("")
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc  ;==>MY_WM_COMMAND

Многие используют стиль $ES_NUMBER, но он не перестраховывает от вставки текста по Ctrl V или с контексного меню.

DenchikK 09-10-2007 21:59 657265

Подскажите пожалуйста, что то я так и не нашёл - как можно настроить скрипт на выход из цикла по нажатию на определённую клавишу?

Вот как то так пытался, не выходит:

Код:

WinActivate ("µTorrent","")

Sleep (500)

Global $i

$i = 0

While $i <= 10 or Send ('{F2}')
Sleep (1000)
Send ("{APPSKEY}")
Sleep (1000)
Send ("{UP}{UP}")
Sleep (1000)
Send ("{Enter}")
$i=$i+1
Sleep (1000)

WEnd


amel27 10-10-2007 06:05 657416

Creat0R,
Цитата:

Цитата Creat0R
А «Мои документы» тоже нормально отображаются в реестре? »

измененное имя в HKCU аналогично другим, дефолтового действительно нет но его можно взять из параметра Personal ключа "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"

Lodoss 10-10-2007 07:44 657433

Привет всем.

По работе понадобилось конвертировать большое количество файлов из одного формата в другой.
Пакетного конвертера который бы выполнил мою задачу я ненашёл, поэтому пришлось изголяться непосредственно с приложением в котором есть такая возможность используя обычные команды меню и горячие клавиши (открывая последовательно сначала один файл: выполняя ряд действий, "импорт",..."экспорт" ;затем открывая второй файл и т. д....)


Проблему решил написав следующий скрипт

Код:

; выбор одного или нескольких файлов
$files = FileOpenDialog("Пакетное конвертирование файлов", "c:\", "любые файлы (*.*)", 1 + 4 ) & "|"
; если ничего не выбрано то выходим
If @error Then
        TrayTip("пакетная обработка файлов", 'Выход', 5, 3)
        MsgBox(16,"Информация","Ничего не выбрано", 7)
        Exit
EndIf
$dir_in = StringMid($files,1, StringInStr($files, "\",0,-1))
$Chetchik=1
While $Chetchik<3
  $sch=StringInStr( $files,"|",0,$Chetchik)
  if $sch<>0 Then
                  $Chetchik=$Chetchik+1
  Else
        ExitLoop
  endif 
WEnd
; рисуем цикл для двух типов выделений
if $Chetchik>2  Then
  ; группа файлов
  $i=1
  While StringLen($files)>$i
  $dir_in = StringReplace(StringReplace(StringMid($files,1, StringInStr($files, "|",0,1)), "|", "\"), "\\", "\")
  $name=StringMid(StringMid($files,StringInStr ( $files,$dir_in)+2 ),StringInStr(StringMid($files,StringInStr ( $files,$dir_in)+2 ),"|",0,$i)+1,StringInStr( StringMid($files,StringInStr ( $files,$dir_in)+2 ),"|",0,$i+1) - StringInStr( StringMid($files,StringInStr ( $files,$dir_in)+2 ),"|",0,$i)-1)
if StringLen($name)>0 Then
            $i=$i+1
                prt_to_dwg($name)
        Else
                ExitLoop
        endif         
  WEnd
Else ; один файл
  $name=StringTrimRight(StringMid($files,StringInStr($files,$dir_in)+StringLen($dir_in)),1)
  prt_to_dwg($name)
EndIf
; конец выполнения программы
TrayTip("пакетная обработка файлов", 'Конец', 5, 1)
 MsgBox(64, "Информация", "Все опрации завершены" )
 
; функция обработки файла 
Func prt_to_dwg($value)
    $value = $value
        TrayTip("пакетная обработка", 'обработка файла "' & $value & '"', 10, 1)
; для примера откроем блокнот
Run("notepad")
WinWait("Безымянный")
WinActivate("Безымянный")
Send("^o")
WinWait("Открыть")
WinActivate("Открыть")
Sleep(100)
ControlSetText("Открыть", "", "Edit1", $dir_in & $value)
Sleep(5000)
WinClose("Открыть")
WinClose("Безымянный")
WinWaitClose("Безымянный")
EndFunc

Сейчас осенила мысль - неплохо бы написать к этому скрипту GUI
с прогресс баром, возможностью выбора входящих и исходящих папок до и после обработки + возможность
использовать включающий и исключающий фильтр в названиях обрабатываемых файлов.

Посему вопрос: не делал ли кто нибудь нечто похожее? Неохота изобретать велосипед :)

Maza Faka 10-10-2007 07:49 657434

DenchikK
Попробуй так:
Код:

Dim $i = 0

HotKeySet("{F2}", "Quit")

WinWait("µTorrent")
WinActivate ("µTorrent")

Sleep (500)

While $i <= 10
    Sleep (1000)
    Send ("{APPSKEY}")
    Sleep (1000)
    Send ("{UP}{UP}")
    Sleep (1000)
    Send ("{Enter}")
    $i += 1
    Sleep (1000)
WEnd

Func Quit()
    Exit
EndFunc


Maza Faka 10-10-2007 12:02 657606

Вложений: 1
Lodoss
Вот пример как это можно сделать, если нужен законченный скрипт, тогда выкладывай подробности ;)

Creat0R 10-10-2007 14:43 657700

DenchikK,
Цитата:

как можно настроить скрипт на выход из цикла по нажатию на определённую клавишу?
Если только из цикла, то цикл нужно запускать с дополнительным условием...

Код:

HotKeySet("{F2}", "StopLoop")

WinActivate ("µTorrent","")
WinWaitActive("µTorrent", "", 5)

Global $i = 0, $IsLoop = True

While
$i <= 10 And $IsLoop
    Sleep (1000)
    Send ("{APPSKEY}")
    Sleep (1000)
    Send ("{UP}{UP}")
    Sleep (1000)
    Send ("{Enter}")
    $i += 1
    Sleep (1000)
WEnd

Func
StopLoop()
    $IsLoop = False
EndFunc


amel27
Цитата:

его можно взять из параметра Personal ключа "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
Спасибо, вот так по кускам может и соберу нужные элементы :) - но всё же мне кажется это не очень надёжно...

Lodoss,
Цитата:

понадобилось конвертировать большое количество файлов из одного формата в другой
А с какого в какой?
Возможно есть более удобное решение чем использование сторонних программ (тем более Notepad), я на оф. форуме видел пару решении по конвертированию файлов, вопрос в том, с какого и в какой формат.

Кстати, я как то давно написал функцию для парсирования возвращённой строки от FileOpenDialog()/FileSaveDialog()...

Код:

#include <Array.au3>

$Selected = FileOpenDialog("Title", "C:\", "All (*.*)", 4)

$SelectedArr = _ParseSelected($Selected)

_ArrayDisplay($SelectedArr)

Func _ParseSelected($String)
    Local $RetArr[1], $Ubound
    If StringInStr($String, "|") Then
        Local
$SplitArr = StringSplit($String, "|")
        Local $InitPath = StringRegExpReplace($SplitArr[1], '([^\\])\\*$', '\1')
        For $i = 2 To UBound($SplitArr)-1
            $Ubound = UBound($RetArr)
            ReDim $RetArr[$Ubound + 1]
            $RetArr[$Ubound] = $InitPath & "\" & $SplitArr[$i]
        Next
        $RetArr[0] = $Ubound
    Else
        Local
$RetArr[2] = [1, $String]
    EndIf
    Return
$RetArr
EndFunc


TERMINAL 10-10-2007 18:30 657843

Можно ли с помощью скрипта открыть каретку CD-ROMa или DVD-ROMa?

Creat0R 11-10-2007 00:37 658048

TERMINAL,
Цитата:

Можно ли с помощью скрипта открыть каретку CD-ROMa или DVD-ROMa?
CDTray() ?

Вот пример (by amel27):

Код:

; Читаем параметр командной строки и если обнаружен вызываем функцию,
; переменная окружения ERRORLEVEL устанавливается равной количеству ошибок
; (привод может быть заблокирован Nero или другой программой)


$LastParm = $CmdLine[$CmdLine[0]]
If $LastParm Then
    _CDEject ($LastParm)
    Exit (@error)
EndIf

; Функция выброса трея CD/DVD привода
; в качестве параметра принимается буква диска или порядковый номер (по алфавиту),
; для обработки всех найденных приводов достаточно передать -1,
; по умолчанию применяется к первому найденному приводу.
;
; Возвращает количество успешно обработанных приводов,
; значение @error устанавливается равным количеству неудач,
; суммарное значение равно количеству обнаруженных приводов.


Func _CDEject ($drive = 1)
    Local $i = 1, $err = 0, $aDrives = DriveGetDrive ("CDROM")
    If IsArray ($aDrives) Then
        For
$i = 1 To $aDrives [0]
            If ($drive = -1) OR ($drive = $i) OR ($drive & ':' = $aDrives [$i]) Then
                If
CDTray ($aDrives [$i], "open") =0 Then $err = $err +1
            EndIf
        Next
    EndIf

    SetError ($err)
    Return $i - $err -1
EndFunc


amel27 11-10-2007 07:24 658169

Creat0R
Цитата:

но всё же мне кажется это не очень надёжно »
в плане определения наличия/отсутствия иконок и пользовательских имен ИМХО вполне надежно, а вот насчет системных предустановленных имен (aka "Мой компьютер") тут действительно проблемы, т.к. они берутся не из реестра а из бинарников (DLL)... ты уже поднимал подобный вопрос насчет титлов окон FileOpen/FileSave, пока никаких идей... :(

Creat0R 11-10-2007 07:33 658171

Интересно, возможно ли получить процент закачиваемых байтов (общий процент скаченного), не имея заранее полного размера закачиваемого файла?

Просто InetGetSize() иногда возвращает 0, хотя с той же ссылкой InetGet() справляется (скачивает её).
А также хотелось узнать, как правильно получать примерно-оставшиеся время до окончания закачки?
Я ранее поднимал вопрос о закачке файлов, но всё как то не определено, не надёжно :( - иногда у меня счётчик скачит то на 5 минут, то на 10, а иногда вовсе 00:00:00 показывает (когда закачка только началась).

Lodoss 11-10-2007 11:22 658308

Цитата:

Creat0R: Возможно есть более удобное решение чем использование сторонних программ
Блокнот я привёл в качестве примера, моя задачка никак не связана с текстовыми редакторами :)


Конвертировать нужно файлы "*.prt" в "*.dwg".

И первый и второй - особенные графические форматы.
Файлы с расширением "prt" - это объёмные модели (программа Unigraphix NX), что то наподобие "3Dmaх" но ориентирована на конструкторские решения. Вот из этой программы и нужно формировать файлы "dwg" (экспортировать) для дальнейшего помещения на сервер...

Пакетного конвертера из prt в dwg я ненашёл. Поэтому выходом счёл автоматизировать работу с самой программой Unigraphix NX через её меню и горячие клавиши выполняя сначала загрузку файла prt, его обработку и дальнейший экспорт в dwg ....


Цитата:

Maza Faka: если нужен законченный скрипт, тогда выкладывай подробности
Maza Faka new1 то что нужно ! Лист бокс понравилось, потому как в оболочку хочу воткнуть и другие функции с аналогичными обработками.

вот сырой GUI который хотелось бы видеть в конечном варианте.


Код:

#include <GUIConstants.au3>
AutoItSetOption ( "TrayIconDebug", 1 )
DllCall("uxtheme.dll", "none", "SetThemeAppProperties", "int", 0) ; turn off XP themes

$AForm1_1 = GUICreate("prt >>> dwg", 485, 294, -1, -1)
GUISetBkColor(0xA6CAF0)

        $1 = "D:\work" ; входящая папка
    $2 = "D:\work\plotter\dwg" ; папка конечных файлов
       
$AInput1 = GUICtrlCreateInput($1, 16, 24, 121, 21)
if DirCreate($1)= False Then
        GUICtrlSetData($AInput1, "Заполните поле !")
        GUICtrlSetColor($AInput1, 0xff0000)
Else
        GUICtrlSetColor($AInput1, 0x0000FF)
        EndIf
$AInput2 = GUICtrlCreateInput($2, 16, 224, 121, 21)
if DirCreate($2)= False Then
        GUICtrlSetData($AInput2, "Заполните поле !")
        GUICtrlSetColor($AInput2, 0xff0000)
Else
        GUICtrlSetColor($AInput2, 0x0000FF)
        EndIf
$AButton1 = GUICtrlCreateButton("Выбор", 144, 26, 40, 17, 0)
$AButton2 = GUICtrlCreateButton("Выбор", 144, 226, 40, 17, 0)
$ALabel1 = GUICtrlCreateLabel("Входящая папка", 8, 7, 88, 17)
$ALabel2 = GUICtrlCreateLabel("Папка выхода", 8, 207, 76, 17)
$AProgress1 = GUICtrlCreateProgress(112, 256, 137, 9)
GUICtrlSetColor(-1, 0x007DFA)
$AProgress2 = GUICtrlCreateProgress(88, 272, 161, 9)
$Group1 = GUICtrlCreateGroup("Выбрать", 16, 48, 169, 65)
$Radio1 = GUICtrlCreateRadio("Папку", 24, 64, 57, 17)
$Radio2 = GUICtrlCreateRadio("Группу файлов", 80, 64, 97, 17)
$Checkbox1 = GUICtrlCreateCheckbox("Учитывать подкаталоги", 24, 88, 153, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2 = GUICtrlCreateGroup("Фильтр файлов", 16, 120, 169, 81)
$Input1 = GUICtrlCreateInput("_drw", 82, 144, 97, 21)
$Input2 = GUICtrlCreateInput("*", 82, 168, 97, 21)
$Label1 = GUICtrlCreateLabel("Включить", 22, 144, 53, 17)
$Label2 = GUICtrlCreateLabel("Исключить", 22, 168, 60, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("Удалить", 408, 26, 65, 17, 0)
$Button2 = GUICtrlCreateButton("Очистить", 336, 26, 65, 17, 0)
$Button3 = GUICtrlCreateButton("Сохранить", 192, 26, 65, 17, 0)
$Label3 = GUICtrlCreateLabel("текущий прогресс", 8, 252, 95, 16)
$Label4 = GUICtrlCreateLabel("общий", 8, 268, 37, 17)
$Button4 = GUICtrlCreateButton("Загрузить", 264, 26, 65, 17, 0)
$Group3 = GUICtrlCreateGroup("Время", 328, 248, 57, 33)
$Label6 = GUICtrlCreateLabel("00:12:47", 336, 261, 46, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group4 = GUICtrlCreateGroup("Осталось", 256, 248, 65, 33)
$Label5 = GUICtrlCreateLabel("3 файла", 264, 262, 52, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group5 = GUICtrlCreateGroup("Список обрабатываемых файлов", 192, 48, 281, 193)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Ed = GUICtrlCreateEdit("", 200, 65, 265, 165)
GUICtrlSetData(-1, "Здесь должен формироваться список с" &@CRLF & "чекбоксами входящих файлов, то что будет" &@CRLF &  "отмечено - обрабатываем")
$AButton5 = GUICtrlCreateIcon("C:\WINDOWS\system32\shell32.dll", -138, 392, 248, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP))
GUICtrlSetTip(-1, "Старт")
$AButton6 = GUICtrlCreateIcon("C:\WINDOWS\system32\shell32.dll", -28, 432, 248, 32, 32, BitOR($SS_NOTIFY,$WS_GROUP))
GUICtrlSetTip(-1, "Стоп или Выход")
GUISetState(@SW_SHOW)

While 1
$msg = GuiGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
        ExitLoop
        Case $Msg = $AButton6 ; выход
                  MsgBox(64, "", "Справка")
          ExitLoop
                              Case $Msg = $AButton1 ; выход
          if $radio1 And BitAND(GUICtrlRead($radio1), $GUI_CHECKED) = $GUI_CHECKED = true Then
              ; кнопка выбора папок
                GuiCtrlSetData($AInput1, "")
          $data_in = FileSelectFolder("Заполните поле ! с файлами Prt", "d:\")
          if $data_in = True Then 
                  GuiCtrlSetData($AInput1, $data_in)
                  GUICtrlSetColor($AInput1, 0x0000FF)
Else
        GuiCtrlSetData($AInput1, "Заполните поле !")
GUICtrlSetColor($AInput1, 0xff0000)
          EndIf       
Else
    ; кнопка выбора файлов
GUICtrlSetState($radio2, $GUI_CHECKED)
          GuiCtrlSetData($AInput1, "")
          $files = FileOpenDialog("Пакетное конвертирование файлов Prt в Dwg [beta версия]", "d:\work\", "файлы NX1, NX2, NX3, NX4 (*.prt)", 1 + 4 )
          if $files = True Then 
                  GuiCtrlSetData($AInput1, $files)
                  GUICtrlSetColor($AInput1, 0x0000FF)
                  Else
        GuiCtrlSetData($AInput1, "Заполните поле !")
GUICtrlSetColor($AInput1, 0xff0000)
EndIf
  EndIf       
 ; изменить путь для выходящих файлов prt
  Case $Msg = $AButton2
        $data_out = FileSelectFolder("Заполните поле ! конечных файлов Dwg", "")
      if Not DirCreate ($data_out & "dir546") Then
                  MsgBox(16, "Ошибка", "Нельзя создать файлы в директории "& $data_out,10)
        GuiCtrlSetData($AInput2, "Заполните поле !")
GUICtrlSetColor($AInput2, 0xff0000)
        Else
      GuiCtrlSetData($AInput2, $data_out)
          GUICtrlSetColor($AInput2, 0x0000FF)
          DirRemove($data_out & "dir546", 1)
          EndIf       
  Case $Msg = $AButton5 ; старт
          WinMove("prt >>>", "", 800, 600)
TrayTip("Программа prt to dwg", "проверка путей для входящих и исходящих папок", 5, 1)
if GUICtrlRead($AInput1, 0xff0000) <> True Then
        MsgBox(16, "", "Неправильные пути в папках")
                GuiCtrlSetData($AInput1, "Заполните поле !")
GUICtrlSetColor($AInput1, 0xff0000)
Else
MsgBox(64, "", "Начало обработки программы .....",5)
EndIf
EndSelect
WEnd

PS
Цитата:

Кстати, я как то давно написал функцию для парсирования возвращённой строки
я незнаю что такое парсирование :) функцию то узнал только 4 дня назад как работает. Автоит раньше использовал как автожамкание кнопок при установки программ. Сейчас решил копнуть глубже, читаю справку .... :)

Creat0R 11-10-2007 12:23 658340

Lodoss,
Цитата:

Конвертировать нужно файлы "*.prt" в "*.dwg".
Тогда да, если нет программ способных конвертировать подобные форматы через командную строку, то нужно использовать саму программу в графическом виде...

Цитата:

что такое парсирование
Это обработка не совсем “понятной” (стандартной) строки возвращённой от FileSaveDialog/FileOpenDialog :) (в данном случае, а в общем случае Синтаксический анализ (Парсер)).
Т.е возвращается к примеру такая строка:

C:\My_Files|File1.txt|File2.txt|File3.txt

Вот через ту функцию, подобная строка парсируется в массив, где каждый элемент содержит полный путь к каждому файлу (даже если выбран один файл) - таким образом очень просто обрабатывать массив и делать то что нам нужно с путями к файлам).

mikola1983 11-10-2007 12:42 658357

есть ли возможность с помощью автоита сделать небольшую прогу для переименования удаленных ПК. конкретно интересует кусок кода либо команда переименования. подскажите пожалуйста.

VelDmi 11-10-2007 13:20 658382

Цитата:

Цитата mikola1983
есть ли возможность с помощью автоита сделать небольшую прогу »

Эта прога будет запущена на удаленном ПК?

amel27 12-10-2007 06:26 658840

mikola1983
Цитата:

конкретно интересует кусок кода либо команда переименования
уже обсуждалось: [решено] Переименование рабочих станций в домене

ALL
Думаю не все знают, что у ключей реестра (не путать с параметрами) как и у файлов есть своя метка времени последней модификации, стандартные утилиты ее не показывают но иногда возникает необходимость узнать когда создали/изменили тот или иной ключ... для этого случая сваял UDF, дата возвращается в формате: YYYY/MM/DD HH:MM:SS:
Код:

Global Const $HKCR = 0x80000000
Global Const $HKCU = 0x80000001
Global Const $HKLM = 0x80000002
Global Const $HKU  = 0x80000003
Global Const $HKCC = 0x80000005

Func RegGetTimeStamp($iRegHive, $sRegKey)
    Local $sRes='', $aRet, $hReg = DllStructCreate("int")
    Local $FILETIME = DllStructCreate("dword;dword")
    Local $SYSTEMTIME1 = DllStructCreate("ushort;ushort;ushort;ushort;ushort;ushort;ushort;ushort")
    Local $SYSTEMTIME2 = DllStructCreate("ushort;ushort;ushort;ushort;ushort;ushort;ushort;ushort")
    Local $hAdvAPI=DllOpen('advapi32.dll'), $hKernel=DllOpen('kernel32.dll')
    If $hAdvAPI=-1 Or $hKernel=-1 Then Return SetError(1, $aRet[0], 'DLL Open Error!')
    $aRet = DllCall("advapi32.dll", "int", "RegOpenKeyEx", _
        "int", $iRegHive, "str", $sRegKey, _
        "int", 0, "int", 0x20019, _
        "ptr", DllStructGetPtr($hReg))
    If $aRet[0] Then Return SetError(2, $aRet[0], 'Registry Key Open Error!')
    $aRet = DllCall("advapi32.dll", "int", "RegQueryInfoKey", _
        "int", DllStructGetData($hReg,1), _
        "ptr", 0, "ptr", 0, "ptr", 0, "ptr", 0, "ptr", 0, "ptr", 0, "ptr", 0, "ptr", 0, "ptr", 0, "ptr", 0, _
        "ptr", DllStructGetPtr($FILETIME))
    If $aRet[0] Then Return SetError(3, $aRet[0], 'Registry Key Query Error!')
    $aRet = DllCall("advapi32.dll", "int", "RegCloseKey", _
        "int", DllStructGetData($hReg,1))
    If $aRet[0] Then Return SetError(4, $aRet[0], 'Registry Key Close Error!')
    $aRet = DllCall("kernel32.dll", "int", "FileTimeToSystemTime", _
        "ptr", DllStructGetPtr($FILETIME), _
        "ptr", DllStructGetPtr($SYSTEMTIME1))
    If $aRet[0]=0 Then Return SetError(5, 0, 'Time Convert Error!')
    $aRet = DllCall("kernel32.dll", "int", "SystemTimeToTzSpecificLocalTime", _
        "ptr", 0, _
        "ptr", DllStructGetPtr($SYSTEMTIME1), _
        "ptr", DllStructGetPtr($SYSTEMTIME2))
    If $aRet[0]=0 Then Return SetError(5, 0, 'Time Convert Error!')
    $sRes &= StringFormat("%.2d",DllStructGetData($SYSTEMTIME2,1)) &'/'
    $sRes &= StringFormat("%.2d",DllStructGetData($SYSTEMTIME2,2)) &'/'
    $sRes &= StringFormat("%.2d",DllStructGetData($SYSTEMTIME2,4)) &' '
    $sRes &= StringFormat("%.2d",DllStructGetData($SYSTEMTIME2,5)) &':'
    $sRes &= StringFormat("%.2d",DllStructGetData($SYSTEMTIME2,6)) &':'
    $sRes &= StringFormat("%.2d",DllStructGetData($SYSTEMTIME2,7))
    Return $sRes
EndFunc


mikola1983 12-10-2007 09:39 658902

VelDmi, нет прога будет работать и на компах которые нужно переименовать

VelDmi 12-10-2007 10:15 658920

mikola1983,
Код:

$ComputerName = IniRead(@ScriptDir & "\Config.ini", "Setup", "ComputerName", 0)

If @ComputerName <> $ComputerName Then
        FileWriteLine(@ScriptDir & '\rename.vbs', 'strComputer = "' & @ComputerName & '"')
        FileWriteLine(@ScriptDir & '\rename.vbs', 'Set objWMIService = GetObject("winmgmts:" _')
        FileWriteLine(@ScriptDir & '\rename.vbs', '    & "{impersonationLevel=impersonate}!\\" _')
        FileWriteLine(@ScriptDir & '\rename.vbs', '    & strComputer & "\root\cimv2")')
        FileWriteLine(@ScriptDir & '\rename.vbs', 'Set colComputers = objWMIService.ExecQuery _')
        FileWriteLine(@ScriptDir & '\rename.vbs', '    ("Select * from Win32_ComputerSystem")')
        FileWriteLine(@ScriptDir & '\rename.vbs', 'For Each objComputer in colComputers')
        FileWriteLine(@ScriptDir & '\rename.vbs', '    errReturn = ObjComputer.Rename("' & $ComputerName & '")')
        FileWriteLine(@ScriptDir & '\rename.vbs', 'Next')

        RunWait (@SystemDir & '\WScript.exe ' & @ScriptDir & '\rename.vbs')
        FileDelete (@ScriptDir & '\rename.vbs')
        FileWriteLine(@ScriptDir & "\error.log", StringFormat("%s:%s:%s %s-%s-%s  Сменили имя компьютера с %s на %s", @HOUR, @MIN, @SEC, @MDAY, @MON, @YEAR, @ComputerName, $ComputerName))
        Shutdown (6)
EndIf

Соответственно в Config.ini меняешь имя компьютера и запускаешь скрипт.

TERMINAL 12-10-2007 11:05 658963

Creat0R, Это я уже встречал, но оно у меня не работает даже с 1 сидюком. При условии если 2 сидюка (нужно что бы выезжал нужный, а не все) то можно сделать поиск по файлу-например в корне диска лежит файл SysDisc7.exe. Сможешь помочь? Очень нужно....

Creat0R 12-10-2007 14:39 659151

VelDmi,
Это можно кстати средствами одного лишь AutoIt сделать:

Код:

$ComputerName = IniRead(@ScriptDir & "\Config.ini", "Setup", "ComputerName", 0)

If @ComputerName <> $ComputerName Then
    $strComputer = @ComputerName
    $objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
    $colComputers = $objWMIService.ExecQuery("Select * from Win32_ComputerSystem")
    For $objComputer In $colComputers
        $errReturn
= $ObjComputer.Rename($ComputerName)
    Next
    FileWriteLine(@ScriptDir & "\error.log", StringFormat("%s:%s:%s %s-%s-%s  Сменили имя компьютера с %s на %s", _
        @HOUR, @MIN, @SEC, @MDAY, @MON, @YEAR, @ComputerName, $ComputerName))
    Shutdown(6)
EndIf


TERMINAL,

Цитата:

можно сделать поиск по файлу
Примерно так:

Код:

$File_Indicator = "SysDisc7.exe"
$CDROM_Drives = DriveGetDrive("CDROM")

For $i = 1 To $CDROM_Drives[0]
    If FileExists($CDROM_Drives[$i] & "\" & $File_Indicator) Then
        CDTray($CDROM_Drives[$i], "Open")
        ExitLoop
    EndIf
Next


TERMINAL 13-10-2007 12:00 659618

Creat0R, спасибо, супер !

Creat0R 14-10-2007 03:06 659954

Как можно сделать чтобы во время растягивания/перетаскивания окна, его содержимое не отображалось? (в настройках системы установлено “Отображать содержимое окна при перетаскивании”).

Я видел многие программы такое умеют, мне нужно такое же сделать для моего GUI...
Я имею в виду что то типа этого, но чтобы отображалась граница растягиваемого окна (только граница, без содержимого окна):

Код:

#include <GUIConstants.au3>

Global Const $WM_ENTERSIZEMOVE = 0x231
Global Const $WM_EXITSIZEMOVE = 0x232

$Gui = GUICreate("GUI", 200, 400, -1, -1, $WS_SIZEBOX)

GUIRegisterMsg($WM_ENTERSIZEMOVE, "WM_ENTERSIZEMOVE")
GUIRegisterMsg($WM_EXITSIZEMOVE, "WM_EXITSIZEMOVE")

$Button = GUICtrlCreateButton("Содержимое окна ;)", 50, 100)

GUISetState()

While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd

Func
WM_ENTERSIZEMOVE()
    GUISetState(@SW_LOCK)
EndFunc

Func
WM_EXITSIZEMOVE()
    GUISetState(@SW_UNLOCK)
EndFunc

Это возможно?
Я тут нашёл вроде решение, но не знаю как его приминить :( - Пробовал посылать сообщение WM_SETREDRAW с параметром False, но окно “зависает” при попытке изменить размер/перетащить окно.

Creat0R 14-10-2007 07:25 659971

amel27
Ты недавно приводил функцию _ControlGetFocus(), а можно точно такую, но чтобы не сфокусированный элемент возвращала, а тот над которым проводим мышкой? :shuffle: (типа _ControlGetHovered()).

Oldschool 14-10-2007 13:02 660094

работа с Auto3Lib _ListView_

Код:

$hListVie = ControlGetHandle("WindowTitle", "", "SysListView323")
_ListView_Scroll($hListVie, 0, 0)
$Item = 11
_ListView_ClickItem($hListVie, $Item, "Left", False, 1, 0)

как считать эту линию?

$ItemText = _ListView_GetItemText($Item, "") ?

или если надо проверить текст линии

$sText = mytext
If _ListView_FindInText($Item, $sText) = 0 Then
Blah blah blah...

это правильный syntax? _ListView_FindInText() возвращает что то?

Maza Faka 14-10-2007 16:36 660284

Oldschool
Цитата:

как считать эту линию?
В смысле считать? Вернуть текст из элемента ListView? Попробуй так:
Код:

#include <GUIConstants.au3>
#include <GUIListView.au3>

GUICreate("Drop_Gui", 420, 310, -1, -1, $WS_OVERLAPPEDWINDOW, $WS_EX_ACCEPTFILES)

$input = GUICtrlCreateInput("", 50, 10, 200, 20, BitOR($ES_CENTER, $ES_AUTOHSCROLL), $WS_EX_CLIENTEDGE)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)

$ListView = GUICtrlCreateListView("Selected files", 50, 50, 320, 200, $LVS_SORTASCENDING, $LVS_EX_FULLROWSELECT + $LVS_EX_GRIDLINES)
_GUICtrlListViewSetColumnWidth($ListView, 0, 320)

$add = GUICtrlCreateButton("Add", 260, 10, 50, 22)
$read = GUICtrlCreateButton("Read", 320, 10, 50, 22)

GUISetState()

While 1
    $msg = GUIGetMsg()

        Select
    Case $msg = $GUI_EVENT_CLOSE
        ExitLoop

            Case $msg = $read
        $LV_Item_text = _GUICtrlListViewGetItemText($ListView, _GUICtrlListViewGetCurSel($ListView))
        MsgBox(0, "Item text", $LV_Item_text)

        Case $msg = $add
        $inputRead = GUICtrlRead($input)
        If Not $inputRead = "" Then GUICtrlCreateListViewItem($inputRead, $ListView)

            EndSelect
WEnd

Всё это есть в справке ;)

Oldschool 14-10-2007 17:20 660311

при чем ту GUI я не понял , ты вообще о чем?

я пытаюсь считать текст с ListView32 в чужой проге...здесь я беру окно:

Код:

$hListVie = ControlGetHandle("WindowTitle", "", "SysListView323")
здесь я ставлю мышку на одинадцатаю линию этого ListView:

Код:

$Item = 11
_ListView_ClickItem($hListVie, $Item, "Left", False, 1, 0)

теперь я хочу прочитать эту линию с помощью

_ListView_GetItemText()

например вот так:

Код:

$Title = _ListView_GetItemText($hListVie, $Item, $Item)
а потом сравнить ее с другим текстом вот так например

Код:

If StringInStr($Title, $sText) Then
и т.д и т.п

мой вопрос конкретно про _ListView_GetItemText т.к в данном виде неполучается чего то

amel27 15-10-2007 04:46 660625

Creat0R
Цитата:

чтобы отображалась граница растягиваемого окна (только граница, без содержимого окна) »
ИМХО от WM_SETREDRAW толку мало - оно не отличается от @SW_LOCK, тебе же нужна рамка... Может для установки размера использовать специальное полупрозрачное окно?
Цитата:

чтобы не сфокусированный элемент возвращала, а тот над которым проводим мышкой? (типа _ControlGetHovered()) »
попробуй так:
Код:

Func _ControlGetHovered()
    Local $ret = DllCall("user32.dll", "int", "WindowFromPoint", _
        "long", MouseGetPos(0), _
        "long", MouseGetPos(1) )
    Return $ret[0]
EndFunc


Maza Faka 15-10-2007 11:16 660750

Oldschool
Цитата:

я хочу прочитать эту линию
Ну так и считывай её: ;)
Код:

$text = ControlListView("Drop_Gui", "", "SysListView321", "GetText", 10) ;число 10 означает индекс элемента, счёт идёт с нуля
MsgBox(0, "GetList", $text)


Creat0R 15-10-2007 21:26 661191

amel27,
Цитата:

ИМХО от WM_SETREDRAW толку мало - оно не отличается от @SW_LOCK
То же самое мне на оф. форуме сказали :)
Цитата:

Может для установки размера использовать специальное полупрозрачное окно?
На своё же удивление, я написал функцию для отката состояния “Отображать содержимое окна при перетаскивании”, это всего лишь для демонстрации того, что именно мне требуется сделать (видимо мой Английский ещё сыроват, ну или до кое кого медленно доходит ;) )...

И вот на основе этого примера (полагаю), мне подкинули идею (а точнее готовый пример с решением), ведь на момент растягивания/смещения окна, можно отключать режим “Отображать содержимое окна при перетаскивании”, а потом восстанавливать старое состояние (как я только сам до этого не додумался)...

Код:

#include <GUIConstants.au3>

Global Const $WM_EXITSIZEMOVE = 0x232
Global Const $WM_SYSCOMMAND = 0x0112
Global Const $SC_MOVE = 0xF010
Global Const $SC_SIZE = 0xF000

Global $Old_Param

$Gui
= GUICreate("GUI", 200, 400, -1, -1, $WS_SIZEBOX)
GUIRegisterMsg($WM_EXITSIZEMOVE, "WM_EXITSIZEMOVE")
GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")

$Button = GUICtrlCreateButton("Button", 50, 100, 100, 21)

GUISetState(@SW_SHOW)

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
    EndSwitch
WEnd

Func
WM_SYSCOMMAND($hWnd, $Msg, $wParam, $lParam)
    Switch BitAND($wParam, 0xFFF0)
        Case $SC_MOVE, $SC_SIZE
            ;Local Const $SPI_SETDRAGFULLWINDOWS = 37
            ;Local Const $SPI_GETDRAGFULLWINDOWS = 38
            ;Local Const $SPIF_SENDWININICHANGE = 2

            Local $tBool = DllStructCreate("int")
            DllCall("user32.dll", "int", "SystemParametersInfo", "int", 38, "int", 0, "ptr", DllStructGetPtr($tBool), "int", 0)
            $Old_Param = DllStructGetData($tBool, 1)
            DllCall("user32.dll", "int", "SystemParametersInfo", "int", 37, "int", 0, "ptr", 0, "int", 2)
    EndSwitch
EndFunc

Func
WM_EXITSIZEMOVE()
    DllCall("user32.dll", "int", "SystemParametersInfo", "int", 37, "int", $Old_Param, "ptr", 0, "int", 2)
EndFunc

Цитата:

попробуй так:
То что нужно! Спасибо!
Я так понял тут возвращается идентификатор контроля? мне просто нужно сравнивать с элементами моего ГУИ, а там как известно обычная нумерация элементов, я конечно использовал GuiCtrlGetHandle, а на возвращённое значение от функции _ControlGetHovered() использовал Hwnd, но вот хотелось бы узнать, возможно ли конвертировать этот самый идентификатор в то же число, как и возвращает элемент GUI? (чтобы можно было просто использовать стандартные функци для чтения данных от GUI, типа GuiCtrlRead()).

-AAA- 15-10-2007 23:15 661267

Всем привет. У меня такая задача. Нужно в одной папке просмотреть все вложенные подпапки (количество подкаталогов, количество уровней вложенности и иена подкаталогов заранее неизвестны). Как с помощью AutoIT получить список подкаталогов данного каталога?

Creat0R 16-10-2007 00:01 661285

-AAA-,
Цитата:

Как с помощью AutoIT получить список подкаталогов данного каталога?
Ранее приводилась функция (_DirListToArray() - в самом конце).

amel27 16-10-2007 03:39 661341

Creat0R
Цитата:

возможно ли конвертировать этот самый идентификатор в то же число, как и возвращает элемент GUI? »
Код:

Func _ControlIDGetHovered()
    Local $ret = DllCall("user32.dll", "int", "WindowFromPoint", _
        "long", MouseGetPos(0), _
        "long", MouseGetPos(1) )
    $ret = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $ret[0])
    Return $ret[0]
EndFunc


Maza Faka 16-10-2007 12:15 661527

Интересная штука WinAPI :)
Поначалу абсолютно не понимал, что к чему, но благодаря amel27, вроде начал понимать.
Примеры того, что смог сделать сам:

Создание файла (текстового):
Код:

Global Const $lCreate_RW = 0x00000000

Func FileCreate()
    DllCall("kernel32.dll", "int", "_lcreat", "str", @ScriptDir & "\test.txt", "int", $lCreate_RW)
    If Not @error Then MsgBox(64, "Success", "File test.txt created in " & @ScriptDir)
EndFunc

Активирование окон:
Код:

#include <GUIConstants.au3>

$gui = GuiCreate("Test", 200, 100)
$button = GUICtrlCreateButton("Child", 10, 70, 50, 25)
$child = GUICreate("Dummy", 300, 200)
$ChildButton = GUICtrlCreateButton("Parent", 10, 70, 50, 25)

GUISetState(@SW_HIDE, $child)
GUISetState(@SW_SHOW, $gui)

While 1
    $msg = GUIGetMsg(1)

        Select
    Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $gui
        ExitLoop
    Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $child
        GUISetState(@SW_HIDE, $child)
    Case $msg[0] = $button
        If Not GetWinState() Then
            GUISetState(@SW_SHOW, $child)
        Else
            SetActive($child)
        EndIf
    Case $msg[0] = $ChildButton
        SetActive($gui)
    EndSelect
WEnd

Func SetActive($hwnd)
    DllCall("user32.dll", "hwnd", "SetActiveWindow", "hwnd", $hwnd)
EndFunc

Func GetWinState()
    Return BitAND(WinGetState($child), 2)
EndFunc


Maza Faka 16-10-2007 16:05 661727

-AAA-
Цитата:

Нужно в одной папке просмотреть все вложенные подпапки
Можно так:

Код:

#include <File.au3>
#include <Array.au3>

Global $DirArray[1]
Dim $sPath = "c:\windows"

$GetDirs = DirList($sPath)
_ArrayDisplay($DirArray)

Func DirList($path)
    Local $sRet = ""
    Local $sDir = _FileListToArray($path, "*", 2)

        If IsArray($sDir) And $sDir[0] > 0 Then
        For $i = 1 To UBound($sDir) - 1
            _ArrayAdd($DirArray, $sDir[$i])
            $sRet = DirList($sPath &"\"& $sDir[$i])
        Next
    EndIf
EndFunc


amel27 17-10-2007 11:12 662153

Цитата:

Цитата Maza Faka
Можно так: »

идея понятна, но ты очевидно поторопился ;), итак:

- у тебя очепятка ($path vs $sPath);
- имя каталога заносится в массив без пути;
- проверка локального массива через IsArray() необязательна (особенность For);
- проверка глобального массива IsArray() желательна (особенность _ArrayAdd())
- зачем $sRet ?
- наконец, повторюсь: чтобы избежать путаницы при повторном использовании функций с глобальными переменными их нужно объявлять в параметрах через ByRef.
Код:

#include <File.au3>
#include <Array.au3>

Global $DirArray[1]
_ArrayDirListAdd($DirArray, "c:\windows")
_ArrayDisplay($DirArray,'')

Func _ArrayDirListAdd (ByRef $aGDir, $sPath = @ScriptDir)
    Local $aLDir = _FileListToArray($sPath, "*", 2)
    For $i = 1 To UBound($aLDir) - 1
        If IsArray($aGDir) Then _ArrayAdd($aGDir, $sPath &"\"& $aLDir[$i])
        _ArrayDirListAdd ($aGDir, $sPath &"\"& $aLDir[$i])
    Next
EndFunc


Maza Faka 17-10-2007 14:06 662256

amel27
Цитата:

- у тебя очепятка ($path vs $sPath);
Вообще-то сделано специально, теперь вижу, что без смысла.

Цитата:

- имя каталога заносится в массив без пути;
Поторопился :)

Цитата:

- проверка локального массива через IsArray() необязательна (особенность For);
Учту на будущее.

Цитата:

- проверка глобального массива IsArray() желательна (особенность _ArrayAdd())
А зачем постоянно проверять массив $aGDir ведь он уже обьявлен массивом?

Цитата:

- зачем $sRet ?
Помнишь пример который ты постил для меня:
Код:

MsgBox(64, "Done", _FindFile("icqlite.exe", @ProgramFilesDir))

Func _FindFile($sFile, $sPath)
    Local $sRetPath='', $sFullPath
    Local $hSearch = FileFindFirstFile($sPath & "\*.*"), $sName = FileFindNextFile($hSearch)
    While @error=0 And $sRetPath = ''
        $sFullPath = $sPath &'\'& $sName
        If $sName = $sFile Then $sRetPath = $sPath
        If StringInStr(FileGetAttrib($sFullPath), "D") Then $sRetPath = _FindFile($sFile, $sFullPath)
        $sName = FileFindNextFile($hSearch)
    WEnd
    FileClose($hSearch)
    Return $sRetPath
EndFunc

Цитата:

Теперь к вопросу о возвращаемом значении… Во-первых, функция не является рекурсивной, так как нарушено одно из правил рекурсии: возвращаемое функцией значение должно передаваться по всей цепочке рекурсивных вызовов, у тебя же значение, возвращаемое WritePathToReg() вообще игнорируется… из этого имеем два следствия:
- дальше первого уровня подкаталогов функция и не пытается заглянуть, если бы файл лежал глубже чем на один уровень функция бы его не нашла;
- функция, осуществившая рекурсивный вызов не знает о результате этого вызова… поэтому даже если файл найден (как в твоем случае) на возвращаемое значение это никак не повлияет и результат будет зависеть только от содержимого текущего каталога ($path).

один из возможных вариантов,
ключевой переменной, передаваемой между рекурсивными вызовами является $sRetPath
Цитата:

- наконец, повторюсь: чтобы избежать путаницы при повторном использовании функций с глобальными переменными их нужно объявлять в параметрах через ByRef.
А зачем постоянно передавать глобальный массив по ссылке?

Creat0R 17-10-2007 19:51 662458

amel27,
Спасибо.

По поводу рекурсии...
Всё это хорошо, но на склько известно, есть ограничение на количество вызовов подфункции? можно как то его обойти?

Creat0R 17-10-2007 20:26 662475

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

Я это делаю так (надеялся может есть какой-то быстрый метод, используя всякие BitShift/And/Or и т.п.):

Код:

Func BitNumber($Nmber, $Value)
    If $Value >= $Nmber Then Return $Nmber
    Return $Value
EndFunc


Diamond 18-10-2007 11:50 662809

Maza Faka,
Цитата:

А зачем постоянно передавать глобальный массив по ссылке? »
...имхо ByRef - более универсальный подход.
Если массив глобальный то ByRef по большому счёту не нужен. Ну а если например нужно передать локальный массив из другой функции...? Т.е тебе каждый раз придётся корректировать эту функцию в зависимости от потребности... ;)

amel27 18-10-2007 12:08 662822

Maza Faka
Цитата:

Помнишь пример который ты постил для меня »
помню, там не было глобальных данных, поэтому рукурсивная функция возвращала результат ($ret) который передавался "по цепочке" вызовов. В твоем случае в этом нет необходимости.

Цитата:

зачем постоянно передавать глобальный массив по ссылке? »
к примеру если кто другой будет использовать функцию в своей программе со своим именем массива... что проще: поменять имя по всему тексту функции (об этом еще нужно вспомнить!) или указать свое имя в параметре?

Creat0R
Цитата:

есть ограничение на количество вызовов подфункции? можно как то его обойти? »
в общем случае нет... в данном случае это некритично - не встречал каталога на глубине 384 уровня ;) ... особенно если учесть, что весь путь к файлу обычно не больше 255 символов :)

Цитата:

может есть какой-то быстрый метод »
это и есть самый быстрый, можно сделать короче (одной строчкой) но считаться будет дольше "IF"

Цитата:

используя всякие BitShift/And/Or и т.п
только если $Nmber есть степень двойки, т.е. в двоичном виде есть последовательность "единичек"

Creat0R 18-10-2007 12:12 662825

Может кому пригодится (или может кто мне покажет более правильное/простое решение), вот функция для получения числа разделённого запятыми (когда то на батнике пробовал решить, получилось - но кривовато, а тут совсем другое дело :) )...

Код:

$MyNumber = 212347525 ;> 212,347,525

MsgBox(64, "Внимание", "Конвертировали обычное число: " & @LF & @LF & _
    $MyNumber & @LF & @LF & _
    "В строку (числовую) разделённую запятыми: " & @LF & @LF & GetComasNumber($MyNumber))

Func GetComasNumber($iNumber)
    $iNumber = Number($iNumber)
    If $iNumber <= 1000 Then Return $iNumber

    Local $iLength = StringLen($iNumber)
    Local $RetStr = '', $iN

    For $i = 1 To $iLength
        $iN
= StringMid($iNumber, $i, 1)
        If IsInt(($iLength - $i) / 3) And ($iLength - $i) / 3 > 0 Then
            $RetStr &= $iN & ','
        Else
            $RetStr &= $iN
        EndIf
    Next
    Return
$RetStr
EndFunc

amel27,
Цитата:

в общем случае нет
А жаль :( - Я как раз написал собственный редактор реестра, он правда медленно работает, но полагаю что даже если у кого то и хватит терпения дождаться окончания считывания всех строчек с реестра (у меня не хватает :biggrin: ), то он увидит не полный список, или скрипт выпадет с ошибкой о рекурсивном вызове подфункции.

Цитата:

можно сделать короче (одной строчкой)
О, как это одной строчкой сделать? (скорость не критична в моём случае, проверяться будет вне цикла).

Цитата:

только если $Nmber есть степень двойки, т.е. в двоичном виде есть последовательность "единичек"
У меня число (в этом конкретном случае), всегда 15, т.е нужно проверить, если исло болльше чем 15, то вернуть 15, если меньше, то вернуть то которое меньше (это подходит под критерии сказанного? :) я просто в математике совсем не силён)... понимаю что решать подобные задачи для конкретного случая нет особого смысла, но мне больше для расширения своего круга знании, вот такие мелочи иногда помагают решить серъёзную проблему.

amel27 19-10-2007 08:34 663367

Creat0R
Цитата:

А жаль - Я как раз написал собственный редактор реестра
любую рекурсию можно так или иначе заменить на циклы... вот вариант решения задачи для списка каталогов без использования рекурсии:
Код:

#include <File.au3>
#include <Array.au3>

Global $DirArray[1]
_ArrayAddFileListSubDir($DirArray, "c:\windows")
_ArrayDisplay($DirArray,'')

Func _ArrayAddFileListSubDir (ByRef $aGDir, $sPath = @ScriptDir)
    Local $i = UBound($aGDir), $aLDir = _FileListToArray($sPath, "*", 2)
    _ArrayAddFileList($aGDir, $sPath)
    While $i < UBound($aGDir)
        _ArrayAddFileList($aGDir, $aGDir[$i])
        $i+=1
    WEnd
EndFunc

Func
_ArrayAddFileList(ByRef $aGDir, $sPath)
    Local $i, $aLDir = _FileListToArray($sPath, "*", 2)
    If UBound($aGDir, 0)=1 And UBound($aLDir, 0)=1 Then
        For
$i = 1 To $aLDir[0]
            _ArrayAdd($aGDir, $sPath & '\' & $aLDir[$i])
        Next
    EndIf
EndFunc

Цитата:

как это одной строчкой сделать?
арифметический вариант _IIF() :) :
Код:

$res = ($Value<$Nmber)*$Value + Not($Value<$Nmber)*$Nmber
Цитата:

мне больше для расширения своего круга знании
в такой формулировке одними битовыми операциями все равно не обойтись, поэтому получится еще длиннее... вот если бы $value с каждым шагом изменялось на 1, то отфиксировать переход "границы" можно контролем одного бита... или можно "обрезать" часть старших разрядов... ну и т.д.

NikLok 22-10-2007 23:10 665381

Корифеи! Кто нибуть реализовал просмотр сети?

Creat0R 22-10-2007 23:57 665404

amel27,
Цитата:

любую рекурсию можно так или иначе заменить на циклы
Ну тут как мне кажется, не так циклы как вызов подфункции играют главную роль.
И кстати, а почему While $i < UBound($aGDir) а не простое использоване For? :shuffle: вроде как разницы нет?

Цитата:

арифметический вариант _IIF()
Супер! Спасибо!

NikLok,
Цитата:

Кто нибуть реализовал просмотр сети?
Полагаю что да.

amel27 23-10-2007 05:01 665467

Creat0R
Цитата:

не так циклы как вызов подфункции играют главную роль
выделение функций лишь вопрос удобства - можно объединить и в одну :)
Цитата:

почему While $i < UBound($aGDir) а не простое использоване For?
потому что заранее неизвестно количество элементов массива - они добавляются по ходу прохождения... кстати, у этого способа есть один недостаток по сравнению с рекурсией - результирующий массив не отсортирован по каталогам/подкаталогам
Цитата:

Цитата Creat0R
Цитата:

Цитата NikLok
Кто нибуть реализовал просмотр сети?

Полагаю что да.

вы о чем? :blink:

Creat0R 23-10-2007 05:30 665470

amel27,
Цитата:

выделение функций лишь вопрос удобства - можно объединить и в одну
Точно, я не присмотрелся поглубже в работу функции...

Цитата:

у этого способа есть один недостаток по сравнению с рекурсией - результирующий массив не отсортирован по каталогам/подкаталогам
Хм... в некоторых случаях довольно весомый недостаток :(.

Цитата:

вы о чем
Если бы я знал, ответил бы наверное более подробно :lol:

NikLok 23-10-2007 10:01 665552

Creat0R, amel27, мНЕ собственно нужен как основа скрипт взятия имен машин типа списка аналогичного "Сетевеое окружение". При этом акцент было бы интересно установить на взятие его на машинах с несколькими сетевыми интерфейсами!

amel27 23-10-2007 11:32 665622

NikLok
Перед тем как писать скрипт нужно определиться как разрешать имена: широковещанием (NetBIOS), сервер WINS или DNS?.. Это определяется настройками локальной сети.

TERMINAL 23-10-2007 12:01 665632

У меня идёт опрос окон:
For $i = 0 To 25
MsgBox(64,"System disc","Идёт установка программы ! Подождите пожалуйста "& 26-$i &" секунд...", 2)
if WinWait("Окно 1","", 1) Then
ControlClick("Окно 1","","Button2")
EndIf
If WinWait("Окно 2","",1) Then
ControlClick("Окно 2","","Button2")
EndIf
If WinWait("Окно 3","", 1) Then
ControlClick("Окно 3","","Button2")
EndIf
If WinWait("Окно 4","", 1) Then
ControlClick("Окно 4","","Button2")
EndIf
Next

Дальше идёт продолжение выполнения скрипта....

Возможно ли сделать в цикле так, что если какое-то из окон определяется то заканчивает работать цикл и переходит к дальнейшему выполнению скрипта?

Maza Faka 23-10-2007 12:15 665641

TERMINAL
Цитата:

если какое-то из окон определяется то заканчивает работать цикл
ExitLoop

NikLok 23-10-2007 15:06 665740

amel27, Конечно лучше универсальный вариант. Но на худой конец и простой NetBios сгодится!

amel27 24-10-2007 11:55 666228

Цитата:

Цитата NikLok
на худой конец и простой NetBios сгодится »

1. "NET VIEW" ;)
2. То же через API (функция возвращает массив):
Код:

Global Const $SV_TYPE_WORKSTATION = 0x1
Global Const $SV_TYPE_SERVER = 0x2
Global Const $SV_TYPE_SQLSERVER = 0x4
Global Const $SV_TYPE_DOMAIN_CTRL = 0x8
Global Const $SV_TYPE_DOMAIN_BAKCTRL = 0x10
Global Const $SV_TYPE_TIME_SOURCE = 0x20
Global Const $SV_TYPE_AFP = 0x40
Global Const $SV_TYPE_NOVELL = 0x80
Global Const $SV_TYPE_DOMAIN_MEMBER = 0x100
Global Const $SV_TYPE_PRINTQ_SERVER = 0x200
Global Const $SV_TYPE_DIALIN_SERVER = 0x400
Global Const $SV_TYPE_XENIX_SERVER = 0x800
Global Const $SV_TYPE_NT = 0x1000
Global Const $SV_TYPE_WFW = 0x2000
Global Const $SV_TYPE_SERVER_MFPN = 0x4000
Global Const $SV_TYPE_SERVER_NT = 0x8000
Global Const $SV_TYPE_POTENTIAL_BROWSER = 0x10000
Global Const $SV_TYPE_BACKUP_BROWSER = 0x20000
Global Const $SV_TYPE_MASTER_BROWSER = 0x40000
Global Const $SV_TYPE_DOMAIN_MASTER = 0x80000
Global Const $SV_TYPE_WINDOWS = 0x400000
Global Const $SV_TYPE_CLUSTER_NT = 0x1000000
Global Const $SV_TYPE_TERMINALSERVER = 0x2000000
Global Const $SV_TYPE_CLUSTER_VS_NT  = 0x4000000
Global Const $SV_TYPE_LOCAL_LIST_ONLY = 0x40000000
Global Const $SV_TYPE_DOMAIN_ENUM = 0x80000000
Global Const $SV_TYPE_ALL = 0xFFFFFFFF

Func _NetServerEnum ($iSrvType = -1, $sDomain = '')
    Local $uBufPtr = DllStructCreate("ptr;int;int"), $res[1]=[0], $i
    Local $uRecord = DllStructCreate("dword;ptr"), $iRecLen = DllStructGetSize($uRecord)
    Local $uString = DllStructCreate("char[16]")
    Local $uDomain = DllStructCreate("byte[32]"), $pDomain = 0
    If Not ($sDomain='' Or $sDomain='*') Then
        DllStructSetData($uDomain, 1, StringToBinary($sDomain,2))
        $pDomain = DllStructGetPtr($uDomain)
    EndIf
    Local
$ret = DllCall ("netapi32.dll", "int", "NetServerEnum", _
        "ptr", 0, "int", 100, _
        "ptr", DllStructGetPtr($uBufPtr,1), "int", -1, _
        "ptr", DllStructGetPtr($uBufPtr,2), _
        "ptr", DllStructGetPtr($uBufPtr,3), _
        "int", $iSrvType, "ptr", $pDomain, "int", 0 )
    If $ret[0] Then Return SetError(1, $ret[0], '')
    Local $res[DllStructGetData($uBufPtr,3)+1]=[DllStructGetData($uBufPtr,3)]
    For $i=1 To DllStructGetData($uBufPtr,3)
        Local $uRecord = DllStructCreate("dword;ptr", DllStructGetData($uBufPtr,1)+($i-1)*$iRecLen)
        Local $sNBName = DllStructCreate("byte[32]", DllStructGetData($uRecord,2))
        DllStructSetData($uString,1,BinaryToString(DllStructGetData($sNBName,1),2))
        $res[$i] = DllStructGetData($uString,1)
    Next
    $ret = DllCall ("netapi32.dll", "int", "NetApiBufferFree", "ptr", DllStructGetData($uBufPtr,1))
    Return $res
EndFunc


NikLok 24-10-2007 12:20 666240

amel27, Спасибо! Буду изучать, но пока не понял как указать конкретную сеть для просмотра?! У меня 4 карточки стоит!
Во блин ты даешь! И ведь работает! Я так понимаю параметр ей давть бессмысленно, или там при объявлении он задан на случай отсутствия?

Maza Faka 24-10-2007 16:57 666511

Как создать 24 размерный массив со случайным числом от 1 до 13, причём числа должны быть парными, то есть у каждого числа должна быть пара и расположение их в массиве всегда должно быть случайным.

Creat0R 24-10-2007 21:30 666646

Maza Faka,
Цитата:

Как создать 24 размерный массив со случайным числом от 1 до 13, причём числа должны быть парными
Возможно 24 элементный, не размерный? т.е двумерный, но содержащий 24 элемента?

Вобщем если я правильно понял, то вот:

Код:

#include <Array.au3>

Dim $Array[25][2]

For $i = 1 To 24
    $iRandom = Random(1, 13, 1)
    $Array[$i][0] = $iRandom
    Do
        $jRand = Random(1, 24, 1)
    Until $Array[$jRand][1] = ""
    $Array[$jRand][1] = $iRandom
Next

_ArrayDisplay($Array)


amel27 25-10-2007 05:45 666780

NikLok
Цитата:

не понял как указать конкретную сеть для просмотра?! У меня 4 карточки стоит! »
В NetBIOS нельзя ограничить широковещание одной карточкой... Если все подсети (карточки) находятся в одном широковещательном домене или если именование настроено через WINS, то ограничение не имеет смысла. Если же подсети имеют свои системы именования, то во-первых, "многокарточный" комп не должен быть мастер-браузером (подробно: KB191611). Во-вторых, можно попытаться отобрать компы явно задав имя домена/группы (скрипт подправил), список всех доменов/групп можно получить передав 1-м параметром $SV_TYPE_DOMAIN_ENUM.

Цитата:

Я так понимаю параметр ей давть бессмысленно, или там при объявлении он задан на случай отсутствия? »
На случай отсутствия ($SV_TYPE_ALL). Вот кстати еще вариант через ADSI:
Код:

Func _GetDomainComputers($sDomain)
    Local $objComp, $res[1]=[0], $aType[1] = ["computer"]
    Local $objDom = ObjGet('WinNT://'& $sDomain)
    If $objDom=0 Then Return SetError(1)
    $objDom.Filter = $aType
    For $objComp In $objDom
        $res
[0]+=1
        ReDim $res[$res[0]+1]
        $res[$res[0]]=$objComp.Name
    Next
    Return
$res
EndFunc


NikLok 25-10-2007 10:08 666853

amel27,
Цитата:

Цитата amel27
В NetBIOS нельзя ограничить широковещание одной карточкой. »

Насколько я знаю посылка широковещательного запроса посылка по полной маске последнего октета?.
Имею разные сетевые адреса на всех 4-х картах. Ну для примера пусть две карты имеют адреса 192.168.0.10 и 162.16.10.24.
WINS адресов в настройке карточек нет. Домены не используются пока!
Как мне узнать какой комп по какой сети я вижу.
Вообще нужно узнать какие станции имеют подключение к нескольким сегментам сразу.
Что можешь порекомендовать почитать по данной тематике.

Creat0R 25-10-2007 11:34 666889

Как можно перечитать содержимое папки в меню, но при этом поместив каталоги (подменю) в самый верх, а не как попало (по дате вроде бы сортируются)... а также требуется вернуть двумерный массив с контролями от создания пунктов меню (только пунктов, подменю не нужны), и с путями по порядку (пути только файлов, чтобы позже при нажатии на пункт файл можно было запустить)?

Вот рабочий пример для считывания установочной папки аутоита, но подменю не в начале (они присутствуют в той позиции, где были найдены в процессе поиска), а мне нужно именно в начале:

Код:

#include <GuiConstants.au3>
Opt("GuiOnEventMode", 1)

$Gui = GuiCreate("Test")
GUISetOnEvent(-3, "Quit")

$Menu = GUICtrlCreateMenu("AutoIt")
$AutoItPath = StringRegExpReplace(@AutoItExe, '\\[^\\]+$', '')
Global $Elements = GetFolderToMenu($AutoItPath, $Menu)

GUISetState()

While 1
    Sleep(100)
WEnd

Func
GetFolderToMenu($sPath, $hMenu)
    Local $RetArray[1][4], $SubDirsArr, $hSubMenu, $FindNextFile, $CurrentPath, $iUbound
    $sPath
= StringRegExpReplace($sPath, '\\+$', '')

    Local $FindFirstFile = FileFindFirstFile($sPath & '\*.*')
    If @error = 1 Then Return SetError(1, 0, -1)

    While 1
        $FindNextFile = FileFindNextFile($FindFirstFile)
        If @error = 1 Then ExitLoop
        $CurrentPath = $sPath & "\" & $FindNextFile
        If StringInStr(FileGetAttrib($CurrentPath), 'D') And $FindNextFile <> "Include" And $FindNextFile <> "Examples" Then
            $hSubMenu = GUICtrlCreateMenu($FindNextFile, $hMenu)
            $SubDirsArr = GetFolderToMenu($CurrentPath, $hSubMenu)
            If IsArray($SubDirsArr) Then
                For
$i = 1 To UBound($SubDirsArr)-1
                    If StringInStr(FileGetAttrib($SubDirsArr[$i][3]), 'D') Then
                        GUICtrlCreateMenu($SubDirsArr[$i][2], $SubDirsArr[$i][0])
                    Else
                        $iUbound = UBound($RetArray)
                        ReDim $RetArray[$iUbound+1][4]
                        $RetArray[$iUbound][1] = $SubDirsArr[$i][1]
                        $RetArray[$iUbound][2] = $SubDirsArr[$i][2]
                        $RetArray[$iUbound][3] = $SubDirsArr[$i][3]
                    EndIf
                Next
            EndIf
        ElseIf Not StringInStr(FileGetAttrib($CurrentPath), 'D') Then
            $iUbound = UBound($RetArray)
            ReDim $RetArray[$iUbound+1][4]
            $RetArray[$iUbound][0] = $hMenu
            $RetArray[$iUbound][1] = GUICtrlCreateMenuItem($FindNextFile, $hMenu)
            $RetArray[$iUbound][2] = $FindNextFile
            $RetArray[$iUbound][3] = $CurrentPath
            GUICtrlSetOnEvent(-1, "MenuItemEvents")
        EndIf
    WEnd
    FileClose($FindFirstFile)
    $RetArray[0][0] = UBound($RetArray)-1
    Return $RetArray
EndFunc

Func MenuItemEvents()
    For $i = 1 To $Elements[0][0]
        If $Elements[$i][1] = @GUI_CtrlId Then
            ShellExecute($Elements[$i][3])
            ExitLoop
        EndIf
    Next
EndFunc

Func Quit()
    Exit
EndFunc

Я пытался создавать сначала каталоги (подменю), а потом проходить полученный массив и создавать файлы, но у меня не получилось на первом этапе (создание каталогов) записать все пути чтобы потом по ним проходится в том же порядке и создавать соответственно пункты :( .

Creat0R 26-10-2007 03:22 667339

Вложений: 1
:yahoo: - Получилось! см. скриншот:



Сам скрипт + библиотеку ModernMenu.au3 прикладываю вместе с постом (разукрашенного кода боее 22 тысяч строк!, а прикладывать библиотеку всё ровно нужно (не помню где брал, а искать лень :tongue: ), так что пусть будут вместе в архиве ;) ).

amel27 26-10-2007 08:03 667367

Creat0R
интересно, а ограничения на размер меню какие?.. а то я натравил твой скрипт в корень диска C:\ и он мне выдал: ModernMenu.au3 (450) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.: :jester:

NikLok
Цитата:

Насколько я знаю посылка широковещательного запроса посылка по полной маске последнего октета »
тут видимо только во все сети, так как "тип узла" NetBIOS задается для хоста, а не карточки
Цитата:

Имею разные сетевые адреса на всех 4-х картах [...]
WINS адресов в настройке карточек нет. Домены не используются пока! »
ну, домен необязателен.... можно для каждой подсети определить свою группу, по которой затем и выбирать компы, хотя для многокарточных придется ограничиться только какой-то одной группой
Цитата:

Как мне узнать какой комп по какой сети я вижу.
Вообще нужно узнать какие станции имеют подключение к нескольким сегментам сразу. »
варианты:
- по имени (удаленно) через WMI "снять" конфигурацию сетевых интерфейсов;
- поднять WINS-сервер и брать с него занимаемые именем IP-адреса.
Цитата:

Что можешь порекомендовать почитать по данной тематике. »
для начала можно ТУТ (главы 8, 9)

Creat0R 26-10-2007 08:28 667372

Вложений: 1
amel27,
Цитата:

интересно, а ограничения на размер меню какие?
1000 (явно массив не возврастает, обьявлен на 1000), библиотека не моя :tongue: , я сам только заметил, вот поправлены вариант, а также в примере исправлена ошибка с файлами ярлыков + меню Quick Launch + изменён фон меню (для увеличения скорости) + ещё несколько доработок ;)

P.S
Библиотека переименована в Menu_With_Icons_Incl.au3 (её содержание также намного изменилось).

Davlet 26-10-2007 10:34 667445

Подскажите можно ли при заблокированной системе (win XP) симулировать клавиатурные нажатия?
При не заблокированной все нормально отрабатывается, а при заблокированной никак не хочет.
Вы уж прости если ламерский вопрос, но я только вчера сел знакомиться с AutoIt.
Вот сам код.
Код:

WinWait("Генератор отчетов ")
WinActive("Генератор отчетов")
If @error=1 Then WinActivate("Генератор отчетов")
;Выбираем отчет
Send("{DOWN}")
Sleep(300)
Send("{DOWN}")
Sleep(300)
Send("{DOWN}")
Sleep(300)
Send("{RIGHT}")
Sleep(300)
Send("{DOWN}")
Sleep(300)
Send("{DOWN}")
Sleep(300)
Send("{DOWN}")
Sleep(300)
Send("{DOWN}")
Sleep(300)
Send("{DOWN}")
Sleep(300)
;Открыли отчет
Send("{ENTER}")

Сделал так (я про множественный send) потому что иногда не успевает обработаться переход и захватывается другой отчет, а так нормально.

А эти строчки по идее проверяют активно ли окно и если нет делают его активным :) Ну это по моим соображениям из того что я подчерпнул в справке.
WinActive("Генератор отчетов")
If @error=1 Then WinActivate("Генератор отчетов")

Сделано потому что при заблокированной системе
WinWaitActive("Генератор отчетов")
можно ждать до бесконечности.

По другому отчет выбрать не получается т.к. выбор идет из дерева (class TTreeView), а как я понял AutoIt не может сним работать.
Подскажите как можно это сделать?

Creat0R 26-10-2007 11:02 667460

Davlet,
Цитата:

можно ли при заблокированной системе (win XP) симулировать клавиатурные нажатия?
Из примера в справке исходит что вроде можно:

Код:

If @OSVersion <> "WIN_98" And @OSVersion <> "WIN_ME" Then
    BlockInput(1)
EndIf

Run("notepad")
WinWaitActive("Untitled - Notepad")
Send("{F5}")  ;pastes time and date

BlockInput(0)

Цитата:

AutoIt не может сним работать
Ну почему, если нужно получить текст, то есть способы (а значит и кликнуть по определённому элементу полагаю тоже можно)...

Вот пример (должна быть установлена библиотека отсюда, если есть проблемы с установкой, решение есть тут) - Открывает “Диспетчер устройств”, переходит к 16-тому пункту, раскрывает его, и возвращает текст раскрытого подпункта:


Код:

#include <A3LTreeView.au3>

ShellExecute("devmgmt.msc")
WinWait("[CLASS:MMCMainFrame]")

$hWnd = WinGetHandle("[CLASS:MMCMainFrame]")
$h_Item = ControlGetHandle($hWnd, "", "SysTreeView321")

ControlSend($hWnd, "", "SysTreeView321", "{Down 16} {Right 2}")
ControlFocus($hWnd, "", "SysTreeView321")

$GetText = _TreeView_GetText($h_Item, _TreeView_GetSelection($h_Item))

MsgBox(0, "", $GetText)

ControlFocus($hWnd, "", "SysTreeView321")
Sleep(1500)
WinClose($hWnd)


Davlet 26-10-2007 11:18 667471

Creat0R

Получилось используя

ControlSend("Генератор отчетов", "", "[CLASS:TTreeView; INSTANCE:5]", "{DOWN}")

и т.д.

Но сейчас посмотрю (обмозгую :) ) что ты предложил.



Код:

If @OSVersion <> "WIN_98" And @OSVersion <> "WIN_ME" Then
    BlockInput(1)
EndIf

Run("notepad")
WinWaitActive("Untitled - Notepad")
Send("{F5}")  ;pastes time and date

BlockInput(0)

Не получилось, таже ситуации.

буду делать через ControlSend.

mikola1983 26-10-2007 14:23 667592

Доброго времени суток уважаемые ..очень нужна ваша помошь. нужно установить лицензионное ПО на более сотни машин соответствено на каждое свой ключ. есть предположение что с помошью автоита можно работать с файлом где построчно будут ключи ...напишите пожалуйста как взять из текстового или экселевского файла строку и передать ее в программу....?

Maza Faka 26-10-2007 17:11 667704

mikola1983
Скажем у каждого компьютер имеется имя, например WS1; WS2 и т.д., также имеется текстовый файл с ключами, где номер каждой строки, соответствует номеру машины, соответственно можно написать такой скрипт:
Код:

$number = StringRegExpReplace(@ComputerName, "[a-zA-z]", "") ; Получаем номер машины
$list = "c:\list.txt" ;Переменная с текстовым файлом, в котором находятся лицензии
$string = FileReadLine($list, $number) ;Считываем строку соответствующую номеру компьютера и присваиваем переменной
MsgBox(0, "", $string) ;Это просто просмотр строки
;Здесь твой код...

Просто переделай под свою задачу ;)

Creat0R 26-10-2007 22:58 667950

Davlet,
Цитата:

Не получилось, таже ситуации.
А если так:

Код:

Opt("WinTitleMatchMode", 2)

BlockInput(1)

Run("notepad")
WinWaitActive("- Notepad")
Send("Test")

BlockInput(0)


Creat0R 27-10-2007 01:59 668047

amel27,
Ты приводил функцию для получения контроля по идентификатору, я вот пытаюсь сделать нечто похожее, но для Handle от контроля GUI (аутоита)... типа такого:

Код:

Func _HwndToID($hwnd)
    Local $iRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hwnd)
    Return $iRet[0]
EndFunc

По сути это нужно для того, чтобы можно было на _GuiCtrlTreeViewInsertItem повесить событие - т.е там возвращается handle на вставлены пункт, а мне нужен Id, вот и пытаюсь конвертировать, но почему то всегда эта функци возвращает 0 :(

amel27 27-10-2007 09:22 668111

Цитата:

Цитата Creat0R
там возвращается handle на вставлены пункт, а мне нужен Id »

дык "вставленый пункт" не является контролом, поэтому и полученный хэндл не является хэндлом окна... посмотри хоть через "Window Info"... это какая-то внутренняя нумерация которую ведет для себя сам контрол... кстати, посмотри текст функции _GUICtrlTreeViewInsertItem() - она по сути лишь враппер для сообщения $TVM_INSERTITEM, отправляемого контролу SysTreeView32.
Цитата:

Цитата Creat0R
чтобы можно было на _GuiCtrlTreeViewInsertItem повесить событие »

смысл?.. ведь вставка элемента является синхронным событием (в отличие скажем от нажатия на кнопку) и скрипт всегда знает когда оно случилось... т.е. вставку можно произвести только через вызов определенной функции

Creat0R 27-10-2007 10:25 668121

amel27,
Цитата:

смысл?
Как смысл :unsure: , мне нужно отслеживать нажатия на определённый элемент TreeView, и соответствено делать что-то (к примеру получить текст выбранного контроля, но не только).

Я это сделал через CallBack, т.е просто тупо вызывается определённая функция каждые 100 мс., она и проверяет текст выбранного элемента (через _GuiCtrlTreeViewGetTree()), но хотелось обойтись без CallBack или другой постоянной проверкой (пусть то в цикле или в зарегистрированном сообщении через GuiRegisterMsg()) - просто есть и другие задачи для главного цикла, и не хочется нагружать его слишком много и/или вызывать несколько подобных циклов.

P.S
Я про событие как через GuiCtrlSetOnEvent(), не событие самой вставки :)

Maza Faka 27-10-2007 10:36 668126

Creat0R
Видно не получится при помощи API вернуть ID TreeViewItem.
Наверное потому, что даже утилита AutoIt Window Info не показывает класс и instance TreeViewItem, а вот например с контроль Button идентификатор возвращается:
Код:

#include <GUIConstants.au3>
#include <GuiTreeView.au3>
Opt("GuiOnEventMode", 1)

$gui = GUICreate("Test", 300, 200)
GUISetOnEvent(-3, "OnExit")

$treeView = GUICtrlCreateTreeView(20, 10, 200, 150, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_CHECKBOXES), $WS_EX_CLIENTEDGE)
$all = GUICtrlCreateTreeViewItem("All", $treeView)
GUICtrlCreateTreeViewItem("One", $all)

$button = GUICtrlCreateButton("Insert", 240, 10, 50, 25)
GUICtrlSetOnEvent(-1, "HwndToID")
GUISetState()

While 1
    Sleep(200)
WEnd

Func OnExit()
    Exit
EndFunc

Func HwndToID()
    $insert = _GUICtrlTreeViewInsertItem($treeView, "Inserted")
    $handle = GUICtrlGetHandle($button)
    MsgBox(0, "Handle", $handle)
    $iRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $handle)
    MsgBox(0, "ID", $iRet[0])
EndFunc


Creat0R 27-10-2007 11:06 668138

Вот что я имел в виду:

Код:

#include <GUIConstants.au3>
#include <GuiTreeView.au3>
Opt("GuiOnEventMode", 1)

$Gui = GUICreate("Test", 300, 200)
GUISetOnEvent(-3, "OnExit")

$TreeView = GUICtrlCreateTreeView(20, 20)

$hItem = _GUICtrlTreeViewInsertItem($TreeView, "Inserted")
$TV_ID = HwndToID($hItem)

; Закомментируем две предыдущие строчки, а ту то чуть ниже раскомментируем, и получем то что нужно при нажатии на пункт
; (но с ограничением в количестве создаваемых элементов)
;$TV_ID = GUICtrlCreateTreeViewItem("Inserted", $TreeView)


GUICtrlSetOnEvent($TV_ID, "TV_Event")

GUISetState()

While 1
    Sleep(100)
WEnd

Func
TV_Event()
    ConsoleWrite("Ok, we have clicked tv item")
EndFunc

Func
OnExit()
    Exit
EndFunc

Func
HwndToID($hID)
    $iRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hID)
    Return $iRet[0]
EndFunc


amel27 27-10-2007 12:10 668157

Цитата:

Цитата Creat0R
Вот что я имел в виду »

все равно не понимаю - что мешает вставить в TV_Event() тот же _GUICtrlTreeViewGetTree(), определяющий какую ветку кликнули, а затем Switch вызывающий действие в зависимости от типа ветки?... и никаких циклов

Creat0R 27-10-2007 12:14 668158

amel27,
Цитата:

что мешает вставить в TV_Event() тот же _GUICtrlTreeViewGetTree(), определяющий какую ветку кликнули
А как будет распознаваться что был кликнут пункт в TreeView? (без постоянной проверки)

amel27 27-10-2007 12:21 668159

Creat0R
распознается клик на TreeView, а сам пункт "вычисляем" в функции-обработчике... ведь клик на TreeView это всегда клик на каком-то элементе?

Creat0R 27-10-2007 12:49 668170

Цитата:

ведь клик на TreeView это всегда клик на каком-то элементе?
Во-первых не всегда, можно ведь кликнуть в пустом месте ;)

Но не в этом дело, ведь если поставить событие для TreeView, то оно не срабатывает как таковое:

Код:

#include <GUIConstants.au3>
#include <GuiTreeView.au3>
Opt("GuiOnEventMode", 1)

$Gui = GUICreate("Test", 300, 200)
GUISetOnEvent(-3, "OnExit")

$TreeView = GUICtrlCreateTreeView(20, 20)
GUICtrlSetOnEvent($TreeView, "TV_Event")

$hItem = _GUICtrlTreeViewInsertItem($TreeView, "Inserted")

GUISetState()

While 1
    Sleep(100)
WEnd

Func
TV_Event()
    ConsoleWrite("Ok, we have clicked tv item")
EndFunc

Func
OnExit()
    Exit
EndFunc

Или что-то другое имеется в виду? покажи плиз на примере.

amel27 28-10-2007 13:23 668574

Creat0R
Цитата:

Или что-то другое имеется в виду? покажи плиз на примере »
ура, дошло! :) ...извиняюсь, невнимательно читал твой код :blush:
провел вот такой эксперимент:
Код:

#include <GUIConstants.au3>
#include <GuiTreeView.au3>
Opt("GuiOnEventMode", 1)

$Gui = GUICreate("Test", 300, 200)
GUISetOnEvent(-3, "OnExit")

$TreeView = GUICtrlCreateTreeView(20, 20)
$hTreeView= IDToHwnd($Gui, $TreeView) ; хэндл $TreeView

$TV_ID1 = GUICtrlCreateTreeViewItem("Created1", $TreeView)
$hItem = _GUICtrlTreeViewInsertItem($TreeView, "Inserted1")
$TV_ID2 = GUICtrlCreateTreeViewItem("Created2", $TreeView)

GUISetOnEvent(-3, "OnExit")
GUISetState()

; отсюда видно что элемент, вставленный через _GUICtrlTreeViewInsertItem()
; не получает своего ControlID (нумерация ID сквозная)

ConsoleWrite($TreeView&@CRLF) ; ControlID $TreeView
ConsoleWrite($TV_ID1  &@CRLF) ; ControlID $TV_ID1
                              ; тут должен был быть ControlID $hItem

ConsoleWrite($TV_ID2  &@CRLF) ; ControlID $TV_ID2

; это просто хэндл $TreeView

ConsoleWrite(@CRLF)
ConsoleWrite('0x'&Hex($hTreeView)&@CRLF)

; видно, что Hwnd элементов TreeView не являетя Hwnd окна:
ConsoleWrite(@CRLF)
ConsoleWrite('0x'&Hex(IDToHwnd($Gui, 4))&@CRLF)
ConsoleWrite('0x'&Hex(IDToHwnd($Gui, 5))&@CRLF)
; или даже так, один фиг:
ConsoleWrite(@CRLF)
ConsoleWrite('0x'&Hex(IDToHwnd($hTreeView, 4))&@CRLF)
ConsoleWrite('0x'&Hex(IDToHwnd($hTreeView, 5))&@CRLF)

While 1
    Sleep(100)
WEnd

Func
HwndToID($hWnd)
    Local $iRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hWnd)
    Return $iRet[0]
EndFunc

Func
IDToHwnd($hWndMain, $CtrlID)
    Local $iRet = DllCall("user32.dll", "int", "GetDlgItem", "hwnd", $hWndMain, "int", $CtrlID)
    Return $iRet[0]
EndFunc

Func
OnExit()
    Exit
EndFunc

Цитата:

ведь если поставить событие для TreeView, то оно не срабатывает как таковое »
Хм... вот это странно, ведь ControlID у него есть... можно было и сделать для случая клика на любом пункте TreeView

Цитата:

но с ограничением в количестве создаваемых элементов »
откуда инфа и чем ограничено количество?...
может ограничение как раз и связано с присвоением пунктам ControlID?

так глядишь и сам начну понимать кой-чего в ГУИ :)

Creat0R 28-10-2007 17:42 668692

amel27,
Цитата:

ура, дошло!
:)

Цитата:

Хм... вот это странно, ведь ControlID у него есть... можно было и сделать для случая клика на любом пункте TreeView
С ListView подобна структура срабатывает, видимо потому что у него есть заголовок.

Цитата:

откуда инфа и чем ограничено количество?
Инфа из справки как ни странно :)
Цитата:

Цитата AutoIt3 Help
Maximum number of GUI controls per window: 4096

Но как говорится, «Доверяй но проверяй», вот я и проверяю:

Код:

#include <GUIConstants.au3>
Opt("GuiOnEventMode", 1)

$Gui = GUICreate("Test", 300, 200)
GUISetOnEvent(-3, "OnExit")

$TreeView = GUICtrlCreateTreeView(20, 20)

GUISetState()

For $i = 1 To 4100
    $Item = GUICtrlCreateTreeViewItem("Item " & $i, $TreeView)
    If $Item Then
        PrintF("Created Item: " & $i)
    Else
        PrintF("Oops, we have reached the limit on Item: " & $i-1)
        ExitLoop
    EndIf
Next

While
1
    Sleep(100)
WEnd

Func
PrintF($Str, $Line=@ScriptLineNumber)
    ConsoleWrite(@LF & "+======================================================" & @LF & _
                "--> Script Line (" & $Line & "):" & @LF & "!" & @TAB & $Str & @LF & _
                "+======================================================")
EndFunc

Func
OnExit()
    Exit
EndFunc

Создание останавливается на 4095 потому что создание самого TreeView это уже первый контрол.

TERMINAL 29-10-2007 11:15 669050

какая команда делает печать?

amel27 29-10-2007 12:44 669102

Creat0R
может через GUIRegisterMsg() типа такого?
Код:

#include <GUIConstants.au3>
#include <A3LConstants.au3>
#include <GuiTreeView.au3>

Opt("GuiOnEventMode", 1)

$Gui = GUICreate("Test", 300, 200)
GUISetOnEvent(-3, "OnExit")
$nTreeView = GUICtrlCreateTreeView(20, 20)
$hTreeView = IDToHwnd($Gui, $nTreeView)
$nTV1_ID = _GUICtrlTreeViewInsertItem($nTreeView,"Inserted1")
$nTV2_ID = _GUICtrlTreeViewInsertItem($nTreeView,"Inserted2")

GUIRegisterMsg ($WM_NOTIFY, "TV_Event")
GUISetState()

While 1
    Sleep(100)
WEnd

Func
TV_Event($hWnd, $Msg, $wParam, $lParam)
    If $Msg = $WM_NOTIFY Then
        Local
$NMHDR = DllStructCreate("hwnd;uint;short", $lParam)
        If DllStructGetData($NMHDR, 1)=$hTreeView And DllStructGetData($NMHDR,3)=-451 Then
            ConsoleWrite(_GUICtrlTreeViewGetTree($nTreeView,'\')&@CRLF)
        EndIf
    EndIf
    Return
$GUI_RUNDEFMSG
 EndFunc

Func
OnExit()
    Exit
EndFunc

Func
HwndToID($hControlID)
    $iRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hControlID)
    Return $iRet[0]
EndFunc

Func
IDToHwnd($hWnd, $CtrlID)
    $iRet = DllCall("user32.dll", "int", "GetDlgItem", "hwnd", $hWnd, "int", $CtrlID)
    Return $iRet[0]
EndFunc

З.Ы. я уже сталкивался ранее с контролами без ControlID при установке специфического софта... вот я с ними тогда помучился... :aggressiv собсно из-за них и пришлось лезть в дебри

mikola1983 29-10-2007 15:53 669213

как передать строку?
вобщем есть вот это:
$file = FileOpen("c:\1.txt", 0)
$line = FileReadLine($file)
If @error = -1 Then ExitLoop
Run ("notepad.exe")
WinWait("Untitled - Notepad","")
If Not WinActive("Untitled - Notepad","") Then WinActivate("Untitled - Notepad","")
WinWaitActive("Untitled - Notepad","")
Send(GUICtrlRead($line))
но в нотпаде пишет НОЛЬ вместо определенного ключа . есть ли возможность вставить этот ключ в окно программы желательно посимвольно через SEND т.к. 4 окна.
и еше хотелось бы удалять использованный ключ

Maza Faka 29-10-2007 16:57 669241

mikola1983
Цитата:

Send(GUICtrlRead($line))
Это что? :o
Как я понял ты хочешь выслать строку в блокнот?
Сделай так:
Код:

ControlSend("Untitled - Notepad", "", "Edit1", $line)

Creat0R 29-10-2007 22:04 669394

TERMINAL,
Цитата:

какая команда делает печать?
Конкретной такой команды нет, но для печати документа с файла можно использовать ShellExecute()....

Код:

ShellExecute("MyFile.txt", "", @ScriptDir, "Print")
amel27,
Цитата:

может через GUIRegisterMsg() типа такого?
О, оно работает получше чем все мои попытки (я пробовал через другие сообщения, например улавливал нажатия мышки, но не всегда срабатывало).
Спасибо!

P.S
Функция IDToHwnd() не обязательна в этом случае, можно просто использовать GUICtrlGetHandle($nTreeView) :)

amel27 30-10-2007 04:09 669497

Creat0R
Цитата:

Конкретной такой команды нет
Как же нет?.. по справке как минимум две: _FilePrint() и _WordDocPrint() ;)
первая по сути тот же ShellExecute(), а вторая специально для печати документов MS Word, пример:
Код:

#include <Word.au3>

$sDocPath = @ScriptDir & "\Test.doc" ; путь к документу Word

$oWordApp = _WordCreate ("") ; создаем объект MS Word
$oDoc = _WordDocOpen ($oWordApp, $sDocPath) ; открываем существующий файл
_WordDocPrint ($oDoc) ; печатаем документ
_WordQuit ($oWordApp, 0) ; закрываем окно и освобождаем объект

необязательные параметры:

$b_Background - ожидать или нет завершения печати;
$i_Copies - количество экземпляров;
$i_Orientation - ориентация страницы (книга/альбом);
$b_Collate - разобрать по копиям;
$s_Printer - выбор принтера (имя);
$i_Range - выбор страниц для печати;
$i_From - с какой страницы (для $i_Range=3);
$i_To - по какую страницу печатать (для $i_Range=3);
$s_Pages - список страниц через запятую (для $i_Range=4);
$i_PageType - все/четные/нечетные;
$i_Item - печать дополнительных элементов.

Цитата:

оно работает
угу, только я не совсем понял насчет сообщения $TVN_SELCHANGED - в "A3LTreeView.au3" определен $TVN_SELCHANGEDA = $TVN_FIRST-2 (-402), а по факту приходит $TVN_SELCHANGEDW = $TVN_FIRST-51 (-451)

Creat0R 30-10-2007 05:49 669504

amel27,
Цитата:

по справке как минимум две: _FilePrint() и _WordDocPrint()
Я про UDF'ы забыл, прошёлся поиском по обычной справке, а там только ShellExecute всплыл как вариант.

fak1r 31-10-2007 22:22 670580

Добрый вечер.
Вот есть 2 вопроса:

1 Как сделать чтобы можно было скомпилированому файлу автоита передавать даные через ключи, например так:
Код:

script.exe /f "list.txt"
или так
Код:

script.exe /h /d /s
?

2 Как сделать так чтобы результат выполнения например функции ProcessList(выводит массив со списком процесов) выдавался в командную строку windows?

Creat0R 31-10-2007 23:31 670607

fak1r,
Цитата:

Как сделать чтобы можно было скомпилированому файлу автоита передавать даные через ключи
В самом скрипте нужно распознавать их:

Код:

If $CmdLine[0] = 0 Then
    MsgBox(16, "Ошибка", "Ком. строка пуста")
Else
    Switch
$CmdLine[1]
        Case "/f"
            MsgBox(64, "", "Путь к файлу: " & StringRegExpReplace($CmdLineRaw, ".*?/f", ""))
    EndSwitch
EndIf

Цитата:

чтобы результат выполнения например функции ProcessList(выводит массив со списком процесов) выдавался в командную строку windows?
Если нужно запустить командную строку, то можно использовать макрос @ComSpec, вернуть значение в консоль думаю средствами AutoIt нельзя, я пробовал через StdWrite, но это только для дочерних процессов.

fak1r 01-11-2007 13:09 670835

Цитата:

Код:

If $CmdLine[0] = 0 Then
    MsgBox(16, "Ошибка", "Ком. строка пуста")
Else
    Switch $CmdLine[1]
        Case "/f"
            MsgBox(64, "", "Путь к файлу: " & StringRegExpReplace($CmdLine[1], ".*?/f", ""))
    EndSwitch
EndIf


А как тогда запускать сприпт с ключём /f, когда запускаю так script.exe /f C:\win\1.exe
появляется окно в котором написано только "путь к файлу" и все.

Creat0R 01-11-2007 13:24 670849

fak1r,
Цитата:

появляется окно в котором написано только "путь к файлу" и все
Я сделал ошибку в скрипте, поправил свой пост.

fak1r 01-11-2007 18:54 671022

пасиба, а вот еще вопрос как тогда сделать что б можно было использовать несколько ключей?
И просто интересно Откуда переменые $CmdLineRaw и $CmdLine
они вроде ни где не объявлены, но автоит не ругается на это.

Creat0R 01-11-2007 22:43 671151

fak1r,
Цитата:

как тогда сделать что б можно было использовать несколько ключей?
Можн в цикле проходить по всем значениям ком. строки (я даже написал функцию для парсирования строк):

Код:

If $CmdLine[0] = 0 Then
    MsgBox(16, "Ошибка", "Ком. строка пуста")
Else
    For
$i = 1 To $CmdLine[0]
        Switch $CmdLine[$i]
            Case "/f"
                MsgBox(64, "", "Ком. строка: " & _GetCmdLine("/f"))
            Case "/s"
                MsgBox(64, "", "Ком. строка: " & _GetCmdLine("/s"))
            Case "/b"
                ;И т.д...
        EndSwitch
    Next
EndIf

Func
_GetCmdLine($aArgument)
    Local $RetCmd = StringRegExp($CmdLineRaw, '(?i)' & $aArgument & '\s(.*?)\s', 3)
    If Not IsArray($RetCmd) Or $RetCmd[0] = '' Then $RetCmd = StringRegExp($CmdLineRaw, '(?i)' & $aArgument & '\s(.*?)$', 3)
    If IsArray($RetCmd) Then $RetCmd = $RetCmd[0]
    Return StringStripWS($RetCmd, 3)
EndFunc

Цитата:

Откуда переменые $CmdLineRaw и $CmdLine
Это встроенные константы, первая содержит полную командную строку, а $CmdLine это массив со всеми подстроками (у него есть вроде ограничение в количестве строк).
В справке об этом всё изложено ;)

TERMINAL 02-11-2007 15:23 671549

Почему я немогу открыть экселевский файл с помощью скрипта?

Run ( @ScriptDir & "\2007.xls") - скрипт в этой же папке...

Maza Faka 02-11-2007 15:33 671556

TERMINAL
Попробуй так:
Код:

ShellExecute(@ScriptDir & "\2007.xls")

TERMINAL 02-11-2007 15:40 671563

Maza Faka,

D:\TEST\1.au3(2,38) : ERROR: ShellExecute(): undefined function.
ShellExecute(@ScriptDir & "\Test.txt")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
D:\TEST\1.au3 - 1 error(s), 0 warning(s)

Вот такая хрень вылазит-ничего не могу сделать....

Creat0R,

ShellExecute("MyFile.txt", "", @ScriptDir, "Print") - тоже не катит...

Creat0R 02-11-2007 15:48 671565

TERMINAL,
Цитата:

ShellExecute(): undefined function
Какой врсией AutoIt пользуешься? обнови до 3.2.8.1.
ShellExecute и ShellExecuteWait были добавлены в версии 3.2.2.0.

А если нет желания обновляться, то придётся выкручиваться так:

Код:

Run(@ComSpec & ' /c start "" "' & @ScriptDir & '\2007.xls"', @ScriptDir, @SW_HIDE)
;)

TERMINAL 02-11-2007 16:20 671584

Creat0R, Спасибо - получилось !
Возможно ли при переводе в *.exe возможно ли ставить пароль как в предыдущих версиях?
Есть ли уже обновлённый руский хелп к последней версии?

Creat0R 02-11-2007 16:42 671600

TERMINAL,
Цитата:

возможно ли ставить пароль как в предыдущих версиях?
Нет, в этом нет уже необходимости, разработчики решили что декомпилляции не будет в дальнейших версиях - советуют бекапить исходники ;)

Цитата:

Есть ли уже обновлённый руский хелп к последней версии?
В шапке есть ссылка - Русская справка, там все обновления ;)

Maza Faka 03-11-2007 07:30 671883

Цитата:

Цитата Creat0R
разработчики решили что декомпилляции не будет в дальнейших версиях »

То-то я не могу найти эту опцию, думал может глюк :)

TERMINAL 03-11-2007 09:44 671910

А если использовать компилятор от старой версии , а AutoIt обновлённый - глюков не будет?

Creat0R 03-11-2007 09:51 671911

Цитата:

А если использовать компилятор от старой версии , а AutoIt обновлённый - глюков не будет?
Будет, он просто не даст скомпилировать (если я правильно помню), и к тому же это то же самое что откатиться на предыдущую версию, т.к все поддерживаемые команды в новой версии не будут работать, старый интерпритатор (который встраивается в скомпилированный скрипт) не сможет их распознать.

TERMINAL 03-11-2007 10:30 671918

Creat0R, У меня есть на удалённой точке комп, с которым связываюсь по инету с помощью почты (меняемся пакетами (в рар архиве папка)). Я заслал туда якобы троянчик, который контролирует во сколько комп включается и выключается-для контроля и после все эти значения записуются в*.ini файл, он делается скрытым, человек этого не видит и незнает, архивирует папку и отсылает мне почтой. Вопрос:
1. Возможно ли делать запись данных с помощью IniWrite ( @HomeDrive & "\Пакет\Time.ini", "Запуск компа ", "Включение " & $Den & "." & $Mesyac & "." & $God , " " & $4as & "." & $Minute) не только в *.ini файл но и в другие (напрмер *.txt или даже в такой-неизвестный никому, просто потом присваивать расширение и смотреть или вообще без разширения.

2. Возможно ли данный файл не хранить именно в @HomeDrive & "\Пакет\, а спрятать его в любое место и как только подключается интернет, чтобы он мне лично отсылался на почту?

3. Возможно ли передать текстовое окно (MsgBox) cети по адресу (например 192.168.0.1)?

Maza Faka 03-11-2007 16:53 672066

TERMINAL
1.
Код:

$ini = "c:\myIni"
IniWrite($ini, "Запуск компа", "Включение", @MDAY &"-"& @MON &"-"& @YEAR &" "& @HOUR &":"& @MIN)

мог бы и сам попробовать, прежде чем постить.

2.
Код:

FileSetAttrib($ini, "+S")
Либо
Код:

FileMove("source", "dest" [, flag])
3.
Код:

Run(@ComSpec & " /c " & 'netsend 192.168.0.1 "Hello frend"', "", @SW_HIDE)
Либо скомпилировать сообщение типа
Код:

MsgBox(16, "Error", "Access denied")
и запускать на удалённом компьютере при помощи утилиты psexec.exe

kagorec 03-11-2007 16:59 672067

Привет, написал скрипт... но ненравится его некоректная работа.
Требуется:
;*** Стоп работает
;*** Пауза вкл/выкл работает
;*** Кликать с интервалом 10 (сотых) секунды правой и левой кнопкой мыши. включается и выключается отлично.
;*** Во время этих кликов, клавиша 1 всевремя просто включена и после двух минут включается на одну секунду клавиша 2. некоректно работает
Вот вырезка этого кода
PHP код:

Opt ("SendKeyDelay"25       )
Opt ("WinTitleMatchMode"4  )
Opt ("SendKeyDownDelay"600  )
Opt ("MouseClickDownDelay"25)

Press Esc to terminate scriptPause/Break to "pause"

Global $Paused
HotKeySet
("{PAUSE}""TogglePause")
HotKeySet ("{F5}",  "Auto_2"     )
HotKeySet ("{F6}",  "Auto_3"     )
HotKeySet ("{F9}",  "Left_Click" )
HotkeySet ("{F10}""Stop"       )
HotKeySet ("{F8}""Right_Click")

;********** 
Auto 2 **********

Func Auto_2 ()
While (
1)
Call ("Manashield_A1")
Call ("Delay_1")
Call ("Evilspirit_A1")
Call ("Delay_1")
WEnd
EndFunc

;********** FunctionsDelay **********

Delay Interval In Between Skills.

Func Delay_1 ()
Sleep (1300)
EndFunc

Func Delay_2 
()
Sleep (100)
Sleep (100)
EndFunc

;********** FunctionsEvilspirit **********

Func Evilspirit_A1 ()
While 
1
HotKeySet
("{1}")
Sleep (10000)
WEnd
EndFunc

;********** FunctionsManashield **********

Func Manashield_A1 ()
    While 
1
Opt
("SendKeyDelay"120000)
HotKeySet("{2}")
Sleep (100)
WEnd
EndFunc 

помогите исправить что нетак...
Тоесть скрипт нажал клавишу 1 (не удерживая),всевремя кликает правой или левой кнопкой, как истекло например две минуты, нажимается клавиша 2 на две секунды и потом обратно всевремя включена клавиша 1 (не удерживая)
-
Вроде разобрался, просто еще раз мануал пересмотрел почитал.
PHP код:

While 1
Opt
("SendKeyDelay"1000)
Sleep (100)
Send("{1 down}") ;Нажать клавишу 1
Sleep 
(10)
Send("{1 up}") ;Освободить клавишу 1
Sleep 
(120000)

Send("{2 down}") ;Нажать клавишу 2
Sleep 
(10)
Send("{2 up}") ;Освободить клавишу 2
Sleep 
(100)

WEnd 


Creat0R 04-11-2007 17:46 672554

В последних бетках аутоита разработчики делают настоящий переворот!

Добавили долгожданный ControlTreeView, добавили около 200 UDF'ов из библиотеки A3LLibrary (а также много новых Include'ов), добавили не менее долгожданную функцию VarGetType(), добавили неплохую функцию SendKeepActive (для посылании клавиш с возможностью поддержки активности окна в которое нужно посылать клавиши), в области Dll функции тоже несколько обновок:

Цитата:

- Changed: DllCall() new method of passing types by reference using *.
- Changed: DllCall(): short_ptr, long_ptr, int_ptr types deprecated. Use short*, long* and int* respectively.
- Added: DllCall() new types of wparam and lparam.
И вообще многое изменили, теперь многие скрипты с “GUI-характером” придётся переделывать (не знаю радоваться или нет).

MaxxQ 04-11-2007 18:12 672568

Привет всем, подскажите как сделать вычисление графической области 0х0, 50х50 при появлении в которой контрольной суммы которая равна 1111111111 должно выполниться нажатие клавиши Z, при любой другой сумме клавишу X , как должна выглядеть функция?

fak1r 04-11-2007 23:10 672773

Подскажите пожалуйста как залить файл через форму на сайте.
Вообщем есть файло обменик на странице есть кнопка обзор,. нажимаешь на нее выбираешь файл и нажимаешь кнопку отправить, после загрузки файла обменик выдает ссылку на этот файл.
Так вот как нить можно на Автоите написать прогу чтобы из окно проги выбрать файл, нажать кнопку для его загрузки и по окончании загрузки получить ссылку от обменика?????

Maza Faka 05-11-2007 08:45 672885

MaxxQ
Код:

$checksum = PixelChecksum(0,0, 50,50)

While $checksum <> 1111111111
    $checksum = PixelChecksum(0,0, 50,50)
    Send("{x}")
    Sleep(500)
WEnd

Send("{z}")

В справке это есть.

TERMINAL 05-11-2007 09:33 672900

После компилировании в *.exe файл и старте его, возможно ли сделать этот файл невидимым процессом в диспетчере задач?

Creat0R 05-11-2007 10:43 672918

TERMINAL,
Цитата:

возможно ли сделать этот файл невидимым процессом в диспетчере задач?
Полностью невидемым не уверен, но можно сделать что-то в этом роде:

Код:

#include <A3LListView.au3>

$Process = "AutoIt3.exe"
$TaskMgr_Title = "Диспетчер задач Windows"
$TaskMgr_LV_hWnd = ControlGetHandle($TaskMgr_Title, "", "SysListView321")

While 1
    Sleep(100)
    $TaskMgrActiveMark = 0

    While Not BitAND(WinGetState($TaskMgr_Title), 2)
        Sleep(100)
        $TaskMgrActiveMark = 1
    WEnd

    If
$TaskMgrActiveMark = 1 Then
        $TaskMgr_LV_hWnd = ControlGetHandle($TaskMgr_Title, "", "SysListView321")
        ControlSend($TaskMgr_Title, "", "", "{Alt}{Right 2}{Down 2}{Right}{Up}{Enter}")
    EndIf

    $Index = _ListView_FindText($TaskMgr_LV_hWnd, $Process, -1, False)
    If $Index = -1 Then ContinueLoop
    _ListView_DeleteItem($TaskMgr_LV_hWnd, $Index)
WEnd

Требуется библиотека A3LLibrary.




О, вот метод попроще (кажется amel27 его написал):

Код:

HotKeySet("{Esc}", "Quit")

$ProcName = "AutoIt3.exe"
HideProcess("Диспетчер задач Windows", $ProcName)

Func HideProcess($TaskManTitle, $ProcName)
    Local $FindIndex, $hwnd
    While 1
        $FindIndex = ControlListView($TaskManTitle, "", 1009, "FindItem", $ProcName)
        If $FindIndex = -1 Then
            Sleep(5)
        Else
            $hwnd = ControlGetHandle($TaskManTitle, "", 1009)
            DllCall("user32.dll", "int", "SendMessage", "hwnd", $hwnd, "int", 0x1008, "int", $FindIndex, "int", 0)
        EndIf
    WEnd
EndFunc

Func
Quit()
    Exit
EndFunc


MaxxQ 05-11-2007 17:03 673062

Maza Faka спасибо большое, а как сделать что бы после выполнения Send("{z}"), продолжить выполнение сценария, т.е сейчас пока не найдено заначение 1111111111 выполняется Send("{x}"), а при верном значении выполняется Send("{z}") и все скрипт закрывается, а мне нужно что бы Send("{z}") выполнялось до тех пор, пока значение опять станет неверным и начнется ваполнение Send("{x}"), подскажите пожалуйста.

MaxxQ 05-11-2007 18:01 673082

Извините за глупые вопросы ( я дуб дубом в написании скриптов :)), но вот при выполнении сценария который постил выше Maza Faka, при появлении в области (0,0, 50,50) значения 1111111111, еще раз выполняется команда Send("{x}"), а уже потом Send("{z}") ( это хорошо видно если установить значение Sleep(10000)), а как сделать что бы при появлении в области значения 1111111111 следующая команда была нужно т.е Send("{z}") (а не ждать выполнения Send("{x}"), когда уже область изменена на выполнение Send("{z}"))???????
p.s надеюсь не слишком запутанно написал :)

Maza Faka 05-11-2007 18:19 673089

MaxxQ
Попробуй так:
Код:

HotKeySet("{Esc}", "ExitFunc")

$checksum = PixelChecksum(0, 0, 50, 50)

SendX()

Func SendX()
    While 1
        $checksum = PixelChecksum(0,0, 50,50)
        If $checksum = 1111111111 Then ExitLoop
            Send("{x}")
            Sleep(500)
        WEnd
        SendZ()
    EndFunc

Func SendZ()
    While 1
        If $checksum <> 1111111111 Then ExitLoop
            $checksum = PixelChecksum(0,0, 50,50)
            Send("{z}")
            Sleep(500)
        WEnd
        SendX()
    EndFunc

Func ExitFunc()
    Exit
EndFunc


MaxxQ 05-11-2007 19:06 673126

Спасибо Maza Faka

А как сделать что бы нажатие клавиш было по одному разу (изменилась область на 1111111111 один раз нажатие Send("{x}") , изменилось на другое один раз Send("{z}") и т.д ,а не постоянное нажатие.?????

ну подскажите пожалуйста кто нибудь

kagorec 05-11-2007 22:06 673241

Как реализовать скрипт чтоб курсор двигался по кругу диаметром 100пиксел и во время движения курсора неприрывно кликалась правая кнопка мыши
У меня получается либо только движение либо только кликание правой кнопкой.
Тоесть ненадо пооочереди, а сразу синхроннно движение по кркгу и кликание правой кнопкой.

Creat0R 06-11-2007 02:11 673326

kagorec,
Цитата:

Как реализовать скрипт чтоб курсор двигался по кругу диаметром 100пиксел и во время движения курсора неприрывно кликалась правая кнопка мыши
Кликания правой кнопкой могут вызывать проблемы в некоторых случаях, вот пример с движением мышки по кругу и зажатие левой кнопки мышки (рисует круг в MSPaint):

Код:

$MsPaintPid = Run("mspaint")
ProcessWait($MsPaintPid)
WinActivate("[CLASS:MSPaintApp]")

_MouseMoveCircle(220, 180, 100, 625, 1)

Func _MouseMoveCircle($xPos, $yPos, $Radius, $TimeExp, $MouseClick=0); x coord, y coord, radius, time to loop (milliseconds)
    Local $TimeInit = TimerInit()
    Local $xPosMov, $yPosMov
    Local $MouseClick_Mark = 1

    Do
        $TimeDiff = TimerDiff($TimeInit)
        $xPosMov = $xPos + ($Radius * Sin($TimeDiff/100))
        $yPosMov = $yPos + ($Radius * Cos($TimeDiff/100))
        MouseMove($xPosMov, $yPosMov, 1)
        If $MouseClick_Mark = 1 And $MouseClick <> 0 Then MouseDown("Left")
        $MouseClick_Mark = 0
    Until $TimeDiff > $TimeExp
    If $MouseClick <> 0 Then MouseUp("Left")
EndFunc

Чтобы поменять кнопку на правую нужно заменить “Left” на “Right” ;)

Maza Faka 06-11-2007 07:17 673351

MaxxQ
Вот если бы не ленился заглядывать в справку, то уже давно нашёл бы решение такой простой задачки ;)
Код:

HotKeySet("{Esc}", "ExitFunc")

SendX()

Func SendX()
    While 1
        $checksum = PixelChecksum(0,0, 50,50)
        If $checksum = 1111111111 Then
            Send("{x}")
            ExitLoop
        EndIf
        Sleep(100)
    WEnd
    SendZ()
EndFunc

Func SendZ()
    While 1
        $checksum = PixelChecksum(0,0, 50,50)
        If $checksum <> 1111111111 Then
            Send("{z}")
            ExitLoop
        EndIf
        Sleep(100)
    WEnd
    SendX()
EndFunc

Func ExitFunc()
    Exit
EndFunc


MaxxQ 06-11-2007 08:17 673361

Спасибо Maza Faka , но у меня опять грабли, и в связи с этим несколько вопросов, при выполнении твоего сценария когда $checksum <> 1111111111 происходит нажатие клавиши Z, но вот после когда область изменяется опять на $checksum <> 1111111111 не происходит нажатие клавиши Z, я имею ввиду что мне нужно что бы при каждом изменении области которая будет $checksum <> 1111111111 происходило нажатие Z(один раз) , а если значение становилось $checksum = 1111111111 тогда уже X(один раз), если опять $checksum = 1111111111 опять X и т.д

И еще вопрос можно ли добавить не одно значение - 1111111111, а еще 2222222222, 3333333333 и т.д, при появление которых будет выполнятся X.

Подскажите как такая функция будет выглядеть ??? Спасибо

P.s пытаюсь читать справку нехрена пока не понимаю :(

Creat0R 06-11-2007 09:14 673402

Рисуем смайлик

Код:

$MsPaintPid = Run("mspaint")
ProcessWait($MsPaintPid)
WinActivate("[CLASS:MSPaintApp]")
WinWaitActive("[CLASS:MSPaintApp]")

BlockInput(1)
_MouseMoveCircle(220, 180, 100, 625, 1) ;Лицо
Sleep(200)
_MouseMoveCircle(180, 155, 100, 100, 1) ;Улыбка (кривая :D)
Sleep(400)
_MouseMoveCircle(175, 140, 20, 625, 1) ;Левый глаз
Sleep(20)
_MouseMoveCircle(260, 140, 20, 625, 1) ;Правый глаз
Sleep(400)
_MouseMoveCircle(182, 145, 10, 625, 1) ;Зрачёк левого глаза
Sleep(20)
_MouseMoveCircle(268, 145, 10, 625, 1) ;Зрачёк правого глаза
BlockInput(0)

Func _MouseMoveCircle($xPos, $yPos, $Radius, $TimeExp, $MouseClick=0); x coord, y coord, radius, time to loop (milliseconds)
    Local $TimeInit = TimerInit()
    Local $xPosMov, $yPosMov
    Local $MouseClick_Mark = 1

    Do
        $TimeDiff = TimerDiff($TimeInit)
        $xPosMov = $xPos + ($Radius * Sin($TimeDiff/100))
        $yPosMov = $yPos + ($Radius * Cos($TimeDiff/100))
        MouseMove($xPosMov, $yPosMov, 1)
        If $MouseClick_Mark = 1 And $MouseClick <> 0 Then MouseDown("Left")
        $MouseClick_Mark = 0
    Until $TimeDiff > $TimeExp
    If $MouseClick <> 0 Then MouseUp("Left")
EndFunc


P.S
Функция немного подправлена и в предыдущем моём примере, там переменная для отметки не сбрасывалась.

Maza Faka 06-11-2007 12:00 673508

MaxxQ
Может во время работы скрипта ты нажимаешь клавишу Esc и скрипт завершает работу? Попробуй заменить клавишу Esc на какое нибудь сочетание клавиш, например:
Код:

HotKeySet("^!a", "ExitFunc") ;Ctrl + Alt + a
К сожалению я не могу проверить работу скрипта с контрольной суммой пикселов, но можно немного изменить скрипт (принцип работы остаётся таким же) :
Код:

HotKeySet("^!a", "ExitFunc")

$title = "Безымянный - Блокнот"

SendX()

Func SendX()
    While 1
        If WinExists($title) Then
            ConsoleWrite("X")
            ExitLoop
        EndIf
        Sleep(100)
    WEnd
    SendZ()
EndFunc

Func SendZ()
    While 1
        If Not WinExists($title) Then
            ConsoleWrite("Z")
            ExitLoop
        EndIf
        Sleep(100)
    WEnd
    SendX()
EndFunc

Func ExitFunc()
    Exit
EndFunc

В этом скрипте если существует окно с заголовком "Безымянный - Блокнот", то происходит запись символа X в консоль редактора (в данном случае SciTE), происходит выход из цикла и вызывается вторая функция, которая ожидает момента, когда окна с заголовком "Безымянный - Блокнот" не будет (закрыли), производит запись символа Z в консоль, после этого происходит выход из цикла и вызывается первая функция. И так до бесконечности.
Скрипт работает, значит должен работать и с вычислением контрольной суммы пикселов.

Цитата:

добавить не одно значение - 1111111111, а еще 2222222222, 3333333333 и т.д
Код:

Func SendX()
    While 1
        $checksum = PixelChecksum(0,0, 50,50)
        Switch $checksum
        Case 1111111111
            Send("{x}")
            ExitLoop
        Case 2222222222
            Send("{x}")
            ExitLoop
        Case 3333333333
            Send("{x}")
            ExitLoop
        EndSwitch
        Sleep(100)
    WEnd
    SendZ()
EndFunc


Maza Faka 06-11-2007 13:48 673582

Код:

#include <GUIConstants.au3>
#include <Date.au3>

Dim $hour, $min, $sec

GUICreate("Test", 150, 70, -1, -1, $WS_CLIPSIBLINGS)
$label = GUICtrlCreateLabel("00:00:00", 50, 15, 100, 20)

$begin = TimerInit()
GUISetState()

AdlibEnable("SetTime", 500)

While GUIGetMsg() <> -3
    Sleep(10)
WEnd

Func SetTime()
    $time = _TicksToTime(Int(TimerDiff($begin)), $hour, $min, $sec)
    GUICtrlSetData($label, StringFormat("%02i:%02i:%02i", $hour, $min, $sec))
EndFunc

В коде указанном выше имеется такая проблемка, если нажать и удерживать левую кнопку мыши на заголовке окна, то таймер "замерзает" и не обновляется, пока левая кнопка мыши удерживается. Конечно можно обойти это задействовав UDF _DllCallBack:
Код:

#include <GUIConstants.au3>
#include <Date.au3>
#include <DllCallBack.au3>

Global $sTimer, $Dll_Timer, $hour, $min, $sec

GUICreate("Test", 150, 70, -1, -1)
$label = GUICtrlCreateLabel("00:00:00", 50, 15, 100, 20)
$begin = TimerInit()

GUISetState()

Timer()

While 1
    Switch GUIGetMsg()
    Case -3
        _DllCallBack_Free($sTimer)
        DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "uint", $Dll_Timer)
        ExitLoop
    EndSwitch
WEnd

Func Timer()
    $sTimer = _DllCallBack("SetTime", "hwnd;uint;int;ptr")
    $Dll_Timer = DllCall("user32.dll", "uint", "SetTimer", "hwnd", 0, "uint", 0, "int", 500, "ptr", $sTimer)
    $Dll_Timer = $Dll_Timer[0]
EndFunc

Func SetTime($hWnd, $uiMsg, $idEvent, $dwTime)
    $time = _TicksToTime(Int(TimerDiff($begin)), $hour, $min, $sec)
    GUICtrlSetData($label, StringFormat("%02i:%02i:%02i", $hour, $min, $sec))
EndFunc

, но всё-таки хотелось бы узнать и о других вариантах (если они есть) решения этой проблемки.

MaxxQ 06-11-2007 16:29 673651

Спасибо Maza Faka что помогаешь разобраться (единственный кто помог)
ESC я не нажимал, сценарий не завершал работу а, а ждал пока область будет изменена с $checksum<> 1111111111 на $checksum = 1111111111, а если область опять изменялась с $checksum<> 1111111111 на $checksum<> 1111111111 нечего не происходит.


Вот по этому скрипту c блокнотом, получается что функция не может быть дважды подряд Z (как я понял) т.е дважды подряд блокнот не может быть закрыт :) (или чета я напутал?)

А у меня не известно когда придет нужная сумма пикселей при которой $checksum= 1111111111 (2222222222, 3333333333 и т.д.) и выполнится Send("{x}")(один раз) , если же сумма будет любой другой Send("{z}")(один раз) каждый раз при обновлении области.

Вообще скрипт нужен для игры в покер на префлопе(не знаю может я велосипед изобретаю?), но функции должны быть такие: при приходе на руки нужных карт AA, KK, QQ и т.д. сумму пикселей которых я знаю (и сам задаю в скрипте, 1111111111, 222222222, 3333333333 и т.д., вообще их будет около 132) происходит нажатие X , а при появлении 29, 48,73 и т.д. где естественно $checksum <> 1111111111, нажатие Z. Все бы хорошо, но в данном скрипте не реализована функция где при каждом обновлении области на $checksum <> 1111111111 происходило бы Send("{z}") (один раз) дважды подряд, трижды и так до бесконечности , ведь неизвестно когда придут карты где $checksum= 1111111111.
Возможно ли это вообще реализовать? и как?? ПОМОГИТЕ :) :) :)

Creat0R 06-11-2007 16:58 673670

Maza Faka,
Цитата:

хотелось бы узнать и о других вариантах
Я уже поднимал подобный вопрос (когда ещё библиотеки DllCallBack не было ;) ), amel27 привёл пару хороших примеров).

Maza Faka 07-11-2007 08:32 673998

MaxxQ
Пробуй:
Код:

#include <Array.au3>

HotKeySet("{Esc}", "OnExit")

Global $CardArray[133]
Dim $new_checksum = PixelChecksum(0,0, 50,50)

$CardArray[0] = 132
$CardArray[1] = 1111111111
$CardArray[2] = 2222222222
$CardArray[3] = 3333333333
; И так далее, либо выложи формулу по которой происходит увеличение суммы, тогда можно будет сделать в цикле ;-)

While 1
    $checksum = PixelChecksum(0, 0, 50, 50)
    If $checksum <> $new_checksum Then
        _ArraySearch($CardArray, $checksum, 1)
        If @error Then
            Send("{z}")
        Else
            Send("{x}")
        EndIf
        $new_checksum = PixelChecksum(0,0, 50,50)
    EndIf
    Sleep(100)
WEnd

Func OnExit()
    Exit
EndFunc


infinity78 07-11-2007 20:11 674423

http://creator-lab.ucoz.ru/AutoIt/Au...oGenerator.zip (34 Kb) - Записывает в реальном времени действия пользователя в AutoIt код.
http://creator-lab.ucoz.ru/AutoIt/ScriptWriter.zip (78 Kb) - Аналог AutoItMacroGenerator.
http://creator-lab.ucoz.ru/AutoIt/API_Help_Rus.zip Русский справочник по API-функциям
http://creator-lab.ucoz.ru/AutoIt/Koda.zip (724 Kb) - Визуализация работы с GUI - аналог Visual Basic.

MaxxQ 07-11-2007 20:30 674436

ЗАРАБОТАЛА, СПАСИБО Maza Faka

MaxxQ 08-11-2007 22:06 675131

Цитата:

Цитата infinity78
http://creator-lab.ucoz.ru/AutoIt/Au...oGenerator.zip (34 Kb) - Записывает в реальном времени действия пользователя в AutoIt код.
http://creator-lab.ucoz.ru/AutoIt/ScriptWriter.zip (78 Kb) - Аналог AutoItMacroGenerator.
http://creator-lab.ucoz.ru/AutoIt/API_Help_Rus.zip Русский справочник по API-функциям
http://creator-lab.ucoz.ru/AutoIt/Koda.zip (724 Kb) - Визуализация работы с GUI - аналог Visual Basic. »

полезные проги, спасибо

Creat0R 09-11-2007 00:58 675236

MaxxQ,
Цитата:

полезные проги
Да, но только уточню (т.к располагаются у меня на сайте), утилиты вовсе не мои ;) - Там кстати недавно я создал раздел посвящённый утилитам с открытым кодом на AutoIt, а также раздел для разных функции и библиотек (пока в процессе строения).

Angelus 09-11-2007 12:14 675458

Никто не в курсе как можно даную функцию (_IsPressed) заставить вести лог??, тоесть сохранять все нажатия клавиш в текстовом файле....

Maza Faka 09-11-2007 14:16 675538

Angelus
Примерно так:
Код:

#include <Misc.au3>

HotKeySet("{Esc}", "Quit")

Global $KeyArray[6]

$KeyArray[0] = 5
$KeyArray[1] = 01
$KeyArray[2] = 02
$KeyArray[3] = 04
$KeyArray[4] = 08
$KeyArray[5] = 09

$log = FileOpen("c:\log.txt", 2)
$dll = DllOpen("user32.dll")

AdlibEnable("KeyPress", 100)

While 1
    Sleep(100)
WEnd

FileClose($open)
DllClose($dll)

    Func Quit()
    Exit
EndFunc

Func KeyPress()
    For $i = 1 To $KeyArray[0]
        If _IsPressed($KeyArray[$i], $dll) Then FileWriteLine($log, $KeyArray[$i])
        Next
    EndFunc

Вышеуказанный скрипт отслеживает нажатия: левой и правой кнопок мыши, клавиши Tab и BackSpace
Но написать полноценный кейлогер при помощи AutoIT-а не получится, всё таки это скриптовый язык.

Creat0R 09-11-2007 17:11 675671

Maza Faka, Angelus,
Цитата:

Цитата Maza Faka
написать полноценный кейлогер при помощи AutoIT-а не получится »

Получится, Larry (на моё удивление) написал подобную штучку ;) (вот более понятный пример).

MaxxQ 10-11-2007 06:30 676003

Maza Faka, у меня еще один вопрос возник в процессе использования скрипта :) , как добавить в него суммы исключения, к примеру что бы по появлении суммы равной 6666666666, 777777777, 8888888888 нечего не происходило бы??????
Спасибо

Creat0R 10-11-2007 06:53 676009

MaxxQ,
Цитата:

что бы по появлении суммы равной 6666666666, 777777777, 8888888888 нечего не происходило
Простая логичная проверка:

Код:

If $checksum = 6666666666 Or $checksum = 777777777 Or $checksum = 8888888888 Then
    ;Тут ничего не происходит ;)
Else
    ;Тут происходит то что нам нужно
EndIf

;)

P.S
При необходимости можно все исключения поместить в массив (также как и с массивом пикселей), и проверять поиском по массиву (текущего $checksum).

MaxxQ 10-11-2007 16:19 676221

все, вроде закончил скрипт, спасибо всем за помощь

Kenwood3D 10-11-2007 16:57 676232

Доброго времени суток.
Подскажите пожалуйста.
Необходимо программно отркрыть окно свойства одного из сетевого подключения (через AutoIt). К примеру, чтобы открыть "Сетевые подключения" необходимо выполнить ::{7007acc7-3202-11d1-aad2-00805fc1270e}, а что надо выполнить чтобы открыть свойства или состояние конкретного подключения?
Есть способ через rasphone.exe -f "C:\Documents and Settings\All Users\Application Data\Microsoft\Network\Connections\Pbk\rasphone.pbk" -e "Inet", но так открывает только VPN-соединение "Inet", а подключение по локальной сети не хочет.

Dementei 12-11-2007 11:55 677215

Здравствуйте.
Только вчера открыл для себя AutoIT.
Написал следующее:

Код:

;Открывает окно из которого копируем через ctrl-c и закрывает окно ctrl-a
Send("901")
Send("^c")
Send("^a")
$old_name = ClipGet()
$new_name = InputBox("Переименовать", "Введите новое название файла", $old_name)
;Открывает окно куда вводится новое имя файла
Send("901")
Send($new_name)

Все работает только тогда, когда раскладка клавиатуры по умолчанию английская и язык для печати английский. В других случаях таких как en-ru, ru-en, ru-ru работает не так как надо либо вообще не работает. Подскажите, что надо сделать, чтоб этот скрипт работал при любых раскладках. Так же при русской раскладке по умолчанию не срабатывают ctrl-c ... Спасибо.

amel27 12-11-2007 12:47 677269

Kenwood3D
Цитата:

Необходимо программно отркрыть окно свойства одного из сетевого подключения »
Код:

HotKeySet("{Esc}", "OnExit")
_OpenConnProperties('Подключение по локальной сети')

While 1
    Sleep(1000)
Wend

Func
_OpenConnProperties($sConnName)
    Local $oShellApp = ObjCreate('shell.application')
    Local $oCP = $oShellApp.Namespace (3), $item
    For $item In $oCP.items
        If $item.name = 'Сетевые подключения' Then
            For
$item In $item.getfolder.items
                If $item.name = $sConnName Then $item.InvokeVerb('Сво&йства')
            Next
        EndIf
    Next
EndFunc

Func
OnExit()
    Exit
EndFunc


Dementei 12-11-2007 13:20 677292

Сочетания клавиш заработали при любой раскладке если писать так:
Код:

If @KBLayout = 0419 Then
Send("^ф")
Else
Send("^a")
EndIf

А вот с текстом проблемы, функция ControlGetText в этом приложении не работает и приходится его через буфер обмена передавать, но вот в таком варианте получается, что при:

en-ru, вместо допустим "tim" пишет "ешь"...
Как это побороть?

Maza Faka 12-11-2007 14:13 677332

Dementei,
Цитата:

вместо допустим "tim" пишет "ешь"...
У меня нормально указывает и получает текст при любой раскладке:
Код:

$string = "tim"
$title = "Безымянный"
WinWait($title)
ControlSetText($title, "", "Edit1", $string)


Dementei 12-11-2007 14:54 677361

Напишу еще раз:
(code)
Send("901")
;Вызывает окно, из которого с помощью ctrl-c копируется название файла, а ctrl-a закрывает это окно.
;Для программы, которой этот скрип управляет 901 - вызывает окно и делает выделенной строчку, в которой
;название файла. Сочетание клавиш ctrl-a закрывает это окно.
If @KBLayout = 0419 Then
Send("^с")
Else
Send("^c")
EndIf
If @KBLayout = 0419 Then
Send("^ф")
Else
Send("^a")
EndIf
$old_name = ClipGet()
;$old_name получает значение имени файла
$new_name = InputBox("Переименовать", "Введите новое название файла", $old_name)
;$new_name создает окно, в котором отображается страрое название файла и надо ввести новое
Send("901")
;Открываем снова окно для ввода имени файла и передаем ему новое имя, кот. ввели в диалоговое окно
Send($new_name)
;Посылаем новое имя в окно, кот. открылось по сочетанию клавиш 901
(/code)

Так вот при таком способе Send($new_name) пошлет Tim при английской раскладке и Ешь при русской.
Как добиться аналогичной функциональности, но чтоб это работало при любой раскладке?

Maza Faka 12-11-2007 16:25 677440

Dementei,
Посмотри здесь http://oszone.net/display.php?id=3663 про переключение раскладки.

Dementei 12-11-2007 16:39 677452

Maza Faka,
Смотрел, это не помогает в данном случаи.
Но я нашел выход:

ClipPut($new_name)

Вот уже с этим ничего не происходит, оно уже вводится как надо при любой раскладке... но это ограничивает возможности...

Creat0R 12-11-2007 19:50 677546

amel27,
А можно таким же методом (ну или другим), отображать свойства для любого файла? т.е мне нужен вот этот диалог для указанного в функции файла:



P.S
ShellExecute($File, "", "", "properties") не работает :(


Dementei
Цитата:

это ограничивает возможности
Чем ограничивает?

amel27 13-11-2007 08:15 677757

Creat0R,
Цитата:

А можно таким же методом (ну или другим), отображать свойства для любого файла? »
можно, только извини, некогда доводить до ума - без контроля ошибок и разделения пути:
Код:

Func _OpenFileProperties($sDir, $sFile)
    Local $oShellApp = ObjCreate('shell.application')
    Local $oDir = $oShellApp.Namespace ($sDir), $oName
    For $oName In $oDir.items
        If $oName.name = $sFile Then $oName.InvokeVerb('Сво&йства')
    Next
EndFunc


Creat0R 13-11-2007 09:03 677776

amel27,
Цитата:

без контроля ошибок и разделения пути
Но оно работает у тебя? у меня нет :( - если задать пустое значение для verb, то открывает файл в программе по умолчанию.

Вот версия с разделением путей, но у меня по прежнему не работает:

Код:

_OpenFileProperties("C:\Test.txt", "Сво&йства")

Func _OpenFileProperties($sFilePath, $Verb='Open')
    Local $sFileName = StringRegExpReplace($sFilePath, '.*\\|\.[^.]*$', '')
    Local $sPath = StringRegExpReplace($sFilePath, '\\[^\\]*$', '')

    Local $oShellApp = ObjCreate('shell.application')
    Local $oDir = $oShellApp.Namespace($sPath), $oName

    For $oName In $oDir.Items
        If $oName.Name = $sFileName Then
            ;$objVerbs = $oDir.Self.Verbs
            ;$Verb = $objVerbs.Item(0).Name

            $oName.InvokeVerb($Verb)
        EndIf
    Next
EndFunc


Creat0R 13-11-2007 09:24 677793

amel27,
Оно работает! :) но только пока скрипт активен :( - Т.е как только скрипт завершает работу, окно свойств исчезает, не очень удобно...

Kenwood3D 14-11-2007 01:12 678434

Цитата:

Цитата amel27
HotKeySet("{Esc}", "OnExit")
_OpenConnProperties('Подключение по локальной сети')
While 1
Sleep(1000)
Wend
Func _OpenConnProperties($sConnName)
Local $oShellApp = ObjCreate('shell.application')
Local $oCP = $oShellApp.Namespace (3), $item
For $item In $oCP.items
If $item.name = 'Сетевые подключения' Then
For $item In $item.getfolder.items
If $item.name = $sConnName Then $item.InvokeVerb('Сво&йства')
Next
EndIf
Next
EndFunc
Func OnExit()
Exit
EndFunc »

Не хочет работать! После запуска вылетает системное окно "Приложение или библиотека C:\WINDOWS\system32\irprops.cpl не является образом программы для Windows NT. Проверьте назначение установочного диска. " И выполнение зависает на строке "Sleep(1000)"
Система WindowsXP

amel27 14-11-2007 06:22 678481

Creat0R
Цитата:

как только скрипт завершает работу, окно свойств исчезает, не очень удобно... »
думал ты это понял из предыдущего примера с сетевым подключением, поэтому не стал заострять внимание... :) имхо такое поведение вполне логично, так как при выходе все открытые объекты закрываются, так что в некоторых случаях это даже полезно. Кстати, таким образом можно включать/отключать сетевые подключения - Shell-альтернатива DevCon.

Kenwood3D
Цитата:

Цитата Kenwood3D
После запуска вылетает системное окно "Приложение или библиотека C:\WINDOWS\system32\irprops.cpl не является образом программы для Windows NT. Проверьте назначение установочного диска. " И выполнение зависает на строке "Sleep(1000)" »

1. на Sleep() скрипт не зависает, а входит в цикл ожидания ("Esc" - для выхода)... так как окно свойств будет открыто только до тех пор пока работает скрипт, вместо цикла можно поставить команды обработки этого окна.
2. Ошибка никак не связана со скриптом, ищи в сетевых настройках Windows, начать можно отсюда:
Появление сообщения об ошибке «RUNDLL Ошибка загрузки irprops.cpl» при загрузке Windows XP

Creat0R 14-11-2007 08:57 678522

amel27,
Цитата:

думал ты это понял из предыдущего примера с сетевым подключением
Я просто запустил пример, появилось окно свойств подключения, я нажал “Отмена” и затем убил скрипт - Познать сущность того примера, мне, на тот момент, не удалось :biggrin: .

Цитата:

такое поведение вполне логично, так как при выходе все открытые объекты закрываются, так что в некоторых случаях это даже полезно
100% согласен (с обеими утверждениями :) ), какое то чувство мне подсказывает, что именно такое поведение мне где нибудь пригодится..
Но пока, мне бы узнать о другом поведении, как это окно вызвать “на долго/навсегда” :) - может есть какой то API-метод? или возможно через CallBack функции как то?

Есть идея запускать отдельный скрипт, чтобы тот завершал работу только после закрытия диалога свойств, но это особо крайний вариант :(

P.S
А есть ещё вариант с созданием своего окна Свойства для файла, вроде встроенными функциями можно получить необходимую инфу, но всё же, оригинал, он есть оригинал ;)

amel27 14-11-2007 12:43 678668

Creat0R

Цитата:

Есть идея запускать отдельный скрипт, чтобы тот завершал работу только после закрытия диалога свойств »
Цитата:

есть ещё вариант с созданием своего окна Свойства для файла, вроде встроенными функциями можно получить необходимую инфу »
не вижу разницы между этими вариантами - оба требуют работы скрипта, только во втором случае еще и ГУИ рисовать :)

в принципе, можно сваять UDF на базе ShellExecuteEx (как тебе советовали на офсайте ;) ), но в плане запуска это ничего не даст - функция все равно требует наличия какого-либо целевого приложения, в данном случае это процесс самого скрипта... разве только добавится возможность делать новое окно дочерним к GUI

Kenwood3D 14-11-2007 18:05 678869

Цитата:

Цитата amel27
HotKeySet("{Esc}", "OnExit")
_OpenConnProperties('Подключение по локальной сети')
While 1
Sleep(1000)
Wend
Func _OpenConnProperties($sConnName)
Local $oShellApp = ObjCreate('shell.application')
Local $oCP = $oShellApp.Namespace (3), $item
For $item In $oCP.items
If $item.name = 'Сетевые подключения' Then
For $item In $item.getfolder.items
If $item.name = $sConnName Then $item.InvokeVerb('Сво&йства')
Next
EndIf
Next
EndFunc
Func OnExit()
Exit
EndFunc »

Так а куда указаывать имя сетевого подключения, свойства которого я хочу открыть? У меня их то несколько. Мож из-за этого и не хочет? На другом компе работает, но там только одно сетевое подключение.

Creat0R 14-11-2007 23:09 679008

amel27,
Цитата:

не вижу разницы между этими вариантами - оба требуют работы скрипта
Ну в первом как бы остаётся иллюзия что скрипт завершил работу, а кокошко наместе :) - во-втором да, гуи рисовать нужно, но зато потом можно с этим окном делать что угодно (почти).

Цитата:

разве только добавится возможность делать новое окно дочерним к GUI
Это было бы неплохо, я в принципе догадываюсь что функция будет примерно такой, но и она у меня не работает:

Код:

$GUI = GUICreate("My GUI")

GUISetState()
GUISetState(@SW_DISABLE)

_ShellExecuteEx(@DesktopDir & "\Test.txt", "", @DesktopDir, "properties", @SW_SHOW, $GUI)

Sleep(2000)

Func _ShellExecuteEx($sCmd, $Args="", $sFolder="", $Verb="", $rState=@SW_SHOWNORMAL, $hWnd=0)
    If StringRight($sCmd, 3) = "lnk" Then
        Local
$iShortcutInfo = FileGetShortcut($sCmd)
        If IsArray($iShortcutInfo) Then $sCmd = $iShortcutInfo[0]
    EndIf

    Local
$aRet = DllCall("shell32.dll", "long", "ShellExecute", _
        "hwnd", $hWnd, _
        "string", $Verb, _
        "string", $sCmd, _
        "string", $Args, _
        "string", $sFolder, _
        "int", $rState)
    If @error Then Return SetError(1, 0, 0)

    Local $RetVal = $aRet[0]
    If $RetVal > 32 Then Return SetError(0, 0, 1)
    Return SetError(2, 0, 0)
EndFunc

Kenwood3D
Цитата:

куда указаывать имя сетевого подключения
В качестве единственного параметра функции _OpenConnProperties() ;)

Kenwood3D 15-11-2007 01:26 679050

Цитата:

Цитата Creat0R
В качестве единственного параметра функции _OpenConnProperties() »

Разобрался.
amel27, Creat0R, огромное СПАСИБО!

amel27 15-11-2007 06:08 679069

Creat0R
Цитата:

в принципе догадываюсь что функция будет примерно такой, но и она у меня не работает »
а чего ты для UDF _ShellExecuteEx() используешь API-функцию ShellExecute?.. она как раз не поддерживает "properties" ;)
Код:

HotKeySet("{Esc}", "OnExit")
_ShellExecuteEx(@ScriptName, "", @ScriptDir, "properties")

While 1
    Sleep(500)
WEnd

  Func
_ShellExecuteEx($sCmd, $Args = "", $sFolder = "", $Verb = "", $rState = @SW_SHOWNORMAL, $hWnd = 0)
    Local $struINFO = DllStructCreate("long;long;long;ptr;ptr;ptr;ptr;long;long;long;ptr;long;long;long;long")
    Local $struVerb = DllStructCreate("char[15];char")
    Local $struPath = DllStructCreate("char[255];char")
    Local $struArgs = DllStructCreate("char[255];char")
    Local $struWDir = DllStructCreate("char[255];char")
    ; Заполняем структуры параметров
    DllStructSetData($struVerb, 1, $Verb)
    If StringRight($sCmd, 3) = "lnk" Then
        Local
$aShortcutInfo = FileGetShortcut($sCmd)
        If IsArray($aShortcutInfo) Then
            DllStructSetData($struPath, 1, $aShortcutInfo[0])
            DllStructSetData($struWDir, 1, $aShortcutInfo[1])
            DllStructSetData($struArgs, 1, $aShortcutInfo[2])
            $rState = $aShortcutInfo[6]
        Else
            Return
0
        Endif
    Else

        DllStructSetData($struPath, 1, $sCmd)
        DllStructSetData($struWDir, 1, $sFolder)
        DllStructSetData($struArgs, 1, $Args)
    EndIf
    ; Заполняем структуру SHELLEXECUTEINFO
    DllStructSetData($struINFO, 1, DllStructGetSize($struINFO))
    DllStructSetData($struINFO, 2, BitOR(0xC, 0x40, 0x400))
    DllStructSetData($struINFO, 3, $hWnd)
    DllStructSetData($struINFO, 4, DllStructGetPtr($struVerb))
    DllStructSetData($struINFO, 5, DllStructGetPtr($struPath))
    DllStructSetData($struINFO, 6, DllStructGetPtr($struArgs))
    DllStructSetData($struINFO, 7, DllStructGetPtr($struWDir))
    DllStructSetData($struINFO, 8, $rState)

    Local $ret = DllCall("shell32.dll", "int", "ShellExecuteEx", "ptr", DllStructGetPtr($struINFO))
    Return $ret[0]
EndFunc

Func
OnExit()
    Exit
EndFunc

P.S. кста я про ярлыки и не подумал :yes:

Creat0R 15-11-2007 06:26 679070

amel27,
Цитата:

а чего ты для UDF _ShellExecuteEx() используешь API-функцию ShellExecute?
Я пробовал ShellExecuteEx, но у меня почему то скрипт вываливался в тихом режиме (код выхода -1073741819).

Цитата:

я про ярлыки и не подумал
Я был удивлён когда узнал что родная ShellExecute не умеет запускать ярлыки :dont-know , поэтому с того момента и до сих пор, юзаю самопальную ShellExecute (именуемую как просто _Execute() :) ).

P.S
Спасибо за функцию, работает, правда параметр $hWnd пользы не приносиит, по крайней мере не визуально :( - т.е задаю hWnd родительского окна, а диалог свойств появляется как отдельное окно, без связи с родительским.

amel27 15-11-2007 07:38 679076

Creat0R
Цитата:

параметр $hWnd пользы не приносиит »
угу, видимо он используется для других нужд... кста в MSDN сказано что-то типа - для месседж-боксов, которые могут возникнуть во время выполнения функции, что имелось ввиду неясно... :dont-know

Creat0R 15-11-2007 23:38 679587

amel27,
Цитата:

видимо он используется для других нужд
Ладно, всё ровно спасибо, API для меня предпочтительнее объектов/WMI и т.п.




Самому как то давно (и кажется тут в ветке уже спрашивали про это), нужна была функция для получения текста с таба (SysTabControl321), поискал немного, не нашёл и разочаровался :( .
Но недавно кое кому тоже это понадобилось, и я сразу вспомнил про библиотеку A3LLibrary - Но ради одной функции включать такую тяжёлую артиллерию, мне показалось излишним :unsure: ..

Собрав все нужные ресурсы с этой библиотеки, плюс немного с MSDN, плюс немного с головы (моей :) ), я написал рабочую функцию _ControlTab()!!! аж самому не верится, но всё прекрасно работает!

Вот функция с описаниями (на Английском, т.к на оф. форуме хочу предложить разработчикам для включения в стандартные библиотеки):

Код:

;===============================================================================
; Function Name:  _ControlTab()
; Description:    Sends a command to a SysTab32 Control.
; Syntax:          _ControlTab ( $hWnd, $sText, $sCommand  [, $sParam1 [, $sParam2 [, $sParam3]]] )
;
; Parameter(s):    $hWnd      = Window Handle/Title.
;                  $sText      = Window Text.
;                  $sCommand  = Command to send to the control (See "Return Value(s)").
;                  $sParam1, $sParam2, $sParam3 = Additional parameters required by some commands.
;
; Requirement(s): None.
;
; Return Value(s): Depends on command as shown below. In case of an error (such as an invalid command or window/control), @error=1
;                      If $sCommand Equel...
;                          "GetItemState" - State of the tab item returned.
;                            ($sParam1 defines what tab item (zero-based) will be used - 0 is the default).
;
;                          "GetItemText" - Text of the tab item returned.
;                            ($sParam1 defines what tab item (zero-based) will be used - 0 is the default).
;
;                          "GetItemImage" - Image Index of the tab item returned.
;                            ($sParam1 defines what tab item (zero-based) will be used - 0 is the default).
;
;                          "CurrentTab" - Returns the current Tab shown of a SysTabControl32.
;
;                          "TabRight" - Moves to the next tab to the right of a SysTabControl32.
;
;                          "TabLeft" - Moves to the next tab to the left of a SysTabControl32.
;
;                          "GetTabsCount" - Returns the number of total tab items of a SysTabControl32.
;
;                          "FindTab" - Search For tab item with specific text..
;                          In this case used all three additional parameters:
;                              $sParam1 - defines what text to find.
;                              $sParam2 - defines from what tab item the search will start (zero-based).
;                              $sParam3 - defines search type...
;                              If $sParam3 = True Then will be performed a partial search of the string in the tab item text.
;
; Author(s):      G.Sandler a.k.a CreatoR
;
; Example(s):
;    $TabText = _ControlTab("Properties", "", "GetItemText", 1) ;Will return the text of second tab from the left side.
;===============================================================================

Func _ControlTab($hWnd, $sText, $sCommand, $sParam1="", $sParam2="", $sParam3="")
    Local Const $TCM_FIRST = 0x1300
    Local $hTab = ControlGetHandle($hWnd, $sText, "SysTabControl321")

    Switch $sCommand
        Case "GetItemState", "GetItemText", "GetItemImage"
            Local Const $TagTCITEM = "int Mask;int State;int StateMask;ptr Text;int TextMax;int Image;int Param"
            Local Const $TCIF_ALLDATA = 0x0000001B
            Local Const $TCM_GETITEM = $TCM_FIRST + 5

            Local $tBuffer  = DllStructCreate("char Text[4096]")
            Local $pBuffer  = DllStructGetPtr($tBuffer)
            Local $tItem    = DllStructCreate($tagTCITEM)
            Local $pItem    = DllStructGetPtr($tItem)

            DllStructSetData($tItem, "Mask", $TCIF_ALLDATA)
            DllStructSetData($tItem, "TextMax", 4096)
            DllStructSetData($tItem, "Text", $pBuffer)

            If $sParam1 = -1 Then $sParam1 = _ControlTab($hWnd, $sText, "CurrentTab")
            DllCall("user32.dll", "long", "SendMessage", "hwnd", $hTab, "int", $TCM_GETITEM, "int", $sParam1, "int", $pItem)

            If @error Then Return SetError(1, 0, "")
            If $sCommand = "GetItemState" Then Return DllStructGetData($tItem, "State")
            If $sCommand = "GetItemText" Then Return DllStructGetData($tBuffer, "Text")
            If $sCommand = "GetItemImage" Then Return DllStructGetData($tItem, "Image")
        Case "CurrentTab", "TabRight", "TabLeft"
            Local $iRet = ControlCommand($hWnd, $sText, "SysTabControl321", $sCommand, "")
            If @error Then Return SetError(1, 0, -1)
            Return $iRet - 1
        Case "GetTabsCount"
            Local Const $TCM_GETITEMCOUNT = $TCM_FIRST + 4
            Local $iRet = DllCall("user32.dll", "long", "SendMessage", "hwnd", $hTab, "int", $TCM_GETITEMCOUNT, "int", 0, "int", 0)
            If @error Then Return SetError(1, 0, -1)
            Return $iRet[0]
        Case "FindTab"
            If Not IsNumber($sParam2) Or $sParam2 < 0 Then $sParam2 = 0
            Local $sTabText

            For $i = $sParam2 To _ControlTab($hWnd, $sText, "GetTabsCount")
                $sTabText = _ControlTab($hWnd, $sText, "GetItemText", $i)
                If $sParam3 = True And StringInStr($sTabText, $sParam1) Then Return $i
                If $sTabText = $sParam1 Then Return $i
            Next
            Return
-1
        Case Else
            Return
SetError(1, 0, "")
    EndSwitch
EndFunc

Вот пример:

Код:

$GUI = GUICreate("ControlTab Demo")

GUICtrlCreateTab(0, 20)
$Tab_1 = GUICtrlCreateTabItem("Tab 1")
$Tab_2 = GUICtrlCreateTabItem("Tab 2")
$Tab_3 = GUICtrlCreateTabItem("More Tab")

GUISetState()

For $i = 0 To _ControlTab($GUI, "", "GetTabsCount")-1
    MsgBox(0, "", "Zero-Based tab number [" & $i & "]: " & @LF & _ControlTab($GUI, "", "GetItemText", $i))
    _ControlTab($GUI, "", "TabRight")
Next


Creat0R 16-11-2007 02:51 679618

Как получить пути к системным папкам, не используя COM-обьекты? (Shell.Application к примеру, не на всех системах будет корректно работать).

Реестр тоже отпадает, там нет того что нужно (например “Мои видеозаписи” там и близко нет).

На данный момент нужно именно для “Мои видеозаписи”, но в частности хотелось бы и к другим папкам.

amel27 16-11-2007 03:11 679623

Цитата:

Цитата Creat0R
“Мои видеозаписи” там и близко нет »

неправда: HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders, параметр: "My Video"

Creat0R 16-11-2007 03:35 679629

amel27,
Цитата:

неправда: HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
Хм, поиск по “Мои видео” не дал результатов... спасибо.
Насколько “надёжна” эта ветка? она там присутствует на всех Win-системах?

amel27 16-11-2007 04:03 679631

Цитата:

Цитата Creat0R
Насколько “надёжна” эта ветка? »

ИМХО вполне надежна для тех ОСей, в которых такая папка определена в профиле - в Win2K к примеру ее не было... в XP она тоже не всегда присутствует, но в этом случае значение параметра "пусто"

Creat0R 16-11-2007 04:19 679633

amel27,
Ок, Спасибо.

V0van3 16-11-2007 19:12 680020

в хелпе к AUTOIT есть:
Цитата:

Таким образом, если сценарий запущен с помощью строки:
AutoIt3.exe myscript.au3 param1 "а это другой параметр"
то после загрузки в нем можно использовать следующий специальный массив:
$CmdLine[0] равно... 2
$CmdLine[1] равно... param1
$CmdLine[2] равно... а это другой параметр
@ScriptName равно... myscript.au3
так вот проблема в том что "а это другой параметр" в $CmdLine[2] обрезается до первого пробела!
вызывал из батнега:
%path_cmdutils%\Autoit3.exe %~dp0\FlashPlayerUpdate.au3 /p %AppPath%
как надо правильно если в значении %AppPath% есть пробелы?


от нефиг делать написал скрипт который проходит головоломку за меня методом тыка.
Может кто подаст идею какое условие в таком скрипте должно отследить успешное срабатывание чтобы сделать exitloop?
Код:

;Поочерёдный кликер в разные области экрана
;Copywrite by Vovan [CAD/EDP]

;Отображать текущую строку сценария с помощью индикатора системной панели в режиме отладки.
AutoItSetOption("TrayIconDebug", 1)

;запускать после открытия окна браузера
Run('C:\Program Files\Internet Explorer\iexplore.exe http://newyorkdesign.hp.infoseek.co.jp/findit.html')
;дожидаемся активности окна
WinWaitActive('findit - Microsoft Internet Explorer','')
;настройка мыши на коортдинатны окна
Opt("MouseCoordMode",2)

;координаты угла флешки
$absx=332
$absy=279

;ожидание загрузки страницы
Sleep(4000)
;кликнуть по "Start"
Sleep(500)
mouseclick("left",$absx+284,$absy+327,1)
;прокликать поочерёдно по пикселям
for $y=0 to 400 step 10
 for $x=0 to 600 step 10
  WinWaitActive('findit - Microsoft Internet Explorer','')
  mouseclick("left",$absx+$x,$absy+$y,1)
  Sleep(300)
  ;нажимаем кнопку "try again"
  Send('{TAB}')
  Send('{SPACE}')
 next
next

Вообще что лучше использовать для управления веб интерфейсами autoit или autohotkey?

Creat0R 16-11-2007 23:45 680115

V0van3,
Цитата:

как надо правильно если в значении %AppPath% есть пробелы?
Заключить переменную в кавычки:

Код:

%path_cmdutils%\Autoit3.exe "%~dp0\FlashPlayerUpdate.au3" /p "%AppPath%"
Цитата:

какое условие в таком скрипте должно отследить успешное срабатывание чтобы сделать exitloop?
Срабатывание чего? из скрита непонятно какова цель..

А вообще, для таких задач (автоматизации Internet Explorer), есть встроенная библиотека IE.au3, там можно запустить адрес в IE, и функция будет ждать окончания загрузки страницы, также можно нажать на ссылку/кнопку зная заранее только её текст, и т.д и т.п.

Цитата:

то лучше использовать для управления веб интерфейсами autoit или autohotkey?
Думаю что они оба не подходят для этой задачи, хотя если только IE, тогда AutoIt для этого вооружён ;)

Creat0R 17-11-2007 22:01 680550

Ещё один сюрприз от разработчиков! :yahoo:

В последней бетте добавили поддержку DllCallBack!!!

Цитата:

Цитата http://www.autoitscript.com/forum/index.php?showtopic=19717&st=330&
3.2.9.12 (17th November, 2007) (Beta)

- Added: DllCallbackRegister(), DllCallbackGetPtr() and DllCallbackFree()

Библиотека DllCallBack.au3 полагаю уже будет не нужна ;)

Creat0R 20-11-2007 01:14 681723

Имитация телефонного звонка:

Код:

HotKeySet("{Esc}", "Quit")

_PhoneRing(8)

;===============================================================================
;
; Function Name:    _PhoneRing()
; Description:      Beep Sound Imitation of Phone Rings.
; Parameter(s):    $iRings [Optional] - Rings to beep (5 is the default),
;                      If $iRings > 0 Then this time of rings will be sounded.
;                      If $iRings < 0 Then number after - sign will be used to indicate how long (seconds) the function will ring.
;                      If $iRings = 0 Then the function will ring (loop) forever :)
;                  $iDuration [Optional] - Duration of the Ring to beep (15 is the default).
;                  $iWait - [Optional] How long to wait between each rings in milleseconds (1500 is the default).
;
; Return Value(s):  Always returns 1 regardless of success.
; Requirement(s):  None.
; Author(s):        G.Sandler (a.k.a CreatoR).
;
;===============================================================================

Func _PhoneRing($iRings=5, $iDuration=15, $iWait=1500)
    Local $iCount = 0, $iTimerInit = TimerInit()
    While 1
        $iCount += 1

        For $i = 1 To $iDuration
            Beep(1000, 35)
            Beep(2000, 30)
            Beep(1500, 25)
        Next

        If
$iRings > 0 And $iCount = $iRings Then Return 1
        If $iRings < 0 And TimerDiff($iTimerInit) / 1000 >= -$iRings Then Return 1

        Sleep($iWait)
    WEnd
EndFunc

Func
Quit()
    Exit
EndFunc


Creat0R 20-11-2007 14:30 682017

GuiCtrlSetOnHover() UDF!

Эта функция предназначена для управления элементами при наведении курсора мышки над ними (Hovering Process), используется точно также как и подобные функции GuiCtrlSetOnEvent().

Вот пример, создаёт алфавит из кнопок, когда проводим мышкой по кнопкам, они красятся в красный цвет, также обратите внимание - это будет работать даже если GUI окно не активно, и даже если запущен обычный MsgBox !!! (нажмите на кнопку буквы).

Код:

#include <GuiCtrlSetOnHover_UDF.au3>
Opt("GuiOnEventMode", 1)

$Btn_Color = 0x7A9DD8
$Hover_Color = 0xFF0000

$GUIMain = GuiCreate("GuiCtrlSetOnHover - Letters Demo", 570, 200)
GUISetOnEvent(-3, "Quit")

GUICtrlCreateLetters(10, 60, 18, 20)

$Close = GuiCtrlCreateButton("Close", 30, 120, 100, 30)
GUICtrlSetOnEvent($Close, "Quit")

GuiSetState()

While 1
    Sleep(100)
WEnd

Func
GUICtrlCreateLetters($iLeft, $Top, $Width=15, $Height=15)
    Local $iLeft_Begin = $iLeft
    Local $iAsc_Char = 64
    For $i = 0 To 25
        $iLeft_Begin += 20
        $iAsc_Char += 1
        GUICtrlCreateButton(Chr($iAsc_Char), $iLeft_Begin, $Top, $Width, $Height)
        GUICtrlSetOnEvent(-1, "LetterEvents")
        GUICtrlSetOnHover(-1, "Hover_Func", "Leave_Hover_Func")
        GUICtrlSetBkColor(-1, $Btn_Color)
        GUICtrlSetFont(-1, 6)
    Next
EndFunc

Func
LetterEvents()
    MsgBox(64, "Pressed", "Letter = " & GUICtrlRead(@GUI_CtrlId))
EndFunc

Func
Hover_Func($CtrlID)
    GUICtrlSetBkColor($CtrlID, $Hover_Color)
EndFunc

Func
Leave_Hover_Func($CtrlID)
    GUICtrlSetBkColor($CtrlID, $Btn_Color)
EndFunc

Func
Quit()
    Exit
EndFunc

Сам UDF скачать можно тут.
История зарождения функции на оф. форуме ;) .

Creat0R 22-11-2007 01:44 683092

Давняя проблема с кодировками...

Есть два критичных вопроса (один критичнее другого :) ) :

1) Возможно ли написать функцию, которая будет возвращать тип кодировки указанной строки?
К примеру, функция будет именоваться так: _StringGetEncoding(), и возвращать будет в соответствии с кодировкой: ANSI, Unicode, UTF-8, UTF-8 with signature.
2) Как перекодировать строку в UTF-8 with signature кодировку? это нужно для обработки текста разных кодировок, я так понял это единственная кодировка которая справляется с текстом на многих языках.

Дело в том, что мне нужно писать в лог файл, этот лог будет содержать данные, взяты с сети (названия ссылок, заголовок страниц и т.п), но при этом эти данные должны отображаться в моём GUI, для этого я использую функцию _UTF8ToUnicode (см. в примере далее), но когдя я пишу в файл в режиме UTF-8 with signature (FileOpen("log.txt", 129)), то данные пишутся некорректно, т.е если строка на русском, то либо пишет всё что до русских символов + русские символы (и дальше не пишет :( ), либо вообще не пишет русские символы, точно как показано в примере ниже:

Код:

;Запишем сначала в файл, чтобы получить строку в кодировке Unicode (строка может быть и в этой кодировке, но проверить я не могу(?))
$hFile = FileOpen(@ScriptDir & "\temp.txt", 34)
FileWrite($hFile, "Some [Тест.txt] and more test" & @CRLF)
FileClose($hFile)
$Line = FileRead(@ScriptDir & "\temp.txt")
FileDelete(@ScriptDir & "\temp.txt")

;Теперь пишем в лог (с UTF-8 with signature кодировкой), текст с русскими символами вообще не пишется :(
$Log_File = @ScriptDir & "\Log.txt"
WriteLog($Log_File, _Utf8ToUnicode($Line))
ShellExecute($Log_File)

Func WriteLog($sFile, $Line)
    Local $hFile = FileOpen($sFile, 129)
    FileWrite($hFile, $Line)
    FileClose($hFile)
EndFunc

Func
_Utf8ToUnicode($Utf8String)
    Local $BufferSize = StringLen($Utf8String) * 2
    Local $Buffer = DllStructCreate("byte[" & $BufferSize & "]")
    Local $Return = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", _
        "int", 65001, _
        "int", 0, _
        "str", $Utf8String, _
        "int", StringLen($Utf8String), _
        "ptr", DllStructGetPtr($Buffer), _
        "int", $BufferSize)
    Local $UnicodeBinary = DllStructGetData($Buffer, 1)
    Local $UnicodeHex1 = StringReplace($UnicodeBinary, "0x", "")
    Local $UnicodeString, $UnicodeHex2, $UnicodeHex3
    For $i = 1 To StringLen($UnicodeHex1) Step 4
        $UnicodeHex2 = StringMid($UnicodeHex1, $i, 4)
        $UnicodeHex3 = StringMid($UnicodeHex2, 3, 2) & StringMid($UnicodeHex2, 1, 2)
        $UnicodeString &= ChrW(Dec($UnicodeHex3))
    Next
    $Buffer = 0
    Return $UnicodeString
EndFunc

Это не идеальный пример моей проблеме, в этом примере можно сделать так чтобы всё записывалось как надо, но бывают и посложнее ситуации, с другими кодировками и на других языках.

P.S
Я верю что если найдётся решение для двух этих вопросов, то все мои (и не только) проблемы связанные с кодировками будут решены.

amel27 22-11-2007 08:33 683151

Creat0R
Цитата:

Возможно ли написать функцию, которая будет возвращать тип кодировки указанной строки?
в общем случае нет... хотя WinAPI и содержит функцию для проверки строки на "юникодовость", но даже она не дает абсолютно достоверного результата так как применяет некие статистические алгоритмы и не рекомендуется к использованию... собственно поэтому и придумали сигнатуры, чтобы была возможность надежно определить кодировку файла
Цитата:

Как перекодировать строку в UTF-8 with signature кодировку?
из какой кодировки и куда?.. если из ANSI в файл то штатным FileWrite() с флагом 128... если из UTF-8 в файл, то FileWrite() с флагом 16 и предварительной записью сигнатуры в начало файла при его инициализации... или имелось ввиду что-то другое?

И еще - я так и не понял зачем тебе понадобился юникод если ты работаешь только в UTF-8? :dont-know

Creat0R 22-11-2007 09:01 683163

amel27,
Цитата:

из какой кодировки и куда?
Из неизвестной, строку получаю с разных источников, именно поэтому мне и нужна функция для определения кодировки.

А строка будет отображаться в ГУИ, и далее записываться в файл. Кстати, юникодная строка в Status Bar'е отображается некоректно, когда таже строка нормально отображается в других элементах гуи... но это не так уж важно.

Цитата:

зачем тебе понадобился юникод если ты работаешь только в UTF-8?
Мне он вообще не нужен, я вообще не понимаю зачем столько кодировок придумали (знаю вроде зачем, но не понимаю :) ), это строка которую я получаю (программно) с сети, кодировка там бывает разная :(

amel27 22-11-2007 10:40 683209

Creat0R
Цитата:

строку получаю с разных источников
ИМХО единственный выход - копать в сторону параметров самих источников строк, к примеру для файла - сигнатура, для браузера - параметры отображаемой страницы (в меню же есть, значит можно как-то и программно получить кодировку) ну и т. д.

ADD: да, еще надо учитывать особенности API которым производится чтение строк т.е. по ходу передачи строка может неожиданно сменить свою кодировку

Цитата:

Мне он вообще не нужен
тогда зачем _Utf8ToUnicode()?.. Во-первых, твоя функция переводит не в юникод, а в обычный ANSI... Во-вторых, в качестве параметра ты подаешь вместо UTF-8 обычную (ANSI) строку поэтому часть текста, отличная от ASCII интерпретируется неверно.

З.Ы. строго говоря, UTF-8 и UTF-16 имеют одну кодировку (юникодовую) но разное двоичное представление

Maza Faka 22-11-2007 17:17 683472

Как создать одномерный, 24-ёх элементный массив со случайными числами от 1 до 12, которые должны каждый раз располагаться в случайном порядке, причём у каждого числа должна быть пара.
Сделал так:
Код:

#include <Array.au3>

Global $ImgArray1[12]
RandomArray($ImgArray1)

Global $ImgArray2[12]
RandomArray($ImgArray2)

Global $MainArray[1]

For $i = 0 To 11
    _ArrayAdd($MainArray, $ImgArray1[$i])
    _ArrayAdd($MainArray, $ImgArray2[$i])
Next

$ImgArray1 = 0
$ImgArray2 = 0

_ArrayDisplay($MainArray)

Func RandomArray(ByRef $retArray)
    For $i = 0 To UBound($retArray) -1
        While 1
            $number = Random(1, 12, 1)
            $search = _ArraySearch($retArray, $number)
            If @error Then ExitLoop
            WEnd

            $retArray[$i] = $number
        Next
    EndFunc

, но получилось громоздко и некрасиво, может, кто-нибудь подкинет идею, как можно сделать покрасивее?

Creat0R 23-11-2007 00:52 683694

Вложений: 1
amel27,
Ок, Прикрепляю реальный пример, вывод в гуи, нормально, запись в файл - не нормально :(.

Обойти можно если использовать функцию кодировки только для показа в ГУИ, но бывают и другие строки (всё зависит от запроса поиска), которые нормально отображатся в ГУИ и без перекодировки, но в файл попадут неверно... вот и не могу найти идеальное решение... как говорится - Catch 22 ;)


P.S
Этот код, это часть моего проэкта YouTube Download Center! (исходники и необходимые ресурсы там прилагаются).


Maza Faka
Цитата:

24-ёх элементный массив со случайными числами от 1 до 12, которые должны каждый раз располагаться в случайном порядке
Кажется ты(?) уже задавал точно такой вопрос :)
И я даже пример вроде привёл (сорри, найти не удалось).

amel27 23-11-2007 06:24 683724

Цитата:

Цитата Creat0R
Прикрепляю реальный пример, вывод в гуи, нормально »

как я себе представляю вывод в юникоде:
Код:

#include <A3LConstants.au3>

; ...
; Это кусок скрипта между "Case $Get_Button" и "EndSwitch"

            GUICtrlSetData($StatusLabel, "Please wait...")
            $VNameUTF8 = GetName("fQyYG-1nhMA") ;Это видео ролик с YouTube (имя ролика на иврите)
            $VNameUTF16= _Utf8ToUnicode($VNameUTF8) ; Возвращает тип BINARY
            $struUTF16 = DllStructCreate("byte["&BinaryLen($VNameUTF16)&"];byte[2]") ; Структура для UTF-16
            DllStructSetData($struUTF16, 1, $VNameUTF16) ; Заполняем структуру
            GUICtrlSendMsg($Data_Input, $WM_SETTEXT, 0, DllStructGetPtr($struUTF16)) ; Устанавливаем текст контрола
            WriteToLog("Video Name: [" & $VNameUTF8 & "] and data")
            GUICtrlSetData($StatusLabel, "")
; ...

; Функция возвращает тип BINARY

Func _Utf8ToUnicode($UTF8String)
    Local $ret = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", _
        "int", 65001, _
        "int", 0, _
        "str", $UTF8String, _
        "int", -1, _
        "ptr", 0, _
        "int", 0)
    Local $buf = DllStructCreate("byte[" & $ret[0]*2 & "]")
    $ret = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", _
        "int", 65001, _
        "int", 0, _
        "str", $UTF8String, _
        "int", -1, _
        "ptr", DllStructGetPtr($buf), _
        "int", $ret[0])
    Return DllStructGetData($buf, 1)
EndFunc

Цитата:

Цитата Creat0R
запись в файл - не нормально »

хм, сигнатура должна быть всего одна в начале файла, а у тебя добавляется перед каждой строкой... поэтому лучше не доверять AutoIT и сделать все самому, типа:
Код:

Func WriteToLog($Line)
    Local $hLogFile, $Log_File = StringTrimRight(@ScriptFullPath, 3) & "log"
    Local $GetDateTime = @HOUR & ":" & @MIN & ":" & @SEC & ", " & @MDAY & "/" & @MON & "/" & @YEAR

        If Not FileExists($Log_File) Then
        $hLogFile = FileOpen($Log_File, 17)
        FileWrite($Log_File, chr(0xEF) & chr(0xBB) & chr(0xBF) & _
        "========================================================================" & @CRLF & _
        "Log File for <" & @ScriptName & "> started at: " & $GetDateTime & @CRLF & _
        "========================================================================" & @CRLF & @CRLF)
    Else
        $hLogFile = FileOpen($Log_File, 17)
    EndIf

    FileWrite($hLogFile, StringToBinary("[" & $GetDateTime & "]" & @CRLF,4))
    FileWrite($hLogFile, StringToBinary(">> ",4) & Binary($Line) & StringToBinary(@CRLF & @CRLF,4))
    FileClose($hLogFile)
EndFunc


Creat0R 23-11-2007 08:38 683749

amel27,
Спасибо большое!
С этим примером всё отлично работает, но на самом деле всё намного сложнее, в лог при некоторых обстоятельствах пишется и путь к файлу вместе с именем с сети (скачивается видео с сети), если путь содержит кириллицу, или теже ивритские символы (или вообще и те и другие), то в файле получается полная каша :(

А также мне будет немного сложно адаптировать подобный метод, GuiCtrlSendMsg() работает с обычными контролями, а что делать со StatusBar к примеру? (не Label) - возможно SendMessage, но опять таки, это не надёжно, StatusBar не полностью поддерживает юникод. А также обновлять данные нужно по несколько раз, в зависимости от отображаемых элементов (там у меня есть динамичная панель которая скрывается опционально)...

Кстати, есть ещё функция StringToUTF() (без API, чистая перекодировка символов), можно попробовать путь кодировать отдельно, а имя с сети отдельно... но вот если бы была функция для определения кодировки строки, то это упростило бы работу намного.

В общем спасибо ещё раз, попробую найти хоть какой то компромис.

amel27 23-11-2007 09:22 683763

Цитата:

Цитата Creat0R
на самом деле всё намного сложнее »

в любом случае все нужно конвертить в UTF-16 так как это native-кодировка Windows
Цитата:

Цитата Creat0R
возможно SendMessage, но опять таки, это не надёжно »

имхо это как раз надежней... ну, можно еще "покапать на мозги" разработчикам, может добавят в GUI-функции поддержку текста не только в ANSI, но и в UTF-16 (тип Binary)
Цитата:

Цитата Creat0R
StatusBar не полностью поддерживает юникод »

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

Цитата Creat0R
можно попробовать путь кодировать отдельно, а имя с сети отдельно... но вот если бы была функция для определения кодировки строки »

Ну не может быть такой функции (кроме частных случаев), так что единственный выход я уже озвучивал - скурпулезный учет всех источников и их раздельная кодировка... примерно так я и делал в функции WriteToLog()
Цитата:

Цитата Creat0R
есть ещё функция StringToUTF() »

хм, у меня еще нет... может версию обновить?

Creat0R 23-11-2007 13:25 683892

amel27,
Цитата:

можно пример?
В том скрипте что я прикрепил, замени создание строки состояния (Label) на настоящий StatusBar, и полученное имя видео отобрази в этом статус баре, всё что отобразиться так это ????????.

Цитата:

хм, у меня еще нет
Это самопальная функция :biggrin: - Вот:

Код:

Func StringToUTF($String)
    Local $sResult = "", $iCode
    Local $VarUTFArr = StringSplit($String, "")

    For $i = 1 To $VarUTFArr[0]
        $iCode = Asc($VarUTFArr[$i])

        Select
            Case
$iCode >= 192 And $iCode <= 239
                $VarUTFArr[$i] = Chr(208) & Chr($iCode - 48)
            Case $iCode >= 240 And $iCode <= 255
                $VarUTFArr[$i] = Chr(209) & Chr($iCode - 112)
            Case $iCode = 168
                $VarUTFArr[$i] = Chr(208) & Chr(129)
            Case $iCode = 184
                $VarUTFArr[$i] = Chr(209) & Chr(145)
            Case Else
                $VarUTFArr[$i] = Chr($iCode)
        EndSelect

        $sResult &= $VarUTFArr[$i]
    Next

    Return
$sResult
EndFunc


Maza Faka 23-11-2007 17:30 684106

Creat0R,
Цитата:

Цитата Creat0R
Кажется ты(?) уже задавал точно такой вопрос
И я даже пример вроде привёл (сорри, найти не удалось). »

Да, я уже задавал такой вопрос, но твоё решение не отвечало одному из требований задачи (сорри не могу вспомнить какому именно требованию, так, как тоже не смог найти твой пост) Если не трудно выложи своё решение ;)

Drsmog 23-11-2007 20:06 684194

Как выполнить такое условие если в блокноте, строке есть знак + тогда выполнить дествие ???

Creat0R 24-11-2007 06:41 684400

Maza Faka,
Цитата:

не смог найти твой пост
Google рулит (при правильном запросе: 24 +массив site:forum.oszone.net ;) )...

http://forum.oszone.net/thread-60616...tml#post666511

Там задача была похожая, только от 1 до 13 :) ..
И массив я сделал двумерный (мне кажется так легче), но то что ты сделал в твоём примере, можно сделать двумя циклами (плюс вспомагательная функция):


Код:

#include <Array.au3> ;Только для _ArrayDisplay()

Global $MainArray = GetArray(24, 12)

_ArrayDisplay($MainArray)

Func GetArray($iElements = 24, $iRandom = 12)
    Local $iRandNum, $avRetArray[$iElements + 1]

    For $i = 1 To $iElements
        $iRandNum
= Random(1, $iRandom, 1)
        If _FindInArray($avRetArray, $iRandNum) = -1 Then
            $avRetArray[$i] = $iRandNum
        Else
            While
_FindInArray($avRetArray, $iRandNum) > 1
                $iRandNum = Random(1, $iRandom, 1)
            WEnd
            $avRetArray[$i] = $iRandNum
        EndIf
    Next


    $avRetArray[0] = $iElements
    Return $avRetArray
EndFunc

Func
_FindInArray(ByRef $avArray, $StrToFind)
    Local $iRetCount = 0
    For $i = 1 To UBound($avArray)-1
        If $avArray[$i] <> "" And $avArray[$i] = $StrToFind Then $iRetCount += 1
    Next
    If
$iRetCount <> 0 Then Return $iRetCount
    Return -1
EndFunc


Drsmog
Цитата:

если в блокноте, строке есть знак + тогда выполнить дествие
Примерно так:

Код:

$NotepadTitle = "[CLASS:Notepad]"

Run(@WindowsDir & "\Notepad.exe")
WinWait($NotepadTitle)

ControlSetText($NotepadTitle, "", "Edit1", "Просто текст с + ") ;Задаём текст с "+"

$EditText = ControlGetText($NotepadTitle, "", "Edit1")

If StringInStr($EditText, "+") Then
    ;Делаем наше действие ;)
    MsgBox(0, "", "Это могло бы быть ваше действие ;)")
EndIf

;Просто закроем то что открыли
WinClose($NotepadTitle)
WinWaitClose($NotepadTitle, "", 1)
If WinActive("[CLASS:#32770]", "&") Then ControlClick("[CLASS:#32770]", "&", "Button2")


Drsmog 24-11-2007 15:24 684554

Огроменное спасибо !!!!!!!!!!!! :up :yahoo: :clapping:

fak1r 24-11-2007 18:12 684610

Такая вот у меня проблемка:
Есть один сайт на который нужно закачивать картинки, а что бы их закачать нада сначала пройти авторизацию вводом логина и пароля.
Так вот нельзя ли как нить сделать прогу на автоите для заливки картинок на этот сайт. очень нужно, а также необходим получать ссылки на залитые на сайт картинки.

PS вот сам сайт www.nn.ru
PSS вот тут http://www.nn.ru/services/personal-photo/ после регистрации будет галерея в котрую и нужно лить картинки.
Помогите пожалуйста!!!!
Заранее спасибо.

Drsmog 24-11-2007 20:37 684688

Нужна помощь !!!!!!!! Пажалуйста кто нибуть !!!!!!!!!!!! :help:

а если в блокноте, строке есть знак + тогда выполнить дествие, а если нет + тогда естественно другое дествие


я так примерно написал а почему то тока плюс проверяет

$NotepadTitle = "[CLASS:Notepad]"


WinWait($NotepadTitle)



$EditText = ControlGetText($NotepadTitle, "", "Edit1")

If StatusbarGetText ( $EditText,"+" ) Then
Send('{DOWN}')
;Делаем наше действие ;)
MsgBox(0, "", "ПЛЮС")
ElseIf StatusbarGetText ( $EditText, "-" ) Then
Send('{DOWN}')
;Делаем наше действие ;)
MsgBox(0, "", "МИНУС")


EndIf

Мне надо так
если +(тока в строке) тогда дествие
если -(тока в строке) тогда другое дествие
если ?(тока в строке) тогда другое дествие
ну и т.д

Creat0R 25-11-2007 00:24 684774

fak1r,
Цитата:

нельзя ли как нить сделать прогу на автоите для заливки картинок на этот сайт
Если помучаться, то наверняка можно, смотри в сторону TCP-функции, ну или через библиотеку IE.au3.

Drsmog,
Цитата:

StatusbarGetText
А при чём тут StatusBar? :unsure:

Цитата:

Мне надо так
Код:

$NotepadTitle = "[CLASS:Notepad]"

Run(@WindowsDir & "\Notepad.exe")
WinWait($NotepadTitle)

ControlSetText($NotepadTitle, "", "Edit1", "Просто текст с - ") ;Задаём текст с "-"

$EditText = ControlGetText($NotepadTitle, "", "Edit1")

Select
    Case
StringInStr($EditText, "+") And Not StringRegExp($EditText, "-|\?")
        Action_Plus()
    Case StringInStr($EditText, "-") And Not StringRegExp($EditText, "\+|\?")
        Action_Minus()
    Case StringInStr($EditText, "?") And Not StringRegExp($EditText, "\-|\+")
        Action_Question()
EndSelect

;Просто закроем то что открыли
WinClose($NotepadTitle)
WinWaitClose($NotepadTitle, "", 1)
If WinActive("[CLASS:#32770]", "&") Then ControlClick("[CLASS:#32770]", "&", "Button2")

Func Action_Plus()
    ;Тут что-то делаем
    MsgBox(0, "", "ПЛЮС")
EndFunc

Func
Action_Minus()
    ;Тут делаем что-то другое
    MsgBox(0, "", "МИНУС")
EndFunc

Func
Action_Question()
    ;Тут делаем что-то другое
    MsgBox(0, "", "ВОПРОС")
EndFunc

Я только не уверен, что значит “тока в строке”?

Drsmog 25-11-2007 09:51 684851

Этот скрипт проверяет всю страницу в блокноте на наличии знаков, а надо чтоб искал тока в строчке, допустим в блокноте
стоят знаки в столбик.
+
-
?
тогда этот скрипт несрабатывает.
Надо чтоб возле каждого символа писал слово
например
+ это плюс
- это минус
? а это вопрос

fak1r 25-11-2007 11:36 684886

Цитата:

Цитата Creat0R
fak1r,
Цитата:нельзя ли как нить сделать прогу на автоите для заливки картинок на этот сайт
Если помучаться, то наверняка можно, смотри в сторону TCP-функции, ну или через библиотеку IE.au3. »

То то и оно я не умею работать с TCP , а как спомощью IE.au3 авторизирваться на сайте тоже не знаю. :(

fak1r 25-11-2007 11:51 684895

да и я считаю что ТСР гораздо лучше будет работать чем ИЕ.ау3

Creat0R 25-11-2007 16:22 685017

Drsmog,
Цитата:

Этот скрипт проверяет всю страницу в блокноте на наличии знаков
Задача была поставлена значит неясно...


Цитата:

Надо чтоб возле каждого символа писал слово
А это уже совсем другая задача ;)

Что то вроде этого:

Код:

$NotepadTitle = "[CLASS:Notepad]"

Run(@WindowsDir & "\Notepad.exe")
WinWait($NotepadTitle)

ControlSetText($NotepadTitle, "", "Edit1", "+" & @CRLF & "-" & @CRLF & "?")

$EditText = ControlGetText($NotepadTitle, "", "Edit1")

;Разделим весь текст из блокнота по строчкам, и заменим в каждой строчке по надобности
$SplitText = StringSplit($EditText, @CRLF)
$NewText = ""
For $i = 1 To UBound($SplitText)-1
    If StringInStr($SplitText[$i], "+") Then
        $SplitText[$i] = StringReplace($SplitText[$i], "+", "+ это плюс")
    ElseIf StringInStr($SplitText[$i], "-") Then
        $SplitText[$i] = StringReplace($SplitText[$i], "-", "- это минус")
    ElseIf StringInStr($SplitText[$i], "?") Then
        $SplitText[$i] = StringReplace($SplitText[$i], "?", "? это вопрос")
    EndIf
    $NewText &= $SplitText[$i] & @CRLF
Next

ControlSetText($NotepadTitle, "", "Edit1", $NewText)

MsgBox(0, "", "Сделано!")

;Просто закроем то что открыли
WinClose($NotepadTitle)
WinWaitClose($NotepadTitle, "", 1)
If WinActive("[CLASS:#32770]", "&") Then ControlClick("[CLASS:#32770]", "&", "Button2")


fak1r,
Увы, мне тоже никогда не приходилось производить авторизацию на сайте/форуме, я поищю на оф. форуме, возможно там кто-то уже делал подобное...

Drsmog 25-11-2007 17:41 685051

Спасибо !!! Ну вроде то что надо

Creat0R 25-11-2007 23:20 685190

Два вопроса на повестке дня:

1) Возможно ли отключить (временно) устройство ввода (клавиатуру)? позже нужно будет его включить, без “побочных эффектов” :)

2) Как определить, установлен ли Flash Player для Internet Explorer?
Обсуждение на оф. форуме зашло в тупик, функция чуть ниже возвращает True, однако при открытии странички с роликом на YouTube к примеру, получаю предупреждение о том что нужно установить Flash Player...

Код:

Func ShockWavePlayer_Installed()
    Local $sObjRead = RegRead("HKCR\CLSID\{D27CDB6E-AE6D-11cf-96B8-444553540000}\ProgID", "")
    Local $sFlashObj = ObjCreate($sObjRead)
    If Not IsObj($sFlashObj) Then Return False
    Return True
EndFunc


Creat0R 26-11-2007 04:28 685240


25 ноября, 2007 - v3.2.10.0
  • ВНИМАНИЕ: Следующий выпуск AutoIt будет иметь следующие изменения, которые нарушат обратную совместимость:
  • FileInstall() будет переписана с нуля. FileInstall() функция останется, но не будет действовать таким же образом как ранее. Новые реализации появятся в будущих бета версиях.
  • Библиотека GUIConstants.au3 стала излишней, она будет идентична GUIConstantsEx.au3. Самый простой способ преодалеть это изменение, заключается в замене всех GUIConstants.au3 на GUIConstantsEx.au3, затем запустите Au3Check, и включите все недостающие библиотеки и константы пока все ошибки не будут исчерпаны.
    Это изменение желательно сделать сейчас, оно не требует ожидания будущей бета-версии. В какой-то момент в ходе следующей бета-версии, GUIConstants.au3 станет идентичной GUIConstantsEx.au3, и тогда скрипты использующие GUIConstants.au3 могут работать некорректно (в зависимости от констант, которые используются в скриптах).
  • Изменено: DllCall() Новый метод передачи типов ByRef используя *.
  • Изменено: DllCall(): short_ptr, long_ptr, и int_ptr типы запрещены. Используйте short*, long* и int* соответственно.
  • Изменено: Сняты ограничения на Execute().
  • Изменено: PCRE движок регулярных выражений обновлен до 7,4.
  • Добавлено: 64-битные (x64) версии AutoIt, Aut2Exe, Au3Info и AutoItX (см. здесь).
  • Добавлено: DllCallbackRegister(), DllCallbackGetPtr() и DllCallbackFree() [Ураааа!].
  • Добавлено: DllCall() теперь принимает двойные типы, int64, uint64, wparam и lparam.
  • Добавлено: SendKeepActive().
  • Добавлено: ControlTreeView() [Ураааа!].
  • Добавлено: ProcessGetStats().
  • Добавлено: VarGetType() [Ураааа!].
  • Добавлено: макрос @AutoItX64.
  • Добавлено: Au3Info: Информация идентификатора для окон и контролей (элементов GUI).
  • Добавлено: DllStructCreate() добавлен ключ "align" для установки согласования структуры.
  • Исправлено: Control...() функции при использовании CLASS и TEXT вместе иногда приводит к неправильному результату.
  • Исправлено: Control ...() функции при использовании CLASSNN иногда приводит к неправильному результату.
  • Исправлено: Предпросмотр панели задач в Windows Vista вызывает проблемы с соответствием (поиском) окон.
  • Исправлено: $var = $var не выводило ошибку если переменная $var не обьявлена.
    Исправлено: GUICtrlSetImage() регрессии с изменением размера в 3.2.4.9.
  • Исправлено: GUICtrlCreateListView() без колонок (Columns).
  • Исправлено: Экстра уведомление при использовании цветной кнопки.
  • Исправлено: IniReadSectionNames() для секции без имени ( [] ).
  • Исправлено: Opt( "WinTitleMatchMode", Default) фатальная ошибка.
  • Исправлено: GUICtrlSetStyle() с $ES_READONLY плохой $WS_TABSTOP.
  • Исправлено: AutoIt вылетает при выходе, если в функциях Win...() COM-объект используется как заголовок.
  • Исправлено: ProcessExists() с сервисным процессом под Win2K.
  • Исправлено: DefPushButton поведение [Ураааа!].
  • Исправлено: ControlCommand(SelectString) порядок отбора.
  • Исправлено: Массив не может иметь 2 ^ 24 записей (элементов).
  • Исправлено: GuiCreateMenu() на окна без заголовка и без области клиентской части.
  • Исправлено: WinWaitActive() иногда не срабатывает после WinActivate().
  • Исправлено: При использовании GUIRegisterMsg() в цикле, не срабатывает отмена ригестрации.
  • Исправлено: Фокус на ES_READONLY Edit контроля.
  • Исправлено: Многочисленные исправления в UDF'ах.

Перевод by CreatoR (мой), мод на перевод от Google ;)






P.S

Скажу от себя, что в этой версии, как я и писал ранее, разработчики сделали поворот в 360 градусов, изменили многие функции, добавили новые. Да, теперь чтобы перейти на новую версию, нужно будет поменять многие (если не все) наши скрипты, я если честно не спешу этого делать, т.к у меня их слишком много :) - разработчики знают о том, что подобные перемены проблематичны скриптерам, но понаблюдав за их действиями (на оф. форуме), можно понять, что такие перемены оправданы, тем более что это принесёт пользу в будущем, ведь рано или поздно нужно что-то менять, улучшать, и лучше поменять всё(?) одним махом, чем каждый раз по чуть чуть, мучаясь переписывая скрипты.

Happy Scripting!!!

amel27 26-11-2007 05:15 685243

Creat0R
Цитата:

при открытии странички с роликом на YouTube к примеру, получаю предупреждение о том что нужно установить Flash Player »
не знаю как надо, но по тому линку который ты указал проверка производится по алгоритму (вытащил из HTML):
Код:

MsgBox(0, "", ShockwaveDetectAxVer(0))

; $iVerReq=0 - возврат текущей версии
; $iVerReq>0 - соответствие минимальным требованиям к версии

Func ShockwaveDetectAxVer($iVerReq)
    Local $i, $iVer, $sVer
    For $i=8 To 1 Step -1
        $sVer = GetShockwaveVer($i)
        If $sVer <> '0.0' Then
            $iVer = Number($sVer)
            If $sVer='1.0' Then $iVer = 6
            If $iVerReq Then Return $iVer>=$iVerReq
            Return $iVer
        EndIf
        If
$iVerReq Then Return False
        Return
0
    Next
EndFunc

Func
GetShockwaveVer($iVer)
    Local $swControl=ObjCreate("SWCtl.SWCtl." & $iVer), $sVer = '0.0'
    If IsObj($swControl) Then
        $sVer = $iVer + '.0'
        $sVer = $swControl.ShockwaveVersion("")
        Return $sVer
    EndIf
EndFunc


amel27 26-11-2007 10:34 685344

Creat0R
Цитата:

Возможно ли отключить (временно) устройство ввода (клавиатуру)? »
на базе скрипта-кейлоггера получилось вот что:
Код:

; Скрипт для версии v3.2.10.0

Global Const $WH_KEYBOARD_LL = 13

Global $hKeyProc = DllCallbackRegister ("_KeyProc", "int", "int;ptr;ptr")
Global $hmod = DllCall("kernel32.dll","hwnd","GetModuleHandle","ptr",0)
Global $hHook = DllCall("user32.dll","hwnd","SetWindowsHookEx","int", $WH_KEYBOARD_LL, _
    "ptr", DllCallbackGetPtr($hKeyProc), "hwnd", $hmod[0], "dword", 0)

MsgBox(4096, "", 'После нажатия "Ok" клавиатура будет заблокирована на 10 сек.')
Sleep(10000)
MsgBox(4096, "", 'Клавиатура разблокирована!')

OnAutoItExit()
Exit

Func
_KeyProc($nCode, $wParam, $lParam)
    If $nCode < 0 Then
        $ret = DllCall("user32.dll","long","CallNextHookEx","hwnd", $hHook[0], _
            "int",$nCode, "ptr", $wParam, "ptr", $lParam)
        Return $ret[0]
    EndIf
    Return
1
EndFunc

Func
OnAutoItExit()
    DllCall("user32.dll","int","UnhookWindowsHookEx","hwnd",$hHook[0])
    DllCallbackFree($hKeyProc)
EndFunc


Creat0R 26-11-2007 11:13 685370

amel27,
Спасибо, но функция всегда возвращает 0 :( , у меня на компе установлен Flash Player.
Объекта SWCtl.SWCtl у меня нет, возможно это не стандартный объект...

Но вот piccaso вроде нашёл решение, у меня, где есть флэш (для IExplorer), возвращает 9, на компе без флэша пока нет возможности проверить:

Код:

Global $oErr = ObjEvent("AutoIt.Error","_ComError")
ConsoleWrite(_FlashMajorVersion()  & @CRLF)

Func _FlashMajorVersion()
    Local $oSwf,$sVersion
    $oSwf
= ObjCreate("ShockwaveFlash.ShockwaveFlash")
    if @error Then Return 0 ; No flash at all
    $oSwf.AllowScriptAccess = "always"
    $sVersion = $oSwf.GetVariable("$version")
    if @error Then
      $oSwf = ObjCreate("ShockwaveFlash.ShockwaveFlash.3")
      if @error Then
        $oSwf = ObjCreate("ShockwaveFlash.ShockwaveFlash.2")
        if @error then return 0
        Return 2
      EndIf
      Return
3
    EndIf
    $sVersion = StringTrimLeft($sVersion,3)
    $sVersion = StringLeft($sVersion,StringInStr($sVersion,",")-1)
    Return Number($sVersion)
EndFunc

Func
_ComError()
  ; Just set @error, the script will handle it...
  Local $iErr = $oErr.number
  if $iErr = 0 Then $iErr = -1
  SetError($iErr)
EndFunc

Цитата:

на базе скрипта-кейлоггера получилось вот что
:yahoo: Получилось то что надо!!! я правда поменял концепцию примера, во-первых потому то ещё не ставил последнюю версию, а во-вторых потому что мне нужно иметь возможность включать/выключать клавиатуру по запросу (не при выходе из скрипта)...

Код:

#include <DllCallBack.au3>
Global $hWinHook

$CallBackProc
= TogglePlugKeyBoard()
MsgBox(4096, "", "Клавиатура заблокирована, нажмите OK для разблокирования.")

TogglePlugKeyBoard($CallBackProc)
MsgBox(4096, "", "Клавиатура разблокирована!")

Exit

Func
TogglePlugKeyBoard($hCallProc=0)
    If IsArray($hWinHook) Then
        DllCall("user32.dll", "int", "UnhookWindowsHookEx", "hwnd", $hWinHook[0])
        _DllCallBack_Free($hCallProc)
        Return 0
    EndIf

    Local Const
$WH_KEYBOARD_LL = 13
    Local $hKeyProc = _DllCallBack("_KeyProc", "int;ptr;ptr")
    Local $hMod = DllCall("kernel32.dll", "hwnd", "GetModuleHandle", "ptr", 0)
    $hWinHook = DllCall("user32.dll", "hwnd", "SetWindowsHookEx", _
        "int", $WH_KEYBOARD_LL, _
        "ptr", $hKeyProc, _
        "hwnd", $hMod[0], _
        "dword", 0)
    Return $hKeyProc
EndFunc

Func
_KeyProc($nCode, $wParam, $lParam)
    If $nCode < 0 Then
        Local
$iRet = DllCall("user32.dll", "long", "CallNextHookEx", "hwnd", $hWinHook[0], _
            "int", $nCode, _
            "ptr", $wParam, _
            "ptr", $lParam)
        Return $iRet[0]
    EndIf
    Return
1
EndFunc

Но это мелочи, главное что оно блокирует все(?) клавишы, на любой клавиатуре :)

P.S
Кстати, функция OnAutoItExit вызывается по умолчанию, её не обязательно вызывать ( OnAutoItExit() ).

amel27 27-11-2007 03:25 685870

Creat0R
Цитата:

функция всегда возвращает 0 »
была ошибка - исправил... чес говоря не проверял - просто тупо сконвертировал
Цитата:

Объекта SWCtl.SWCtl у меня нет, возможно это не стандартный объект »
не знаю, у меня после установки плеера объект появился... просто интересно - разные сайты используют разный код для обнаружения... попадался еще один вариант, который был приведен piccaso и использует свойство ShockwaveVersion объекта SWCtl.SWCtl :dont-know

Цитата:

функция OnAutoItExit вызывается по умолчанию, её не обязательно вызывать ( OnAutoItExit() )
спасибо, буду знать :)

Creat0R 27-11-2007 04:07 685874

amel27,
Цитата:

у меня после установки плеера объект появился
И ещё у многих... видимо это что-то специфичное/системно-зависимое/условное :)

Я на днях (максимум в субботу) проверю скрипт от piccaso, мне кажется что он сработает (вернёт 0 или ошибку).

По поводу примера для клавы... есть подозрение что это тот же BlockInput, только для клавиатуры, т.к Ctrl Alt Del всё же работает (клаву не включает, но вызывает Диспетчер задач)... нет, я конечно не хочу блокировать и эти клавиши, но просто интересно, действительно ли блокируются все клавиши кроме этих, как бы это проверить точно?

amel27 27-11-2007 05:10 685878

Creat0R
Цитата:

Ctrl Alt Del всё же работает »
гы, а эта комбинация неотключаемая aka "in design" :) - требование безопасности

Цитата:

В том скрипте что я прикрепил, замени создание строки состояния (Label) на настоящий StatusBar, и полученное имя видео отобрази в этом статус баре »
подправил штатную _GUICtrlStatusBar_SetText() для случая юникода...
если на вход подать результат _Utf8ToUnicode() ту что приводил выше, то текст отобразится корректно... там номер сообщения отличается на 10 ;)
Код:

; Вариант установки текста статус-бара для юникода
; $binUTF16 - текст, тип Binary


Func _GUICtrlStatusBar_SetUTF16($hWnd, $binUTF16, $iPart = 0, $iUFlag = 0)
    If $Debug_SB Then _GUICtrlStatusBar_ValidateClassName($hWnd)
    Local $ret, $struct_String, $sBuffer_pointer, $struct_MemMap, $Memory_pointer
    $struct_String
= DllStructCreate("byte[" & BinaryLen($binUTF16) & "];byte[2]")
    $sBuffer_pointer = DllStructGetPtr($struct_String)
    DllStructSetData($struct_String, 1, $binUTF16)
    If _GUICtrlStatusBar_IsSimple($hWnd) Then $iPart = $SB_SIMPLEID
    If _WinAPI_InProcess($hWnd, $__ghSBLastWnd) Then
        $ret = _SendMessage($hWnd, $SB_SETTEXT+10, BitOR($iPart, $iUFlag), $sBuffer_pointer, 0, "wparam", "ptr")
    Else
        $Memory_pointer = _MemInit($hWnd, StringLen($sText) + 1, $struct_MemMap)
        _MemWrite($struct_MemMap, $sBuffer_pointer)
        $ret = _SendMessage($hWnd, $SB_SETTEXT+10, BitOR($iPart, $iUFlag), $Memory_pointer, 0, "wparam", "ptr")
        _MemFree($struct_MemMap)
    EndIf
    Return
$ret <> 0
EndFunc


Creat0R 27-11-2007 05:50 685884

amel27,
Цитата:

эта комбинация неотключаемая aka "in design"
Я как бы знал это, но мне не нужно их отключать, а просто убедиться что всё остальное действительно отключено... у тебя случайно на клаве нет лишних кнопочек? :) например Power/Sleep которая обычно делает то, что на ней написано :biggrin:

Цитата:

подправил штатную _GUICtrlStatusBar_SetText() для случая юникода...
Эх, не дано мне пока этим воспользоваться, я не ставил ещё последнюю версию, боюсь :cry: - у меня много скриптов, всё мгновенно поламется, желание сразу пропадёт что либо там менять :lazy: .

Но всё ровно конечно спасибо, когда обновлюсь (не скоро видимо) оно мне пригодится.

amel27 27-11-2007 09:14 685913

Creat0R
Цитата:

у тебя случайно на клаве нет лишних кнопочек? например Power/Sleep »
угу, кнопки питания не блокируются... на MSDN по этому поводу написано, что эти события не доходят до API, т.е. их нужно перехватывать раньше - в драйвере клавиатурного фильтра: How to disable the keyboard Sleep button with a filter driver... хотя можно попытаться порулить политикой питания, на ентот счет есть свои API и, к примеру, менять эти настройки на время блокировки :)
Цитата:

я не ставил ещё последнюю версию »
не вопрос - вот вариант для версии 3.2.8.1, там в общем все довольно просто... объединил заодно две функции в одну - теперь кодировку текста можно задавать прямо в параметрах (для текста в UTF8 - 65001)... Кстати, обнаружил что, в 10-ке алгоритм более продуманный в плане производительности.
Код:

Func _GUICtrlStatusBarSetTextEx($h_StatusBar, $s_Data = "", $i_Part = 0, $iCode = 0)
    If Not IsHWnd($h_StatusBar) Then $h_StatusBar = HWnd($h_StatusBar)
    If Not _IsClassName ($h_StatusBar, "msctls_statusbar32") Then Return SetError(-1, -1, False)
    Local $ret = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", _
        "int", $iCode, "int", 0, _
        "str", $s_Data, "int", -1, _
        "ptr", 0, "int", 0)
    If $ret[0]=0 Then Return SetError(-1, -1, 0)
    Local $struct_String = DllStructCreate("byte[" & $ret[0]*2+2 & "]")
    Local $sBuffer_pointer = DllStructGetPtr($struct_String)
    Local $struct_MemMap
    Local $Memory_pointer = _MemInit ($h_StatusBar, DllStructGetSize($struct_String), $struct_MemMap)
    If @error Then
        _MemFree ($struct_MemMap)
        Return SetError(-1, -1, 0)
    EndIf
    $ret = DllCall("Kernel32.dll", "int", "MultiByteToWideChar", _
        "int", $iCode, "int", 0, _
        "str", $s_Data, "int", -1, _
        "ptr", DllStructGetPtr($struct_String), "int", $ret[0])
    If $ret[0]=0 Then
        _MemFree ($struct_MemMap)
        Return SetError(-1, -1, 0)
    EndIf
    _MemWrite ($struct_MemMap, $sBuffer_pointer)
    If @error Then
        _MemFree ($struct_MemMap)
        Return SetError(-1, -1, 0)
    EndIf
    $ret = _SendMessage($h_StatusBar, $SB_SETTEXT+10, $i_Part, $Memory_pointer)
    If @error Then
        _MemFree ($struct_MemMap)
        Return SetError(-1, -1, 0)
    EndIf
    _MemFree ($struct_MemMap)
    Return $ret
EndFunc  ;==>_GUICtrlStatusBarSetTextEx


SvetlanaK 27-11-2007 09:15 685914

Здравствуйте!
вклиниваюсь в переписку по очень важному для меня вопросу....
не знает ли кто-то как решить такую проблему. Речь идет об открытии файла эксель.
$sFilePath="C:\фйлик.xls"
$oExcel_Pr_M = _ExcelBookOpen($sFilePath)
открываю файл Exel. Но он имеет сязи с другими книгами, и при открытии всплывает предупреждение Microsoft Excel - "Эта книга содержит связи с другими источниками данных..." и три кнопки - обновить, не обновлять и справка.
В этот момент скрипт останавливается!!!! пока я руками не сделаю выбор...это же неправильно( пробовала послать Send - бесполезно! причем как-то странно реагирует на посыл, раз сделает как надо, раз - нет( я не понимаю в чем дело. Мне надо ответить - "не обновлять" и дальше двигаться...но на этом все встало((

Angelus 27-11-2007 09:31 685925

Прошу прощения..но ктонить может обьяснить мне тупому почему данная каманда не работаает???

Код:

Run ( @SystemDir )

SvetlanaK 27-11-2007 10:18 685948

а вы какую программу там хотите запустить? вот например это запускается без проблем
Run(@SystemDir & "\cmd.exe")

Drsmog 27-11-2007 10:38 685956

Как выслать в EXEL 2003 клавиши Ctrl+a
я делаю так send('{Ctrl}+{a}')
и несрабатывает :-((, а должно было все выделится

amel27 27-11-2007 11:03 685981

SvetlanaK,
Цитата:

Цитата SvetlanaK
Мне надо ответить - "не обновлять" »

хм, а почему "не обновлять"?.. Вот нажатие "обновлять" можно "автоматизировать" в Excel: параметры\правка\запрашивать об обновлении... Проблема в том, что скрипт простаивает ожидая завершения открытия файа, поэтому чтобы нажать на кнопку нужен уже второй скрипт... :) Можно конечно замутить аналог AdLib на CallBack, но для этого нужно знать версию AutoIT... а может все-таки "обновить"? ;)

Drsmog
Код:

send("^a")

Angelus 27-11-2007 11:21 685994

Я хочу просто открыть провадник в какойто папке...без запуска програм...неуж нада кокуюто прогу оязательно??

Drsmog 27-11-2007 11:30 686001

это send("^a") несрабатывает он мне просто вставляет эти символы

Drsmog 27-11-2007 11:55 686020

а усе разобрался вобщем так

ControlFocus ( $EXEL, "", 'MsoCommandBar')

SEND("^ф") ; это нажимает как Ctrl+a

amel27 27-11-2007 11:59 686022

Angelus
Цитата:

Я хочу просто открыть провадник в какойто папке »
вот пример:
Код:

$sPathSelect = "C:\Windows\System32"
Run ("explorer.exe "&$sPathSelect, @SystemDir)

есть возможность даже выбрать папку/файл:
Код:

$sPathSelect = "C:\Windows\System32"
Run ("explorer.exe /e, /select, "&$sPathSelect, @SystemDir)

FYI: Настройка параметров отображения проводника в Windows XP

Creat0R 27-11-2007 17:22 686227

amel27,
Цитата:

хотя можно попытаться порулить политикой питания, на ентот счет есть свои API и, к примеру, менять эти настройки на время блокировки
О, это думаю будет проще/надёжнее, а как туда подрулить? , т.к пересмотрев страничку по ссылке что ты дал, я так и не понял как на AutoIt это дело перевести...

Цитата:

вот вариант для версии 3.2.8.1
Гинеально! :clapping: Оно и вправду работает, спасибо!
Может на оф. форуме выложить, пусть поправят в оригинале?

Цитата:

обнаружил что, в 10-ке алгоритм более продуманный в плане производительности.
В UDF'ах? или сам движек AutoIt'а?

Angelus,
Цитата:

просто открыть провадник в какойто папке
Можно просто через ShellExecute(@SystemDir).

amel27 28-11-2007 12:57 686606

Creat0R
Цитата:

а как туда подрулить? »
хм, у меня этот способ как-то странно работает... отключаются клавиши вроде сразу после применения политики, а вот включаться обратно не хотят - требуется перезагрузка компа... помучаю еще чуть :dont-know
Цитата:

Может на оф. форуме выложить, пусть поправят в оригинале? »
да я не против, ткни куда выложить... только вот непонятно под какую версию делать UDF - новую или старую?... с другой стороны какой смысл править статус бар, если есть куча других несовместимых с иникодом GUI-функций?
Цитата:

В UDF'ах? или сам движек AutoIt'а? »
в старом UDF был единый алгоритм для "своих" и "чужих" окон, в новом варианте "свои" GUI-окна пустили по короткому алгоритму

Creat0R 28-11-2007 21:25 686875

amel27,
Цитата:

только вот непонятно под какую версию делать UDF - новую или старую?
Конечно же новую, старую никто переделвать уже не будет :)
Я думаю нужно запостить в форум AutoIt Feature Requests, назвать тему можно примерно так: “Unicode Support for _GUICtrlStatusBar_SetText()”
И предложить чтобы добавили дополнительный параметр $iUFlag...
Кстати, я до сих пор не понял, для чего функция _GUICtrlStatusBarSetUnicode()? что она делает? я ведь думал что именно она мне позволит отображать юникод в статусбаре.

По поводу всё того же юникода... если нельзя определить кодировку (её тип) строки, то может всё же возможно определить не является ли строка юникодной? т.е проверить нет ли юникодных символов в $String'е. Т.к нужно знать какой параметр ставить в той же функции для статусбар, ведь с 65001 не юникодная строка отображаться корректно не будет :(

fak1r 28-11-2007 21:34 686880

видимо моя проблема так и не решится :((

Maza Faka 29-11-2007 06:35 686990

fak1r
Цитата:

видимо моя проблема так и не решится
Что за проблема?

amel27 29-11-2007 11:45 687125

Maza Faka
пролистай назад, требуется автоматизация задач:

- регистрация на сайте (линк дан);
- заливка на сайт файлов.

Creat0R
Цитата:

я до сих пор не понял, для чего функция _GUICtrlStatusBarSetUnicode()? что она делает? »
Судя по немногочисленным примерам переключает контрол в юникодовый режим, только я плохо представляю как можно передать юникодовый текст ANSI-сообщением... и тем более в каком он должен быть формате: UTF-8 или UTF-16?.. И еще настораживает тот факт, что в тырнете по сообщениям типа SB_SETUNICODEFORMAT инфа практически отсутствует... ИМХО все же перед тем как постить свой вариант нужно определиться чем не устраивает предложенный разработчиками способ...
Цитата:

предложить чтобы добавили дополнительный параметр $iUFlag »
кроме прочего это будет идти в разрез с ихней кодировкой форматов
Цитата:

может всё же возможно определить не является ли строка юникодной? »
можно проверить на соответствие строки требованиям формата, к примеру для UTF-8:
Код:

Func _StringIsUTF8Format($string)
    Local $asc, $i, $j, $len = StringLen($string), $ext = $len
    For $i=1 To $len
        $asc
= Asc(StringMid($string, $i, 1))
        If Not(BitAnd($asc,0x80)) Then
            $ext=0
        ElseIf Not(BitXOR(BitAnd($asc,0xE0),0xC0)) Then
            $ext=1
        ElseIf Not(BitXOR(BitAnd($asc,0xF0),0xE0)) Then
            $ext=2
        ElseIf Not(BitXOR(BitAnd($asc,0xF8),0xF0)) Then
            $ext=3
        EndIf
        If
$i+$ext>$len Then Return False
        For
$j = $i+1 To $i+$ext
            $asc
= Asc(StringMid($string, $j, 1))
            If BitXOR(BitAnd($asc,0xC0),0x80) Then Return False
        Next

        $i+=$ext
    Next
    Return True
EndFunc


HORRIBLE 30-11-2007 01:02 687547

Все привет.
Как написать, что я зажал кнопку SHIFT ?
Объясните пожалуйсто, вот есть команда ControlClick("Adobe Acrobat 8 Professional", "", "[CLASS:Button; TEXT:Accept; INSTANCE:2]")
INSTANCE:2 - что это такое и откуда это берется?
Спасибо.

Maza Faka 30-11-2007 06:58 687594

HORRIBLE
Цитата:

Как написать, что я зажал кнопку SHIFT ?
Код:

Send("{+ Down}")
Цитата:

INSTANCE:2 - что это такое и откуда это берется?
Это вроде порядкового номера кнопки, если кнопок несколько, то у каждой свой INSTANCE.

В справке всё это обьясняется и очень подробно!

amel27 30-11-2007 10:07 687660

Цитата:

Цитата Maza Faka
Send("{+ Down}") »

не так, Shift+Down это будет: Send("+{Down}")

Цитата:

Цитата HORRIBLE
есть команда ControlClick("Adobe Acrobat 8 Professional", "", "[CLASS:Button; TEXT:Accept; INSTANCE:2]")
[...] что это такое »

то же самое что ControlClick("Adobe Acrobat 8 Professional", "", "Button2")

Creat0R
вроде разобрался как управлять кнопками питания, вот UDF и пример:
Код:

Global Const $PowerActionNone = 0
Global Const $PowerActionReserved = 1
Global Const $PowerActionSleep = 2
Global Const $PowerActionHibernate = 3
Global Const $PowerActionShutdown = 4
Global Const $PowerActionShutdownReset = 5
Global Const $PowerActionShutdownOff = 6
Global Const $PowerActionWarmEject = 7

Dim $aOFF[3]=[0,0,0]
$aBAK = PowerKeysCallState($aOFF) ; читаем/записываем состояние клавиш
MsgBox(0,'','Клавиши питания заблокированы!')
PowerKeysCallState($aBAK) ; восстанавливаем состояние клавиш
MsgBox(0,'','Состояние клавиш восстановлено!')

; $aKeys[0] - Power Key Action
; $aKeys[1] - Sleep Key Action
; $aKeys[2] - NoteBook Close Action


Func PowerKeysCallState($aKeys = 0)
    Local Const $SysPwrPolLen = 232 ; size of SYSTEM_POWER_POLICY structure
    Local $buf = DllStructCreate("byte["&$SysPwrPolLen&"]")
    Local $tmp = DllStructCreate("long;int;long[2];int;long[2];int;long[2]", DllStructGetPtr($buf))
    ; Чтение текущей системной политики питания
    Local $ret = DllCall("PowrProf.dll", "int", "CallNtPowerInformation", "int", 0, _
        "ptr", 0, "int", 0, "ptr", DllStructGetPtr($buf), "int", DllStructGetSize($buf))
    If Not(IsArray($ret)) Then SetError(1, @error) ; ошибка DLL
    If $ret[0] Then Return SetError(2, $ret[0])    ; ошибка чтения политики
    ; Сохранение текущей конфигурации клавиш в выходном массиве

    Local $i, $res[3]
    For $i=1 To 3
        $res[$i-1] = DllStructGetData($tmp,$i*2)
    Next
    ; Сохранение требуемой конфигурации в структуре данных политики
    If UBound($aKeys,1)=3 Then ; проверка типа данных
        For $i=1 To 3
            If BitShift($aKeys[$i-1],3)=0 Then ; проверка допустимого значения
                DllStructSetData($tmp, $i*2, $aKeys[$i-1])
                If $aKeys[$i-1]=0 Then DllStructSetData($tmp,$i*2+1,BitOR (DllStructGetData($tmp,$i*2+1,2),0x80000000),2)
                If $aKeys[$i-1]>0 Then DllStructSetData($tmp,$i*2+1,BitAND(DllStructGetData($tmp,$i*2+1,2),0x7FFFFFFF),2)
            EndIf
        Next

        ; Применение новой политики
        $ret = DllCall("PowrProf.dll", "int", "CallNtPowerInformation", "int", 0, _
            "ptr", DllStructGetPtr($buf), "int", $SysPwrPolLen, "ptr", 0, "int", 0)
        If Not(IsArray($ret)) Then SetError(1, @error) ; ошибка DLL
        If $ret[0] Then Return SetError(3, $ret[0])    ; ошибка записи политики
    EndIf
    Return
$res
EndFunc


TERMINAL 30-11-2007 10:15 687667

amel27, Creat0R, Подскажите плз...Как удалить с рабочего стола все ярлыки за исключением ярлыка КОРЗИНА.lnk. Я написал скриптик, но как только он встречает ярлык КОРЗИНА - сразу скрипт перестаёт работать.

Maza Faka 30-11-2007 11:31 687716

TERMINAL
Вообще-то корзина это не ярлык, а класс и так просто с рабочего стола её не удалить, можно через реестр:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{645FF040-5081-101B-9F08-00AA002F954E}]
@="Recycle Bin"

Выложи свой скрипт.

TERMINAL 30-11-2007 12:01 687738

Maza Faka, Ты меня не понял-мне все ярлыки нужно удалить за исключением корзины.

Maza Faka 30-11-2007 15:38 687900

TERMINAL
Можно так:
Код:

#include <File.au3>

Dim $path = @DesktopDir
Global $LnkArray = _FileListToArray($path, "*.lnk")
_ArrayDisplay($LnkArray)

For $i = 1 To $LnkArray[0]
    If $LnkArray[$i] <> "Корзина.lnk" Then FileDelete($path &"\"& $LnkArray[$i])
    Next

Но если ярлыков много, то будет быстрее, если переместить ярлык "корзины" в другую папку, удалить все ярлыки и переместить ярлык "корзины" обратно.

NikLok 30-11-2007 16:05 687917

amel27,
Цитата:

Цитата amel27
для начала можно ТУТ (главы 8, 9 »

Ты не в курсе почему не открывается этот материал более?

А самое главное нет ли у тебя да и у Creatora заодно желание создать аналог BSPI, который я очень уважаю, но автор его редко дорабатывает!
Я думаю преимущества Вам понятны. А сама разработка была бы замечательным учебным примером для остальных!

Creat0R 30-11-2007 17:16 687975

amel27,
Цитата:

можно проверить на соответствие строки
Работает, спасибо - я не думал что это реально построить лишь встроенными функциями AutoIt'а :)

HORRIBLE, Maza Faka, amel27,
Цитата:

Send("{+ Down}")
Цитата:

не так, Shift+Down это будет: Send("+{Down}")
Но как я понял, требуется зажать Shift, а не Shift и вниз ;) ...

Send("{SHIFTDOWN}"), и соответственно отпустить - Send("{SHIFTUP}").
amel27,

Цитата:

вроде разобрался как управлять кнопками питания, вот UDF и пример:
Я не сомневался ;), ещё и в придачу “блокирует” закрытие крышки ноута :) - Спасибо.

HORRIBLE 01-12-2007 14:44 688429

Вложений: 1
Скажите почему не работает последняя команда, что я не так пишу???
Или тут нельзя этой командой пользоваться, а можно только табом добраться до кнопочки ACCEPT?
Пасибо.

Maza Faka 01-12-2007 15:55 688456

HORRIBLE
Попробуй так:
Код:

ControlClick("Adobe Acrobat 8 Professional", "", "Internet Explorer_Server1")

Creat0R 02-12-2007 01:48 688750

amel27,
По поводу определения флэша...
Я проверил, на системе никогда не устанавливался флэш плеер, функция от piccaso вернула версию 6, я установил плеер, возвращает 9 - вот я и подумал, а что если просто проверять совместимость текущей версии и версии плеера? (или может есть возможность послать запрос (от лица IE) на получение инфы о том, установлен ли в системе Flash плеер?).

Вот что у меня получилось в результате:

Код:

Global $oErr = ObjEvent("AutoIt.Error", "_ComError")

$FlashCurrentVersion = _GetFlashVersion()
$FlashIsCompatible = IsCompatible_Flash_Version($FlashCurrentVersion)

If Not @error Then
    MsgBox(64, "", "Flash Player is compatible (installed last version)? = " & $FlashIsCompatible)
Else
    MsgBox(48, "Error", "Please check your connection to the Internet.")
EndIf

Func
IsCompatible_Flash_Version($Version=9)
    If Number($Version) <= 0 Then Return False

    Local
$sSource = _HTTPGetSource("www.adobe.com", "/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash")
    If @error Then Return SetError(1, 0, -1)

    Local $InetFlashVersion = StringRegExpReplace($sSource, '(?i)(?s).*?<strong>Version</strong>:(.*?)</li>.*', '\1')
    $InetFlashVersion = StringStripWS($InetFlashVersion, 3)
    $InetFlashVersion = StringLeft($InetFlashVersion, 1)
    If Number($InetFlashVersion) > Number($Version) Then Return False
    Return True
EndFunc

Func
_GetFlashVersion()
    Local $oSwf, $sVersion
    $oSwf
= ObjCreate("ShockwaveFlash.ShockwaveFlash")
    If @error Then Return 0 ; No flash at all
    $oSwf.AllowScriptAccess = "always"
    $sVersion = $oSwf.GetVariable("$Version")
    If @error Then
        $oSwf = ObjCreate("ShockwaveFlash.ShockwaveFlash.3")
        If @error Then
            $oSwf = ObjCreate("ShockwaveFlash.ShockwaveFlash.2")
            If @error Then Return 0
            Return 2
        EndIf
        Return
3
    EndIf
    $sVersion = StringTrimLeft($sVersion, 3)
    $sVersion = StringLeft($sVersion, StringInStr($sVersion, ",") - 1)
    Return Number($sVersion)
EndFunc

Func
_HTTPGetSource($sHost, $sPage)
    TCPStartup()

    Local $sRetSource = ""
    Local $nCurrentLine, $sRcvBytes = 1024
    Local $Name_To_IP = TCPNameToIP($sHost)
    Local $iSocket = TCPConnect($Name_To_IP, 80)

    If $iSocket = -1 Then
        TCPCloseSocket($iSocket)
        Return SetError(1, 0, 0)
    EndIf

    Local
$sCommand = "GET " & $sPage & " HTTP/1.1" & @CRLF
    $sCommand &= "Host: " & $sHost & @CRLF
    $sCommand &= "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)" & @CRLF
    $sCommand &= "Connection: close" & @CRLF & @CRLF

    Local $iBytesSent = TCPSend($iSocket, $sCommand)
    If $iBytesSent = 0 Or @error Then Return SetError(2, @error, 0)

    While 1
        $nCurrentLine = TCPRecv($iSocket, $sRcvBytes)
        If @error <> 0 Then ExitLoop
        If
$nCurrentLine <> '' Then $sRetSource &= $nCurrentLine
    WEnd

    TCPCloseSocket($iSocket)
    TCPShutdown()

    Return $sRetSource
EndFunc

Func
_ComError()
    ; Just set @error, the script will handle it...
    Local $iErr = $oErr.number
    If $iErr = 0 Then $iErr = -1
    SetError($iErr)
EndFunc

Один нюанс - я не уверен как задать «User Agent» для Http запроса, нужно в принципе для Internet Explorer, но в википедии слишком много вариантов, я выбрал самый простой (средний).

amel27 02-12-2007 08:31 688806

Creat0R
Цитата:

на системе никогда не устанавливался флэш плеер, функция от piccaso вернула версию 6 »
может тогда не заморачиваться? =)
Код:

Func IsShockwaveInst()
    Local $i
    For $i=13 To 7 Step -1
        If IsObj(ObjCreate("ShockwaveFlash.ShockwaveFlash." & $i)) Then Return True
    Next
    Return False
EndFunc

Цитата:

не думал что это реально построить лишь встроенными функциями AutoIt'а »
ты не понял мою мысль - проблема не в ограниченности языка, а в самой системе кодировок, та же UTF-8 строка всегда будет соответствать некоторой ANSI-последовательности... хотя она будет похожа скорей на набор спецсимволов, чем на осмысленный текст (а вдруг это шифротекст? ;) ), поэтому чем длинней текст тем точней можно угадать кодировку

Цитата:

“блокирует” закрытие крышки ноута »
на самом деле приведенная UDF контролирует POWER-клавиши только для On-Line состояния, для управления клавишами в режиме On-Battery требуется другая такая же UDF (типа PowerKeysCallDCState), в которой первый параметр заменен с "0" на "1":
Код:

    ; ...
    ; Чтение текущей системной политики питания

    Local $ret = DllCall("PowrProf.dll", "int", "CallNtPowerInformation", "int", 1, _
        "ptr", 0, "int", 0, "ptr", DllStructGetPtr($buf), "int", DllStructGetSize($buf))
        ; ...
        ; Применение новой политики

        $ret = DllCall("PowrProf.dll", "int", "CallNtPowerInformation", "int", 1, _
            "ptr", DllStructGetPtr($buf), "int", $SysPwrPolLen, "ptr", 0, "int", 0)
    ; ...


amel27 02-12-2007 09:48 688832

HORRIBLE
надеюсь, вы предварительно ознакомились с материалами форума по установке Adobe Reader 8.0?


NikLok
Цитата:

не в курсе почему не открывается этот материал более? »
видимо прикрыли доступ... кидай в PM свое мыло - вышлю в CHM
Цитата:

нет ли [...] желание создать аналог BSPI, который я очень уважаю, но автор его редко дорабатывает»
к сожалению, я не пользуюсь POST-инсталлерами, так как универсальным дистрибам предпочитаю генерить установочные комплекты для каждого конкретного случая.... поэтому для выбора приложений вполне хватает клавиш "Insert" и "F5" FAR-менеджера ;)

amel27 02-12-2007 14:01 688912

Creat0R
немного отсебятины по поводу юникода:

- в ANSI-режиме AutoIT юникодовые (UTF-16) строки можно хранить только в переменных типа Binary, так как двухбайтовые символы включают нулевые байты недопустимые в обычных строках…. точнее такие байты воспринимаются как конец ANSI-строки и строковые функции перестают корректно работать. Зато обычные строки (тип String) могут хранить и обрабатывать юникодовый текст в формате UTF-8… но так как Windows API понимает юникод только в UTF-16 перед передачей в API (к примеру в GUI) требуется дополнительное преобразование кодировки.

- чтобы переключить AutoIT в юникодовый режим сам текст скрипта должен быть набран в юникоде… SciTE способен редактировать юникодовые скрипты, но не позволяет пересохранить скрипт в другом формате - для этого можно воспользоваться «блокнотом»

- в юникодовом режиме AutoIT все строки представлены двухбайтовыми символами UTF-16, и все строковые функции «заточены» на работу именно с такими строками, в частности результат StringLen() будет отличаться от количества байтов в строке (в два раза)… для работы с многобайтовыми строками UTF-8 требуется их предварительное преобразование в UTF-16

- при передаче строк в GUI-элементы через SendMessage() важно учитывать в каком режиме находится AutoIT, так как для передачи ANSI и Юникодовых строк используются разные номера сообщений… между тем мне не попадалось пока UDF, пытающихся самостоятельно определить текущий режим работы AutoIT

Creat0R 02-12-2007 16:22 688954

amel27,
Цитата:

может тогда не заморачиваться?
Но где гарантия что, к примеру при чтановленном Flash Player версии 7, браузер не потребует установки последней версии?

Цитата:

на самом деле приведенная UDF контролирует POWER-клавиши только для On-Line состояния
On-line это в смысле когда пользователь активен?

Цитата:

между тем мне не попадалось пока UDF, пытающихся самостоятельно определить текущий режим работы AutoIT
Если я правильно понял, то макрос @Unicode определяет в каком режиме скомпилирован/запущен AutoIt.

Diamond 02-12-2007 19:11 689035

На элементе ListView созданный с помощью UDF функции(_GUICtrlListView_Create) почему-то не срабатывает GUICtrlSetResizing().
Конечно можно было бы изменять его размер при получении сообщения WM_SIZING от окна, но к сожалению GUICtrlSetPos() на нём тоже не срабатывает...
Мне кажется, что это происходит из-за отсутствия ID у ListView...
Как быть? Может кто-то уже сталкивался с этим?

P.S.
У UDF'ного ListView нашёл баг: Если попытаться поменять местами пункты в ListView - отображается "+" и окно зависает до тех пор пока не кликнешь по другому окну, например по "Рабочему столу".
Если пункты(item) в ListView имеют изображения, то воспроизводится такой же баг если потянуть за само изображение.

Creat0R 02-12-2007 23:31 689197

Diamond,
Цитата:

На элементе ListView созданный с помощью UDF функции(_GUICtrlListView_Create) почему-то не срабатывает GUICtrlSetResizing()
Я бы не стал использовать UDF, чем плоха встроенная функция GuiCtrlCreateListView()?

Цитата:

о к сожалению GUICtrlSetPos() на нём тоже не срабатывает...
А ControlMove() ?

amel27 03-12-2007 04:18 689268

Creat0R
Цитата:

где гарантия что, к примеру при чтановленном Flash Player версии 7, браузер не потребует установки последней версии? »
ну да, "проверка наличия" и "проверка актуальности" это немного разные задачи... думаю запрос на обновление должен запрашивать не сам IE, а код загружаемой страницы в зависимости от требований ролика

Цитата:

On-line это в смысле когда пользователь активен? »
нет, это когда комп питается от сети, соответственно "On-Battery" - когда переключается на батарею/UPS... кстати, в панели управления эти режимы также настраиваются раздельно

Цитата:

Если я правильно понял, то макрос @Unicode определяет в каком режиме скомпилирован/запущен AutoIt »
угу :) ... но между тем этот макрос не задействован ни в одной UDF, хотя имхо он должен использоваться как минимум при определении универсальных констант для сообщений :search:

Diamond 03-12-2007 04:35 689275

Creat0R,
Цитата:

Я бы не стал использовать UDF, чем плоха встроенная функция
А в чём преимущество встроенной функции перед _GUICtrlListView_Create(), имхо преимуществ нет.
Что касается недостатков... то есть хоть и один но очень существенный: Если ListView был создан с помощью штатной GuiCtrlCreateListView() то управлять им с помощью UDF'х функций не получится(Хотя некоторые всё же срабатывают).

Цитата:

А ControlMove() ?
Ой, а ведь я совсем забыл про неё...
В общем реализовал так:
Код:

Func WM_SIZE($HWnd, $MsgID, $wParam, $lParam)
    Switch $HWnd
      Case $hGui
          Local $Client = WinGetClientSize($HWnd)
          ControlMove($HWnd, "", $hListView, 5, 5, $Client[0]-10, $Client[1]-10)
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc

Оказалось что WM_SIZE срабатывает даже при команде развернуть-восстановить окно, а в плане точности этот способ даже лучше чем GUICtrlSetResizing().
Думаю проблема решена, спасибо.

Diamond 03-12-2007 05:38 689282

Передача строки другому приложению
Передающее приложение:

Код:

#include <GuiConstants.au3>
;~ Global Const $WM_COPYDATA = 0x004A
$Gui = GUICreate("Отправитель",300,100)
$input = GUICtrlCreateInput("Привет!",10,10,280,20)
$button = GUICtrlCreateButton("Отправить",10,40,70,20)
GUISetState()

While 1
        $msg = GUIGetMsg()
        Switch $msg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $button
                        $HWnd = WinGetHandle("Получатель")
                        If $HWnd <> "" And Not @error Then
                                SendMsg(GUICtrlRead($input), $HWnd, $Gui)
                        Else
                                MsgBox(16,"Отправитель","Получатель не обнаружен!")
                        EndIf
        EndSwitch
WEnd

;~ $String      - Строка сообщения
;~ $HWnd_Grantee - Приложение получатель  (hwnd)
;~ $HWnd_Sender  - Приложение отправитель (hwnd)
Func SendMsg($String, $HWnd_Grantee, $HWnd_Sender = 0)
        Local Const $tagCopyData = "dword dwData;dword cbData;ptr lpData"
        Local $struct = "char [" & StringLen($String)+1 & "]"
        Local $p = DllStructCreate($tagCopyData)
        Local $StringMSG = DllStructCreate($struct)
        DllStructSetData($p, "dwData", "?") ; ?????
        DllStructSetData($p, "cbData", DllStructGetSize($StringMSG))  ; размер структуры $StringMSG
        DllStructSetData($p, "lpData", DllStructGetPtr($StringMSG))  ; указатель на структуру $StringMSG
        DllStructSetData($StringMSG, 1, $String) ; строка сообщения
       
        DllCall("user32.dll","long","SendMessage","hwnd",$HWnd_Grantee,"int",$WM_COPYDATA,"hwnd",$HWnd_Sender,"ptr",DllStructGetPtr($p))
EndFunc


Принимающее приложение:

Код:

#include <GuiConstants.au3>
;~ Global Const $WM_COPYDATA = 0x004A
Global $ArrMessage[2]
$Gui = GUICreate("Получатель",300,100)
$Dummy = GUICtrlCreateDummy()
$Label = GUICtrlCreateLabel("",10,10,280,20)
GUIRegisterMsg($WM_COPYDATA,"WM_COPYDATA")
GUISetState(@SW_SHOW)

While 1
        $msg = GUIGetMsg()
        Switch $msg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Dummy
                        GUICtrlSetData($Label, $ArrMessage[0])
                        ;MsgBox(0, "Получатель", "Получено сообщение от " & $ArrMessage[1] & @LF & _
                        ;"Текст сообщения: " & $ArrMessage[0])
        EndSwitch
WEnd

Func WM_COPYDATA($HWnd,$MsgID,$wParam,$lParam)
        Local Const $tagCopyData = "dword dwData;dword cbData;ptr lpData"
        Local $p = DllStructCreate($tagCopyData, $lParam) 
        Local $struct = "char [" & DllStructGetData($p, "cbData") & "]"
        Local $StringMSG = DllStructCreate($struct,  DllStructGetData($p, "lpData"))
       
        $ArrMessage[0] = DllStructGetData($StringMSG,1) ; Строка сообщения
        $ArrMessage[1] = $wParam ; Хэндл окна приложения отправителя
        GUICtrlSendToDummy($Dummy)
EndFunc



И собственно вопрос, что должен содержать первый элемент(dwData) у структуры tCopyData?

P.S.
Как передать-принять командную строку если скрипт которому её нужно передать уже работает? Я в начале предположил что это можно реализовать через WM_COPYDATA используя два процесса. Может есть какой нибудь специальный способ?

Creat0R 03-12-2007 06:38 689288

amel27,
Цитата:

обновление должен запрашивать не сам IE, а код загружаемой страницы в зависимости от требований ролика
Ого, это мне не постичь, я понятия не имею где код брать, и как его приминить тем более :dont-know .


Цитата:

этот макрос не задействован ни в одной UDF
Он приминяется в DllCallBack ;) (аж два раза :biggrin: ).

Насколько я знаю, это новый макрос, я его лично приминил пару раз (к примеру в проэкте KeyBoard and Mouse Cleaner - для которго кстати мне и нужны функции блокирования клавиш ;)) - В ранних версиях аутоита использовался $DTM_SETFORMAT = 0x1005, в последних версиях нужно проверять юникодность, если скрипт в юникоде, тогда значение должно быть $DTM_SETFORMAT = 0x1032 (решение от самого Jon'а ;) ), иначе некорректно отображается формат времени (для GUICtrlCreateDate()) - почему аутоит сам не проверяет, я так и не понял :(.

Diamond,
Цитата:

А в чём преимущество встроенной функции перед _GUICtrlListView_Create()
Сказать не могу, т.к не использовал никогда второй :) - но знаю что встроенная функция вполне идеальна для построения практический любого списка (как в плане стильности, так и в плане функциональности).

Цитата:

Оказалось что WM_SIZE срабатывает даже при команде развернуть-восстановить окно
Потому что меняется размер GUI ;)
Я бы использовал тут WM_SIZING, оно срабатывает в момент смены размеров.
Кстати если интересно, могу подкинуть функцию для автоматической смены размера колонок в ListView (сам писал), в момент смены размера GUI будут смещаться колонки в идентичный размер для каждой (опционально - либо по ширине списка, либо до последнего разделителя).

Цитата:

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

Скрипт...
Код:

#include <GuiConstants.au3>

RegisterScriptMsg("SendMessage Test", $CmdLineRaw)

$Gui = GuiCreate("SendMessage Test")
GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case -3
            Exit
    EndSwitch
WEnd

Func
Main_Msg_Function($vsMsg)
    MsgBox(0, "", "Recieved message:" & @LF & @LF & $vsMsg)
    Exit
EndFunc


;=====================================
Func RegisterScriptMsg($sTitle, $vMsg)
    Local $OccurName = StringReplace(@ScriptFullPath, "\", "")
    Local $ERROR_ALREADY_EXISTS = 183

    Local $ihWnd = WinGetHandle($sTitle)

    Local $hDll = DllCall("kernel32.dll", "int", "CreateMutex", "int", 0, "long", 1, "str", $OccurName)
    Local $iLastError = DllCall("kernel32.dll", "int", "GetLastError")
    If $iLastError[0] = $ERROR_ALREADY_EXISTS Then
        _AU3COM_SendData($vMsg, $ihWnd)
        Exit
    Else
        Local Const
$WM_COPYDATA = 0x4A
        GUIRegisterMsg($WM_COPYDATA, "_GUIRegisterMsgProc")
    EndIf
EndFunc

Func
_GUIRegisterMsgProc($hWnd, $MsgID, $WParam, $LParam)
    Local Const $WM_COPYDATA = 0x4A
    If $MsgID = $WM_COPYDATA Then
        Local
$vsMsg = _AU3COM_RecvData($LParam)
        Local $MSGRECVD = DllStructGetData($vsMsg, 1)
        ;Here is go whatever we need to do with the recieved string ($MSGRECVD)
        Call("Main_Msg_Function", $MSGRECVD)
    EndIf
EndFunc

Func
_AU3COM_SendData($InfoToSend, $RecvWinHandle)
    Local Const $WM_COPYDATA = 0x4A
    Local $StructDef_COPYDATA = "dword var1;dword var2;ptr var3"
    Local $CDString = DllStructCreate("char var1[256];char var2[256]") ;the array to hold the string we are sending

    DllStructSetData($CDString, 1, $InfoToSend)
    Local $pCDString = DllStructGetPtr($CDString) ;the pointer to the string
    Local $vs_cds = DllStructCreate($StructDef_COPYDATA);create the message struct
    DllStructSetData($vs_cds, "var1", 0) ;0 here indicates to the receiving program that we are sending a string
    DllStructSetData($vs_cds, "var2", String(StringLen($InfoToSend) + 1));tell the receiver the length of the string
    DllStructSetData($vs_cds, "var3", $pCDString) ;the pointer to the string
    Local $pStruct = DllStructGetPtr($vs_cds)
    DllCall("user32.dll", "long", "SendMessage", "hwnd", $RecvWinHandle, "int", $WM_COPYDATA, "int", 0, "int", $pStruct)

    $vs_cds = 0 ;free the struct
    $CDString = 0 ;free the struct

    Return 1
EndFunc

Func
_AU3COM_RecvData($COM_LParam)
    ; $COM_LParam = Poiter to a COPYDATA Struct
    Local $STRUCTDEF_AU3MESSAGE = "char var1[256];int"
    Local $StructDef_COPYDATA = "dword var1;dword var2;ptr var3"
    Local $vs_cds = DllStructCreate($StructDef_COPYDATA, $COM_LParam)
    ; Member No. 3 of COPYDATA Struct (PVOID lpData;) = Pointer to Costum Struct
    Local $vs_msg = DllStructCreate($STRUCTDEF_AU3MESSAGE, DllStructGetData($vs_cds, 3))
    Return $vs_msg
EndFunc



Этот скрипт нужно запустить (не из SciTE), и потом запустить его ещё раз :) - получим ком. строку с которой запущен скрипт... очень полезно если нужно не запускать повторно копию скрипта, и при этом передать данные (такие как путь к "сбросанному" файлу в файл программы ;) ).

amel27 03-12-2007 09:58 689368

Diamond
Цитата:

Цитата Diamond
собственно вопрос, что должен содержать первый элемент(dwData) у структуры tCopyData? »

любое число - передается без изменений... можно использовать как "ветвитель" типа Select/Endselect для классификации получаемых структур данных... что-то типа собственной системы сообщений на базе WM_COPYDATA
Цитата:

Цитата Diamond
Может есть какой нибудь специальный способ? »

тут они все перечислены: http://fort.stup.ac.ru/wmaster/books...708/089727.htm

Diamond 03-12-2007 21:21 689847

Creat0R,
Цитата:

встроенная функция вполне идеальна для построения практический любого списка (как в плане стильности, так и в плане функциональноти)
Согласен. :) Я имел ввиду что нет никаких преимуществ если из-за неё приходится отказываться от использования UDF.
Цитата:

Потому что меняется размер GUI ;)
Я бы использовал тут WM_SIZING, оно срабатывает в момент смены размеров.
Я сначала так и хотел сделать... но как оказалось она не срабатывает при команде развернуть-восстановить окно. :(
Цитата:

Кстати если интересно, могу подкинуть функцию для автоматической смены размера колонок в ListView
Конечно интересно.

Спасибо за пример. Кстати твой код мне показался проще и понятнее чем на офф. форуме.
В общем я решил сделать так:

Код:

#include <GuiConstantsEx.au3>
#include <Array.au3>
Global $UserCmdLine, $EventCmdLine
Global $Title = "CmdLine_Test"
RegisterScriptMsg($Title)

$Gui = GUICreate($Title, 400, 300)
$EventCmdLine = GUICtrlCreateDummy()
If $CmdLine[0] Then _ArrayDisplay($CmdLine,"CmdLine") ; OpenFile ($CmdLine)
GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$EventCmdLine
            _ArrayDisplay($UserCmdLine,"UserCmdLine") ; OpenFile ($UserCmdLine)
    EndSwitch
WEnd

Func
RegisterScriptMsg($Title)
    Local Const $WM_COPYDATA = 0x004A
    Local Const $ERROR_ALREADY_EXISTS = 0x00B7
    Local $String
    Local $OccurName = StringReplace(@ScriptFullPath, "\", "")
    DllCall("kernel32.dll", "int", "CreateMutex", "int", 0, "long", 1, "str", $OccurName)
    Local $iLastError = DllCall("kernel32.dll", "int", "GetLastError")
    If $iLastError[0] = $ERROR_ALREADY_EXISTS Then
        If
$CmdLine[0] Then
            $String = $CmdLine[1]
            For $i = 2 To $CmdLine[0]
                $String &= "|" & $CmdLine[$i]
            Next
            Local
$HWnd = WinGetHandle($Title)
            Local Const $tagCopyData = "dword dwData;dword cbData;ptr lpData"
            Local $struct = "char [" & StringLen($String)+1 & "]"
            Local $p = DllStructCreate($tagCopyData)
            Local $StringMSG = DllStructCreate($struct)
            DllStructSetData($p, "dwData", 0)
            DllStructSetData($p, "cbData", DllStructGetSize($StringMSG))  ; размер структуры $StringMSG
            DllStructSetData($p, "lpData", DllStructGetPtr($StringMSG))  ; указатель на структуру $StringMSG
            DllStructSetData($StringMSG, 1, $String) ; строка сообщения
            DllCall("user32.dll","long","SendMessage","hwnd",$HWnd,"int",$WM_COPYDATA,"hwnd",0,"ptr",DllStructGetPtr($p))
        EndIf
        Exit
    Else

        GUIRegisterMsg($WM_COPYDATA, "WM_COPYDATA")
    EndIf
EndFunc

Func
WM_COPYDATA($HWnd, $MsgID, $wParam, $lParam)
    Local Const $tagCopyData = "dword dwData;dword cbData;ptr lpData"
    Local $p = DllStructCreate($tagCopyData, $lParam)
      Local $struct = "char [" & DllStructGetData($p, "cbData") & "]"
    Local $StringMSG = DllStructCreate($struct,  DllStructGetData($p, "lpData"))
    $UserCmdLine = StringSplit(DllStructGetData($StringMSG,1),"|")
    GUICtrlSendToDummy($EventCmdLine)
EndFunc


GUICtrlSendToDummy() я использую для того чтобы как можно быстрее выйти из функции и отпустить "передающий процесс".
От $CmdLineRaw решил отказаться потому что не знаю как правильно разобрать строку.

Creat0R 04-12-2007 04:11 689977

Diamond,
Цитата:

нет никаких преимуществ если из-за неё приходится отказываться от использования UDF
Я лично имею такое мнение: если UDF ни чем не лучше встроенной функции, то лучше использовать оригинал (встроенную функцию) - всегда надёжнее, но это конечно моё имхо :).

Цитата:

Конечно интересно.
Вот пример с функцией
Код:

#include <GuiConstants.au3>

$Main_GUI = GUICreate("ListView Set Equel Column Width", 340, 260, -1, -1, $WS_OVERLAPPEDWINDOW)

$ListView = GUICtrlCreateListView("col1|col2|col3", 20, 30, 300, 150, _
    $LVS_SHOWSELALWAYS+$LVS_NOSORTHEADER, $LVS_EX_FULLROWSELECT+$LVS_EX_GRIDLINES)

GUICtrlCreateListViewItem("line1|data1|more1", $ListView)
GUICtrlCreateListViewItem("line2|data2|more2", $ListView)
GUICtrlCreateListViewItem("line3|data3|more3", $ListView)
GUICtrlCreateListViewItem("line4|data4|more4", $ListView)
GUICtrlCreateListViewItem("line5|data5|more5", $ListView)

$Set_Equel_Button = GUICtrlCreateButton("Set Equel Width", 20, 190, 100, 20)
$Set_Full_Button = GUICtrlCreateButton("Set Full Width", 20, 220, 100, 20)

GUISetState()

GUIRegisterMsg($WM_SIZE, "WM_SIZE")

While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$Set_Full_Button, $GUI_EVENT_MAXIMIZE, $GUI_EVENT_RESTORE
            _GUICtrlListViewSetEquelColWidth($Main_GUI, $ListView, 1)
        Case $Set_Equel_Button
            _GUICtrlListViewSetEquelColWidth($Main_GUI, $ListView, 0)
    EndSwitch
WEnd

Func
WM_SIZE($hWndGUI, $MsgID, $WParam, $LParam)
    ;По каким то причинам функция не срабатывает корректно при разворачивании/восстановлении,
    ;поэтому пусть стандартный обработчик справляется с этими событиями ($GUI_EVENT_MAXIMIZE, $GUI_EVENT_RESTORE)..

    _GUICtrlListViewSetEquelColWidth($hWndGUI, $ListView, 1)
EndFunc

Func
_GUICtrlListViewSetEquelColWidth($hWnd, $hLV, $iFullMode=1)
    If Not IsHWnd($hLV) Then $hLV = ControlGetHandle($hWnd, "", $hLV)
    If @error Then Return SetError(1, 0, -1)

    Local $LV_Header = DllCall("user32.dll", "long", "SendMessage", "hwnd", $hLV, "int", $LVM_GETHEADER, "int", 0, "int", 0)
    If @error Then Return SetError(2, 0, -1)

    ;Local Const $HDM_GETITEMCOUNT = 0x1200
    Local $sItmsCnt = DllCall("user32.dll", "long", "SendMessage", "hwnd", $LV_Header[0], "int", 0x1200, "int", 0, "int", 0)
    If @error Then Return SetError(3, 0, -1)

    Local $Columns_Count = $sItmsCnt[0]
    Local $iLV_Width = 0

    Switch $iFullMode
        Case 0
            Local $Columns_Width = 0
            Local $GetColumns_Width

            For $i = 0 To $Columns_Count
                $GetColumns_Width
= DllCall("user32.dll", "long", "SendMessage", _
                    "hwnd", $hLV, "int", $LVM_GETCOLUMNWIDTH, "int", $i, "int", 0)
                $Columns_Width += $GetColumns_Width[0]
            Next

            $iLV_Width = $Columns_Width / $Columns_Count
        Case 1
            Local $sLV_Width = ControlGetPos($hWnd, "", $hLV)
            If @error Then Return SetError(4, 0, 0)

            $iLV_Width = ($sLV_Width[2]-10) / $Columns_Count
        Case Else
            Return SetError(5, 0, -1)
    EndSwitch

    For $i = 0 To $Columns_Count
        DllCall("user32.dll", "long", "SendMessage", "hwnd", $hLV, "int", $LVM_SETCOLUMNWIDTH, "int", $i, "int", $iLV_Width)
    Next
EndFunc



Правда почему то функция не срабатывает корректно при разворачивании/восстановлении, поэтому пусть стандартный обработчик справляется с этими событиями ($GUI_EVENT_MAXIMIZE, $GUI_EVENT_RESTORE).

Но зато она работает и на внешних приложениях ;)

Цитата:

твой код мне показался проще и понятнее чем на офф. форуме
Мне тоже :)

Цитата:

GUICtrlSendToDummy() я использую для того чтобы как можно быстрее выйти из функции и отпустить "передающий процесс".
Кстати, у меня есть старый пример с использованием фиктивной Label (для получения данных), я как то не подумал о том что можно Dummy использовать - спасибо.

HORRIBLE 04-12-2007 12:45 690180

Всем еще раз привет.

есть такой код:

$file3= FileOpen("DONE.txt", 1)
$file4= FileOpen("NOT DONE.txt", 1)


$File1=false


If $File1 = false then
MsgBox(0, "Info", "Disable '&$File1&'.", 3)
FileWrite($file4, " '&$File1&' Disable User")
Else
MsgBox(0, "Info", "DElaem '&$File1&'.", 3)
RunWait("ACDSee.exe")
FileWrite($file3,&@CRLF " '&$File1&' Ystanovleno" &@CRLF)
EndIF

Вопрос, как присвоить переменной $File имя ACDSee чтобы в окошке MsgBox когда оно выскакивало был текст Disable ACDSee, а не Disable '&$File1&' . Ну и соответственно в записаном файле тоже самое было.

И можно ли как нить создать переменную, с именем пользователя в винде? (Короче говоря какое имя у пользователя в винде, такое же имя и у переменной.) Чтоб она сама себе присваивало, это имя?

Спасибо.

Creat0R 04-12-2007 15:30 690306

HORRIBLE,
Цитата:

как присвоить переменной $File имя ACDSee чтобы в окошке MsgBox когда оно выскакивало был текст Disable ACDSee, а не Disable '&$File1&'
Та нужно использовать двойные кавычки...

Код:

$file3 = FileOpen("DONE.txt", 1)
$file4 = FileOpen("NOT DONE.txt", 1)

$File1 = false

If
$File1 = false then
    MsgBox(0, "Info", "Disable " & $File1 & ".", 3)
    FileWrite($file4, " " & $File1 & " Disable User")
Else
    MsgBox(0, "Info", "DElaem " & $File1 & ".", 3)
    RunWait("ACDSee.exe")
    FileWrite($file3, @CRLF & " " & $File1 & " Ystanovleno" & @CRLF)
EndIF

Цитата:

можно ли как нить создать переменную, с именем пользователя в винде?
Макрос @UserName ?

HORRIBLE 04-12-2007 16:30 690357

Creat0R,
Дык, а где я должен задать, что $file1 это есть Acdsee, ведь значение false говорит только, что я типо дела отменил установку.
Если делать как ты говоришь, то получается Disable false, а мне немного другое надо.


Цитата:

Цитата Creat0R
Макрос @UserName ? »

А этот макрос так просто в строку вставлять чтобы вывести имя пользователя, к примеру в файл или как??

Creat0R 04-12-2007 16:57 690371

Цитата:

Цитата HORRIBLE
а где я должен задать, что $file1 это есть Acdsee, ведь значение false говорит только, что я типо дела отменил установку »

Ну немного воображения приминить никогда не повредит ;) - можно создать другую переменную...

Код:

Global $ACDSeeVar = "ACDSee"

$file3 = FileOpen("DONE.txt", 1)
$file4 = FileOpen("NOT DONE.txt", 1)

$File1 = false

If
$File1 = false then
    MsgBox(0, "Info", "Disable " & $ACDSeeVar & ".", 3)
    FileWrite($file4, " " & $ACDSeeVar & " Disable User")
Else
    MsgBox(0, "Info", "DElaem " & $ACDSeeVar & ".", 3)
    RunWait("ACDSee.exe")
    FileWrite($file3, @CRLF & " " & $ACDSeeVar & " Ystanovleno" & @CRLF)
EndIF


P.S
В справке много полезного ;) - просто нужно немного терпения при её чтении.

HORRIBLE 04-12-2007 17:04 690375

Creat0R, )
Спасибо. Чет я сглупил, а все так просто оказалось)). Я хотел обойтись ток 1 переменной. Наивный.

Creat0R 05-12-2007 05:13 690732

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

Код:

$sFileName  = @SystemDir & "\User32.dll"
$WinHandle = WinGetHandle("")

$stRet = _PickIconDlg($sFileName, 1, $WinHandle)

If Not @error Then
    $sFileName = $stRet[0]
    $nIconIndex = $stRet[1]
    Msgbox(64, "Info", "Selected file: " & $sFileName & @LF & "Icon-Index: " & $nIconIndex)
EndIf

;=====================================================================================
;
; Function Name:    _PickIconDlg()
; Description:      Show the Windows PickIconDlg.
;
; Parameter(s):    $sFileName - Path to icon file to be used as initial pick file.
;                  $nIconIndex - [Optional] Default Icon zero-based Index to pick (default is 0).
;                  $hWnd - [Optional] Handle of owner window (Default is 0).
;
; Requirement(s):  None.
; Return Value(s):  On Success - Returns 2 elements array:
;                                  $stRetArr[0] = Selected Icons File Path.
;                                  $stRetArr[1] = Picked Index from the icon file.
;                  On Failure - If "Cancel" button was pressed, return 2 elements array with initial data.
;                                On DllCall() fail return -1.
;                                In both cases @error is set to 1.
; Author(s):        G.Sandler (CreatoR), the main concept is taken from AutoIt Help file.
;
;======================================================================================

Func _PickIconDlg($sFileName, $nIconIndex=0, $hWnd=0)
    Local $stIcon, $stString, $nStructSize, $nRetErr, $stRetArr[2]

    ; Create a structure to store the icon index
    $stIcon = DllStructCreate("int")
    DllStructSetData($stIcon, 1, $nIconIndex)

    If @OSType = "WIN32_NT" Then
        ; Win NT
        $stString = DLLStructCreate("wchar[260]")
        DllStructSetData($stString, 1, $sFileName)
        $nStructSize = DllStructGetSize($stString) / 2
    Else
        ; Win'9x
        $stString = DLLStructCreate("char[260]")
        DllStructSetData($stString, 1, $sFileName)
        $nStructSize = DllStructGetSize($stString)
    EndIf

    ; Run the PickIconDlg - '62' is the ordinal value for this function
    $nRetErr = DllCall("shell32.dll", "int", 62, _
        "hwnd", $hWnd, _
        "ptr", DllStructGetPtr($stString), _
        "int", $nStructSize, _
        "ptr", DllStructGetPtr($stIcon))
    If @error Then $nRetErr = 1

    $stRetArr[0] = DllStructGetData($stString, 1)
    $stRetArr[1] = DllStructGetData($stIcon, 1)

    $stString = 0
    $stIcon = 0

    If $nRetErr = 1 Then Return SetError(1, 0, -1)
    If Not $nRetErr[0] Then $nRetErr = 1

    Return SetError($nRetErr, 0, $stRetArr)
EndFunc


Добавленно:

Вы не поверите, как только я запостил эту функцию, я на оф. форуме совершенно случайно наткнулся на подобную функцию, а точнее всего одну строчку вызовом Dll !!!

Вот функция на основе этой строчки :) ...

Код:

Func _PickIconDlg($sFileName, $nIconIndex=0, $hWnd=0)
    Local $nRet, $stRetArr[2]
    $nRet = DllCall("shell32.dll", "int", "PickIconDlg", _
        "hwnd", $hWnd, _
        "wstr", $sFileName, "int", 1000, "int_ptr", $nIconIndex)
    If Not $nRet[0] Then Return SetError(1, 0, -1)

    $stRetArr[0] = $nRet[2]
    $stRetArr[1] = $nRet[4]

    Return $stRetArr
EndFunc


Maza Faka 05-12-2007 08:01 690762

Creat0R
А как можно создать toolbar
, если можно, с примерами пожалуйста.

Creat0R 05-12-2007 23:11 691414

Maza Faka,
Цитата:

А как можно создать toolbar
На оф. форуме полагаю тебе уже ответили ;)

Я скоро выложу «AutoIt Bar», там не совсем оригинальный тулбар, но что-то похожее, предназначен в помощь скриптеру AutoIt'а ;)

Maza Faka 06-12-2007 06:53 691524

Creat0R
Цитата:

коро выложу «AutoIt Bar»
Ждёмс... :)

Maza Faka 06-12-2007 10:11 691640

В новой версии кол-во UDF увеличилось, что не может не радовать, но увеличилось также кол-во вопросов. :-)
Взять к примеру
Цитата:

Можно ли выполнять редактирование по месту в текстах элементов ListView ?
, я и не думал, что это сложная задача, пока сам не столкнулся с ней. Пример из справки (немного отредактированный):
Код:

#include <GuiConstants.au3>
#include <GuiListView.au3>

$Gui = GUICreate("Test", 300, 200)

$hListView = _GUICtrlListView_Create($GUI, "Items|SubItems", 2, 2, 296, 196, BitOR($LVS_EDITLABELS, $LVS_REPORT))
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
$ListItem1 = _GUICtrlListView_AddItem($hListView, "Item1")
$ListItem2 = _GUICtrlListView_AddItem($hListView, "Item2")

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

GUISetState()

While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
        ExitLoop
    EndSwitch
WEnd

Func
WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView
= $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $hWndFrom
    Case $hWndListView
        Switch $iCode
        Case $LVN_BEGINLABELEDIT
            Local $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
            Return False
        Case
$LVN_ENDLABELEDIT
            Local $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
            Local $tBuffer = DllStructCreate("char Text[" & DllStructGetData($tInfo, "TextMax") & "]", DllStructGetData($tInfo, "Text"))
            If StringLen(DllStructGetData($tBuffer, "Text")) Then Return True
            EndSwitch
        EndSwitch
        Return
$GUI_RUNDEFMSG
    EndFunc

Я смутно понимал, что для этой задачи нужно применить GuiRegisterMsg(), но не думал, что это будет довольно таки сложная конструкция, для казалось простой задачи. Вот если бы кто-нибудь разжевал её (
Код:

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
), было- бы вообще здорово. В идеале хотелось бы научиться решать подобные задачи самостоятельно, без справки, но к сожалению уровень моих знаний далёк от этого :-(.

Creat0R 06-12-2007 21:13 692139

Maza Faka
По поводу Toolbar'а...

Вот простенький пример (примитивного уровня)...



Код:

#include <GuiConstants.au3>

$Gui = GuiCreate("Splitter Bar", 200, 70)

$Menu = GUICtrlCreateMenu("Menu")
GUICtrlCreateMenuItem("Item", $Menu)

GuiCtrlCreateSeperator(0, 3, 5, 3, 195)

$Left = 7
$IconsArr = StringSplit("13|23|25|169|28", "|")

For $i = 1 To $IconsArr[0]
    $ControlID = GUICtrlCreateButton("", $Left, 10, 24, 24, $BS_ICON)
    GUICtrlSetImage(-1, "shell32.dll", $IconsArr[$i], 0)
    If $i < $IconsArr[0] Then GuiCtrlCreateSeperator(1, $Left + 30, 10)
    $Left += 40
Next

GuiCtrlCreateSeperator(0, 3, 40, 3, 195)

GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case -3, $ControlID
            Exit
    EndSwitch
WEnd

Func
GuiCtrlCreateSeperator($Direction, $Left, $Top, $Width=3, $Lenght=25)
    Switch $Direction
        Case 0
            GUICtrlCreateLabel("", $Left, $Top, $Lenght, $Width, $SS_SUNKEN)
        Case 1
            GUICtrlCreateLabel("", $Left, $Top, $Width, $Lenght, $SS_SUNKEN)
    EndSwitch
EndFunc

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

Maza Faka 07-12-2007 06:33 692324

Creat0R
Цитата:

Только ссегодня узнал, что обычный Label может использоваться как разделитель в тулбаре
Класс! :kruto: Мне нравится :)

Kenwood3D 07-12-2007 17:10 692817

Вложений: 1
Подскажите, пожалуйста, как можно переключатся по закладкам и выбрать нужный компонент в подобном окне (свойство "Подключение по локальной сети") без использования имитации нажатия клавиш и мыши. Дело в том что число компонентов и закладок может изменятся, поэтому иметация нажатия уже будет не попадать.

HORRIBLE 07-12-2007 21:06 692952

А как написать, что бы можно было копировать папки/фалы с сдрома, незная буквы CD? можно ли такое сделать на AUTO IT.
Спасибо.

gregaz 07-12-2007 22:39 693008

Цитата:

Цитата fak1r
видимо моя проблема так и не решится ( »

Частично :

Вот автовход на сайт : www.nn.ru

Код:


#include <IE.au3>
$oIE = _IECreate ("http://www.nn.ru/popup.php?c=classUsers&m=forum&s=&users_do=enter")

$oForm = _IEFormGetCollection ($oIE, 0); 

MsgBox(0,"",$oForm,1)
$oQuery0 = _IEFormElementGetCollection ($oForm, 0)
_IEFormElementSetValue ($oQuery0, "Login")

$oQuery1 = _IEFormElementGetCollection ($oForm, 1)
_IEFormElementSetValue ($oQuery1, "E-Mail")

$oQuery2 = _IEFormElementGetCollection ($oForm, 2)
_IEFormElementSetValue ($oQuery2, "123456")

_IEFormSubmit ($oForm)


Creat0R 08-12-2007 00:07 693051

Kenwood3D,
Для переключения вкладок, можно использовать мою UDF _ControlTab(), и указывать текст в качестве идентификатора...

Т.к я изменил функцию, вылажу её ещё раз чуть ниже (не помещается) - добавлена возможность выбора определённого таба ("TabSelect"), и для TabRight/TabLeft теперь можно указывать дополнительный пареметр, определяющий сколько сдвигов следует сделать вправо/влево:

Код:

$ConnPropTitle = 'Подключение по локальной сети'
$TabText = "Проверка"

_OpenConnProperties($ConnPropTitle)

WinWait($ConnPropTitle)

$iIndex = _ControlTab($ConnPropTitle, "", "FindTab", $TabText, "", True)
_ControlTab($ConnPropTitle, "", "TabSelect", $iIndex)

Sleep(2500)

Func _OpenConnProperties($sConnName)
    Local $oShellApp = ObjCreate('shell.application')
    Local $oCP = $oShellApp.Namespace (3), $Item
    For $Item In $oCP.Items
        If $Item.name = 'Сетевые подключения' Then
            For
$Item In $Item.Getfolder.Items
                If $Item.name = $sConnName Then $Item.InvokeVerb ('Сво&йства')
            Next
        EndIf
    Next
EndFunc


HORRIBLE
Цитата:

что бы можно было копировать папки/фалы с сдрома, незная буквы CD?
Перебором CDRom'ов...

Код:

$DrivesArr = DriveGetDrive("CDROM")

MsgBox(0, "", "Всего CD-ROM'ов: " & UBound($DrivesArr)-1)

For $i = 1 To UBound($DrivesArr)-1
    MsgBox(0, "", _
        "CD-ROM №" & $i & ":" & @LF & _
        "Буква диска: " & StringUpper($DrivesArr[$i]) & "\" & @LF & _
        "Состояние диска: " & DriveStatus($DrivesArr[$i]))
Next


Creat0R 08-12-2007 00:10 693054

Функция _ControlTab():

Код:

;===============================================================================
; Function Name:  _ControlTab()
; Description:    Sends a command to a SysTab32 Control.
; Syntax:          _ControlTab ( $hWnd, $sText, $sCommand  [, $sParam1 [, $sParam2 [, $sParam3]]] )
;
; Parameter(s):    $hWnd      = Window Handle/Title.
;                  $sText      = Window Text.
;                  $sCommand  = Command to send to the control (See "Return Value(s)").
;                  $sParam1, $sParam2, $sParam3 = Additional parameters required by some commands.
;
; Requirement(s):  None.
;
; Return Value(s): Depends on command as shown below. In case an invalid command or window/control, @error set to 1 and return ""
;                      If $sCommand Equel...
;                          "GetItemState" - State of the tab item returned.
;                            ($sParam1 defines what tab item (zero-based) will be used - 0 is the default).
;                            On failure return "" and set @error to 1.
;
;                          "GetItemText" - Text of the tab item returned.
;                            ($sParam1 defines what tab item (zero-based) will be used - 0 is the default).
;                            On failure return "" and set @error to 1.
;
;                          "GetItemImage" - Image Index of the tab item returned.
;                            ($sParam1 defines what tab item (zero-based) will be used - 0 is the default).
;                            On failure return "" and set @error to 1.
;
;                          "CurrentTab" - Returns the current Tab shown of a SysTabControl32.
;                            On failure return -1 and set @error to 1.
;
;                          "TabRight" - Moves to the next tab to the right of a SysTabControl32.
;                            ($sParam1 defines how many times move to the right tab - 1 is the default).
;                            On failure return -1 and set @error to 1.
;
;                          "TabLeft" - Moves to the next tab to the left of a SysTabControl32.
;                            ($sParam1 defines how many times move to the left tab - 1 is the default).
;                            On failure return -1 and set @error to 1.
;
;                          "TabSelect" - Select specific tab item (base on given zero-based index) of a SysTabControl32.
;                            On failure return -1 and set @error to 1.
;
;                          "GetTabsCount" - Returns the number of total tab items of a SysTabControl32.
;                            On failure return -1 and set @error to 1.
;
;                          "FindTab" - Search For tab item with specific text..
;                          In this case used all three additional parameters:
;                              $sParam1 - defines what text to find.
;                              $sParam2 - defines from what tab item the search will start (zero-based).
;                              $sParam3 - defines search type...
;                              If $sParam3 = True Then will be performed a partial search of the string in the tab item text.
;                          On seccess: return the tab item index taht contain founded text.
;                          On failure:
;                              If $sParam2 >= total tabs count, return -1 and set @error to 1.
;                              If could not find tab, return -1.
;
; Author(s):      G.Sandler a.k.a CreatoR
;
; Example(s):
;    $TabText = _ControlTab("Properties", "", "GetItemText", 1) ;Will return the text of second tab from the left side.
;===============================================================================

Func _ControlTab($hWnd, $sText, $sCommand, $sParam1="", $sParam2="", $sParam3="")
    Local Const $TCM_FIRST = 0x1300
    Local $hTab = ControlGetHandle($hWnd, $sText, "SysTabControl321")

    Switch $sCommand
        Case "GetItemState", "GetItemText", "GetItemImage"
            Local Const $TagTCITEM = "int Mask;int State;int StateMask;ptr Text;int TextMax;int Image;int Param"
            Local Const $TCIF_ALLDATA = 0x0000001B
            Local Const $TCM_GETITEM = $TCM_FIRST + 5

            Local $tBuffer  = DllStructCreate("char Text[4096]")
            Local $pBuffer  = DllStructGetPtr($tBuffer)
            Local $tItem    = DllStructCreate($tagTCITEM)
            Local $pItem    = DllStructGetPtr($tItem)

            DllStructSetData($tItem, "Mask", $TCIF_ALLDATA)
            DllStructSetData($tItem, "TextMax", 4096)
            DllStructSetData($tItem, "Text", $pBuffer)

            If $sParam1 = -1 Or $sParam1 = "" Then
                $sParam1 = _ControlTab($hWnd, $sText, "CurrentTab")
                If @error Then Return SetError(1, 0, "")
            EndIf

            DllCall("user32.dll", "long", "SendMessage", "hwnd", $hTab, "int", $TCM_GETITEM, "int", $sParam1, "int", $pItem)
            If @error Then Return SetError(1, 0, "")

            If $sCommand = "GetItemState" Then Return DllStructGetData($tItem, "State")
            If $sCommand = "GetItemText" Then Return DllStructGetData($tBuffer, "Text")
            If $sCommand = "GetItemImage" Then Return DllStructGetData($tItem, "Image")
        Case "CurrentTab"
            Local $iRet = ControlCommand($hWnd, $sText, "SysTabControl321", $sCommand, "")
            If @error Then Return SetError(1, 0, -1)
            Return $iRet - 1
        Case "TabRight", "TabLeft"
            Local $iRet = 0

            If Not IsNumber($sParam1) Or $sParam1 <= 0 Then $sParam1 = 1
            For $i = 1 To $sParam1
                $iRet
= ControlCommand($hWnd, $sText, "SysTabControl321", $sCommand, "")
                If @error Then Return SetError(1, 0, -1)
            Next
            Return
$iRet
        Case "TabSelect"
            Local Const $TCM_SETCURFOCUS = $TCM_FIRST + 48
            Local $iRet = DllCall("user32.dll", "long", "SendMessage", _
                "hwnd", $hTab, "int", $TCM_SETCURFOCUS, "int", $sParam1, "int", 0)
            If @error Then Return SetError(1, 0, -1)
            Return $iRet[0]
        Case "GetTabsCount"
            Local Const $TCM_GETITEMCOUNT = $TCM_FIRST + 4
            Local $iRet = DllCall("user32.dll", "long", "SendMessage", "hwnd", $hTab, "int", $TCM_GETITEMCOUNT, "int", 0, "int", 0)
            If @error Then Return SetError(1, 0, -1)
            Return $iRet[0]
        Case "FindTab"
            If Not IsNumber($sParam2) Or $sParam2 < 0 Then $sParam2 = 0

            Local $sTabText
            Local $iCnt = _ControlTab($hWnd, $sText, "GetTabsCount")

            If $sParam2 >= $iCnt Then Return SetError(1, 0, -1)

            For $i = $sParam2 To $iCnt
                $sTabText
= _ControlTab($hWnd, $sText, "GetItemText", $i)
                If $sParam3 = True And StringInStr($sTabText, $sParam1) Then Return $i
                If $sTabText = $sParam1 Then Return $i
            Next
            Return
-1
        Case Else
            Return
SetError(1, 0, "")
    EndSwitch
EndFunc
  ;==> _ControlTab


Creat0R 08-12-2007 06:41 693140

amel27,
Мы мучались с DllCallBack (чтобы скрипт не останавливался на момент перемещения окна), когда можно было просто использовать обычный GUIRegisterMsg($WM_TIMER, "WM_TIMER") - По сути тот же CallBack, но намного проще.

Инфу чисто случайно откопал из скрипта “Network profiles” (на оф. форуме) ...

Код:

#include <GuiConstants.au3>

Global Const $WM_TIMER = 0x0113

$Gui = GuiCreate("_TimerFunc Test", 300, 130)

$Left = -200
$Label = GUICtrlCreateLabel("Drag the window, i am just a runing text ;)", $Left, 100)

$RunCheckBox = GUICtrlCreateCheckbox("Run text", 20, 40)

GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case -3
            _AdlibDisable($Gui)
            Exit
        Case
$RunCheckBox
            If GUICtrlRead($RunCheckBox) = 1 Then
                _AdlibEnable("_TimerFunc", $Gui, 30)
            Else
                _AdlibDisable($Gui)
            EndIf
    EndSwitch
WEnd

Func
_AdlibEnable($sFunction, $hWnd, $iTime=250)
    GUIRegisterMsg($WM_TIMER, $sFunction)
    DllCall("User32.dll", "int", "SetTimer", "hwnd", $hWnd, "int", 50, "int", $iTime, "int", 0)
EndFunc

Func
_AdlibDisable($hWnd)
    GUIRegisterMsg($WM_TIMER, "")
    DllCall("user32.dll", "int", "KillTimer", "hwnd", $hWnd, "int_ptr", 50)
EndFunc

Func
_TimerFunc()
    $Left += 2
    If $Left >= 300 Then $Left = -200
    ControlMove($Gui, "", $Label, $Left, 100)
EndFunc


Rogalik 09-12-2007 16:39 693826

1. Можно ли скрыть диалоговые окна при автоустановке приложений через AutoIt?
2. Почему в скриптах для автоустановки приложений вначале закомментированы строки с блокировкой ввода? Бывают проблемы?

Creat0R 09-12-2007 16:49 693830

Rogalik,
1. Да, см. функцию WinSetState("Title", "Text", @SW_HIDE).
2. Проблемы бывают в частности и за того что пользователь “произвольничает” в момент установки :) , но скрипт должен быть оптимизирован так, чтобы пользователь ничего немог нарушить - блокирвание ввода должно ставиться в крайних случаях.

HORRIBLE 09-12-2007 22:11 693988

----------------------------------------------
Подскажите пожалуйста как можно сделать проверку выполнения скрипта, а именно не застыл ли он на какой нить строчке???
Если застыл то закрываем работу скрипта.
-----------------------------------------------------------------------------------------------------------------







Может кто нить сталкивался с таким, почему на виртуальной машинке при установки программы через авто ит, не срабатывает команда Send("^c"), должен скопировать, а не копирует, или Send("^v") должен вставить то что скопировал, а вставляет v. Проверил тот же самый скрипт на другом компе, не на виртуальной машине, все замечательно копируется и вставляется.


Спасибо.

NikLok 09-12-2007 22:32 694002

HORRIBLE, Сам сталкиваюсь часто с такими ситуациями. Мне видится, что если бы скрипт выполнялся построчно другим автоит скриптом, с этим бы не было проблем! Поэтому то (в дополнение кдругим причинам) хочется иметь аналог BSPI или WMI написанный на автоит!!!
А для копирования вставки попробуй использовать пару:
Код:

ClipPut($nm)
Send('+{Ins}')


Rogalik 09-12-2007 23:18 694034

Цитата:

Цитата Creat0R
Rogalik,
1. Да, см. функцию WinSetState("Title", "Text", @SW_HIDE). »

Но тогда нельзя будет работать с его контролами, нажимать там кнопочки, ставить галочки...
Т.е. при автоустановке программ окна инсталлятора и автоматические действия скрипта с ними приходится наблюдать полюбому, так?

Creat0R 10-12-2007 00:50 694074

Rogalik,
Цитата:

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

Да, в скрытых окнах нажать ничего нельзя, но можно в свёрнутых (WinSetState("Title", "Text", @SW_MINIMIZE)) ;).

Rogalik 10-12-2007 01:27 694086

Цитата:

Цитата Creat0R
Да, в скрытых окнах нажать ничего нельзя, но можно в свёрнутых (WinSetState("Title", "Text", @SW_MINIMIZE)) . »

Спасибо!
Все равно не получается silent-установки, как я хотел, жаль :(

HORRIBLE 10-12-2007 17:04 694480

А каким образом запустить 1.msi, если он на ходиться в C:\1\2\1.msi, через скрипт Auto It, который находится в корне, а не в папке с установщиком.

TERMINAL 10-12-2007 18:00 694546

HORRIBLE,
Global $filename = "\1\2\1.msi", $file = @HomeDrive & $filename
RunWait ( 'msiexec /i "'&$file&'"')

Должно работать...

HORRIBLE 10-12-2007 23:49 694743

Спасибо все работает TERMINAL,
А скажи зачем $file заключать в 3-ые ковычки????

Creat0R 11-12-2007 00:36 694761

HORRIBLE,
Цитата:

зачем $file заключать в 3-ые ковычки?
Это двойные кавычки (одна одиночная и одна двойная), заключать в кавычки нужно, чтобы если путь содержит пробелы, небыло проблем при попытке запуска.




All

Нужна срочно помощь по RegExp...

Никак немогу получить массив со всеми совпадениями между двух символов ($), но при это должно учитываться, что нужный нам текст, должен содержать только допустимые для переменной символы, а именно A-Z, 0-9, и _ (вроде больше ничего не допускается).

Чтобы проще понять что мне нужно, покажу что я пытаюсь сделать на примере:

Код:

#include <Array.au3>

$String = "This is <$Var$> and this is <$Str$>"
$Array = StringRegExp($String, "(?i).*?\$(.*?[0-9a-z_])\$.*?", 3)

_ArrayDisplay($Array)

Тут всё отлично, получаем массив, где [0] = Var, а [1] = Str, если убрать символ $ у последнего значения...

Код:

$String = "This is <$Var$> and this is <$Str>"
То тоже нормально, получаем только [0] = Var, но если убрать $ у первого значения..

Код:

$String = "This is <$Var> and this is <$Str$>"
То получим совсем не то что нужно (нужно только Str)... сколько я не мучался, но казалось бы, вроде такую простую задачу, решить не смог :(.

Creat0R 11-12-2007 01:46 694788

Нашёл!!! :yahoo:

Код:

#include <Array.au3>

$String = "This is <$Var> and this is <$Str$>"
$Array = StringRegExp($String, "\$((?i)[0-9a-z_]+)\$", 3)

_ArrayDisplay($Array)

А ведь так просто оказалось :).

Мне это нужно было для функции _ExpandVarStrings() - позволяет расширять переменные (не включая макросы) в любом виде, даже такие: "$Var".

Пример и сама функция:

Код:

$Var = "Our Value"
$Str = "Our String"

;================= Example with $iMode = -1, default - Only $String$ expanded =================
$sString = "This is <$Var$> and this is <$Str$>"
$ExpandedStr = _ExpandVarStrings($sString, -1)

MsgBox(64, "Expand Var Strings", "Was:" & @LF & $sString & @LF & @LF & "Expanded:" & @LF & $ExpandedStr)
;==========================================================================================================

;================= Example with $iMode = 1, Only $String expanded =================

$sString = "$Var goes here, and $Str goes here"
$ExpandedStr = _ExpandVarStrings($sString, 1)

MsgBox(64, "Expand Var Strings", "Was:" & @LF & $sString & @LF & @LF & "Expanded:" & @LF & $ExpandedStr)
;==========================================================================================================

;================= Example with $iMode = 2, All strings expanded ($String and $String$) =================

$sString = "$Var not equel $Str$"
$ExpandedStr = _ExpandVarStrings($sString, 2)

MsgBox(64, "Expand Var Strings", "Was:" & @LF & $sString & @LF & @LF & "Expanded:" & @LF & $ExpandedStr)
;==========================================================================================================

;===============================================================================
; Function Name:    _ExpandVarStrings()
; Description:      Expand string variables inside string (using different modes).
; Parameter(s):        $sString - String that contain variables that need to be expanded.
;                      $iMode - Define the expand mode...
;                              -1 - (default) will expand only $Var$ strings.
;                              1 - will expand only $Var strings.
;                              2 - will expand $Var$ and $Var strings.
; Requirement(s):  None.
; Return Value(s):  On success - Return initial string with expanded variables.
;
;                  On failure - If $sString not contain string variables that need to be expanded (according to $iMode),
;                                will returned initial $sString.
;
; Author(s):        G.Sandler (a.k.a CreatoR)
;===============================================================================

Func _ExpandVarStrings($sString, $iMode=-1)
    Local $aExtractStrs, $sPattern, $sEval
    Local $sRetStr = $sString

    Switch $iMode
        Case 1
            $sPattern = "(?i)(\$[0-9a-z_]+)"
        Case 2
            $sPattern = "(?i)(\$[0-9a-z_]+\$)|(\$[0-9a-z_]+)"
        Case Else
            $sPattern = "(?i)(\$[0-9a-z_]+\$)"
    EndSwitch

    Local
$aExtractStrs = StringRegExp($sString, $sPattern, 3)
    If Not IsArray($aExtractStrs) Then Return $sRetStr

    For $i = 0 To UBound($aExtractStrs)-1
        $sEval = Eval(StringReplace($aExtractStrs[$i], "$", ""))
        If $sEval <> "" Then $sRetStr = StringReplace($sRetStr, $aExtractStrs[$i], $sEval)
    Next

    Return
$sRetStr
EndFunc

Для макросов нужно ещё немного помучать функцию...

Creat0R 11-12-2007 03:03 694800

Нашёл вроде багу в Opt("ExpandVarStrings", 1)...

Код:

Opt("ExpandVarStrings", 1)

$Var = "Some data"
$String = "$Str and $Var$"

MsgBox(0, "", $String)

Переменная не расширяется, но если мы добавим символ $ после $Str, то всё расширяется нормально (не зависимо от того, есть ли такая переменная):

Код:

Opt("ExpandVarStrings", 1)

$Var = "Some data"
$String = "$Str$ and $Var$"

MsgBox(0, "", $String)

Моя функция обходит эту багу :yu: , и вот кстати версия поддерживающая макросы:

Код:

;===============================================================================
; Function Name:    _ExpandVarStrings()
; Description:      Expand string variable/macro inside string (using different modes).
; Parameter(s):        $sString - String that contain variables that need to be expanded.
;                      $iMode - Define the expand mode...
;                              -1 - (default) will expand only $Var$/@Macro@.
;                              1 - will expand only $Var/@Macro.
;                              2 - will expand $Var$/@Macro@ and $Var/@Macro.
; Requirement(s):  None.
; Return Value(s):  On success - Return initial string with expanded variables.
;
;                  On failure - If $sString not contain string variables that need to be expanded (according to $iMode),
;                                will returned initial $sString.
;
; Author(s):        G.Sandler (a.k.a CreatoR)
;===============================================================================

Func _ExpandVarStrings($sString, $iMode=-1)
    Local $aExtractStrs, $sPattern, $sEval, $Old_Opt_EVS
    Local $sRetStr = $sString, $sExpndStr = ""
    Local $aSymbExpnd[2] = ["$", "@"]

    For $i = 0 To 1
        Switch $iMode
            Case 1
                $sPattern = "(?i)(\" & $aSymbExpnd[$i] & "[0-9a-z_]+)"
            Case 2
                $sPattern = "(?i)(\" & $aSymbExpnd[$i] & "[0-9a-z_]+\" & $aSymbExpnd[$i] & ")|(\" & $aSymbExpnd[$i] & "[0-9a-z_]+)"
            Case Else
                $sPattern = "(?i)(\" & $aSymbExpnd[$i] & "[0-9a-z_]+\" & $aSymbExpnd[$i] & ")"
        EndSwitch

        Local
$aExtractStrs = StringRegExp($sString, $sPattern, 3)
        If Not IsArray($aExtractStrs) Then ContinueLoop

        For
$iE = 0 To UBound($aExtractStrs)-1
            If $i = 0 Then
                $sEval = Eval(StringReplace($aExtractStrs[$iE], $aSymbExpnd[$i], ""))
                If $sEval <> "" Then $sRetStr = StringReplace($sRetStr, $aExtractStrs[$iE], $sEval)
            ElseIf $iMode <> -1 Or StringRight($aExtractStrs[$iE], 1) = $aSymbExpnd[$i] Then
                $sExpndStr = $aExtractStrs[$iE]
                If StringRight($sExpndStr, 1) <> $aSymbExpnd[$i] Then $sExpndStr &= $aSymbExpnd[$i]
                $Old_Opt_EVS = Opt("ExpandVarStrings", 1)
                $sExpndStr = $sExpndStr
                Opt("ExpandVarStrings", $Old_Opt_EVS)
                If $aExtractStrs[$iE] <> "" Then $sRetStr = StringReplace($sRetStr, $aExtractStrs[$iE], $sExpndStr)
            EndIf
        Next
    Next

    Return
$sRetStr
EndFunc

Вроде работает :)

Kenwood3D 11-12-2007 03:31 694802

Creat0R
Цитата:

Kenwood3D, Для переключения вкладок, можно использовать мою UDF _ControlTab(), и указывать текст в качестве идентификатора...
Спасибо.
А как на счет выбора компонента в окне свойство "Подключение по локальной сети" без использования имитации нажатия клавиш и мыши?

Creat0R 11-12-2007 04:37 694810

Kenwood3D,
Цитата:

как на счет выбора компонента в окне свойство "Подключение по локальной сети"
Какого компонента? возможно есть метод запускать отдельно.

amel27 11-12-2007 06:40 694835

Kenwood3D
вот пример изменения состояния компонента:
Код:

#Include <GuiListView.au3>

$Name = "Клиент для сетей Microsoft"
$hWnd  = WinGetHandle("Подключение по локальной сети")
If Not @error Then
    $hSLV = ControlGetHandle($hWnd, "", "SysListView321")
    If Not @error Then
        _SysListViewToggle($hSLV, $Name)
        MsgBox(48, '', 'Состояние элемента "'& $Name &'" изменено')
    EndIf
EndIf

Func
_SysListViewToggle($hSLV, $sText)
    Local $idx = _GUICtrlListView_FindInText($hSLV, $sText)
    _GUICtrlListView_SetItemSelected ($hSLV, $idx)
    _GUICtrlListView_SetItemFocused ($hSLV, $idx)
    ControlSend($hWnd, "", "SysListView321", "{SPACE}")
EndFunc

все-таки какую задачу должен решать скрипт?

TERMINAL 11-12-2007 09:57 694914

HORRIBLE, Мало ли, может захочишь установку делать с ключами...
RunWait ( 'msiexec /i "'&$file&'" /L1049 /S /v/qn')

amel27, Creat0R, помогите сделать скрипт плз.... Нужно определить операционку, если VISTA выдаёт сообщение, если XP выдаёт сообщение. (сам бы сделал, но нет под рукой ВИСТЫ, может Вы вкурсе по каким файлам можно определять.....)
Я использовал If @OSType="WIN32_NT" Then.... , но почему то не определяется ВИСТА (наверно рна тоже относится к @OSType="WIN32_NT"). Заранее СПС!

Creat0R, ты мне давал скрипт который выполняет копирование папки с показателем времени от винды...
1. Нужно сделать так-если файлы есть - перезаписывать...
2. Возможно ли сделать на скрипте чтобы показывало остаток времени (вообщем как в винде)

*автор скрипта возможно и amel27, но разговор был с тобой....

Creat0R 11-12-2007 10:25 694931

TERMINAL,
Цитата:

Нужно определить операционку
Из справки:

Цитата:

@OSVersion - Returns one of the following: "WIN_VISTA", "WIN_2003", "WIN_XP", "WIN_2000", "WIN_NT4", "WIN_ME", "WIN_98", "WIN_95"
;)

Цитата:

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

Цитата:

Возможно ли сделать на скрипте чтобы показывало остаток времени
Наверное можно.

TERMINAL 11-12-2007 10:27 694933

Creat0R, Ща нарою, не убегай...

Вот на этой страничке наше обсуждение, но всё что ты писал я копировал в Autolt и у меня вылазила целая куча ошибок (пробовал только что на свежей версии-непомогает).... Сразу говорю-мне нужно скопировать с диска папку i386 на С диск...

Creat0R 11-12-2007 10:57 694950

TERMINAL,
Цитата:

вылазила целая куча ошибок
Каких?

Вот это разве не делает то что нужно:

Код:

_CopyWithProgress("D:\i386", "C:\i386", $FOR_COPY, BitOR($FOF_NOCONFIRMMKDIR, $FOF_NOCONFIRMATION))
Функции отсюда.

TERMINAL 11-12-2007 11:08 694956

Creat0R, для теста скопировал и переделал на - _CopyWithProgress("D:\$OEM$", "C:\9", $FOR_COPY, BitOR($FOF_NOCONFIRMMKDIR, $FOF_NOCONFIRMATION))

Вот какие ошибки...
читать дальше »
C:\test.au3(1,48) : WARNING: $FOR_COPY: possibly used before declaration.
_CopyWithProgress("D:\$OEM$", "C:\9", $FOR_COPY,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\test.au3(1,75) : WARNING: $FOF_NOCONFIRMMKDIR: possibly used before declaration.
_CopyWithProgress("D:\$OEM$", "C:\9", $FOR_COPY, BitOR($FOF_NOCONFIRMMKDIR,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\test.au3(1,96) : WARNING: $FOF_NOCONFIRMATION: possibly used before declaration.
_CopyWithProgress("D:\$OEM$", "C:\9", $FOR_COPY, BitOR($FOF_NOCONFIRMMKDIR, $FOF_NOCONFIRMATION)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\test.au3(1,48) : ERROR: $FOR_COPY: undeclared global variable.
_CopyWithProgress("D:\$OEM$", "C:\9", $FOR_COPY,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\test.au3(1,97) : ERROR: _CopyWithProgress(): undefined function.
_CopyWithProgress("D:\$OEM$", "C:\9", $FOR_COPY, BitOR($FOF_NOCONFIRMMKDIR, $FOF_NOCONFIRMATION))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\test.au3 - 2 error(s), 3 warning(s)

Надпись внизу
>"C:\Program Files\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in "C:\test.au3" /autoit3dir "C:\Program Files\AutoIt3" /UserParams
+>10:04:40 Starting AutoIt3Wrapper v.1.9.2
>Running AU3Check (1.54.3.0) from:C:\Program Files\AutoIt3
C:\test.au3(1,48) : WARNING: $FOR_COPY: possibly used before declaration.
_CopyWithProgress("D:\$OEM$", "C:\9", $FOR_COPY,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\test.au3(1,75) : WARNING: $FOF_NOCONFIRMMKDIR: possibly used before declaration.
_CopyWithProgress("D:\$OEM$", "C:\9", $FOR_COPY, BitOR($FOF_NOCONFIRMMKDIR,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\test.au3(1,96) : WARNING: $FOF_NOCONFIRMATION: possibly used before declaration.
_CopyWithProgress("D:\$OEM$", "C:\9", $FOR_COPY, BitOR($FOF_NOCONFIRMMKDIR, $FOF_NOCONFIRMATION)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\test.au3(1,48) : ERROR: $FOR_COPY: undeclared global variable.
_CopyWithProgress("D:\$OEM$", "C:\9", $FOR_COPY,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\test.au3(1,97) : ERROR: _CopyWithProgress(): undefined function.
_CopyWithProgress("D:\$OEM$", "C:\9", $FOR_COPY, BitOR($FOF_NOCONFIRMMKDIR, $FOF_NOCONFIRMATION))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
C:\test.au3 - 2 error(s), 3 warning(s)
!>10:04:40 AU3Check ended.rc:2
+>10:06:25 AutoIt3Wrapper Finished
>Exit code: 0 Time: 105.462


а за @OSVersion большое СПС !

Creat0R 11-12-2007 11:41 694986

TERMINAL,
Цитата:

Вот какие ошибки...
Эти ошибки говорят о том, что функция использовалась без констант, и без самой функции включённой в скрипт :)

Нужно так:

Код:

;Тут нужные константы
#Region consts
Global Const $FOR_MOVE = 0x0001
Global Const $FOR_COPY = 0x0002
Global Const $FOR_DELETE = 0x0003
Global Const $FOR_RENAME = 0x0004

Global Const $FOF_MULTIDESTFILES = 0x0001
Global Const $FOF_CONFIRMMOUSE = 0x0002
Global Const $FOF_SILENT = 0x0004
Global Const $FOF_RENAMEONCOLLISION = 0x0008
Global Const $FOF_NOCONFIRMATION = 0x0010
Global Const $FOF_WANTMAPPINGHANDLE = 0x0020
Global Const $FOF_ALLOWUNDO = 0x0040
Global Const $FOF_FILESONLY = 0x0080
Global Const $FOF_SIMPLEPROGRESS = 0x0100
Global Const $FOF_NOCONFIRMMKDIR = 0x0200
Global Const $FOF_NOERRORUI = 0x0400
Global Const $FOF_NOCOPYSECURITYATTRIBS = 0x0800
Global Const $FOF_NORECURSION = 0x1000
Global Const $FOF_NO_CONNECTED_ELEMENTS = 0x2000
Global Const $FOF_WANTNUKEWARNING = 0x4000
Global Const $FOF_NORECURSEREPARSE = 0x8000
#Endregion consts
;

_CopyWithProgress("D:\$OEM$", "C:\9", $FOR_COPY, BitOR($FOF_NOCONFIRMMKDIR, $FOF_NOCONFIRMATION))

;Это функция, без которой ничего работать не будет ;)
Func _CopyWithProgress($sFrom, $sTo, $OPERATION_MODE, $GENERAL_MODE)
    ; version 1 by SumTingWong on 5/26/2006
    ; http://www.autoitscript.com/forum/index.php?showtopic=11888
    ; updated by lod3n on 6/5/2007


    Local $SHFILEOPSTRUCT
    Local $pFrom
    Local $pTo
    Local $aDllRet
    Local $nError = 0
    Local $i

    If FileExists($sTo) And StringRight($sFrom, 3) <> "*.*" And StringInStr(FileGetAttrib($sFrom), "D") Then $sFrom &= "\*.*"

    $SHFILEOPSTRUCT = DllStructCreate("int;uint;ptr;ptr;uint;int;ptr;ptr")
    If @error Then Return "nostruct"
    ; hwnd
    DllStructSetData($SHFILEOPSTRUCT, 1, 0)
    ; wFunc
    DllStructSetData($SHFILEOPSTRUCT, 2, $OPERATION_MODE)
    ; pFrom
    $pFrom = DllStructCreate("char[" & StringLen($sFrom) + 2 & "]")
    ; pFrom will now be null-terminated at StringLen($sFrom)+1
    DllStructSetData($pFrom, 1, $sFrom)
    For $i = 1 To StringLen($sFrom) + 2
        If DllStructGetData($pFrom, 1, $i) = 10 Then DllStructSetData($pFrom, 1, 0, $i)
    Next
    ; We need a second null at the end
    DllStructSetData($pFrom, 1, 0, StringLen($sFrom) + 2)
    DllStructSetData($SHFILEOPSTRUCT, 3, DllStructGetPtr($pFrom))
    ; pTo
    $pTo = DllStructCreate("char[" & StringLen($sTo) + 2 & "]")
    ; pTo will now be null-terminated at StringLen($sTo)+1
    DllStructSetData($pTo, 1, $sTo)
    ; We need a second null at the end
    DllStructSetData($pTo, 1, 0, StringLen($sTo) + 2)
    DllStructSetData($SHFILEOPSTRUCT, 4, DllStructGetPtr($pTo))
    ; fFlags
    DllStructSetData($SHFILEOPSTRUCT, 5, $GENERAL_MODE)
    ; fAnyOperationsAborted
    DllStructSetData($SHFILEOPSTRUCT, 6, 0)
    ; hNameMappings
    DllStructSetData($SHFILEOPSTRUCT, 7, 0)
    ; lpszProgressTitle
    DllStructSetData($SHFILEOPSTRUCT, 8, 0)
    $aDllRet = DllCall("shell32.dll", "int", "SHFileOperation", "ptr", DllStructGetPtr($SHFILEOPSTRUCT))
    $retcode = $aDllRet[0]
    $pFrom = 0
    $pTo = 0
    $SHFILEOPSTRUCT = 0
    If $retcode <> 0 Then
        SetError($nError)
        Return False
    EndIf
    Return True
EndFunc
  ;==>_CopyWithProgress


TERMINAL 11-12-2007 12:00 695009

Creat0R, сори, протупил...всё получилось, но копирование происходит в верхнем левом углу
(можно в другое место?)
А хотелось бы, чтобы выглядело это так
читать дальше »
GUICreate("Копирование...", 520, 60)
GUICtrlCreateLabel("Выполняется подготовка дистрибутива Windows XP Professional Edition Service Pack 2 Plus", 30, 20)
GUISetState(@SW_SHOW)
Sleep(5000)


и ниже после Выполняется подготовка дистрибутива Windows XP Professional Edition Service Pack 2 Plus шла шкала и время копирования....
примерно я хочу так
читать дальше »
#include <GUIConstants.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Копирование...", 633, 103, 193, 125)
$Label1 = GUICtrlCreateLabel("Выполняется подготовка дистрибутива Windows XP Professional Edition Service Pack 2 Plus", 80, 16, 463, 17)
$Progress1 = GUICtrlCreateProgress(80, 40, 462, 17)
$Label2 = GUICtrlCreateLabel("до окончания копирования осталось - 3 мин.38 сек.", 176, 64, 268, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit

EndSwitch
WEnd

Kenwood3D 11-12-2007 12:57 695045

amel27
Цитата:

Цитата amel27
вот пример изменения состояния компонента:
Код:
#Include <GuiListView.au3>
$Name = "Клиент для сетей Microsoft"
$hWnd = WinGetHandle("Подключение по локальной сети")
If Not @error Then
$hSLV = ControlGetHandle($hWnd, "", "SysListView321")
If Not @error Then
_SysListViewToggle($hSLV, $Name)
MsgBox(48, '', 'Состояние элемента "'& $Name &'" изменено')
EndIf
EndIf
Func _SysListViewToggle($hSLV, $sText)
Local $idx = _GUICtrlListView_FindInText($hSLV, $sText)
_GUICtrlListView_SetItemSelected ($hSLV, $idx)
_GUICtrlListView_SetItemFocused ($hSLV, $idx)
ControlSend($hWnd, "", "SysListView321", "{SPACE}")
EndFunc
все-таки какую задачу должен решать скрипт? »

Необходимо открыть свойство компонента "Протокол Интернета (TCP/IP)"

Цитата:

Цитата Creat0R
$ConnPropTitle = 'Подключение по локальной сети'
$TabText = "Проверка"
_OpenConnProperties($ConnPropTitle)
WinWait($ConnPropTitle)
$iIndex = _ControlTab($ConnPropTitle, "", "FindTab", $TabText, "", True)
_ControlTab($ConnPropTitle, "", "TabSelect", $iIndex)
Sleep(2500)
Func _OpenConnProperties($sConnName)
Local $oShellApp = ObjCreate('shell.application')
Local $oCP = $oShellApp.Namespace (3), $Item
For $Item In $oCP.Items
If $Item.name = 'Сетевые подключения' Then
For $Item In $Item.Getfolder.Items
If $Item.name = $sConnName Then $Item.InvokeVerb ('Сво&йства')
Next
EndIf
Next
EndFunc »

Creat0R
я так понимаю что $TabText = "название закладки". Если это так то в моем случае я делаю так $TabText="Дополнительно", но скрипт не переключает на данную закладку.

Creat0R 11-12-2007 17:07 695242

TERMINAL,
Цитата:

примерно я хочу так
Нужно либо использовать ещё один процесс (криво получится), либо создать своё окно и механизм копирования (тоже криво, но зато многими параметрами можно управлять).
У меня уже есть рабочий механизм (кажется даже приводил уже здесь), но для твоей задачки нужно немного переделать, если такой вариант подходит, позже выложу.


Kenwood3D,
Цитата:

Необходимо открыть свойство компонента "Протокол Интернета (TCP/IP)"
Можно просто выбрать эту строку и нажать на кнопку “Свйоства” :) ...

Код:

$ConnPropTitle = 'Подключение по локальной сети'
$Name = "Протокол Интернета (TCP/IP)"

_OpenConnProperties($ConnPropTitle)

WinWait($ConnPropTitle)

$Index = ControlListView($ConnPropTitle, "", "SysListView321", "FindItem", $Name)
ControlListView($ConnPropTitle, "", "SysListView321", "Select", $Index)
ControlClick($ConnPropTitle, "", "Button4")

Sleep(2500)

Func _OpenConnProperties($sConnName)
    Local $oShellApp = ObjCreate('shell.application')
    Local $oCP = $oShellApp.Namespace (3), $Item
    For $Item In $oCP.Items
        If $Item.name = 'Сетевые подключения' Then
            For
$Item In $Item.Getfolder.Items
                If $Item.name = $sConnName Then $Item.InvokeVerb ('Сво&йства')
            Next
        EndIf
    Next
EndFunc

Цитата:

скрипт не переключает на данную закладку
Странно, у меня переключает... попробуй $TabText = "Допол" - или указать точное имя и заменить True на False (последний параметр в функции _ControlTab()).

Kenwood3D 12-12-2007 00:15 695489

Цитата:

Цитата Creat0R
Странно, у меня переключает... попробуй $TabText = "Допол" - или указать точное имя и заменить True на False (последний параметр в функции _ControlTab()). »

Уже так делал, ни одну закладку не хочет включать.
$iIndex = _ControlTab($ConnPropTitle, "", "FindTab", $TabText, "", True) и всегда равняется 0


Цитата:

Цитата Creat0R
Можно просто выбрать эту строку и нажать на кнопку “Свйоства” ...
Код:
$ConnPropTitle = 'Подключение по локальной сети'
$Name = "Протокол Интернета (TCP/IP)"
_OpenConnProperties($ConnPropTitle)
WinWait($ConnPropTitle)
$Index = ControlListView($ConnPropTitle, "", "SysListView321", "FindItem", $Name)
ControlListView($ConnPropTitle, "", "SysListView321", "Select", $Index)
ControlClick($ConnPropTitle, "", "Button4")
Sleep(2500)
Func _OpenConnProperties($sConnName)
Local $oShellApp = ObjCreate('shell.application')
Local $oCP = $oShellApp.Namespace (3), $Item
For $Item In $oCP.Items
If $Item.name = 'Сетевые подключения' Then
For $Item In $Item.Getfolder.Items
If $Item.name = $sConnName Then $Item.InvokeVerb ('Сво&йства')
Next
EndIf
Next
EndFunc »

То что надо! Спасибо!

:) Может тогда еще подскажите как в "Подключение по локальной сети - свойства" -> Настроить -> "Свойства: " выбрать закладку "Дополнительно" и там выбрать свойство "Сетевой адрес"? А то видемо из-за закладок не могу определить ClassNameNN списка.

TERMINAL 12-12-2007 11:01 695708

Creat0R, ок, буду ждать... А выглядеть будет так как я хотел?

SergeyAV 12-12-2007 15:29 695865

Народ, подскажите плииз - не могу понять в чем дело. Сделал скрипт для автоматической установки AutoCAD 2006 Russian:
читать дальше »

; User Var's
$SF_1 = "setup.exe" ; Setup File Name
$UR_1 = "xxx" ; User Registration Code Part 1
$UR_2 = "xxxxxxxx" ; User Registration Code Part 2
$UR_3 = "Name" ; User Registration Name
$UR_4 = "o" ; User Registration Surname
$UR_5 = "Firme" ; User Registration Organization
$UR_6 = "o" ; User Registration Supplier
$UR_7 = "o" ; User Registration Phone No.


Run($SF_1)

; Welcome
WinWaitActive ("Установка Autodesk","Перед установкой AutoCAD 2006 ","Button1")
ControlClick ("Установка Autodesk","Перед установкой AutoCAD 2006 ","Button1")
WinWaitActive ("Установка AutoCAD 2006","Добро пожаловать в Мастер уста","Button1")
Sleep ( 5000 )
ControlClick ("Установка AutoCAD 2006","Добро пожаловать в Мастер уста","Button1")

; License
WinWait("Установка AutoCAD 2006","Страна или территори")
WinWaitActive("Установка AutoCAD 2006","Страна или территори")
Sleep ( 2000 )
Send("{TAB}{TAB}{UP}{ENTER}")

; Serial
WinWait("Установка AutoCAD 2006","Серийный номер ")
WinWaitActive("Установка AutoCAD 2006","Серийный номер ")
Sleep ( 1550 )
SEND ( $UR_1 )
Sleep ( 250 )
SEND ( $UR_2 )
ControlClick ( "Установка AutoCAD 2006", "", "Button1" )

; User Information
WinWait("Установка AutoCAD 2006","Укажите в полях этог")
WinWaitActive("Установка AutoCAD 2006","Укажите в полях этог")
Sleep ( 1250 )
SEND ( $UR_3 )
SEND ("{TAB}")
SEND ( $UR_4 )
SEND ("{TAB}")
SEND ( $UR_5 )
SEND ("{TAB}")
SEND ( $UR_6 )
SEND ("{TAB}")
SEND ( $UR_7 )
SEND ("{TAB}")

;ControlClick ( "Установка AutoCAD 2006", "", "Button4" )
Send("{ENTER}")
Sleep ( 250 )
Send("{ENTER}")
Sleep ( 250 )
Send("{ENTER}")
Sleep ( 250 )
Send("{ENTER}")
Sleep ( 250 )
Send("{ENTER}")
Sleep ( 250 )
Send("{ENTER}")

; Install Ends
WinWait( "Установка AutoCAD 2006","В&ывести файл Readme")
WinWaitActive( "Установка AutoCAD 2006","В&ывести файл Readme")
ControlClick ( "Установка AutoCAD 2006", "", "Button1" )
Sleep(1000)
Send("{SPACE}")
Send("{ENTER}")

Exit
на основе скрипта для установки AutoCAD 2005, взятым на форуме MSFN. Для мониторинга вводимых команд использовал ScriptWriter. Все вроде работает, НО... только с жесткого диска :weep:.
При попытке запустить установку с DVD-ROM (одновременно с Unattended-установкой Windows), все срубается. Такое ощущение, что "кто-то" (что-то) жмёт на клавиши раньше записанных действий, и весь автоматизм нарушается. Попытки отмониторить весь процес уже при установке с DVD-ROM к успеху не привели - ScriptWriter тупо зависает, и не дает сохранить лог действий. Ничего больше в голову не приходит - я в AutoIT начинающий. И ведь при установке с винта все РАБОТАЕТ БЕЗ ПРОБЛЕМ - пробовал на разных компах...
Что тут можно посоветовать?
И еще. При выполнении даже скомпиленного AutoIT-скрипта в трее остается значок, который продолжает "висеть", когда весь процесс нарушается (Script paused). Этого можно как-нибудь избежать? В опциях компиллера (Aut2Exe) я ничего об этом не нашел :shuffle:. Дело в том, что из-за этого нарушается весь процесс дальнейшей установки...

Creat0R 12-12-2007 18:23 695975

Вложений: 1
Прикрепляю первую версию самодельной функции для копирования папок вместе с их содержимым...

Две проблемы которые нужно решить:

1) Более точный подсчёт оставшегося до окончания копирования времени (мне кажтся у меня вообще неверный подсчёт, делал давно).

2) AVI-Анимация останавливается на время копирования большого файла - это можно было бы решить если создание всего GUI повесить на отдельный скрипт, но тогда будет висеть два процесса для одной задачи :(.

P.S
В скрипте используются много CallBack-вызовов.. что может повлиять на нагрузку памяти на время копирования.

Для примера нужно распаковать архив, открыть файл Copy With Progress Example.au3, и выставить нужные пути.
В самой функции (в качестве параметров) можно указать размеры окна и его местоположение на экране.

TERMINAL,
Цитата:

А выглядеть будет так как я хотел?
Посколько оболочка это самодельный GUI, то выглядеть может как угодно ;)

Creat0R 12-12-2007 18:29 695983

SergeyAV,
Цитата:

Такое ощущение, что "кто-то" (что-то) жмёт на клавиши раньше записанных действий
Нужно везде ставить проверки, на существования окна, активность окна, и т.п.
А также все Send() наверняка можно переделать в ControlClick, но точно сказать немогу, негде проверить.

Цитата:

Этого можно как-нибудь избежать?
Да, в начало скрипта поставь #NoTrayIcon :)

SergeyAV 13-12-2007 09:07 696269

Цитата:

Цитата Creat0R
Нужно везде ставить проверки, на существования окна, активность окна, и т.п. »

Это типа:
WinWait
WinActivate
WinWaitActive ?
Попробую...
Цитата:

Цитата Creat0R
А также все Send() наверняка можно переделать в ControlClick, но точно сказать немогу, негде проверить. »

'ControlClick' - это что-то с мышкой связанное? Я думал, лучше отказаться от этого, пользваться исключительно клавишами. Но у меня нет большого опыта в этих делах...
Цитата:

Цитата Creat0R
Да, в начало скрипта поставь #NoTrayIcon »

Спасибо, попробую.

TERMINAL 13-12-2007 09:32 696284

Creat0R, чего-то я не пойму где здесь прописовать какие копировать папки и куда.......

Creat0R 13-12-2007 09:50 696306

SergeyAV,
Цитата:

'ControlClick' - это что-то с мышкой связанное?
Это нажимает на определённый элемент (кнопка и т.п)...

Чтобы узнать класс/имя элемента, нужно использовать инструмент Au3Info (вместе с AutoIt идёт).

Вот немного подправленая версия твоего скрипта, я добавил немного комментов, присмотрись к ним ;)

Скрипт...
Код:

; User Var's
$SF_1 = "setup.exe" ; Setup File Name
$UR_1 = "xxx" ; User Registration Code Part 1
$UR_2 = "xxxxxxxx" ; User Registration Code Part 2
$UR_3 = "Name" ; User Registration Name
$UR_4 = "o" ; User Registration Surname
$UR_5 = "Firme" ; User Registration Organization
$UR_6 = "o" ; User Registration Supplier
$UR_7 = "o" ; User Registration Phone No.

Run($SF_1)

; Welcome
WinWait ("Установка Autodesk","Перед установкой AutoCAD 2006 ","Button1")
ControlClick ("Установка Autodesk","Перед установкой AutoCAD 2006 ","Button1")
WinWait ("Установка AutoCAD 2006","Добро пожаловать в Мастер уста","Button1")
ControlClick ("Установка AutoCAD 2006","Добро пожаловать в Мастер уста","Button1")

; License
WinWait("Установка AutoCAD 2006","Страна или территори")
WinActivate("Установка AutoCAD 2006","Страна или территори")
;Если используется AutoIt 3.2.10.0, то можно перед Send использовать SendKeepActive("Заголовок", "Текст").
Send("{TAB}{TAB}{UP}{ENTER}") ; Это можно заменить на ControlClick(...).

; Serial

WinWait("Установка AutoCAD 2006","Серийный номер ")
WinActivate("Установка AutoCAD 2006","Серийный номер ")

;Тут можно заменить на ControlSetText("Установка AutoCAD 2006", "", "Edit?") - где "?" нужно узнать идентификатор (Au3Info Tool)
SEND ( $UR_1 )

;Тут тоже можно заменить на ControlSetText(...)
SEND ( $UR_2 )

ControlClick ( "Установка AutoCAD 2006", "", "Button1" )

; User Information
WinWait("Установка AutoCAD 2006","Укажите в полях этог")
WinActivate("Установка AutoCAD 2006","Укажите в полях этог")

SEND ( $UR_3 ) ;Тут тоже можно заменить на ControlSetText(...)
SEND ("{TAB}") ;Это тогда не нужно будет
SEND ( $UR_4 ) ;Тут тоже можно заменить на ControlSetText(...)
SEND ("{TAB}") ;Это тогда не нужно будет
SEND ( $UR_5 ) ;Тут тоже можно заменить на ControlSetText(...)
SEND ("{TAB}") ;Это тогда не нужно будет
SEND ( $UR_6 ) ;Тут тоже можно заменить на ControlSetText(...)
SEND ("{TAB}") ;Это тогда не нужно будет
SEND ( $UR_7 ) ;Тут тоже можно заменить на ControlSetText(...)
SEND ("{TAB}") ;Это тогда не нужно будет

; почему не используется?
;ControlClick ( "Установка AutoCAD 2006", "", "Button4" )

Send("{ENTER}")
Sleep ( 250 )
Send("{ENTER}")
Sleep ( 250 )
Send("{ENTER}")
Sleep ( 250 )
Send("{ENTER}")
Sleep ( 250 )
Send("{ENTER}")
Sleep ( 250 )
Send("{ENTER}")

; Install Ends
WinWait( "Установка AutoCAD 2006","В&ывести файл Readme")
ControlClick ( "Установка AutoCAD 2006", "", "Button1" )
Sleep(1000)
Send("{SPACE}") ;Тут видимо можно заменить на ControlClick ( "Установка AutoCAD 2006", "", "Button?" )
Send("{ENTER}") ;И Тут.



P.S
Если AutoCad небольшая прога, могу потестить (чтобы усовершенствовать скрипт), всё ровно скоро систему нужно переустанавливать :)

TERMINAL 13-12-2007 09:51 696307

SergeyAV, У меня тожк такая же проблема была с AutoCAD 2005-это клас из тех программ которые начинают себя неправильно вести при установке винды (я так думаю из-за отсутсвия драйверов). Я его оложил в долгий ящик, но скоро им займусь, если нужно- через неделю можешь спросить, может чем то помогу.
Creat0R, AutoCAD 2005 прога большая- у меня она помоему 400 мег.

Creat0R 13-12-2007 09:53 696314

TERMINAL,
Цитата:

где здесь прописовать какие копировать папки и куда
В скрипте с примером (Copy With Progress Example.au3)... первый параметр путь к папке которую нужно скопировать, второй параметр путь назначения (куда помещать скопированные файлы), третьи указывает метод замены (0 - не заменять существующие файлы, 1 - заменять).

Всё довольно просто ;).

SergeyAV 13-12-2007 15:12 696488

Цитата:

Цитата Creat0R
Это нажимает на определённый элемент (кнопка и т.п)... »

Ясно.
Цитата:

Цитата Creat0R
Чтобы узнать класс/имя элемента, нужно использовать инструмент Au3Info (вместе с AutoIt идёт). »

Ага! Вот этого мне и не хватало - я с AutoIt только начинаю разбираться...
Цитата:

Цитата Creat0R
Вот немного подправленая версия твоего скрипта, я добавил немного комментов, присмотрись к ним »

Спасибо.
Цитата:

Цитата Creat0R
Если AutoCad небольшая прога, могу потестить (чтобы усовершенствовать скрипт), всё ровно скоро систему нужно переустанавливать »

Она "немножко" большая - почти 600М ;). Хотя и хорошо пакуется - до 400М.

TERMINAL,
Цитата:

Цитата TERMINAL
У меня тожк такая же проблема была с AutoCAD 2005-это клас из тех программ которые начинают себя неправильно вести при установке винды (я так думаю из-за отсутсвия драйверов). »

Драйвера все установлены; да и не причем тут это - не нужны Автокаду никакие драйвера. Другое дело, что установщик себя ведет действительно странно, но проблема решается другим способом, к топику отношения не имеющем.
Подробнее здесь:
http://forum.oszone.net/thread-61866.html
В 2-х словах: создается админстративная точка (модификация дистрибутива, точнее .msi), которая потом уже без проблем устанавливается...
Но с AutoIt разобраться все равно хотелось бы, хотя бы потому, что есть много других прог, где "автокадный способ" не прокатит...

HORRIBLE 13-12-2007 16:46 696578

Ребят, подскажите. Это про калькулятор ).
1
...

$CTRL_btn1 = GUICtrlCreateButton("1", 54, 138, 36, 29)
$CTRL_btn2 = GUICtrlCreateButton("2", 93, 138, 36, 29)
$CTRL_btn3 = GUICtrlCreateButton("3", 132, 138, 36, 29)
$CTRL_btn4 = GUICtrlCreateButton("4", 54, 106, 36, 29)
$CTRL_btn5 = GUICtrlCreateButton("5", 93, 106, 36, 29)
$CTRL_EdtScreen = GUICtrlCreateEdit("0.", 8, 2, 239, 23,BitOR($ES_READONLY, $ES_RIGHT),$WS_EX_STATICEDGE)
$CTRL_LblMemory = GUICtrlCreateLabel("", 12, 39, 27, 26)
GUISetState (@SW_SHOW )

While 1

$msg = GUIGetMsg()

select
Case $msg = $CTRL_btn0
GUICtrlSetData($CTRL_EdtScreen, $CTRL_btn1 )
EndSelect

WEnd

Почему он в поле $CTRL_EdtScreen вводит 4 ??(причем если помять кнопку не $CTRL_btn1 а там например $CTRL_btn5 поставить, то покажит вместо 5 на 3 больше, т.е. 8) или так нельзя задавать значения, а только так GUICtrlSetData($CTRL_EdtScreen, "1")
Но если так писать то в поле $CTRL_EdtScreen получается вводить ток по 1 цифре, а как быть если нужно ввести 2 и более.
....

2. Я так понимаю первую цифру при нажатии кнопки + он заносит в память, а дальше все тупик для меня(
у меня получается нажимаю цифру 5 потом нажимаю + и он мне складывает 5+5 пишет 10(хорошо хоть правильно получилось сложить:) )
А как сделать, чтоб при нажатии + он складывал то, что в памяти с той цифрой которую я ввел после нажатия +.

Спасибо.

Creat0R 13-12-2007 18:34 696626

HORRIBLE,
Простой(?) пример калькулятора:

Код:

#include <GuiConstants.au3>

Global $aButtons_Arr[11]
Global $aOperations_Arr[1]

$Left = 60
$Top = 140

$Gui = GuiCreate("Calculator - Demo", 240, 290)

$CTRL_Edit = GUICtrlCreateEdit(0, 8, 2, 220, 23, BitOR($ES_READONLY, $ES_RIGHT), $WS_EX_STATICEDGE)

GUICtrlCreateGroup("Operations", 10, 25, 220, 90)

$Plus_Button = GUICtrlCreateButton("+", 20, 40, 25, 20)
$Minus_Button = GUICtrlCreateButton("-", 50, 40, 25, 20)
$Devide_Button = GUICtrlCreateButton("/", 80, 40, 25, 20)
$Multiply_Button = GUICtrlCreateButton("*", 110, 40, 25, 20)

GuiCtrlCreateSeperator(1, 142, 40, 3, 20)

$Pi_Button = GUICtrlCreateButton("Pi", 150, 40, 30, 20)
$Sqrt_Button = GUICtrlCreateButton("Sqrt", 190, 40, 30, 20)

GuiCtrlCreateSeperator(0, 18, 70, 3, 205)

$Equel_Button = GUICtrlCreateButton("=", 20, 80, 60, 25)
$CE_Button = GUICtrlCreateButton("CE", 150, 80, 70, 25)

GUICtrlCreateGroup("Digits", 10, 125, 220, 150)

For $i = 1 To 9
    If $Left >= 180 Then
        $Left = 60
        $Top += 32
    EndIf

    $aButtons_Arr[$i] = GUICtrlCreateButton($i, $Left, $Top, 36, 29)
    $Left += 40
Next

;Забыл нолик :D
$aButtons_Arr[10] = GUICtrlCreateButton("0", 60, 240, 115, 29)

GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case -3
            Exit
        Case
$aButtons_Arr[1] To $aButtons_Arr[10]
            Local $iUbound = UBound($aOperations_Arr)

            If $iUbound > 1 And StringIsDigit($aOperations_Arr[$iUbound-1]) Then
                $aOperations_Arr[$iUbound-1] &= GUICtrlRead($nMsg, 1)
                $iUbound -= 1
            Else
                ReDim
$aOperations_Arr[$iUbound+1]
                $aOperations_Arr[$iUbound] = GUICtrlRead($nMsg, 1)
            EndIf

            GUICtrlSetData($CTRL_Edit, $aOperations_Arr[$iUbound])
        Case $Plus_Button To $Multiply_Button
            Local $iUbound = UBound($aOperations_Arr)

            If $iUbound <= 1 Or $aOperations_Arr[$iUbound-1] = GUICtrlRead($nMsg, 1) Then ContinueLoop

            ReDim
$aOperations_Arr[$iUbound+1]
            $aOperations_Arr[$iUbound] = GUICtrlRead($nMsg, 1)
        Case $Equel_Button
            Local $Operations_Str = ""

            For $i = 1 To UBound($aOperations_Arr)-1
                $Operations_Str &= $aOperations_Arr[$i]
            Next

            ClearOperations()

            $sResults = Execute($Operations_Str)
            If $sResults = "" Then $sResults = 0

            GUICtrlSetData($CTRL_Edit, $sResults)
        Case $Pi_Button
            ClearOperations()
            GUICtrlSetData($CTRL_Edit, Pi_Calculate())
        Case $Sqrt_Button
            Local $ReadEdit = GUICtrlRead($CTRL_Edit)
            If $ReadEdit <= 0 Then ContinueLoop

            ClearOperations()
            GUICtrlSetData($CTRL_Edit, Sqrt($ReadEdit))
        Case $CE_Button
            ClearOperations()
            GUICtrlSetData($CTRL_Edit, "0")
    EndSwitch
WEnd

Func
ClearOperations()
    $aOperations_Arr = ""
    Dim $aOperations_Arr[1]
EndFunc

Func
Pi_Calculate($iRound = 100000)
    Local $n = 0
    For $i = 1 To $iRound
        $n
+= 1 / ($i * $i)
    Next
    Return
Sqrt($n * 6)
EndFunc

Func
GuiCtrlCreateSeperator($Direction, $Left, $Top, $Width=3, $Lenght=25)
    Switch $Direction
        Case 0
            GUICtrlCreateLabel("", $Left, $Top, $Lenght, $Width, $SS_SUNKEN)
        Case 1
            GUICtrlCreateLabel("", $Left, $Top, $Width, $Lenght, $SS_SUNKEN)
    EndSwitch
EndFunc


Maza Faka 14-12-2007 08:14 696979

Creat0R
Цитата:

AutoIt Menu для Opera
Не могу скачать, перезалей куда-нибудь.

TERMINAL 14-12-2007 09:26 697023

SergeyAV, уж если хочешь разобраться с AutoIt, тогда советую написать скрипт к DivX 6.7+keygen ! Вот когда напишешь, будешь больше знать чем сейчас (если ты новичёк). Только условие-при региистрации не вводить ключ к с AutoIt, а бери его с кеуgena...

Другой вариант-я лично учился на примерах от Sanya Alone, от его примеров подчёркивал самое важное...

SergeyAV 14-12-2007 10:20 697059

Цитата:

Цитата TERMINAL
SergeyAV, уж если хочешь разобраться с AutoIt, тогда советую написать скрипт к DivX 6.7+keygen ! »

Зачем? Я не использую DivX (для кодирования), предпочитаю смотреть "чистое, неиспорченное видео". А для редкого просмотра на компе и декодера хватает - он то уж регистрируется куда как проще ;).
А применительно к топику (AutoIt) есть куда больше животрепещущих вопросов...

TERMINAL 14-12-2007 12:10 697124

SergeyAV, Я промолчу... Мы разговариваем на разных языках.... Не будем вести дискусию не по теме !

TERMINAL 14-12-2007 13:33 697207

Creat0R, Помоги плз... Внизу приложеный скрипт-проблема такая, нужно чтобы после сообщения галочка изчезала в Checkbox1.
читать дальше »
#include <GUIConstants.au3>

#Region ### START Koda GUI section ### Form=
$Form2 = GUICreate("Oszone.net", 413, 298, 303, 219)
$Checkbox1 = GUICtrlCreateCheckbox("Checkbox1", 152, 128, 97, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit

Case $Checkbox1
MsgBox(64,"Test","test",3)
GUICtrlSetState(@SW_SHOW, $GUI_UNCHECKED)
EndSwitch
WEnd

Kenwood3D 14-12-2007 17:47 697335

Цитата:

Цитата Kenwood3D
Подскажите как в "Подключение по локальной сети - свойства" -> Настроить -> "Свойства: " выбрать закладку "Дополнительно" и там выбрать свойство "Сетевой адрес"? А то видемо из-за закладок не могу определить ClassNameNN списка. »

Creat0R
Почему то твой способ ни на одной закладке на работает.
Код:

Пример:
#include <ControlTab.au3>

Run ("rundll32 shell32,Control_RunDLL main.cpl @0")

$ConnPropTitle = 'Свойства: Мышь'
$TabText = "Параметры указателя"

WinWait($ConnPropTitle)

$iIndex = _ControlTab($ConnPropTitle, "", "FindTab", $TabText, "", True)
_ControlTab($ConnPropTitle, "", "TabSelect", $iIndex)

Все верно? Не работает

TERMINAL 14-12-2007 18:56 697358

Возможно ли при установке Windows XP, после копирования файлов, после 1й перезагрузки, заставить работать скрипт?

Creat0R 14-12-2007 20:48 697401

TERMINAL,
Цитата:

нужно чтобы после сообщения галочка изчезала в Checkbox1
Мне просто интересно, что это:

Код:

GUICtrlSetState(@SW_SHOW, $GUI_UNCHECKED)
?
:)

Выдели слово GUICtrlSetState (или просто поставь на нём курсор), и нажми F1 - увидишь справку для этой команды ;).

Код:

GUICtrlSetState($Checkbox1, $GUI_UNCHECKED)
Там должен быть ID контроля а не @SW_SHOW.

Kenwood3D,
Цитата:

Почему то твой способ ни на одной закладке на работает
Странно, у меня вылетает ошибка о запуске Rundll32 (только с этим диалогом)... ошибка явно в строке:

Код:

DllCall("user32.dll", "long", "SendMessage", "hwnd", $hTab, "int", $TCM_GETITEM, "int", $sParam1, "int", $pItem)
(это при получении текста вкладки)

Вот так вроде работает:

Код:

Run ("rundll32 shell32,Control_RunDLL main.cpl @0")

$ConnPropTitle = 'Свойства: Мышь'

WinWait($ConnPropTitle)

_ControlTab($ConnPropTitle, "", "TabSelect", 2)

Но понимаю что это не выход, у тебя это может быть и не третья вкладка слева...

HORRIBLE 14-12-2007 21:04 697410

Creat0R
Спасибо за калькуль, а можешь объяснить несколько строк из кода:

1. Switch $nMsg
Case -3

Что здесь означеет -3
...........

2. UBound($aOperations_Arr) - зачем, с какой целью мы делаем возрат размерности массива.
3. If $iUbound <= 1 Or $aOperations_Arr[$iUbound-1] = GUICtrlRead($nMsg, 1) Then ContinueLoop

ReDim $aOperations_Arr[$iUbound+1]
$aOperations_Arr[$iUbound] = GUICtrlRead($nMsg, 1)

что тут такое выполняется и зачем это сравнение?
4 и все таки как он складывает или умножает, где это в коде ,видно, но как ?????

Спасибо.

Creat0R 14-12-2007 21:15 697413

Maza Faka,
Цитата:

перезалей куда-нибудь
Зеркало ;).

HORRIBLE,
Цитата:

Что здесь означеет -3
$GUI_EVENT_CLOSE

Цитата:

с какой целью мы делаем возрат размерности массива
Чтобы обьявить массив по новой, присвоив ему ещё одно значение (+1).

Цитата:

что тут такое выполняется и зачем это сравнение?
Проверяется последняя запись, если она ровна операции (- + / *) которая запрпашивается пользователем, то ничего не делаем (ContinueLoop), а далее просто обьявляется массив по новой (плюс ещё один элемент), и добавляется новое знчение (цифра или другая операция, хотя в данном случае только операция).

Цитата:

как он складывает или умножает, где это в коде ,видно, но как ?
По нажатию на ровно ( = ) весь собранный нами ранее массив перечитывается, все его значения складываются в обычную строку ($Operations_Str), а потом используется встроенная функция Execute(), позволяет получить абсолютное значение данных в строке.

P.S
Чуть позже выложу другую версию калькулятора, где поддерживаются хоткеи, а также ещё несколько улучшении ;)

HORRIBLE 15-12-2007 00:24 697521

Creat0R,

$Plus_Button
$Minus_Button
$Devide_Button
$Multiply_Button

это получается стандартное обозначение сложения, вычитания и т.д. ?? А вот, а откуда берутся данные, что я нажал на кнопку деления, ведь ты же не записывал алгоритм, что делим одно число на другое ?
А только указываешь с какой по какую кнопку. Я правильно думаю, что об операции которую требуется выполнить $Devide_Button = GUICtrlCreateButton("/", 80, 40, 25, 20) то что стоит в "" это и говорит что необходимо произвести деление или как????

Может как то некорректно вопрос поставил, извините.
Спасибо.

Kenwood3D 15-12-2007 00:55 697533

Вложений: 1
Creat0R,
Цитата:

Цитата Creat0R
Run ("rundll32 shell32,Control_RunDLL main.cpl @0")
$ConnPropTitle = 'Свойства: Мышь'
WinWait($ConnPropTitle)
_ControlTab($ConnPropTitle, "", "TabSelect", 2) »

У меня проблем с запуском Rundll32 нет, а на счет готовой цифры, я так уже и сделал. Просто дело в том, что я хотел применить этот способ еще и в другом месте, где количество закладок может изменяться от определенных факторов, а вот название остается тоже. Вот только даже команда "GetItemText" почемуто не хочет возвращать текст. Ну да ладно... Все равно спасибо.

Если можно, подсажите решение первой проблемы здесь
И еще! :) Как проверить наличие или отсутсвие флага

Creat0R 15-12-2007 04:58 697579

HORRIBLE,
Цитата:

а откуда берутся данные, что я нажал на кнопку деления
Простая запись имени контроля...

Код:

$aOperations_Arr[$iUbound] = GUICtrlRead($nMsg, 1)
Тут где GUICtrlRead($nMsg, 1), используется дополнительный параметр (1), позволяющий считывать текст с элемента.
Просто в массив записываем этот текст, и когда делается подсчёт (Execute()), то соответствующая операция будет выполнена... да, если создать кнопку с другим именем, то подсчёт будет не корректный.

Kenwood3D
Цитата:

подсажите решение первой проблемы здесь
Оказывается в моей функции есть ошибка, а точнее неточность проверки ошибочности :clever-ma

Нужно в фунцию _ControlTab() добавить это перед Swith $sCommand...

Код:

If Not IsHWnd($hWnd) Then $hWnd = WinGetHandle($hWnd)
If Not WinExists($hWnd) Then Return SetError(1, 0, "")

По поводу решения, вот это у меня работает:

Код:

#include <ControlTab.au3>

$ConnPropTitle = 'Подключение по локальной сети'

_OpenConnProperties($ConnPropTitle)

WinWaitActive($ConnPropTitle)
ControlClick($ConnPropTitle, "", "Button1")

$PropTitle = "[REGEXPTITLE:Свойства:.*]"
WinWaitActive($PropTitle)

$Index = _ControlTab($PropTitle, "", "FindTab", "Дополн", 0, True)
_ControlTab($PropTitle, "", "TabSelect", $Index)

ControlCommand($PropTitle, "", "ListBox1", "SelectString", "Network Address")

Sleep(5000)

Func _OpenConnProperties($sConnName)
    Local $oShellApp = ObjCreate('shell.application')
    Local $oCP = $oShellApp.Namespace (3), $Item
    For $Item In $oCP.Items
        If $Item.name = 'Сетевые подключения' Then
            For
$Item In $Item.Getfolder.Items
                If $Item.name = $sConnName Then $Item.InvokeVerb ('Сво&йства')
            Next
        EndIf
    Next
EndFunc

Цитата:

Как проверить наличие или отсутсвие флага
Код:

If BitAND(GUICtrlRead($Ctrl), $GUI_CHECKED) Then
  ....
EndIf

;)

Kenwood3D 15-12-2007 19:40 697858

Creat0R,
Цитата:

Цитата Creat0R
Оказывается в моей функции есть ошибка, а точнее неточность проверки ошибочности
Нужно в фунцию _ControlTab() добавить это перед Swith $sCommand...
Код:
If Not IsHWnd($hWnd) Then $hWnd = WinGetHandle($hWnd)
If Not WinExists($hWnd) Then Return SetError(1, 0, "") »

Добавил. Не помогло. Также не работает по названиям закладок. Проверял на другом компе, тоже не хочет. Может чушь, а не может быть дело в стиях ХР?

Цитата:

Цитата Creat0R
ControlCommand($PropTitle, "", "ListBox1", "SelectString", "Network Address") »

Работает! Спасибо! :D

Цитата:

Цитата Creat0R
If BitAND(GUICtrlRead($Ctrl), $GUI_CHECKED) Then
....
EndIf »

А вот тут не понял куда что. У меня галочка называется Button2. И как связать?

Kenwood3D 15-12-2007 20:55 697895

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

ControlCommand("Заголовок окна", "", "Button2", "IsChecked")

Creat0R 15-12-2007 23:54 697979

Kenwood3D,
Цитата:

Не помогло
Обычный пример работет?

Код:

#include <GUIConstants.au3>
#include <ControlTab.au3>

$GUI = GUICreate("ControlTab Demo")

GUICtrlCreateTab(0, 20)
$Tab_1 = GUICtrlCreateTabItem("Tab 1")
GUICtrlCreateLabel("Some Text", 10, 60)

$Tab_2 = GUICtrlCreateTabItem("Tab 2")
$Tab_3 = GUICtrlCreateTabItem("More Tab")

GUISetState()

For $i = 0 To _ControlTab($GUI, "", "GetTabsCount")-1
    MsgBox(0, "", "Zero-Based tab number [" & $i & "]: " & @LF & _ControlTab($GUI, "", "GetItemText", $i), 2)
    _ControlTab($GUI, "", "TabRight", 1)
Next

Цитата:

У меня галочка называется Button2
Я думал нужно проверить у аутоитовского GUI ;)
Задача была не ясна.

Maza Faka 16-12-2007 07:19 698073

Creat0R
Цитата:

Зеркало
Ссылка битая, залей на slil.ru

amel27 16-12-2007 12:03 698107

Creat0R
Цитата:

Цитата Creat0R
Прикрепляю первую версию самодельной функции для копирования папок вместе с их содержимым...
Две проблемы которые нужно решить:
1) Более точный подсчёт оставшегося до окончания копирования времени (мне кажтся у меня вообще неверный подсчёт, делал давно).
2) AVI-Анимация останавливается на время копирования большого файла - это можно было бы решить если создание всего GUI повесить на отдельный скрипт, но тогда будет висеть два процесса для одной задачи »

Думаю проблемы решаемы, но скрипт очень сырой и сначала нужно привести в порядок то что уже есть... к примеру файлы, вложенные в подкаталоги не копируются так как перед вызовом _FileCopyEx() нужно сначала создать структуру каталогов - CopyFileExA каталоги создавать не может... Функция _FileListToArrayEx() тоже работает странно - в такой ее реализации нет смысла в маске, так как она применяется к каталогам и тем самым отменяет поиск в подкаталогах, тут возможны варианты в зависимости от того что требуется от функции... Синхронизация копирования и обновления GUI тоже имхо слишком запутанна - одновременно применяются разные способы GUIGetMsg(), GUIGetCursorInfo(), GUIRegisterMsg() насколько это необходимо?... ну и по мелочам ;) ... Кстати, замедление скрипта никак не связано с использованием CallBack, просто нет смысла обновлять GUI для каждого блока данных... имхо нужно либо ставить пропуски (по счетчику) либо обновлять ГУИ по таймеру.

Creat0R 16-12-2007 17:16 698205

Maza Faka,
Цитата:

залей на slil.ru
Слил - Но скоро перезалью, нашёл пару битых ссылок (в меню форума), а также нужно добавить пару фич.

amel27,
Цитата:

файлы, вложенные в подкаталоги не копируются
Странно, у меня всё копируется.

Цитата:

CopyFileExA каталоги создавать не может
Поэтому у меня _FileCopyEx() создаёт их по запросу :)

Цитата:

она применяется к каталогам и тем самым отменяет поиск в подкаталогах
У меня функция возвращает подкаталоги и файлы в них, использовал именно эту функцию т.к хотел обойти необходимость в рекурсии.

Цитата:

насколько это необходимо?
Эти строчки можно убрать:

Код:

$aCurInfo = GUIGetCursorInfo($hCopyProgrss_GUI)
If IsArray($aCurInfo) And $aCurInfo[2] = 1 And $aCurInfo[4] = $Cancel_Button Then ExitLoop

Это я забыл, они использовались раньше для определения отмены копирования.

Цитата:

нет смысла обновлять GUI для каждого блока данных
Он обновляется по необходимости, т.е файл копируется, и соответственно обновляются данные.

Мне интересно решить проблему с _GetTimeRemained(), я теперь уверен что моё “древнее” решение совсем неверно, подсчёт не должен происходить на основе количества копируемых файлов и определённом (зарание) уровне (для суммы файлов).

Kenwood3D 17-12-2007 00:14 698396

Цитата:

Цитата Creat0R
Обычный пример работет? »

Работает. Дело в том что у меня работают все команды ControlTab.au3, кроме тех, которые касаются текста - названия закладки. Т.е. не считывает название закладки и не переключает по названию, а остальные команды работают.

Creat0R 17-12-2007 01:03 698410

Kenwood3D,
Цитата:

кроме тех, которые касаются текста - названия закладки
Но в этом примере тоже задействована команда GetItemText, если она тут (с моим примером) работает, значит проблема где то в системе :dont-know

DImaN! 17-12-2007 16:58 698746

Подскажите пожалейста Как можно растянуть и зафиксировать панель задач на две строки (желательно, чтобы квикланч оказался сверху, а открытые программы - снизу).

Maza Faka 18-12-2007 07:48 699085

DImaN!
По моему с таким вопросом тебе в другой топик.

Creat0R 18-12-2007 09:14 699108

Эффект пристыковки GUI-окна к краям экрана или даже к краям других окон:

Код:

#include <GUIConstants.au3>

Global Const $WM_WINDOWPOSCHANGING = 0x0046

Global $nRange = 20

$hGUI = GUICreate("GUI Stickable!", 280, 150)

$Stickable_CB = GUICtrlCreateCheckbox("Stickable?", 20, 30)
GUICtrlSetState(-1, $GUI_CHECKED)

$Range_Input = GUICtrlCreateInput($nRange, 20, 60, 40, 20, $ES_READONLY)
$UpDown = GUICtrlCreateUpdown(-1)
GUICtrlSetLimit(-1, 80, 5)

GUISetState()

GUICreate("Some extra window", 320, 180, 0, 0)
GUIRegisterMsg($WM_WINDOWPOSCHANGING, "WM_WINDOWPOSCHANGING")

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case
$Stickable_CB
            If GUICtrlRead($Stickable_CB) = $GUI_CHECKED Then
                GUIRegisterMsg($WM_WINDOWPOSCHANGING, "WM_WINDOWPOSCHANGING")
            Else
                GUIRegisterMsg($WM_WINDOWPOSCHANGING, "")
            EndIf
        Case
$UpDown
            $nRange
= GUICtrlRead($Range_Input)
    EndSwitch
WEnd

Func
WM_WINDOWPOSCHANGING($hWnd, $Msg, $wParam, $lParam)
    Local $IsSideWinStick  = True ;Set to True for sticking to all visible windows :) - but it's hangs up CPU :(

    Local $stWinPos        = DllStructCreate("uint;uint;int;int;int;int;uint", $lParam)
    Local $nLeft            = DllStructGetData($stWinPos, 3)
    Local $nTop            = DllStructGetData($stWinPos, 4)

    Local $aCurWinPos      = WinGetPos($hWnd)
    Local $aWorkArea        = _GetWorkingArea()

    ;Left
    If Abs($aWorkArea[0] - $nLeft) <= $nRange Then DllStructSetData($stWinPos, 3, $aWorkArea[0])
    ;Right
    If Abs($nLeft + $aCurWinPos[2] - $aWorkArea[2]) <= $nRange Then DllStructSetData($stWinPos, 3, $aWorkArea[2] - $aCurWinPos[2])
    ;Top
    If Abs($aWorkArea[1] - $nTop) <= $nRange Then DllStructSetData($stWinPos, 4, $aWorkArea[1])
    ;Bottom
    If Abs($nTop + $aCurWinPos[3] - $aWorkArea[3]) <= $nRange Then DllStructSetData($stWinPos, 4, $aWorkArea[3] - $aCurWinPos[3])

    If Not $IsSideWinStick Then Return 0

    Local $ahWnd = WinList()

    For $i = 1 To UBound($ahWnd) - 1
        If $ahWnd[$i][1] = $hWnd Or Not BitAND(WinGetState($ahWnd[$i][1]), 2) Or _
            BitAND(WinGetState($ahWnd[$i][1]), 32) Or BitAND(WinGetState($ahWnd[$i][1]), 16) Then ContinueLoop

        $aSideWinPos = WinGetPos($ahWnd[$i][1])

        If $aCurWinPos[1] + $aCurWinPos[3] >= $aSideWinPos[1] And $aCurWinPos[1] <= $aSideWinPos[1] + $aSideWinPos[3] Then
            ;Left
            If Abs(($aSideWinPos[0] + $aSideWinPos[2]) - $nLeft) <= $nRange Then _
                DllStructSetData($stWinPos, 3, $aSideWinPos[0] + $aSideWinPos[2])

            ;Right
            If Abs($nLeft + $aCurWinPos[2] - $aSideWinPos[0]) <= $nRange Then _
                DllStructSetData($stWinPos, 3, $aSideWinPos[0] - $aCurWinPos[2])
        EndIf

        If
$aCurWinPos[0] + $aCurWinPos[2] >= $aSideWinPos[0] And $aCurWinPos[0] <= $aSideWinPos[0] + $aSideWinPos[2] Then
            ;Top
            If Abs(($aSideWinPos[1] + $aSideWinPos[3]) - $nTop) <= $nRange Then _
                DllStructSetData($stWinPos, 4, $aSideWinPos[1] + $aSideWinPos[3])

            ;Bottom
            If Abs($nTop + $aCurWinPos[3] - $aSideWinPos[1]) <= $nRange Then _
                DllStructSetData($stWinPos, 4, $aSideWinPos[1] - $aCurWinPos[3])
        EndIf
    Next

    Return
0
EndFunc

;===============================================================================
;
; Function Name:    _GetWorkingArea()
; Description:      Returns the coordinates of desktop working area rectangle
; Parameter(s):    None
; Return Value(s):  On Success - Array containing coordinates:
;                        $a[0] = left
;                        $a[1] = top
;                        $a[2] = right
;                        $a[3] = bottom
;                  On Failure - 0
;
;BOOL WINAPI SystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni);
;uiAction SPI_GETWORKAREA = 48
;===============================================================================

Func _GetWorkingArea()
    Local Const $SPI_GETWORKAREA = 48
    Local $stRECT = DllStructCreate("long; long; long; long")
    Local $SPIRet = DllCall("User32.dll", "int", "SystemParametersInfo", _
                        "uint", $SPI_GETWORKAREA, "uint", 0, "ptr", DllStructGetPtr($stRECT), "uint", 0)
    If @error Then Return 0
    If $SPIRet[0] = 0 Then Return 0

    Local $sLeftArea = DllStructGetData($stRECT, 1)
    Local $sTopArea = DllStructGetData($stRECT, 2)
    Local $sRightArea = DllStructGetData($stRECT, 3)
    Local $sBottomArea = DllStructGetData($stRECT, 4)

    Local $aRet[4] = [$sLeftArea, $sTopArea, $sRightArea, $sBottomArea]
    Return $aRet
EndFunc

Возможно уже приводил(и) тут нечто подобное, но этот вариант самый лучше из всех предыдущих!

SashaShveik 18-12-2007 10:45 699152

Добрый день!

Нужно вставить строку из autoit'овского Input'a в EditBox стороннего приложения.
Собственно при выполнении скрипта перемещаю курсор в нужный EditBox и отправляю:
Код:

Send(GUICtrlRead($testinput))
При вставке русскоязычные символы вставляются крокозяблами. Как это побороть?

Maza Faka 18-12-2007 12:39 699236

SashaShveik

Пример:
Код:

#include <GuiConstants.au3>

$hGui = GUICreate("Test", 200, 100)

$hInput = GUICtrlCreateInput("", 50, 50, 100, 17)
$Send_Btn = GUICtrlCreateButton("Send", 145, 75, 50, 20)

GUISetState()

While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
        ExitLoop
    Case
$Send_Btn
        Run("notepad.exe")
        WinWaitActive("Безымянный")
        ControlSetText("Безымянный", "", "Edit1", GUICtrlRead($hInput))
    EndSwitch
WEnd

P.S.
Поищи в топике, было много решений этой проблемы.

Creat0R 18-12-2007 17:03 699415

Вопрос (касается моего примера пристыковки гиу окна) - как можно определить только те окна, которые видно пользователю? BitAND(WinGetState($Title), 2) определяет скрыто ли окно, а как определить не спрятанно ли оно за другими окнами, ведь в моём примере, если окно не скрыто/не свёрнуто, но находится за каким то другим окном, то GUI пристыковывается к краям этого окна, хотя краев не видно.

В идеале хотелось бы конечно опрелделять не просто видимость (a.k.a доступность) окна, а именно его видимые края, чтобы можно было пристыковывать только к тем краям, которые видимы для глаза :).

Creat0R 22-12-2007 06:57 701637

Проблему вроде решил (осталась только проблема с высокой загрузкой ЦП в момент перетаскивания окна).




Функция для корректировки ссылки (вида hттp://, _http://, хттп:// и т.п.):

Код:

ConsoleWrite(_CorrectURL('_hттp://creator-lab.ucoz.ru/load/0-0-1-35-20'))

Func _CorrectURL($sURL)
    $sURL = StringRegExpReplace($sURL, '(?i)\A[^a-z\d]+|[^a-z\d]+$', "")

    Local $sURL_Hold = StringRegExpReplace($sURL, "(?i)(\A.*?(/|\\|:)+[^a-z\d]+|[^a-z\d]+$)", "")
    $sURL_Hold = StringReplace(StringReplace($sURL_Hold, " ", "%20"), "\", "/")

    If StringLeft($sURL, 4) = "ftp." Then Return "ftp://" & $sURL_Hold

    Local $sProtocol = StringRegExpReplace($sURL, "\A.*?(.{1,5}:/).*", "\1/")
    If StringLen($sProtocol) <= 5 Then Return "http://" & $sURL_Hold

    $sProtocol
= StringRegExpReplace($sProtocol, "(?i)\A(h..p|h..р|h.tp|ht..|..tp|.ttp|[а-я]{1,4})://+", "http://", 1)
    If @extended > 0 Then Return $sProtocol & $sURL_Hold

    $sProtocol
= StringRegExpReplace($sProtocol, "(?i)\A(f.p|f.р|f..|.tp|[а-я]{1,3})://+", "ftp://", 1)
    If @extended > 0 Then Return $sProtocol & $sURL_Hold

    $sProtocol
= StringRegExpReplace($sProtocol, "(?i)\A(ms.|.ms|m.s|[а-я]{1,3})://+", "mms://")
    If @extended > 0 Then Return $sProtocol & $sURL_Hold

    $sProtocol
= StringRegExpReplace($sProtocol, "(?i)\A(r.ps|.tps|rt.p|[а-я]{1,4})://+", "rtsp://")
    If @extended > 0 Then Return $sProtocol & $sURL_Hold

    $sProtocol
= StringRegExpReplace($sProtocol, "(?i)\A(h..ps|..tps|.t.ps|[а-я]{1,5})://+", "https://")
    If @extended > 0 Then Return $sProtocol & $sURL_Hold

    If Not StringRegExp($sProtocol, "(?i)\A(http|https|ftp|mms|rtsp|news|irc)://+") Then $sProtocol = "http://"

    Return $sProtocol & $sURL_Hold
EndFunc

По этому поводу вопрос: Встречал ли кто то ссылку, хостинг в которой начинается не с латинской буквы или цифры? а также есть ли ссылки (рабочие) которые завершаются с любым другим символов а не латинской буквой или числом?




Поскольку есть "много заинтересованных" в «AutoIt Menu для Opera», я не забыл напомнить об обновлении плагина.

Список изменении...

[v1.01 - 20.12.2007]

* Добавлен BBCode Модуль - позволяет использовать BBCode теги в текстовых формах (см. в Readme подробнее).

* Улучшены опции "Run/Open Selected Code".

* Обновлен "AutoUpdateIt" до самой последней версии (1.41).
* Обновлен "Icon_File_Scanner.au3" - теперь разделитель между списками иконок может менять позицию.

* Теперь если AutoIt не найден (при интеграции), даётся возможность выбора, чтобы указать путь к AutoIt директории.
* Теперь можно установить путь к AutoIt (в диалоге настроек) без необходимости закрывать браузер Opera постоянно.
* Теперь при настройке AutoIt Menu, уведомление о закрытии Opera будет показано только при необходимости (таким образом позволяя делать настройки не касающиеся Opera без перезапуска браузера).
* Теперь почти все надоедливые сообщения могут быть отключены (установив соответствующую галочку в появившемся сообщении, или используя диалог настроек).
* Теперь интеграция инструментов (AutoIt Tools) опциональна - вы можете выбирать какой инструмент следует интегрировать - доступно только при интеграции.
* Теперь сообщение, уведомляющее о том что настройка AutoIt Menu прошла успешна, будет показано только если были сделаны изменения касающиеся Opera.

* Исправлена ошибка при интеграции - > файл конфигурации не был создан в назначенной директории (должен создаваться рядом с главным модулем "AutoIt Menu").
* Исправлена ссылка для пункта "Today's Active Topics".


[v1.0 - 13.12.2007]
Первый релиз.

rimm 23-12-2007 13:46 702297

Подскажите как мне отправить письмо на почтовый яшик например мойадрес@mail.ru спомошью функции _INetSmtpMail ,если можно то готовый скрипт с подробным описанием, буду рад помощи

fak1r 23-12-2007 17:44 702412

Вложений: 1
rimm

Код:

$s_SmtpServer = "smtp.rambler.ru"
$s_FromName = "User"; омя отправляющего
$s_FromAddress = "1a9s@rambler.ru" от кого шлем(email должен быть правильным, иначе не отправит!!)
$s_ToAddress = "gates@microsoft.com"; кому отправляем
$s_Subject = "TEMA" ;тема письма
$as_Body = ;Текст письма
$s_UserName = "" ;логин  для smtp сервера
$s_Password = ""; пароль для smtp сервера
$s_CcAddress = ""
$s_BccAddress = ""
$s_AttachFiles = "" ;путь к файлу для отправки (опционально)
$IPPort=25; порт smtp сервера
$ssl=0

_INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $as_Body, $s_AttachFiles, $s_CcAddress, $s_BccAddress, $s_Username, $s_Password,$IPPort, $ssl)

Чтобы работала данная функция подключи Mail.au3

fak1r 23-12-2007 17:56 702418

Вот на руборде дали мне сылку вот на этот скрипт

Код:

Func _UploadImage($sFilepath)
$oXMLHTTP = ObjCreate("MSXML2.XMLHTTP")
$oXMLDOC = ObjCreate("MSXML.DOMDocument") ; for later reading the XML data from the upload
$oAdoStream = ObjCreate("ADODB.Stream") ; for streaming the image in the post message
$oAdoStream.Mode = 3  ; Set read/write
$oAdoStream.Type = 1 ; Type Binary
$oAdoStream.Open()
$oAdoStream.LoadFromFile($sFilePath)
$oXMLHTTP.Open("POST", 'http://www.imageshack.us/index.php', "false") ; Set http verb to post, url, and asynchronous mode to false
$oXMLHTTP.setRequestHeader("Content-Type", "multipart/form-data;")
;$oXMLHTTP.setRequestHeader("Content-Length", $oAdoStream.Size)
$oXMLHTTP.Send('fileupload="'&$oAdoStream.Read($oAdoStream.Size)&'"&xml="yes"') ; Pretty sure this is how I should stream the data of the image, but am I'm not passing the variables right.
ConsoleWrite("Response Text: "&$oXMLHTTP.responseText)
$sData = $oXMLDoc.load($oXMLHTTP.responseXML.xml)
If Not $sData Then
    MsgBox(0, "Error", "Error Loading XML from HTTP")
EndIf
EndFunc

Но у меня это не работает, выдает код страници без ссылки и ошибку Error Loading XML from HTTP
Так и не получается залить картинку

Drsmog 24-12-2007 08:01 702697

Как в Excel-е узнать есть ли текст в ячеике или нет ? Например в ячейке A1 есть а в A2 нет ?

Endr 25-12-2007 07:18 703323

Помогите пжалста...
Какой командой в скрипте прописать выполнение другого скрипта *.vbs ?

Creat0R 25-12-2007 07:27 703326

Endr,
Цитата:

Какой командой в скрипте прописать выполнение другого скрипта *.vbs ?
Несколько методов:

Код:

$MyScript = '"C:\My Script.vbs"'

;1)
Run("wscript.exe " & $MyScript)

;2)
ShellExecute($MyScript)

Хотя наверняка проще переписать всё то, что делает vbs скрипт, на AutoIt.

Endr 25-12-2007 08:39 703349

Creat0R, будьте добры, подскажите пжалста как установить в Windows XP службу, с последующим запуском данной службы. В справке AutoIt я этого не нашел... (или может ссылочку туда, где это обсуждается) :help:

ЗЫ: Creat0R, описанные Вами способы не помогли запустить скрипт *.vbs :(

Creat0R 25-12-2007 09:40 703382

Endr,
Цитата:

как установить в Windows XP службу, с последующим запуском данной службы.
Я этого не знаю :( , никогда не сталкивался.

Цитата:

описанные Вами способы не помогли запустить скрипт *.vbs
Что происходит при попытке? а при обычном запуске (кликом по файлу) нормально запускается?

Endr 25-12-2007 10:50 703422

Если кликнуть по файлу *.vbs, то скрипт запускается, а если через описанные выше способы (через скрипт AutoIt) вообще ничего не происходит... (и почему-то с некоторых пор у меня при запуске скриптов AutoIt в трее ничего не появляется :( )

Извиняюсь, что не цитирую, что-то не получается тут это использовать на этом компьютере..

Creat0R 25-12-2007 11:12 703431

Endr,
Цитата:

ничего не происходит
А такой скрипт работает:

Код:

MsgBox(0, "", "Hello World!")
:)

Цитата:

с некоторых пор у меня при запуске скриптов AutoIt в трее ничего не появляется
Иконка спрятана? (в настройках панели задач).

Endr 25-12-2007 11:53 703469

Creat0R, да, окошко появляется :)
Да дело не в компьютере... мои-то скрипты работают.
Тут видимо не так надо запускать vbs-файлик...

Creat0R 25-12-2007 16:33 703645

Endr,
Цитата:

видимо не так надо запускать vbs-файлик
Я очень редко советую что-то, не проверив на себе, если не тестировал, то так и напишу - “Не тестировано”.

У меня оно работает нормально, вопрос возможно глупым покажется, но всё же; как определяется что скрипт (vbs) не запускается?

Endr 26-12-2007 08:03 704094

Creat0R, у меня есть скрипт на VBS, который подкидывает файлики, устанавливает и запускает службу в Винде и потом удаляет все, что для этого требуется и себя. Определить работает скрипт или нет очень просто - служба запускается (если она выключена) и потом файлы удаляются...
Все это нужно для установки Радмина (тот скрипт, который я нашел в интернете делает это видимо, а мой - скрытно).
В данный момент у меня половина написана на AutoIt (это распаковка файлов для установки, в т.ч. и скрипт на VBS), а остальное делает собственно скриптик VBS.
Могу прикрепить код.

Creat0R 26-12-2007 08:19 704101

Endr,
Можно попробовать указать рабочую папку:

Код:

ShellExecute($MyScript, "", "C:\")



amel27

Такой вопрос - накалякал функцию (на основе других подобных) для проверки пути, не является ли он запущенным процессом, всё вроде работает (возвращает PID процесса), но вопрос в том, насколько надёжно использовать Psapi.dll? :shuffle: - в справке по этому поводу вот что сказанно:

Цитата:

Цитата http://www.autoitscript.com/autoit3/docs/intro/installdir.htm
psapi.dll - Process...() function helper DLL - used under Windows NT 4 only (Microsoft redistributable file)

Т.е получается на других системах работать не будет?

Вот функция:

Код:

$PathIsProcess = _PathIsProcess("C:\Program Files\qip\qip.exe")
MsgBox(0, '', $PathIsProcess & @LF & @extended)

Func _PathIsProcess($sPath)
    If Not FileExists($sPath) Then Return SetError(1, 0, False)

    Local $sPathName = StringRegExpReplace($sPath, "^.*\\", "")
    Local $aProcList = ProcessList($sPathName)

    If Not ProcessExists($sPathName) Then Return SetError(2, 0, False)
    Local $iUbound = UBound($aProcList)-1

    Local $aProc, $aPath
    Local $vStruct = DllStructCreate('int[1024]')

    For $i = 1 To $iUbound
        $aProc
= DllCall('kernel32.dll', 'hwnd', 'OpenProcess', 'int', BitOR(0x0400, 0x0010), 'int', 0, 'int', $aProcList[$i][1])
        If Not IsArray($aProc) Or Not $aProc[0] Then Return SetError(3, 0, False)

        DllCall('Psapi.dll', 'int', 'EnumProcessModules', _
            'hwnd', $aProc[0], _
            'ptr', DllStructGetPtr($vStruct), _
            'int', DllStructGetSize($vStruct), _
            'int_ptr', 0)

        $aPath = DllCall('psapi.dll', 'int', 'GetModuleFileNameEx', _
            'hwnd', $aProc[0], _
            'int', DllStructGetData($vStruct, 1), _
            'str', '', _
            'int', 2048)
        If IsArray($aPath) And $aPath[3] = $sPath Then Return SetExtended($iUbound, $aProcList[$i][1])
    Next

    Return
SetExtended($iUbound, False)
EndFunc

Может есть альтернативы?

Endr 26-12-2007 08:59 704124

Creat0R, указал рабочую папку и запустился VBS-скрипт. Спасибо! :up

Maza Faka 27-12-2007 09:31 704849

Creat0R
Привет! Не поможешь?
Никак не получается убить процесс средствами WinAPI

Код:

#include <Array.au3>

Process_Kill("totalcmd.exe")

Func Process_Kill($sProc)
    Local $ProcHandle
    Local $ProcessPid = ProcessExists($sProc)
    If $ProcessPid = 0 Then
        MsgBox(16, "Error", "Process " & $sProc & " not exist")
        Return SetError(1)
    EndIf

    $ProcHandle = DllCall("kernel32.dll", "hwnd", "OpenProcess", "dword", BitOR(0x0400, 0x0004), "int", 0, "dword", $ProcessPid)

    If $ProcHandle[0] = 0 Then
        MsgBox(16, "Error", "Process " & $sProc & " not exist")
        Return SetError(1)
    EndIf

    $ProcHandle = $ProcHandle[0]

    $ProcTerminate = DllCall("kernel32.dll", "int", "TerminateProcess", "hwnd", $ProcHandle, "uint", "?")

    $CloseHandle = DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $ProcHandle)
    ConsoleWrite("@@ (6) : " & $CloseHandle[0] & "      ")
EndFunc

В выделенной строке в место параметра "?", надо вставить
Цитата:

uExitCode

The exit code to be used by the process and threads terminated as a result of this call. Use the GetExitCodeProcess [ http://msdn2.microsoft.com/en-us/lib...,printer).aspx ] function to retrieve a process's exit value. Use the GetExitCodeThread [ http://msdn2.microsoft.com/en-us/lib...,printer).aspx ] function to retrieve a thread's exit value.
Цитата:

GetExitCodeProcess Function


Retrieves the termination status of the specified process.
BOOL WINAPI GetExitCodeProcess(
__in HANDLE hProcess,
__out LPDWORD lpExitCode
);
Parameters
hProcess

A handle to the process.

The handle must have the PROCESS_QUERY_INFORMATION access right. For more information, see Process Security and Access Rights [ http://msdn2.microsoft.com/en-us/lib...,printer).aspx ] .
lpExitCode

A pointer to a variable to receive the process termination status. If the specified process has not terminated and the function succeeds, the status is STILL_ACTIVE.
Как я понял нужно создать структуру Dll, а вот как её создать?

Creat0R 27-12-2007 10:39 704899

Maza Faka,
Цитата:

В выделенной строке в место параметра "?", надо вставить
Там должен быть код (по сути ptr - указатель) выхода от GetExitCodeProcess ... если я не ошибаюсь... у меня тоже не получается заставить это работать, либо скрипт крушится, либо процесс не убивается. DLL-о-писание видимо будет доходить (до меня по крайней мере) долго, т.к мануалов по этой теме вроде нету, я имею в виду именно для использования в AutoIt, а так приходится включать интуицию/способности "тыкания" :).

На оф. форуме решения тоже нет, там ссылаются на C/C++, а на AutoIt перевести видимо ленятся :biggrin:

Maza Faka 27-12-2007 10:55 704912

Creat0R
Цитата:

Там должен быть код (по сути ptr - указатель) выхода от GetExitCodeProcess
Это понятно, что нужно указать pointer, а вот как его создать? (amel27 где ты гуру?) :)

Цитата:

а так приходится включать интуицию/способности "тыкания"
Вот-вот, всё утро на это убил... :(

P.S.
Если вдруг наткнёшься на решение, сообщи пожалуйста.

Maza Faka 27-12-2007 13:11 704996

Ура! :) Нашёл, вернее указали на ошибку. А ошибочное значение из недобросовестного ресурса, уже не помню какого.

Creat0R 28-12-2007 07:53 705429

Функция возвращает пронумерованный список всех классов определённого окна:

Код:

Func _WinGetNumeratedClassList($sTitle)
    Local $sClassList = WinGetClassList($sTitle)
    Local $aClassList = StringSplit($sClassList, @LF)
    Local $sRetClassList = "", $sHold_List = "|"
    Local $aiInHold, $iInHold

    For $i = 1 To UBound($aClassList) - 1
        If $aClassList[$i] = "" Then ContinueLoop

        If
StringRegExp($sHold_List, "\|" & $aClassList[$i] & "~(\d+)\|") Then
            $aiInHold = StringRegExp($sHold_List, ".*\|" & $aClassList[$i] & "~(\d+)\|.*", 1)
            $iInHold = Number($aiInHold[UBound($aiInHold)-1])

            If $iInHold = 0 Then $iInHold += 1

            $aClassList[$i] &= "~" & $iInHold + 1
            $sHold_List &= $aClassList[$i] & "|"

            $sRetClassList &= $aClassList[$i] & @LF
        Else
            $aClassList[$i] &= "~1"
            $sHold_List &= $aClassList[$i] & "|"
            $sRetClassList &= $aClassList[$i] & @LF
        EndIf
    Next

    Return
StringReplace(StringStripWS($sRetClassList, 3), "~", "")
EndFunc


Creat0R 30-12-2007 03:14 706453

amel27,

Не удаётся в новой версии AutoIt 3.2.10.0 переделать самопальную функцию _FileSelectFolder() - хотел избавиться от CallBack UDF'ов, соответственно использовать встроенные функции, но при запуске скрипт намертво виснит, диалога невидно вовсе :(

Я заменил...

_DllCallBack($sCallbackProc,'hwnd;uint;long;ptr')

на

DllCallBackRegister($sCallbackProc, 'int', 'hwnd;uint;long;ptr')

А также _DllCallBack_Free на DllCallBackFree

И убрал все UDF'ы/переменные/константы от библиотеки CallBack, но видимо нужно что-то ещё править, подскажи плиз что именно, у меня многие скрипты используют эту функцию, я затрудняюсь теперь пересесть на новую версию :help: .

МИШАНЧИК 01-01-2008 15:25 707149

Никто не пробовал написать скрипт для Nero 8? А то втихую не получается, требует перезагрузку даже при включенном автоматическом обновлении. Может кто попробует, у кого время есть?
Заранее спасибо!

kagorec 01-01-2008 23:51 707373

Хорошо пополняются посты в этом топике =)

Помогите реализовать корректно работающий скрипт с тикими требованиями:
Лечилка для одной RPG игры. Все происходит в разрешении 1024х786

1. В определенных координатах если изменился цвет, то нажимание клавиши Q происходит с интервалом 0.5 секунды пока невернется снова красный цвет (q клавиша это пить баночки жизьни). И в это же самое время нажимать клавишу E (e элексир силы)
2. Очень важно чтоб при этом была всегда зажата правая кнопка мышки (почемуто у меня никак неполучается реализовать в действии с другими командами)
3. Как реализовать чтоб работало внезависимости если 32 бит или 16 цвет?

Поискал по форуму здесь и на офф. сайте вот нашел скрипт но в нем часть задумки реализована. Кстати он неработает тоесть не нажимает на кнопки.
PHP код:

Opt("WinTitleMatchMode"1)

HotKeySet("{F5}""Start")

While 
1
    Sleep
(10)
WEnd

Func Start
()
        
MsgBox(0,"","Start() triggered")
        
$left PixelChecksum(380420400400)
        
ConsoleWrite($left & @CRLF)
        
$down PixelChecksum(450420470400)
        
ConsoleWrite($down & @CRLF)
        
$up PixelChecksum(520420535410)
        
ConsoleWrite($up & @CRLF)
        
$right PixelChecksum(590415585400)
        
ConsoleWrite($right & @CRLF)
    While 
1  
        
If $left <> PixelChecksum(380420400400Then Send("q")
        If 
$down <> PixelChecksum(450420470400Then Send("e")
        If 
$up <> PixelChecksum(520420535410Then Send("w")
        If 
$right <> PixelChecksum(590415585400Then Send("t")
    
WEnd
EndFunc 


Maza Faka 02-01-2008 08:44 707471

kagorec
С Новым Годом!

Цитата:

1. В определенных координатах если изменился цвет, то нажимание клавиши Q происходит с интервалом 0.5 секунды пока невернется снова красный цвет (q клавиша это пить баночки жизьни). И в это же самое время нажимать клавишу E (e элексир силы)
В принципе написать такой скрипт несложно, в топике есть примеры.

Цитата:

2. Очень важно чтоб при этом была всегда зажата правая кнопка мышки (почемуто у меня никак неполучается реализовать в действии с другими командами)
Смотри в справке MouseDown()

Цитата:

3. Как реализовать чтоб работало внезависимости если 32 бит или 16 цвет?
Можно после запуска игры определять глубину цвета рабочего стола @DesktopDepth и в зависимости от результата передавать значение в функцию.

kagorec 02-01-2008 13:08 707558

Maza Faka Тебя также с новым :)
Спасибо, посмотрю мануал может чтонибудь да получится ...
Насчет посмотреть в топике этт 194 страницы просмотреть с моим диалапом, а можно пример скрипта ?

МИШАНЧИК 03-01-2008 04:51 707962

Ну может всё таки кто нибудь напишет скрипт для Nero8?

Maza Faka 03-01-2008 07:07 707970

kagorec
Цитата:

194 страницы просмотреть с моим диалапом
Посмотри в версии для печати, дай поиск по слову PixelChecksum.

МИШАНЧИК
Цитата:

Ну может всё таки кто нибудь напишет скрипт для Nero8?
Я бы с удовольствием тебе помог, но у меня нет Nero8 (юзаю 6 версию), а качать этого монстра из инета на диал-апе удовольствие сомнительное.

Angelus 03-01-2008 13:45 708126

Добрый день, такой вопрос.....есть параметр, нужно что бы он проверял соответствие пути, и если есть лишнии символы то выдал сообщение....
Код:


Func nst_serv ()
Dim $wtf_exe = '*\*.???'
       
Dim $serv1_realm = ControlGetText ( 'Настройка', '', 'Edit1' )
Dim $serv1_exe = ControlGetText ( 'Настройка', '', 'Edit2' )
Dim $serv1_reg = ControlGetText ( 'Настройка', '', 'Edit3' )
Dim $serv1_ip = ControlGetText ( 'Настройка', '', 'Edit4' )
Dim $serv1_ping = ControlGetText ( 'Настройка', '', 'Edit5' )

Dim $dat_serv1[5][2] = [ [ $key1, $serv1_realm ], [ $key2, $serv1_exe ], [ $key3, $serv1_reg ], [ $key4, $serv1_ip ], [ $key5, $serv1_ping ] ]

If $wtf_exe = $serv1_realm Then
MsgBox ( 16, 'Ошибка', 'Возможно допущенны следующие ошибки:' & @CRLF & _
'- В пути realmlist`а написано имя файла' & @CRLF & _
'- В пути к экзешнику написано имя файла' & @CRLF & _
'- В конце путей стоит " \ "' & @CRLF & _
'- В ip адресе realmlist`a написано "set realmlist"' )
Else
IniWriteSection ( $file, $serv[0], $dat_serv1, 0 )
EndIf

Выполняется только если ввести в параметр $wtf_exe поный путь......

Maza Faka 03-01-2008 14:37 708165

Angelus
FileExists()?

Angelus 03-01-2008 14:40 708167

Я хочу что бы он путь проверял...и если в графе вписано путь и в конце имя файла тогда он выдал сообщение....если не вписано имя файла...то записал в ини файл то что в графе....

Maza Faka 04-01-2008 08:32 708599

Angelus
Так? :
Код:

$parsing = StringRegExp($serv1_realm, "\..{3}$", 3)

If @error Then
    IniWrite("c:\test\test.ini", "Section", $serv1_realm, "value")
Else
    MsgBox(64, "Message", "File name")
EndIf


Creat0R 04-01-2008 09:13 708602

Цитата:

Цитата Creat0R
Не удаётся в новой версии AutoIt 3.2.10.0 переделать самопальную функцию _FileSelectFolder() »

Удалось! :up

Код:

Func _FileSelectFolder($sText='', $iRoot=0, $iFlags=0, $sInitDir=@ScriptDir, $hWnd=0, $sCallbackProc='_FileSFCallbackProc')
    Local $pidl, $iRes='', $pCallbackProc=0, $iMask = $BIF_ALLOLDSTYLEFLAGS, $Error = 0
    ; Контроль входных параметров
    ;$sInitDir = StringRegExpReplace($sInitDir, '([^\\])\\*$', '\1\\')
    ;If StringRight($sInitDir, 1)=':' Then $sInitDir &= '\'

    If BitAND($iFlags, $BIF_NEWDIALOGSTYLE) Then $iMask = $BIF_ALLNEWSTYLEFLAGS
    ; Создание и инициализация основных структур данных
    Local $uBI = DllStructCreate ("hwnd;ptr;ptr;ptr;int;ptr;ptr;int") ; BROWSEINFO
    Local $uTX = DllStructCreate ("char[260];char") ; Текст приглашения
    Local $uMP = DllStructCreate ("char[260]") ; MAX_PATH
    Local $uCB = DllStructCreate ("char[260];int") ; CallBack структура
    DllStructSetData ($uTX, 1, $sText)
    DllStructSetData ($uCB, 1, $sInitDir)
    DllStructSetData ($uCB, 2, $iFlags)
    ; Заполнение структуры BROWSEINFO
    DllStructSetData ($uBI, 1, $hwnd)
    DllStructSetData ($uBI, 3, DllStructGetPtr($uMP))
    DllStructSetData ($uBI, 4, DllStructGetPtr($uTX))
    DllStructSetData ($uBI, 5, BitAND($iFlags, $iMask))
    DllStructSetData ($uBI, 7, DllStructGetPtr($uCB))
    ; Получение указателя на CallBack-функцию
    If $sCallbackProc <> '' Then $pCallbackProc = DllCallbackRegister($sCallbackProc, 'int', 'hwnd;int;long;ptr')
    If @error Then Return SetError(2, @error, '') ; ОШИБКА получения указателя
    DllStructSetData($uBI, 6, DllCallbackGetPtr($pCallbackProc))
    ; Получение указателя на корневую папку (PIDL)
    Local $iRet = DllCall ("shell32.dll", "ptr", "SHGetSpecialFolderLocation", _
        "int", 0 , "int", $iRoot , "ptr", DllStructGetPtr($uBI, 2))
    If $iRet[0]=0 Then
        ; Запуск системного диалога
        $pidl = DllCall ("shell32.dll", "ptr", "SHBrowseForFolder", "ptr", DllStructGetPtr($uBI))
        $iRes = DllStructGetData($uMP, 1) ; сохраняем имя объекта
        If $pidl[0] Then
            ; Обработка полученного указателя (PIDL)
            $iRet = DllCall ("shell32.dll", "int", "SHGetPathFromIDList", "ptr", $pidl[0], "ptr", DllStructGetPtr($uMP))
            If $iRet[0] Then $iRes = DllStructGetData($uMP, 1)
            DllCall ("ole32.dll", "int", "CoTaskMemFree", "ptr", $pidl[0]) ; чистим за собой
        Else
            $Error = 1
        EndIf
        DllCall ("ole32.dll", "int", "CoTaskMemFree", "ptr", DllStructGetData ($uBI, 2)) ; чистим за собой
    Else
        SetError(1, 0, '') ; ОШИБКА в параметре корневой папки
    EndIf
    If
$pCallbackProc Then DllCallBackFree($pCallbackProc) ; закрытие указателя
    Return SetError($Error, 0, $iRes)
EndFunc

Оказывается DllCallbackRegister() возвращает не указатель, а идентификатор, нужно было всего лишь использовать DllCallbackGetPtr() для получения указателя, и далее использовать его при вызове заполнении структуры :) .

Angelus 04-01-2008 09:20 708603

Да спасибо...сработало....интересная команда....

Maza Faka 04-01-2008 10:13 708622

Creat0R
Ругается на:
Цитата:

WARNING: $BIF_ALLOLDSTYLEFLAGS: possibly used before declaration.
, какое значение должно содержаться в константе(?) $BIF_ALLOLDSTYLEFLAGS?

kagorec 04-01-2008 23:42 709132

Попытался собрать из нескольких кодов нужный скрипт.
Для экрана 1024х768, движение курсора по кругу (в центре радиусом 300пикселей) скорость неполучается выставить 25 через команду Opt (mousemove), при этом удерживается правая кнопка мышки.
Старался вписать управление скриптом:
Pause - пауза
F9 - включить
F10 - остановить
Но при включении ахтунг получается - курсор движется по кругу удерживая кнопку все хорошо, НО процессор нагружает на 100% и не управляется ни стоп ни пауза только рестарт компа спасает.
Поправте пожалста скрипт или подскажите (мои эксперементы заканчиваются рестартом ПК)
PHP код:

Global $Paused
HotKeySet
("{PAUSE}""TogglePause")
HotkeySet ("{F10}""Stop"       )
HotKeySet"{F9}""Start" )


;******** 
Script Pause **********
Func TogglePause()
    
$Paused NOT $Paused
    
While $Paused
        sleep
(100)
        
ToolTip('script is "Paused"',0,0)
    
WEnd
    ToolTip
("")
EndFunc

;********** Stop **********
Func Stop ()

While 
1
Sleep 
(600)
Wend

EndFunc

While (1)
BlockInput(1)
_MouseMoveCircle(5403903006251) ;(need opt speed 25Circle 4ever for resolution 1024x768 
Sleep
(200)

BlockInput(0)
 
WEnd
Func _MouseMoveCircle
($xPos$yPos$Radius$TimeExp$MouseClick=0); x coordy coordradiustime to loop (milliseconds)
    
Local $TimeInit TimerInit()
    
Local $xPosMov$yPosMov
    Local $MouseClick_Mark 
1

    
Do
        
$TimeDiff TimerDiff($TimeInit)
        
$xPosMov $xPos + ($Radius Sin($TimeDiff/100))
        
$yPosMov $yPos + ($Radius Cos($TimeDiff/100))
        
MouseMove($xPosMov$yPosMov1)
        If 
$MouseClick_Mark And $MouseClick <> 0 Then MouseDown("Right")
        
$MouseClick_Mark 0
    Until $TimeDiff 
$TimeExp
    
If $MouseClick <> 0 Then MouseUp("Right")
    
EndFunc 


Creat0R 05-01-2008 02:17 709209

Вложений: 1
Maza Faka,
Цитата:

Ругается на
Тогда должен ругаться и на многое дргое ;) - я всего лишь привёл подправленную функцию из _FileSelectFolder.au3...

Прикрепляю полный набор самопальных функции системных диалогов + Примеры применения (файл Examples.au3).
За большенство из которых (как функции так и примеров) большое спасибо amel27 :)

Только для AutoIt 3.2.10.0.

Зеркало для тех кто неможет скачать с форума.

Creat0R 05-01-2008 02:36 709212

kagorec,
Цитата:

НО процессор нагружает на 100% и не управляется ни стоп ни пауза только рестарт компа спасает.
Конечно не будет управляться, ведь BlockInput не даёт ничего нажать.
Я выкрутился быстрым нажатием «Alt + Ctrl + Del» и «Pause» ;)

Тут видимо это происходт из за постоянного цикла внутри _MouseMoveCircle - можно поставить в нём проверку на ввод пользователя, и небольшую паузу...

Вот простой пример, для наглядности, я BlockInput закомментировал :)

Код:

Global $Paused = False

HotKeySet("{PAUSE}", "TogglePause")
HotKeySet("{ESC}", "QuitApp")

While 1
    While $Paused
        Sleep(100)
        ToolTip('script is "Paused"',0 , 0)
    WEnd

    ToolTip("")

    ;BlockInput(1)
    _MouseMoveCircle(540, 390, 300, 625, 1) ;(need opt speed 25) Circle 4ever for resolution 1024x768
    Sleep(200)
    ;BlockInput(0)
WEnd

Func
TogglePause()
    $Paused = NOT $Paused
EndFunc

Func
_MouseMoveCircle($xPos, $yPos, $Radius, $TimeExp, $MouseClick=0); x coord, y coord, radius, time to loop (milliseconds)
    Local $TimeInit = TimerInit()
    Local $xPosMov, $yPosMov
    Local $MouseClick_Mark = 1

    Do
        $TimeDiff = TimerDiff($TimeInit)
        $xPosMov = $xPos + ($Radius * Sin($TimeDiff/100))
        $yPosMov = $yPos + ($Radius * Cos($TimeDiff/100))
        MouseMove($xPosMov, $yPosMov, 1)
        If $MouseClick_Mark = 1 And $MouseClick <> 0 Then MouseDown("Right")
        $MouseClick_Mark = 0

        If $Paused Then ExitLoop
        Sleep(10)
    Until $TimeDiff > $TimeExp
    If $MouseClick <> 0 Then MouseUp("Right")
EndFunc

Func
QuitApp()
    Exit
EndFunc


rimm 05-01-2008 02:57 709221

Подскажите как с помощью Autoit удалить раздел реестра и все ключи в нем?

HKEY_LOCAL_MACHINE\SOFTWARE\TEST\

или все ключи в разделе

HKEY_LOCAL_MACHINE\SOFTWARE\TEST\*.REG_BINARY

Буду рад помощи

Creat0R 05-01-2008 03:20 709235

rimm,
Цитата:

как с помощью Autoit удалить раздел реестра и все ключи в нем?
Код:

RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\TEST")
Для удаления определённых типов записей, можно использовать RegEnumVal()...

Код:

For $i = 1 To 100
    $Var = RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\Autoit", $i)
    If @error Then ExitLoop

    MsgBox(4096, "Value Name  #" & $i & " under in AutoIt3 key", $Var & @LF & "Extended: " & GetExtendedType(@extended))
Next

Func
GetExtendedType($Extended)
    Local $RegTypeArr[6] = [5, "REG_SZ", "REG_MULTI_SZ", "REG_EXPAND_SZ", "REG_DWORD", "REG_BINARY"]
    For $i = 1 To 5
        If $Extended = $i Then Return $RegTypeArr[$i]
    Next
EndFunc


Creat0R 05-01-2008 09:22 709288

Библиотека автоматизации для браузера Opera!

24 (планируется ещё больше) полезных функции для решения задач связанных с браузером Opera.

Примечание: Библиотека тестировалась под Opera начиная с версии 8.54 и до версии 9.5.

[Страница закачки], [Зеркало]

SAOPP 06-01-2008 19:46 710381

Ребят, а с помощью AutoIt'а можно реализовать блокировку клавиатуры и мыши при запуске скрипта - и последующей разблокировкой например нажатием каких либо сочетаний клавиш?

Creat0R 06-01-2008 22:41 710585

SAOPP,
Цитата:

с помощью AutoIt'а можно реализовать блокировку клавиатуры и мыши при запуске скрипта
Да, есть команда BlockInput(1), соответственно BlockInput(0) отменит блокирование... Alt+Ctrl+Del в любом случае разблокирует ввод ;).

SAOPP 06-01-2008 23:03 710602

Ну вот мне бы так и нужно, как "некая" утилитка ;) для чистки клавиатуры блокирует это дело, только без всяких оповещений и окон, просто блокировала, а по нажатию ctrl+alt+del разблокировала и закрывалась соответственно.

Creat0R 07-01-2008 00:02 710645

SAOPP,
Цитата:

мне бы так и нужно, как "некая" утилитка для чистки клавиатуры
Эта утилитка? :)

Цитата:

только без всяких оповещений и окон, просто блокировала, а по нажатию ctrl+alt+del разблокировала и закрывалась
Всё очень просто:

Код:

#NoTrayIcon

$aOld_MousePos = MouseGetPos()

BlockInput(1)

While 1
    Sleep(100)
    $aNewMousePos = MouseGetPos()
    If $aOld_MousePos[0] <> $aNewMousePos[0] Or $aOld_MousePos[1] <> $aNewMousePos[1] Then ExitLoop
WEnd


BlockInput(0)

Скрипт завершит работу после любого движения мышки ;)

SAOPP 07-01-2008 00:09 710650

Цитата:

Цитата Creat0R
Эта утилитка? »

А как же :)

Цитата:

Цитата Creat0R
Скрипт завершит работу после любого движения мышки »

Нет, не годится, любое движение мышки, вот если бы по комбинации клавиш тогда хорошо, а движение или нажатие клавиши не годиться :(

Creat0R 07-01-2008 00:24 710668

SAOPP,
Цитата:

вот если бы по комбинации клавиш тогда хорошо
Ты этот скрипт пробовал запускать?

Я имел в виду после нажатия ALT + CTRL + DEL (ведь в справке к команде BlockInput это говорится), если двинуть мышкой, скрипт завершит работу, а блокирование снимается по нажатию alt ctrl del.

HORRIBLE 07-01-2008 03:16 710793

Подскажите, а как сделать часы, чтобы время шло ) спасибо.

Creat0R 07-01-2008 04:10 710809

HORRIBLE,
Цитата:

как сделать часы, чтобы время шло
Имеется в виду таймер?

Типа такого:

Код:

#include <GuiConstants.au3>

Global $iTimer_Started = False
Global
$Timer_Init = 0, $Total_Seconds = 0

$GUI = GUICreate("Timer Script", 220, 90)

$Timer_Button = GUICtrlCreateButton("Start", 50, 20, 120, 20)
$Timer_Label = GUICtrlCreateLabel("00:00:00", 90, 60)

GUISetState(@SW_SHOW, $GUI)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$Timer_Button
            If $iTimer_Started Then
                GUICtrlSetData($Timer_Button, "Start")
                _AdlibDisable($GUI)
                Set_Timer()
                $Total_Seconds += Round(TimerDiff($Timer_Init)/1000, 1)
            Else
                GUICtrlSetData($Timer_Button, "Stop")
                $Timer_Init = TimerInit()
                _AdlibEnable("Set_Timer", 1000, $GUI)
            EndIf

            $iTimer_Started = Not $iTimer_Started
    EndSwitch
WEnd

Func
_AdlibEnable($sFunction, $iTime=250, $hWnd=0)
    Local Const $WM_TIMER = 0x0113
    If Not IsHWnd($hWnd) Then $hWnd = GUICreate("hCallBack_AdlibEnable")
    GUIRegisterMsg($WM_TIMER, $sFunction)
    Local $aRet = DllCall("User32.dll", "int", "SetTimer", "hwnd", $hWnd, "int", 50, "int", $iTime, "int", 0)
    Return $hWnd
EndFunc

Func
_AdlibDisable($hWnd=0)
    Local Const $WM_TIMER = 0x0113
    GUIRegisterMsg($WM_TIMER, "")
    Local $aRet = DllCall("user32.dll", "int", "KillTimer", "hwnd", $hWnd, "int_ptr", 50)
    Return Number(IsArray($aRet) And $aRet[0])
EndFunc

Func
_SecsToTime($iTicks, $Delim=":")
    If Number($iTicks) >= 0 Then
        Local
$iHours = Int($iTicks / 3600)
        $iTicks = Mod($iTicks, 3600)
        Local $iMins = Int($iTicks / 60)
        Local $iSecs = Round(Mod($iTicks, 60))
        If StringLen($iHours) = 1 Then $iHours = "0" & $iHours
        If StringLen($iMins) = 1 Then $iMins = "0" & $iMins
        If StringLen($iSecs) = 1 Then $iSecs = "0" & $iSecs
        Return $iHours & $Delim & $iMins & $Delim & $iSecs
    EndIf
    Return
SetError(1, 0, 0)
EndFunc

Func
Set_Timer($hWnd=0)
    Local $iTmp_Total_Seconds = Round(TimerDiff($Timer_Init)/1000, 1)
    If $Total_Seconds > 0 Then $iTmp_Total_Seconds += $Total_Seconds

    Local $sTime = _SecsToTime($iTmp_Total_Seconds)

    GUICtrlSetData($Timer_Label, $sTime)
EndFunc


HORRIBLE 07-01-2008 12:43 710982

Creat0R,
неа, не таймер, хотя за таймер спасибо, а такие же часики как и в винде, вправом нижнем углу.
т.к если просто использовать команды @Hour &":"& @MIN &":"& @SeC то получается когда файлик запускается то время показывается когда файл был запущен, а вот как сдеть чтоб время обновлялось, не перезапуская файл.

Еще подскажите почему ругается вот на это
#include <GuiCombo.au3>

говорит: Error opening the file

Можно ли убрать верхнюю шапку когда создаешь окно GUICreate особенно 3-и стандартных кнопки ?

Creat0R 07-01-2008 19:45 711313

HORRIBLE,
Цитата:

как сдеть чтоб время обновлялось, не перезапуская файл.
Использовать GuiCtrlSetData()...

Код:

#include <GuiConstants.au3>

Global $sTDelim = _GetTimeDelim()

$GUI = GUICreate("Timer Script", 220, 90)

$Time_Label = GUICtrlCreateLabel("Текущее время: " & GetCurrentTime($sTDelim), 40, 60)

$Handle = _AdlibEnable("Set_System_Time", 1000)

GUISetState(@SW_SHOW, $GUI)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            _AdlibDisable($Handle, 1)
            Exit
    EndSwitch
WEnd

Func
_AdlibEnable($sFunction, $iTime=250, $hWnd=0)
    Local Const $WM_TIMER = 0x0113
    If Not IsHWnd($hWnd) Then $hWnd = GUICreate("hCallBack_AdlibEnable")
    GUIRegisterMsg($WM_TIMER, $sFunction)
    Local $aRet = DllCall("User32.dll", "int", "SetTimer", "hwnd", $hWnd, "int", 1, "int", $iTime, "int", 0)
    Return $hWnd
EndFunc

Func
_AdlibDisable($hWnd=0, $iCloseHwnd=0)
    Local Const $WM_TIMER = 0x0113
    GUIRegisterMsg($WM_TIMER, "")
    If $iCloseHwnd Then GUIDelete($hWnd)
    Local $aRet = DllCall("user32.dll", "int", "KillTimer", "hwnd", $hWnd, "int", 1)
    Return Number(IsArray($aRet) And $aRet[0])
EndFunc

Func
Set_System_Time()
    GUICtrlSetData($Time_Label, "Текущее время: " & GetCurrentTime($sTDelim))
EndFunc

Func
GetCurrentTime($sTDelim=":")
    Return @HOUR & $sTDelim & @MIN & $sTDelim & @SEC
EndFunc

Func
_GetTimeDelim($sNowTime="")
    Local $sRetDelim = RegRead("HKEY_CURRENT_USER\Control Panel\International", "sTime")
    If $sRetDelim = "" And $sNowTime <> "" Then $sRetDelim = StringLeft(StringRegExpReplace($sNowTime, "[0-9]", ""), 1)
    If $sRetDelim = "" Then $sRetDelim = ":"
    Return $sRetDelim
EndFunc

Цитата:

почему ругается вот на это
GuiCombo.au3 переименован в последней версии AutoIt'а, теперь нужно использовать GuiComboBox.au3

Цитата:

Можно ли убрать верхнюю шапку когда создаешь окно GUICreate особенно 3-и стандартных кнопки ?
Если речь про область заголовка, то убрать можно, нужно просто выставить стиль $WS_POPUP без других стилей, а чтобы убрать все кнопки, но при этом оставить область заголовка, нужно выставить только $WS_CAPTION плюс $WS_POPUP...

Код:

GUICreate("Title", 300, 100, -1, -1, $WS_CAPTION+$WS_POPUP)

TERMINAL 08-01-2008 15:56 711806

Creat0R, возможно ли с помощью скрипта менять разрешение экрана и определять на данный момент?

Creat0R 09-01-2008 00:20 712106

TERMINAL,
Цитата:

возможно ли с помощью скрипта менять разрешение экрана и определять на данный момент?
Да, вот немного изменённые функции (Источник):

Код:

#include <Array.au3>

$aDisplayData = DisplayGetResolution()
_ArrayDisplay($aDisplayData, "Current Resolution Values")

;Change to new resolution
DisplayChangeResolution(960, 600, 32, 60)

Sleep(3000)

;Change back to currently used resolution
DisplayChangeResolution($aDisplayData[0], $aDisplayData[1], $aDisplayData[2], $aDisplayData[3])

Func DisplayGetResolution($iIndex=-1)
    Local $DEVMODE = DllStructCreate("byte[32];int[10];byte[32];int[6]")
    Local $aRet[4]

    Local $aDllCall = DllCall("user32.dll", "int", "EnumDisplaySettings", _
            "ptr", 0, "long", $iIndex, "ptr", DllStructGetPtr($DEVMODE))

    If IsArray($aDllCall) And $aDllCall[0] <> 0 Then
        $aRet[0] = DllStructGetData($DEVMODE, 4, 2)
        $aRet[1] = DllStructGetData($DEVMODE, 4, 3)
        $aRet[2] = DllStructGetData($DEVMODE, 4, 1)
        $aRet[3] = DllStructGetData($DEVMODE, 4, 5)
    Else
        Return
SetError(1, 0, 0)
    EndIf

    $DEVMODE = 0

    Return $aRet
EndFunc  ;==>DisplayGetResolution

Func DisplayChangeResolution($iWidth, $iHeight, $iBpp, $iFreq)
    Local Const $DM_PELSWIDTH = 0x00080000
    Local Const $DM_PELSHEIGHT = 0x00100000
    Local Const $DM_BITSPERPEL = 0x00040000
    Local Const $DM_DISPLAYFREQUENCY = 0x00400000
    Local Const $CDS_TEST = 0x00000002
    Local Const $CDS_UPDATEREGISTRY = 0x00000001
    Local Const $DISP_CHANGE_RESTART = 1
    Local Const $DISP_CHANGE_SUCCESSFUL = 0
    Local Const $HWND_BROADCAST = 0xFFF
    Local Const $WM_DISPLAYCHANGE = 0x007E

    Local $DEVMODE = DllStructCreate("byte[32];int[10];byte[32];int[6]")

    Local $avDllCall = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "long", 0, "ptr", DllStructGetPtr($DEVMODE))

    If IsArray($avDllCall) And $avDllCall[0] <> 0 Then
        DllStructSetData($DEVMODE, 2, BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY), 5)
        DllStructSetData($DEVMODE, 4, $iWidth, 2)
        DllStructSetData($DEVMODE, 4, $iHeight, 3)
        DllStructSetData($DEVMODE, 4, $iBpp, 1)
        DllStructSetData($DEVMODE, 4, $iFreq, 5)

        $avDllCall = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST)

        If @error Then
            $avDllCall = -1
        Else
            $avDllCall = $avDllCall[0]
        EndIf

        Select
            Case
$avDllCall = $DISP_CHANGE_RESTART
                $DEVMODE
= 0
                Return 2
            Case $avDllCall = $DISP_CHANGE_SUCCESSFUL
                DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_UPDATEREGISTRY)
                DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _
                        "int", $iBpp, "int", $iHeight * 2 ^ 16 + $iWidth)
                $DEVMODE = 0
                Return 1
            Case Else
                $DEVMODE = 0
                Return $avDllCall
        EndSelect
    EndIf
EndFunc  ;==>DisplayChangeResolution

В принципе, функцию для получения текущих значении можно заменить макросами...

Код:

Func DisplayGetResolution_by_Macro()
    Local $aRet[4] = [@DesktopWidth, @DesktopHeight, @DesktopDepth, @DesktopRefresh]
    Return $aRet
EndFunc


HORRIBLE 09-01-2008 16:01 712530

Как сделать поиск по маске, формат имени файла выглядит так (12_12_12.txt), в папке текстовых файлов много и у всех разный формат имени, но есть и файлы с форматом имени таким который был приведен, далее после поиска вывести массив с найденными файлами.
Я так думаю что нужно сперва воспользоваться _FileListToArray ($path ,"*.txt"), а после это этим StringRegExp (). Но я так попробовал, и ничего не вышло

StringRegExp ("12_12_12.txt 12_12_12.txt", ,'(\d\d\w\d\d\w\d\d.\w\w\w\w*?)',4) - если так писать, все прекрасно работат, находит)) а как быть с именем файла?
'(\d\d\w\d\d\w\d\d.\w\w\w\w*?)' - правильно написано или можно как нить подругому задать?



2 вопрос:

_FileCreate("1.txt")
$Array1 = _FileListToArray ($path ,"*.au3")
$Array2 = _ArrayToclip($1)
fileWrite("1.txt",ClipGet())

когда информация (имена присутствующих файлов в папке) записываается в файлик она разделяется @LF, а как сделать так чтоб информация разделялась, а Enter-ом, чтобы каждое название файла начиналось с новой строки.

Спасибо.

Creat0R 09-01-2008 19:46 712688

HORRIBLE,
Цитата:

Как сделать поиск по маске, формат имени файла выглядит так (12_12_12.txt), в папке текстовых файлов много и у всех разный формат имени, но есть и файлы с форматом имени таким который был приведен, далее после поиска вывести массив с найденными файлами.
_FileListToArray вернёт массив, поэтому проходиться нужно по всему массиву циклом:

Код:

#include <File.au3>
#include <Array.au3>

$sPath = @ScriptDir
$avArray = _RegExpFileListToArray($sPath, "(?i)\d+_\d+_\d+\.txt", "*.txt")

_ArrayDisplay($avArray)

Func _RegExpFileListToArray($sPath, $sPattern, $sMask="*")
    Local $aRet[1]

    $aFileList = _FileListToArray($sPath, $sMask)

    For $i = 1 To UBound($aFileList)-1
        If StringRegExp($aFileList[$i], $sPattern) Then
            $aRet[0] += 1
            ReDim $aRet[$aRet[0]+1]
            $aRet[$aRet[0]] = $aFileList[$i]
        EndIf
    Next

    Return
$aRet
EndFunc

Если всегда цифр будет только две (между каждым разделителем), то \d+ нужно заменить на \d\d.

Цитата:

как сделать так чтоб информация разделялась, а Enter-ом, чтобы каждое название файла начиналось с новой строки.
А зачем использовать буфер обмена? есть функция _FileWriteFromArray() :).

Функция _ArrayToClip() помещет строчки в буфер обмена разделённые @CR (возврат каретки).

HORRIBLE 10-01-2008 00:32 712877

Creat0R,
ох большущее спасибо.
_RegExpFileListToArray откуда такие команды??? у меня в хелпе по авто иту нету такого, вы че сами их придумавыете?

_RegExpFileListToArray($sPath, $sPattern, $sMask="*")
в этой команде, что такое $sPattern оно же не где не задано.
$sMask="*" как это понять, тип либой файл чтоли?

Creat0R 10-01-2008 02:18 712915

HORRIBLE,
Цитата:

откуда такие команды??? у меня в хелпе по авто иту нету такого, вы че сами их придумавыете?
Сами :) - по сути _FileListToArray() (и все функции начинающиеся с _ ) тоже самопальная функция.

Цитата:

что такое $sPattern оно же не где не задано.
Оно задано как параметр для фунции, я просто как второй параметр указываю образец (Pattern) для RegExp.

Цитата:

как это понять, тип либой файл чтоли?
Это маска, по которой определяется параметры для поиска файлов, см. функцию FileFindFirstFile().

TERMINAL 11-01-2008 18:12 714353

Creat0R, не могу заставить выключиться Send("{CAPSLOCK off}") !

Creat0R 11-01-2008 21:55 714503

TERMINAL,
Цитата:

не могу заставить выключиться Send("{CAPSLOCK off}") !
В справке по этому поводу что-то написано:

Цитата:

You can set SendCapslockMode to make CAPS LOCK disabled at the start of a Send operation and restored upon completion.
However, if a user is holding down the Shift key when a Send function begins, text may be sent in uppercase.
One workaround is to Send("{SHIFTDOWN}{SHIFTUP}") before the other Send operations.

Certain keyboard as the Czech one send different characters when using the Shift Key or being in CAPS LOCK enabled and sending a char. Due to the send AutoIt implementation the CAPS LOCKed char will be sent as Shifted one so it will not work.
а Send("{CAPSLOCK toggle}") работает?

TERMINAL 12-01-2008 09:16 714723

Creat0R, не неработает, а Num Lock работает....

Vikma19 12-01-2008 15:07 714863

Creat0R, добрый день!Пишу Вам, т.к. прочитал ваши сообщения на форуме - очень пригодилось. До этого очень много делал программок для работы на VB.
Впервые попробовал Autoit, когда понадобилось перенести данные с листа Excel в Axata.Понравилось.
Вопрос - можно ли объединить Autoit и VB. И второй очень срочный - есть ли скрипт позволяющий работать с Listview,
как с листом ексель, т.е. вводить данные с клавиатуры во все колонки, редактировать и т.д.
Заранее благодарен.

rimm 12-01-2008 22:16 715194

Прошу кто может помочь с английским переводом описаний функций "Автоматизация MS Internet Explorer", к сожалению в русской справке от Валерия Иванова этот раздел не переведен, самому мне перевести не представляется возможным.
Спасибо всем кто помогал мне в прошлый раз.

Maza Faka 13-01-2008 07:27 715416

Vikma19
Хоть вопрос и не ко мне...
Цитата:

можно ли объединить Autoit и VB.
VB-script? Можно создавать обьекты и управлять ими как в WSH, пример копирования файлов с отображением системного диалога копирования:
Код:

_FileCopy("D:\wallpaper\*.*", "C:\wallpaper")

Func _FileCopy($Source, $Dest)
    If Not FileExists($Dest) Then DirCreate($Dest)
    $WinShell = ObjCreate("shell.application")
    $WinShell.NameSpace($Dest).CopyHere($Source)
EndFunc

Цитата:

второй очень срочный - есть ли скрипт позволяющий работать с Listview,
как с листом ексель, т.е. вводить данные с клавиатуры во все колонки, редактировать и т.д.
Ну как в Excel вряд ли, но в справке есть примеры редактирования Item-ов, вот немного изменённый пример из справки:
Код:

#include <GuiConstants.au3>
#include <GuiListView.au3>

$Gui = GUICreate("Test", 300, 200)

$hListView = _GUICtrlListView_Create($GUI, "Items|SubItems", 2, 2, 296, 196, BitOR($LVS_EDITLABELS, $LVS_REPORT))
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
$ListItem1 = _GUICtrlListView_AddItem($hListView, "Item1")
$ListItem2 = _GUICtrlListView_AddItem($hListView, "Item2")

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

GUISetState()

While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
        ExitLoop
    EndSwitch
WEnd

Func
WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView
= $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $hWndFrom
    Case $hWndListView
        Switch $iCode
        Case $LVN_BEGINLABELEDIT
            Local $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
            Return False
        Case
$LVN_ENDLABELEDIT
            Local $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
            Local $tBuffer = DllStructCreate("char Text[" & DllStructGetData($tInfo, "TextMax") & "]", DllStructGetData($tInfo, "Text"))
            If StringLen(DllStructGetData($tBuffer, "Text")) Then Return True
            EndSwitch
        EndSwitch
        Return
$GUI_RUNDEFMSG
    EndFunc

rimm
Цитата:

кто может помочь с английским переводом описаний функций "Автоматизация MS Internet Explorer"
А какая именно функция не понятна?

P.S.
Переводить на русский все функции, вряд-ли кто будет, так, как на это нужно время, а по отдельным, спрашивай, чем сможем поможем. :)

Vikma19 13-01-2008 11:54 715509

Maza Faka, Большое спасибо! Попробую разобраться.

Vikma19 13-01-2008 12:18 715523

Maza Faka, Редактирование Itemov -понятно, а как с SubItemami(ввел колонку с помощью _GUICtrlListView_AddSubItem
ввел данные) но исправить можно только Item - а как с SubItem и с вводом новых данных в пустую ячейку?
Спасибо.

Creat0R 13-01-2008 16:41 715714

Vikma19,
Цитата:

можно ли объединить Autoit и VB
Кроме метода использования который привёл Maza Faka (более разумный метод), можно ещё запускать сам vbs код из под AutoIt'а... но мне почему то кажется что речь не про vbs, а про Visual Basic? хотя всё что можно на нём сделать, на AutoIt тоже можно ;)

Цитата:

а как с SubItem и с вводом новых данных в пустую ячейку?
на оф. форуме это сделали (Edit In Place Listview (multi-column)), правда есть иногда проблемы с использованием многих колонок, а также если использовать иконки/чекбоксы для элементов..

rimm,
Цитата:

кто может помочь с английским переводом описаний функций
Учить скриптинг без знании (понимании) английского (хотябы базового) довольно сложно, если конечно не учить язык вроде глагола :biggrin:

Попробуй обратиться к Валере.

Vikma19 13-01-2008 16:58 715719

Creat0R,
Цитата:

Цитата Creat0R
Кроме метода использования который привёл Maza Faka (более разумный метод), можно ещё запускать сам vbs код из под AutoIt'а... но мне почему то кажется что речь не про vbs, а про Visual Basic? хотя всё что можно на нём сделать, на AutoIt тоже можно »

спасибо, речь действительно идет о Visual Basic. Попробую реализовать в Autoit, хотя все что связано со строками и сортировкой и поиском, как мне кажется проще на V B. Сейчас почитаю - (Edit In Place Listview (multi-column)

Creat0R 13-01-2008 17:13 715730

Vikma19,
Цитата:

хотя все что связано со строками и сортировкой и поиском, как мне кажется проще на V B
Я особо не знаком с синтаксисом VB, но знаю что проще сделать именно там, где это возможно для вас сделать :) (это как с выбором дороги по которой нужно идти - короче будет всегда та дорогоа, которая нам известна ;) ). Но на AutoIt работать со строками, поиском, довольно не сложно, хотя вот сортировка немного сомнительна (в некоторых случаях), тот же List View, приходится подключать внешние вызовы API, и тоже не всегда идеально.

Vikma19 13-01-2008 18:07 715757

Creat0R,
Цитата:

Цитата Creat0R
(Edit In Place Listview (multi-column)) »

Извините, а какую версию использовать - я поставил последнюю и скрипт по этой ссылке не работает...

Creat0R 13-01-2008 23:29 715976

Vikma19,
Цитата:

какую версию использовать
Скорее всего 3.2.8.1, т.к скрипт был написан ещё раньше выпуска 3.2.10.0...

Vikma19 14-01-2008 11:16 716264

Цитата:

Цитата Creat0R
Скорее всего 3.2.8.1, т.к скрипт был написан ещё раньше выпуска 3.2.10.0... »

к сожалению с 3.2.8.1 тоже не работает- а по всему видно -это то что надо.
пробовал исправлять - но ошибки так и сыпятся.

Creat0R 14-01-2008 11:34 716275

Vikma19,
Цитата:

к сожалению с 3.2.8.1 тоже не работает
У меня работает :dont-know

Цитата:

пробовал исправлять - но ошибки так и сыпятся
Я исправил все ошибки (для 3.2.10.0), но некоторые функции изменились в синтаксисе, поэтому работоспособность скрипта нарушена :( - если у меня получится исправить, то выложу рабочий вариант.

Vikma19 14-01-2008 12:36 716358

Цитата:

Цитата Creat0R
если у меня получится исправить, то выложу рабочий вариант. »

большое спасибо

Timurko 14-01-2008 12:44 716378

Вложений: 1
Помогите решить проблему. Есть исходный файл "source1.txt" там лежит ТВ-Программа без форматирования данного рода.
Цитата:

05:00, 22:30 Малхолланд Драйв
07:30 Евротрип
09:00 Свадьба на Рождество
11:00 Без ума от любви
13:00 Брюс Всемогущий
15:00 Красная шапочка
16:30 Нечего декларировать
18:30 Ze фильм
20:30 Львиное сердце
01:00 Увеселительница
03:00 Обучение Клэр
Я забабашил скрипт который бы брал от туда числа отдельно определял название канала и заменял на шаблонный текст
PHP код:

#include <file.au3>
#include <Array.au3>

Dim $strArray$file

$chanels 
'TV1000|РБК|Дамский клуб|Детский мир\r|Школьник ТВ|Eurosport2|Eurosport|Explorer|Discovery\r|Animal Planet|Viasat History|365\r|КиноСоюз|Наше Новое Кино|Дом Кино|Авто плюс|Боец\r|Звезда\r|MTV-Россия|Муз ТВ|STYLE\r|Теленяня'

$file "source.txt"

_FileReadToArray$file $strArray)

_ArrayInsert$strArray,1,"<br>")
_ArrayInsert$strArray,2,"<br>")

For 
$i 0 To UBound($strArray)-2
    $strArray
[$i] = StringRegExpReplace($strArray[$i], $chanels'<br>' & @LF 'канал \0')            
Next

_FileWriteFromArray
("temporary.txt",$strArray,1

Этот скрипт вроде работает нормально, пишу еще один скрипт который бы определял сколько сейчас времени и взависимости от последнего убирал бы передачи которые уже прошли или будут дольше чем через 2 часа:
PHP код:

#include <file.au3>
Dim $strArray

$file 
"temporary.txt"

_FileReadToArray$file $strArray)
MsgBox(0""UBound($strArray)-2)
For 
$i 1 To UBound($strArray)
        
$arraytext StringRegExp($strArray[$i], '(\d\d):(\d\d).+',2)
        if (@
Error=1then ContinueLoop;
            
$prgtime=$arraytext[1]+($arraytext[2]/60)
        ;
Если время в передаче меньше 4 часов утра то прибавляем 24 часа чтобы он не подумал что время после полуночи меньше реального и не удалил
        
if ($prgtime<=4then $prgtime=$prgtime+24
        
;Также навсякий случай и с реальным временем
        $curtime
=@HOUR+@MIN/60
            
if ($curtime<=4then $curtime=$curtime+24
        
;Если передача уже прошла то удалять ее
        
if (($prgtime)<=($curtime)) then 
            _FileWriteToLine
($file$i""1)
            
_FileReadToArray$file $strArray)
        endif
        ;
Вот тут я хотел чтобы еще удалялись программы которые будут больше через 2 часа
        
if (($prgtime)>=($curtime+2)) then 
            _FileWriteToLine
($file$i""1)
            
_FileReadToArray$file $strArray)
        endif
Next
FileClose
($file

http://forum.oszone.net/attachment.p...1&d=1200305273
Но Выскакивает ошибка... Что неправильный тут массив(Или регэкспы), хотя часть работы при этом программа делает.

И еще: Пожалуйста помогите еще, как сделать так чтобы например есть строка:

Цитата:

05:00, 22:30 Малхолланд Драйв
07:30 Евротрип
09:00 Свадьба на Рождество
11:00 Без ума от любви
13:00 Брюс Всемогущий
15:00 Красная шапочка
16:30 Нечего декларировать
18:30 Ze фильм
20:30 Львиное сердце
01:00 Увеселительница
03:00 Обучение Клэр
И время через запятую выставлялось бы в верное время вот так:

Цитата:

05:00 Малхолланд Драйв
07:30 Евротрип
09:00 Свадьба на Рождество
11:00 Без ума от любви
13:00 Брюс Всемогущий
15:00 Красная шапочка
16:30 Нечего декларировать
18:30 Ze фильм
20:30 Львиное сердце
22:30 Малхолланд Драйв
01:00 Увеселительница
03:00 Обучение Клэр

Creat0R 14-01-2008 14:13 716475

Timurko,
С массивом я вижу одну проблему - нужно к Ubound() добавить -1...

Код:

For $i = 1 To UBound($strArray)-1
Цитата:

время через запятую выставлялось бы в верное время
Через RegExp сложновато (хотя мне кажется вовсе не реально :) ), но вот через массив...

Код:

#include <Array.au3>

$String = _
    "05:00, 22:30 Малхолланд Драйв" & @CRLF & _
    "07:30 Евротрип" & @CRLF & _
    "09:00 Свадьба на Рождество" & @CRLF & _
    "11:00 Без ума от любви" & @CRLF & _
    "13:00 Брюс Всемогущий" & @CRLF & _
    "15:00 Красная шапочка" & @CRLF & _
    "16:30 Нечего декларировать" & @CRLF & _
    "18:30 Ze фильм" & @CRLF & _
    "20:30 Львиное сердце" & @CRLF & _
    "01:00 Увеселительница" & @CRLF & _
    "03:00 Обучение Клэр"

Dim $aStrArray = StringSplit(StringStripCR($String), @LF)
Dim $aNewArray[1]

For $i = 1 To $aStrArray[0]
    If StringRegExp($aStrArray[$i], ", \d\d:\d\d") Then
        $aNewArray[0] += 2
        ReDim $aNewArray[$aNewArray[0] + 1]
        $aNewArray[$aNewArray[0]-1] = StringRegExpReplace($aStrArray[$i], ", \d\d:\d\d", "")
        $aNewArray[$aNewArray[0]] = StringRegExpReplace($aStrArray[$i], ".*, (\d\d:\d\d.*$)", "\1")
    Else
        $aNewArray[0] += 1
        ReDim $aNewArray[$aNewArray[0] + 1]
        $aNewArray[$aNewArray[0]] = $aStrArray[$i]
    EndIf
Next


_ArraySort($aNewArray, 0, 1)
_ArrayDisplay($aNewArray)

Совсем другое дело ;)

Maza Faka 14-01-2008 16:39 716633

Timurko
Привет! Так сказать быстрый бета вариант, так, как ухожу домой :) Если заинтересует красивый вариант стукни в ПМ. ;)
Код:

#include <Array.au3>
#include <File.au3>

Dim $aStrings

_FileReadToArray("c:\source.txt", $aStrings)

$aMaxIndex = _ArrayMaxIndex($aStrings, 1, 1)

For $i = 1 To $aMaxIndex
    $arrayText
= StringRegExp($aStrings[$i], "\d*:\d*", 3)
    $pTime = StringRegExpReplace($arrayText[0], ":", "")
    If $pTime > @HOUR & @MIN Then FileWriteLine("c:\temp.txt", $aStrings[$i])
Next

For
$i = $aMaxIndex To $aStrings[0]
    $arrayText = StringRegExp($aStrings[$i], "\d*:\d*", 3)
    $pTime = StringRegExpReplace($arrayText[0], ":", "")
    If $pTime < 0200 Then FileWriteLine("c:\temp.txt", $aStrings[$i])
Next


Timurko 14-01-2008 16:44 716636

Афигеть вы просто гении... Весь день голову ломал!

Даже спасибо забыл сказать от радости! Спасибо огромное Мазафака и Креатор =)

Vikma19 14-01-2008 20:04 716813

Creat0R,
Цитата:

Цитата Creat0R
У меня работает »

У меня такое впечатление, то я что-то не так делаю

1. Поставил версию 3.2.8.1
2. Я взял из зипа по адресу (Edit In Place Listview (multi-column)) два файла
а) _EipListView ;b) ListViewEIP

Какова последовательность действий в дальнейшем.

Подскажите пожалуйста.

Creat0R 14-01-2008 20:35 716843

Vikma19,
Цитата:

Какова последовательность действий в дальнейшем.
Поместить их в одну папку, и просто запустить ListViewEIP.au3 :)

Vikma19 14-01-2008 21:12 716875

Creat0R,
Цитата:

Цитата Creat0R
Поместить их в одну папку, и просто запустить ListViewEIP.au3 »

Поместил, запустил - ошибка!(так я уже делал)



C:\Documents and Settings\user\Desktop\EIPListView\ListViewEIP.au3 (3) : ==> Error opening the file.:
#include <user\_EIPListView.au3>

Creat0R 14-01-2008 21:29 716884

Vikma19,
Цитата:

Error opening the file.:
#include <user\_EIPListView.au3>
Упс, забыл про это :shuffle: , там нужно user\ заменить на .\ (или вовсе убрать).

Vikma19 14-01-2008 22:08 716916

Creat0R,
Цитата:

Цитата Creat0R
Упс, забыл про это , там нужно user\ заменить на .\ (или вовсе убрать). »

Тот же эффект.

Error opening the file.:
#include <_EIPListView.au3>

Creat0R 14-01-2008 23:47 716975

Vikma19,
А если так:

#include '_EIPListView.au3'

Или ещё полный путь добавить к файлу.

Vikma19 15-01-2008 00:16 716984

Creat0R,
Цитата:

Цитата Creat0R
Или ещё полный путь добавить к файлу. »

Ой! Спасибо!

Перенес один файл. А _EIPListView.au3 оставил в папке и указал полный путь к нему(С: documents.... ит.д.)

Заработало! Извини за доставучесть. Спасибо! Завтра буду разбираться дальше.

Почему не работало, когда оба файла были объединены - не понял.

gregaz 15-01-2008 05:34 717071

Цитата:

Цитата Maza Faka
Ну как в Excel вряд ли, но в справке есть примеры редактирования Item-ов, вот немного изменённый пример из справки: »

А как быть при наличии 2-х окон List_View ?
Func WM_NOTIFY должна определить какое окно послало вызов или нужна отдельная ф-я ?

Creat0R 15-01-2008 06:59 717081

gregaz,
Цитата:

Func WM_NOTIFY должна определить какое окно послало вызов или нужна отдельная ф-я ?
В этой функции нужно проверять $wParam, оно будет ровняться идентиикатору ListView, BitAND($wParam, 0xFFFF) вернёт идентификатор конкретного элемента (ListViewItem).

Timurko 15-01-2008 08:57 717107

А вот еще вопросец: А если в телепередаче более двух обозначений времени а то и вовсе все 10 как на канале РБК. То тут как быть? Например
Цитата:

05:05 Азбука инвестора.
05:10, 18:07 Афиша.
05:20, 03:07 Autonews.
05:35 Рынки. Глобальный взгляд. Российский рынок акций: уроки 2007 года.
06:05 Сфера интересов. Сериальная киноэкономика.
06:35, 10:35, 14:35 Зарубежный бизнес.
06:50, 07:05, 10:50, 13:20, 14:50, 15:07, 16:50 Отдых и Туризм.
07:00-06:30 Новости. Каждые 30 минут.
07:10, 15:10, 19:20 Азбука инвестора
07:20 В фокусе. Крупные ресторанные сети.
08:05 Капитал. Опцион для независимого директора.
08:35 Сфера интересов. Сетевые продажи.
09:05, 10:05, 11:05, 12:05, 13:05, 14:05, 15:05, 16:05, 17:05, 18:05, 19:05, 20:05, 21:05, 22:05, 23:05, 00:05, 01:05, 02:05, 03:05, 04:05 Рынки.

Creat0R 15-01-2008 10:27 717160

Timurko,
Цитата:

если в телепередаче более двух обозначений времени а то и вовсе все 10 как на канале РБК. То тут как быть?
Вот вариант по короче, работает для любых совпадении в строке:

Код:

#include <Array.au3>
#include <File.au3>

$String = FileRead(@ScriptDir & "\source1.txt")

Dim $aStrArray = StringSplit(StringStripCR($String), @LF)
Dim $aNewArray[1]

For $i = 1 To $aStrArray[0]
    $sTVShow_Name = StringRegExpReplace($aStrArray[$i], "((, |)\d\d:\d\d)", "")
    $aTVShow_Time = StringRegExp($aStrArray[$i], "(\d\d:\d\d)", 3)

    For $j = 0 To UBound($aTVShow_Time)-1
        $aNewArray[0] += 1
        ReDim $aNewArray[$aNewArray[0] + 1]
        $aNewArray[$aNewArray[0]] = $aTVShow_Time[$j] & " " & $sTVShow_Name
    Next
Next


_ArraySort($aNewArray, 0, 1)
_ArrayDisplay($aNewArray)
_FileWriteFromArray(@ScriptDir & "\dest1.txt", $aNewArray, 1)


Timurko 15-01-2008 12:14 717260

Спасибо я еще немного подправил, так чтобы лишние пробелы уберались и время выглядило такого формата \d\d (передача)

PHP код:

#include <Array.au3>
#include <File.au3>
$file "C:\titles\programma\source1.txt"
$String FileRead($file)

Dim $aStrArray StringSplit(StringStripCR($String), @LF)
Dim $aNewArray[1]

For 
$i 1 To $aStrArray[0]
    
$sTVShow_Name StringRegExpReplace($aStrArray[$i], "((, |)\d\d:\d\d)""")
    
$aTVShow_Time StringRegExp($aStrArray[$i], "(\d\d:\d\d)"3)

    For 
$j 0 To UBound($aTVShow_Time)-1
        $aNewArray
[0] += 1
        ReDim $aNewArray
[$aNewArray[0] + 1]
        
$aNewArray[$aNewArray[0]] = $aTVShow_Time[$j] & " " $sTVShow_Name
    Next
Next
_ArraySort
($aNewArray01)
For 
$i 1 To $aNewArray[0]
    
$aNewArray[$i] = StringRegExpReplace($aNewArray[$i], '\s(\s+)'' ')
    
$aNewArray[$i] = StringRegExpReplace($aNewArray[$i], '(\d\d) - ''\1 ')
Next
_FileWriteFromArray
(@ScriptDir "\dest1.txt"$aNewArray1


Timurko 15-01-2008 12:36 717294

хм... А вот если в файле с программой присутствуют названия каналов то они тут просто удаляются...
Я вроде сделал переменную RegExp которая определяет что в данной строке находится именно канал...
PHP код:

$chanels '^TV1000$|^РБК$|^Дамский клуб$|^Детский мир$|^Школьник ТВ$|^Eurosport2$|^Eurosport$|^Explorer$|^Discovery$|^Animal Planet$|^Viasat History$|^365$|^КиноСоюз$|^Наше Новое Кино$|^Дом Кино$|^Авто плюс$|^Боец$|^Звезда$|^MTV-Россия$|^Муз ТВ$|^STYLE$|^Теленяня$' 

Теперь получается уже надо юзать двумерный массив? Хм...

Вот пример текста программы

Цитата:

TV1000
05:00, 23:00 Я и ты, и все, кого мы знаем
07:00 Грязные делишки
09:00 Суперзвезда
11:00 Девушка на мосту
13:00 Сердце и души
15:00 Звездная ночь
17:00 Сердцеедки
19:00 Осиное гнездо
21:00 Ирландский Квартал
01:00 Белокурые бестии
03:00 Голубой воротничок
РБК
07:00-15:00 Профилактика на канале РБК.
15:00-06:30 Новости. Каждые 30 минут.
15:10, 16:10, 17:10, 18:15, 20:10, 21:10, 00:15, 03:10, 04:10 Рынки.
15:35, 19:35 Новости компаний.
15:50, 18:50, 04:20 Звездная пыль.
16:20 В фокусе. Рынок мясопереработки.
17:20, 23:50, 01:20 Отдых и Туризм.
17:35 Капитал. Банковские вклады: перспективы роста?
18:35 Рынки. Спецвыпуск. Открытие торгов в Америке.
19:10 Рынки. Спецвыпуск. Итоги торгов в России.
19:50, 03:20 Азбука инвестора.
20:35 Рекламная пауза.
21:35, 03:35 Диалог. "Конвертная" борьба.
22:10, 02:10 Интрига дня.
23:00, 01:30 Мир сегодня.
23:35 Зарубежный бизнес.
00:35, 04:35 Сфера интересов. Ювелирные торговые сети.
01:10 Рынки. Спецвыпуск. Итоги торгов в Америке.

kalikanzaros 21-01-2008 09:58 721898

кто подскажет почему скрипт, после удаления ярлыка из автозагрузки, перед самым ребутом, создает его снова???
Код:

;Определение буквы виртуального CDROM-а (67 - ASCII-код символа "C", 90 - "Z")
;(в качестве маркерного файла используем "wpi.hta")
$i = 67
While FileExists( Chr($i) & ':\WPI\WPI.hta' )=0 AND $i<=90
    $i = $i + 1
WEnd
Sleep ( 500 )
Global $set_reg1=Chr($i) & ':\$OEM$\noanimate.reg', $set_reg2=Chr($i) & ':\$OEM$\sound.reg'
;если ярлык сущ-ет то, скрипт выполняет для чего он собственно и задумывался
If FileExists ( @StartupCommonDir & '\Lastep.lnk' ) Then
    ;предотвращение возможности множественного запуска скрипта
    If WinExists(@ScriptName) Then Exit
    AutoItWinSetTitle(@ScriptName)
    ;Отображать текущую строку сценария с помощью индикатора системной панели в режиме отладки.
    AutoItSetOption("TrayIconDebug", 1)
    AutoItSetOption("SendKeyDelay", 20)
    Sleep ( 5000 )
    ;создаем ярлык на запуск wpi на рабочем столе
    FileCreateShortcut ( Chr($i) & ':\WPI\WPI.hta', @DesktopCommonDir & '\wpi.lnk', Chr($i) & ':\WPI', '' ,'Windows Post Install', Chr($i) & ':\WPI\WPI.ICO')
    Sleep ( 5000 )
    ;удаляем ярлык из автозагрузки
    FileDelete ( @StartupCommonDir & '\Lastep.lnk' )
    Sleep ( 20000 )
    ; переносим ярлыки в старт меню
    FileMove ( @ProgramsDir & '\Internet Explorer.lnk', @ProgramsCommonDir & '\network\', 9 )
    FileMove ( @ProgramsDir & '\Outlook Express.lnk', @ProgramsCommonDir & '\network\', 9 )
    DirRemove( @ProgramsDir & '\Accessories\Entertainment' , 1 )
    Sleep ( 10000 )
    ;загружаем "проблемные" ключи реестра
    RunWait ('regedit /S ' & $set_reg1, '', @SW_HIDE )
    RunWait ('regedit /S ' & $set_reg2, '', @SW_HIDE )
    ; перезагружаем компьютер
    Sleep ( 10000 )
    Shutdown(6)
EndIf
; если ярлык в автозапуске не сущ-ет - создаем его и выходим
FileCreateShortcut ( Chr($i) & ':\$OEM$\lastep.exe',@StartupCommonDir & '\Lastep.lnk', @StartupCommonDir & '\' )
Exit



Время: 22:35.

Время: 22:35.
© OSzone.net 2001-