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

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

Vadikan 05-02-2006 00:02 724247

[Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.
 
Внимание!


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

Пожалуйста, не создавайте тем с названием "Помогите!" или "Нужна помощь по AutoIt". Это и так понятно :) Заголовок темы должен быть осмысленным.



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


Справочник по командам rundll32 (команды запуска диалоговых окон и не только...)

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

Архивы старых тем по AutoIt или они же в 7z архиве (версии для печати) - 846 кб (настоятельно рекомендуется к прочтению/поиску)
(он же прикреплен в шапке)


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

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


gregaz 15-01-2008 17:19 717578

Цитата:

Цитата Creat0R
В этой функции нужно проверять $wParam, оно будет ровняться идентиикатору ListView, BitAND($wParam, 0xFFFF) вернёт идентификатор конкретного элемента (ListViewItem). »

Подскажи как выполнить .Моя попытка не увенчалась успехом :
Это чуть измененный пример от Maza Faka (пост 1969)
Код:

#include <GuiConstants.au3>
#include <GuiListView.au3>

$Gui = GUICreate("Test", 800, 400)

$hListView1 = _GUICtrlListView_Create($GUI, "Items|SubItems", 2, 2, 296, 196, BitOR($LVS_EDITLABELS, $LVS_REPORT))
_GUICtrlListView_SetExtendedListViewStyle($hListView1, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
$ListItem1 = _GUICtrlListView_AddItem($hListView1, "Item1")
$ListItem2 = _GUICtrlListView_AddItem($hListView1, "Item2")

$hListView2 = _GUICtrlListView_Create($GUI, "Items|SubItems", 402, 2, 296, 196, BitOR($LVS_EDITLABELS, $LVS_REPORT))
_GUICtrlListView_SetExtendedListViewStyle($hListView2, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
$ListItem3 = _GUICtrlListView_AddItem($hListView2, "Item3")
$ListItem4 = _GUICtrlListView_AddItem($hListView2, "Item4")
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
$hListView
= BitAND($iwParam, 0xFFFF);                  Попытка  идентификации ListView ??
    $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


Creat0R 15-01-2008 17:23 717580

Timurko,
Цитата:

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

Цитата:

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

Код:

#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 = StringStripWS(StringRegExpReplace($aStrArray[$i], "((, |)\d\d:\d\d)", ""), 3)
    $aTVShow_Time = StringRegExp($aStrArray[$i], "(\d\d:\d\d)", 3)
    $iUbound = UBound($aTVShow_Time)-1

    If $iUbound < 0 Then
        $aNewArray[0] += 1
        ReDim $aNewArray[$aNewArray[0] + 1]
        $aNewArray[$aNewArray[0]] = $aStrArray[$i]
        ContinueLoop
    EndIf

    For
$j = 0 To $iUbound
        $aNewArray
[0] += 1
        ReDim $aNewArray[$aNewArray[0] + 1]

        $sSeperater = " - "
        If StringLeft($sTVShow_Name, 1) = "-" Then $sSeperater = " "
        $aNewArray[$aNewArray[0]] = StringStripWS($aTVShow_Time[$j], 3) & $sSeperater & $sTVShow_Name
    Next
Next


_ArraySort($aNewArray, 0, 1)
_ArrayDisplay($aNewArray)
_FileWriteFromArray(@ScriptDir & "\dest1.txt", $aNewArray, 1)

gregaz,
Цитата:

Подскажи как выполнить
Код:

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView1, $hWndListView2

    $hWndListView1
= $hListView1
    $hWndListView2
= $hListView2

    If Not IsHWnd($hListView1) Then $hWndListView1 = GUICtrlGetHandle($hListView1)
    If Not IsHWnd($hListView2) Then $hWndListView2 = GUICtrlGetHandle($hListView2)

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $hWndFrom
        Case $hWndListView1 ;распознан первый список
            ConsoleWrite("--> ListView 1 events here" & @LF)
;~          Switch $iCode
;~              Case ;;;
;~          EndSwitch

        Case $hWndListView2 ;распознан второй список
            ConsoleWrite("--> ListView 2 events here" & @LF)
;~          Switch $iCode
;~              Case ;;;
;~          EndSwitch

    EndSwitch
    Return
$GUI_RUNDEFMSG
EndFunc  ;==>WM_NOTIFY


gregaz 15-01-2008 18:01 717615

Creat0R, Спасибо , так работает
Вопрос : Где можно почитать про Dll-библиотеки ?

unikum111 15-01-2008 18:50 717653

Подскажите пожалуйста, как в скрипте команды командной строки прописывать, например, "copy /y" и т.д.? Не охота дополнительный файл cmd делать.

Creat0R 15-01-2008 22:43 717826

gregaz,
Цитата:

Где можно почитать про Dll-библиотеки ?
Смотря что требуется, но вообще должна быть документаця к той или инной библиотеке :)

unikum111,
Цитата:

как в скрипте команды командной строки прописывать
Код:

Run(@ComSpec & ' /c copy /y "source" "dest"', '', @SW_HIDE)
А не проще на AutoIt сделать то, что планируется с использованием Cmd? :)

Timurko 16-01-2008 10:26 718141

Цитата:

Цитата Creat0R
Цитата:
если в файле с программой присутствуют названия каналов то они тут просто удаляются
Можно проверять наличие формата времени: »

Хм... Вот в этом то и проблема. В таком случае получается он сортирует все подряд и из такого:
Цитата:

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 Рынки. Спецвыпуск. Итоги торгов в Америке.
Получается такой текст:
Цитата:

00:15 - Рынки.
00:35 - Сфера интересов. Ювелирные торговые сети.
01:00 - Белокурые бестии
01:10 - Рынки. Спецвыпуск. Итоги торгов в Америке.
01:20 - Отдых и Туризм.
01:30 - Мир сегодня.
02:10 - Интрига дня.
03:00 - Голубой воротничок
03:10 - Рынки.
03:20 - Азбука инвестора.
03:35 - Диалог. "Конвертная" борьба.
04:10 - Рынки.
04:20 - Звездная пыль.
04:35 - Сфера интересов. Ювелирные торговые сети.
05:00 - Я и ты, и все, кого мы знаем
06:30 - Новости. Каждые 30 минут.
07:00 - Грязные делишки
07:00 - Профилактика на канале РБК.
09:00 - Суперзвезда
11:00 - Девушка на мосту
13:00 - Сердце и души
15:00 - Звездная ночь
15:00 - Новости. Каждые 30 минут.
15:00 - Профилактика на канале РБК.
15:10 - Рынки.
15:35 - Новости компаний.
15:50 - Звездная пыль.
16:10 - Рынки.
16:20 - В фокусе. Рынок мясопереработки.
17:00 - Сердцеедки
17:10 - Рынки.
17:20 - Отдых и Туризм.
17:35 - Капитал. Банковские вклады: перспективы роста?
18:15 - Рынки.
18:35 - Рынки. Спецвыпуск. Открытие торгов в Америке.
18:50 - Звездная пыль.
19:00 - Осиное гнездо
19:10 - Рынки. Спецвыпуск. Итоги торгов в России.
19:35 - Новости компаний.
19:50 - Азбука инвестора.
20:10 - Рынки.
20:35 - Рекламная пауза.
21:00 - Ирландский Квартал
21:10 - Рынки.
21:35 - Диалог. "Конвертная" борьба.
22:10 - Интрига дня.
23:00 - Мир сегодня.
23:00 - Я и ты, и все, кого мы знаем
23:35 - Зарубежный бизнес.
23:50 - Отдых и Туризм.
TV1000
РБК

Creat0R 17-01-2008 00:06 718752

Timurko,
Цитата:

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

идеалов в жизни не бывает ;)

Попробую подправить...

Creat0R 17-01-2008 00:38 718779

Цитата:

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

Код:

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

$String = FileRead(@ScriptDir & "\source1.txt")

Dim $aStrArray = StringSplit(StringStripCR($String), @LF)
Dim $aNewArray[1], $aChanelsArray[1][1]

For $i = 1 To $aStrArray[0]
    $sTVShow_Name = StringStripWS(StringRegExpReplace($aStrArray[$i], "((, |)\d\d:\d\d)", ""), 3)
    $aTVShow_Time = StringRegExp($aStrArray[$i], "(\d\d:\d\d)", 3)
    $iUbound = UBound($aTVShow_Time)-1

    If $iUbound < 0 Then
        $aChanelsArray[0][0] += 1
        ReDim $aChanelsArray[$aChanelsArray[0][0] + 1][2]
        $aChanelsArray[$aChanelsArray[0][0]][0] = $i
        $aChanelsArray
[$aChanelsArray[0][0]][1] = $aStrArray[$i]
        ContinueLoop
    EndIf

    For
$j = 0 To $iUbound
        $aNewArray
[0] += 1
        ReDim $aNewArray[$aNewArray[0] + 1]

        $sSeperater = " - "
        If StringLeft($sTVShow_Name, 1) = "-" Then $sSeperater = " "
        $aNewArray[$aNewArray[0]] = StringStripWS($aTVShow_Time[$j], 3) & $sSeperater & $sTVShow_Name
    Next
Next


_ArraySort($aNewArray, 0, 1)

For $i = 1 To UBound($aChanelsArray)-1
    $aNewArray[0] += 1
    _ArrayInsert($aNewArray, $aChanelsArray[$i][0], $aChanelsArray[$i][1])
Next

_ArrayDisplay($aNewArray)
_FileWriteFromArray(@ScriptDir & "\dest1.txt", $aNewArray, 1)


Maza Faka 18-01-2008 10:09 719767

Creat0R
Привет! Подскажи пожалуйста: есть строка вида ". 51% 4.89 KB/s", нужно получить массив со значениями 51% и 4.89 KB/s. Так же нужно учесть, что в конце исходной строки может быть любой символ после 4.89 KB/s, который нужно опустить.
Мои потуги: :)
Код:

#include <Array.au3>

$string = ".  51%    4.89 KB/s"

$aString = StringRegExp($string, "(\d+%)(.*s)", 3)

_ArrayDisplay($aString)

Как видишь не совсем то, что нужно.

Creat0R 18-01-2008 11:12 719815

Maza Faka,
Цитата:

нужно получить массив со значениями 51% и 4.89 KB/s
Так:

Код:

#include <Array.au3>

$string = ".  51%    4.89 KB/s"

$aString = StringRegExp($string, "(\d+%)[^\d]+(.*/s).*$", 3)

_ArrayDisplay($aString)

?

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

Maza Faka 18-01-2008 12:18 719860

Creat0R
Спасибо! Это именно то, что мне нужно! ;)

rimm 18-01-2008 20:54 720284

Такая проблема , как в Internet Explorer скопировать выделенный фрагмент текста??
Заранее благодарен

Creat0R 18-01-2008 22:59 720366

rimm,
Цитата:

как в Internet Explorer скопировать выделенный фрагмент текста?
Send("^{INSERT}") ? :)

rimm 19-01-2008 02:13 720487

Цитата:

Цитата Creat0R
Send("^{INSERT}") ? »

Большое спасибо

gregaz 19-01-2008 23:48 721047

При выполнении операции сортировки в ListView иконки остаются на месте
Как обеспечить их привязку к типу файла ,а не к индексу Item ?

Код:

#include <GuiConstants.au3>
#include <GuiListView.au3>
#include <GuiImageList.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))

$hImage = _GUIImageList_Create (16,16,5); 5-ФОН ОКНА
_GUIImageList_AddIcon ($hImage, "shell32.dll", 3);Папка -0
_GUIImageList_AddIcon ($hImage, "shell32.dll", 0);Текстовый файл -2
_GUICtrlListView_SetImageList ($hListView, $hImage, 1)

$ListItem1 = _GUICtrlListView_AddItem($hListView, "Item1",0)
$ListItem2 = _GUICtrlListView_AddItem($hListView, "Item2",1)
$ListSubItem1 = _GUICtrlListView_AddSubItem ($hListView, 0,'1', 1)
$ListSubItem1 = _GUICtrlListView_AddSubItem ($hListView, 1,'2', 1)

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
Global $B_DESCENDING[_GUICtrlListView_GetColumnCount ($hListView) ];Кол-во колонок

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_COLUMNCLICK ; Клик по колонке
                    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
                    _GUICtrlListView_SimpleSort ($hWndListView, $B_DESCENDING, DllStructGetData($tInfo, "SubItem"))
        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


Maza Faka 20-01-2008 08:11 721192

gregaz
В справке есть пример, смотри функцию
Код:

GUICtrlRegisterListViewSort()

Maza Faka 20-01-2008 09:31 721213

Самому стало интересно и спросил на офф. форуме. ;)

Creat0R 20-01-2008 16:27 721413

Maza Faka,
Я не думал что в новой версии это будет проще чем раньше :)
Кстати, с $LVS_EX_CHECKBOXES тоже отлично сортирует.

gregaz 20-01-2008 19:35 721514

Цитата:

Цитата Maza Faka
gregaz
В справке есть пример, смотри функцию
Код:
GUICtrlRegisterListViewSort() »

Maza Faka , Спасибо большое.
Значит для сортировки надо использовать отдельную ф-ю ?
Для редактирования на месте и управления кликами еще одну.
А может проще завести иконки отдельной 0-й колонкой(без текста)и использовать одну ф-ию?

Creat0R 21-01-2008 00:11 721712

gregaz,
А в чём проблема использовать более одной функции? :) . Ограничении вроде нет.

gregaz 21-01-2008 04:38 721792

Цитата:

Цитата Creat0R
gregaz,
А в чём проблема использовать более одной функции? . Ограничении вроде нет. »

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

Maza Faka 21-01-2008 07:02 721816

gregaz
Цитата:

дновременное использование одинарного и двойного кликов одной и той же кнопки мыши не предполагается.
Поподробнее пожалуйста, имеется в виду клики на ListView items?

gregaz 21-01-2008 07:18 721821

Цитата:

Цитата Creat0R
gregaz,
А в чём проблема использовать более одной функции? . Ограничении вроде нет. »

:
Эта функция сортировки работает только на ListView ,созданном внутренней ф-ей : GUICtrlCreateListView
При создании ListView с помощбю UDF : _GUICtrlListView_Create - не хочет
Тогда,как редактирование на месте - наоборот . Получаются вилы ?

Цитата:

Цитата Maza Faka
gregaz
Цитата:
дновременное использование одинарного и двойного кликов одной и той же кнопки мыши не предполагается.
Поподробнее пожалуйста, имеется в виду клики на ListView items? »

Да конечно
Надо выявить двойной клик на ListView items ,игнорируя первый (одинарный) одной и той же кнопкой мыши

Creat0R 21-01-2008 08:59 721861

gregaz,
Цитата:

Как правильно это организовать?
Двойной клик улавливается сообщениями ($NM_DBLCLK), в справке есть пример (в _GUICtrlListView_Create()).

Когда мы кликаем два раза подряд (промежуточность установлена системой), то в ListView посылается сообщение $NM_DBLCLK, вот его и нужно улавливать (испол. WM_NOTIFY_EVENTS()).

Maza Faka 21-01-2008 09:55 721893

gregaz
Цитата:

Эта функция сортировки работает только на ListView ,созданном внутренней ф-ей : GUICtrlCreateListView
При создании ListView с помощбю UDF : _GUICtrlListView_Create - не хочет
Тогда,как редактирование на месте - наоборот . Получаются вилы ?
Остаётся ждать новой версии в которой будет реализована сортировка средствами UDF.

kalikanzaros 21-01-2008 10:21 721915

упс два раза задал вопрос...

Creat0R 21-01-2008 10:43 721934

kalikanzaros,
Цитата:

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

Цитата:

; если ярлык в автозапуске не сущ-ет - создаем его и выходим
?

:)

P.S
Shutdown(6) не завершает работу скрипта, пока компьютер будет перезапускаться, строчка с созданием ярлыка будет выполнена.

kalikanzaros 21-01-2008 10:57 721940

Creat0R,
понятно спасибо, как я понимаю проблему должно решить добавление строки с "exit" после строки Shutdown(6)

gregaz 21-01-2008 14:00 722105

Вот попробовал накалякать LVSort позволяющюю и сортировать на ListView,созданном с помощью UDF
При этом сохраняется возможность редактирования на месте

Код:

#include <GuiListView.au3>
#include <GuiImageList.au3>

$Gui = GUICreate("Test", 400, 250)

$hListView = _GUICtrlListView_Create($GUI, "Items|SubItems", 2, 2, 220, 196, BitOR($LVS_EDITLABELS, $LVS_REPORT))

$hImage = _GUIImageList_Create (16,16,5);
_GUIImageList_AddIcon ($hImage, "shell32.dll", 3);
_GUIImageList_AddIcon ($hImage, "shell32.dll", 11);
_GUIImageList_AddIcon ($hImage, "shell32.dll", 22);
_GUIImageList_AddIcon ($hImage, "shell32.dll", 33);
_GUICtrlListView_SetImageList ($hListView, $hImage, 1)

$ListItem1 = _GUICtrlListView_AddItem($hListView, "Boris",0)
$ListItem2 = _GUICtrlListView_AddItem($hListView, "Anna",2)
$ListItem3 = _GUICtrlListView_AddItem($hListView, "Sveta",1)
$ListItem4 = _GUICtrlListView_AddItem($hListView, "Misha",3)
$ListSubItem1 = _GUICtrlListView_AddSubItem ($hListView, 0,'44', 1)
$ListSubItem2 = _GUICtrlListView_AddSubItem ($hListView, 1,'22', 1)
$ListSubItem3 = _GUICtrlListView_AddSubItem ($hListView, 2,'11', 1)
$ListSubItem4 = _GUICtrlListView_AddSubItem ($hListView, 3,'33', 1)

GUISetState()

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
Global $B_DESCENDING[_GUICtrlListView_GetColumnCount ($hListView) ]

While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
        ExitLoop
    EndSwitch
WEnd

;------------------------------------------------------------------------------
Func LVSort($in)
    $itN=_GUICtrlListView_GetItemCount($hListView)
    $colN=_GUICtrlListView_GetColumnCount($hListView)
    Dim $iArr[$itN][$colN+2]
    For $ii=0 To $itN-1
        $aItem=_GUICtrlListView_GetItem($hListView, $ii)
        For $jj=0 To $colN-1
            $iArr[$ii][$jj]=_GUICtrlListView_GetItemText($hListView, $ii,$jj)
            $iArr[$ii][$jj+1]=$aItem[4]
        Next
    Next


    _ArraySort( $iArr,'','','',$colN+1)

    For $ii=0 To $itN-1
        _ArraySwap( $iArr[$ii][0], $iArr[$ii][$in] )
    Next

    _ArraySort( $iArr,0,0,0,$colN+1)

    For $ii=0 To $itN-1
        _ArraySwap( $iArr[$ii][0], $iArr[$ii][$in] )
    Next
    _GUICtrlListView_DeleteAllItems($hListView)
    For $ii=0 To $itN-1
        _GUICtrlListView_AddItem($hListView,$iArr[$ii][0],$iArr[$ii][2])
        For $jj=1 To $colN-1
            _GUICtrlListView_AddSubItem ($hListView, $ii,$iArr[$ii][$jj], $jj)
        Next
    Next
EndFunc


;-----------------------------------------------------------------------------------
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_COLUMNCLICK ; Клик по колонке
            $aHit = _GuiCtrlListView_SubItemHitTest ($hWndListView)
            LVSort($aHit[1])
        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

Наверняка ее можно еще упростить.

Цитата:

Цитата Creat0R
gregaz,
Цитата:Как правильно это организовать?
Двойной клик улавливается сообщениями ($NM_DBLCLK), в справке есть пример (в _GUICtrlListView_Create()).
Когда мы кликаем два раза подряд (промежуточность установлена системой), то в ListView посылается сообщение $NM_DBLCLK, вот его и нужно улавливать (испол. WM_NOTIFY_EVENTS()). »

Да двойной то улавливает и эта функция (если добавить соответственно $iCode : $NM_CLICK и $NM_DBLCLK,но сначала улавливается одинарный клик(его не знаю как пропустить) чтобы среагировать на второй (от двойного) ?

Maza Faka 21-01-2008 14:17 722122

gregaz
Цитата:

Вот попробовал накалякать LVSort
Молодец. ;) Неплохая идея. Только надо довести до конца, реализовать обратную сортировку.


Цитата:

Да двойной то улавливает и эта функция (если добавить соответственно $iCode : $NM_CLICK и $NM_DBLCLK,но сначала улавливается одинарный клик(его не знаю как пропустить) чтобы среагировать на второй (от двойного) ?
А для чего? Что бы предотвратить переименование по одному клику?

gregaz 21-01-2008 16:14 722215

Цитата:

Цитата Maza Faka
Да двойной то улавливает и эта функция (если добавить соответственно $iCode : $NM_CLICK и $NM_DBLCLK,но сначала улавливается одинарный клик(его не знаю как пропустить) чтобы среагировать на второй (от двойного) ?
А для чего? Что бы предотвратить переименование по одному клику? »

При двойном клике я получаю два сигнала от 1-го клика и второго (двойного)
Как обработать их различив
Например при одинарном запуск файла - при двойном на редактирование файла
Я понимаю нужно начать обработку полученного рез-та через промежуток времени после прохождения двойного клика
Не могу сообразить как это сделать не останавливая работу скрипта (Sleep не подходит
т.к приостанавливает скрипт)

Цитата:

Цитата Maza Faka
gregaz
Цитата:Вот попробовал накалякать LVSort
Молодец. Неплохая идея. Только надо довести до конца, реализовать обратную сортировку. »

А обратная сортировка запросто получится использованием _ArrayReverse
Непонятно чем заказать порядок сортировки .Этот заказанный порядок должен поступить на
$WM_NOTIFY. Наверно через стили ListView ?

gregaz 23-01-2008 09:50 723447

Цитата:

Цитата Maza Faka
gregaz
Цитата:Вот попробовал накалякать LVSort
Молодец. Неплохая идея. Только надо довести до конца, реализовать обратную сортировку. »

Вот что получилось :
При первом клике колонки - прямая сортировка
При повторном - обратная

Код:

#include <GuiListView.au3>
#include <GuiImageList.au3>

$Gui = GUICreate("Demo Func LV_Sort", 400, 250)

$hListView = _GUICtrlListView_Create($GUI, "Items|SubItems1|SubItems2|SubItems3", 2, 2, 320, 120, BitOR($LVS_EDITLABELS, $LVS_REPORT))

$hImage = _GUIImageList_Create (16,16,5);
_GUIImageList_AddIcon ($hImage, "shell32.dll", 3);
_GUIImageList_AddIcon ($hImage, "shell32.dll", 11);
_GUIImageList_AddIcon ($hImage, "shell32.dll", 22);
_GUIImageList_AddIcon ($hImage, "shell32.dll", 43);
_GUIImageList_AddIcon ($hImage, "shell32.dll", 44);
_GUICtrlListView_SetImageList ($hListView, $hImage, 1)

$ListItem1 = _GUICtrlListView_AddItem($hListView, "Boris",0)
$ListItem2 = _GUICtrlListView_AddItem($hListView, "Anna",2)
$ListItem3 = _GUICtrlListView_AddItem($hListView, "Sveta",1)
$ListItem4 = _GUICtrlListView_AddItem($hListView, "Misha",3)
$ListItem5 = _GUICtrlListView_AddItem($hListView, "Olga",4)
        _GUICtrlListView_AddSubItem ($hListView, 0,'44', 1)
        _GUICtrlListView_AddSubItem ($hListView, 1,'22', 1)
        _GUICtrlListView_AddSubItem ($hListView, 2,'11', 1)
        _GUICtrlListView_AddSubItem ($hListView, 3,'33', 1)
        _GUICtrlListView_AddSubItem ($hListView, 4,'55', 1)
_GUICtrlListView_AddSubItem ($hListView, 0,'Петр', 2)
_GUICtrlListView_AddSubItem ($hListView, 1,'Елена', 2)
_GUICtrlListView_AddSubItem ($hListView, 2,'Анна', 2)
_GUICtrlListView_AddSubItem ($hListView, 3,'Раиса', 2)
_GUICtrlListView_AddSubItem ($hListView, 4,'Иван', 2)
        _GUICtrlListView_AddSubItem ($hListView, 0,'4', 3)
        _GUICtrlListView_AddSubItem ($hListView, 1,'23', 3)
        _GUICtrlListView_AddSubItem ($hListView, 2,'1', 3)
        _GUICtrlListView_AddSubItem ($hListView, 3,'24', 3)
        _GUICtrlListView_AddSubItem ($hListView, 4,'123', 3)

GUISetState()

Global $pp=99,$par=0
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
Global $B_DESCENDING[_GUICtrlListView_GetColumnCount ($hListView) ]

While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
        ExitLoop
        EndSwitch
WEnd
Exit

;-------------------------------------------------------------------------------------------
Func LV_Sort($namb)

;Счетчик заходов
    If $pp=$namb Then $par=1
    $pp=$namb
;ListView ---> в массив
    $itN=_GUICtrlListView_GetItemCount($hListView)
    $colN=_GUICtrlListView_GetColumnCount($hListView)
    Dim $iArr[$itN][$colN+2]
    For $ii= 0 To $itN-1
        $aItem=_GUICtrlListView_GetItem($hListView, $ii)
        $iArr[$ii][0]=_GUICtrlListView_GetItemText($hListView, $ii,$namb);Добавление 0-й колонки с текстом сортируемой
        For $jj=1 To $colN
            $iArr
[$ii][$jj]=_GUICtrlListView_GetItemText($hListView, $ii,$jj-1)
            $iArr[$ii][$jj+1]=$aItem[4]
        Next
    Next

;Сортировка массива
    _ArraySort( $iArr,'','','',$colN+2)
;Обратная сортировка массива
    If $par=1 Then
        $p=0
        $p1=$itN-1
        $p2=Ceiling ( $itN/2)
        For $ii=0 To $p2-1
            For $jj=1 To $colN+1
                _ArraySwap( $iArr[$p][$jj], $iArr[$p1][$jj] )
            Next
            $p =$p+1
            $p1 =$p1-1
        Next
    EndIf

; массив ---> в ListView
    _GUICtrlListView_DeleteAllItems($hListView)
    For $ii=0 To $itN-1
        _GUICtrlListView_AddItem($hListView,$iArr[$ii][1],$iArr[$ii][$colN+1])
        For $jj=1 To $colN
            _GUICtrlListView_AddSubItem ($hListView, $ii,$iArr[$ii][$jj], $jj-1)
        Next
    Next

;Счетчик заходов
    If $par=1 Then $pp=99
    $Par=0
EndFunc
;--------------------------------------------------------------------------------------------

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_COLUMNCLICK ; Клик по колонке
                        $aHit = _GuiCtrlListView_SubItemHitTest ($hWndListView)
                        LV_Sort($aHit[1])   
        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


Поскольку это проба пера просьба дать рекомендации по упрощению ф-ии

kalikanzaros 23-01-2008 12:07 723583

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

[HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics]
"MinAnimate"="0"

если значение 1 - скрипт отрабатывает (меняет значение на 0, прописыв себя в автозагрузку и ребутит комп), если значение 0 - выход из скрипта (удаляет себя из автозагрузки)

Creat0R 23-01-2008 16:40 723853

kalikanzaros,
См. в справке RegRead/RegWrite. Ключ для автозапуска:
Код:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

kalikanzaros 23-01-2008 16:43 723857

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

Creat0R 23-01-2008 17:08 723873

gregaz,
Цитата:

просьба дать рекомендации по упрощению ф-ии
А почему бы не использовать обычную Callback функцию, скорость гораздо выше. Я полагал что совместимость с правкой элементов мешает, но спросив на оф. форуме, эта проблема уже вроде не актуальна :)

Код:

#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <GuiImageList.au3>

Global $nCurCol = -1
Global $nHold_Column = -1
Global $nSortDir = 1
Global $bSort_Set = 0

$Gui = GUICreate("Demo Func LV_Sort + Editable LV Items", 400, 250)

$hListView = GUICtrlCreateListView("Items|SubItems1|SubItems2", 2, 2, 320, 120, BitOR($LVS_EDITLABELS, $LVS_REPORT))

$hImage = _GUIImageList_Create (16, 16, 5)
_GUIImageList_AddIcon ($hImage, "shell32.dll", 3)
_GUIImageList_AddIcon ($hImage, "shell32.dll", 11)
_GUIImageList_AddIcon ($hImage, "shell32.dll", 22)
_GUIImageList_AddIcon ($hImage, "shell32.dll", 43)
_GUIImageList_AddIcon ($hImage, "shell32.dll", 44)
_GUICtrlListView_SetImageList ($hListView, $hImage, 1)

$ListItem1 = _GUICtrlListView_AddItem ($hListView, "Boris", 0)
$ListItem2 = _GUICtrlListView_AddItem ($hListView, "Anna", 2)
$ListItem3 = _GUICtrlListView_AddItem ($hListView, "Sveta", 1)
$ListItem4 = _GUICtrlListView_AddItem ($hListView, "Misha", 3)
$ListItem5 = _GUICtrlListView_AddItem ($hListView, "Olga", 4)

_GUICtrlListView_AddSubItem ($hListView, 0, '44', 1)
_GUICtrlListView_AddSubItem ($hListView, 1, '22', 1)
_GUICtrlListView_AddSubItem ($hListView, 2, '11', 1)
_GUICtrlListView_AddSubItem ($hListView, 3, '33', 1)
_GUICtrlListView_AddSubItem ($hListView, 4, '55', 1)
_GUICtrlListView_AddSubItem ($hListView, 0, 'Петр', 2)
_GUICtrlListView_AddSubItem ($hListView, 1, 'Елена', 2)
_GUICtrlListView_AddSubItem ($hListView, 2, 'Анна', 2)
_GUICtrlListView_AddSubItem ($hListView, 3, 'Раиса', 2)
_GUICtrlListView_AddSubItem ($hListView, 4, 'Иван', 2)

GUICtrlRegisterListViewSort($hListView, "LVSort") ; Register the function "LVSort" for the sorting callback
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
WEnd


; Our sorting callback funtion
Func LVSort($hWnd, $nItem1, $nItem2, $nColumn)
    Local $iFind_1, $iFind_2
    Local $tInfo = DllStructCreate($tagLVFINDINFO)
    DllStructSetData($tInfo, "Flags", $LVFI_PARAM)

    ; Switch the sorting direction
    If $nColumn = $nCurCol Then
        If Not
$bSort_Set Then
            $nSortDir *= -1
            $bSort_Set = 1
        EndIf
    Else

        $nSortDir = 1
    EndIf

    $nHold_Column = $nColumn

    DllStructSetData($tInfo, "Param", $nItem1)
    $iFind_1 = _GUICtrlListView_FindItem ($hWnd, -1, $tInfo)
    DllStructSetData($tInfo, "Param", $nItem2)
    $iFind_2 = _GUICtrlListView_FindItem ($hWnd, -1, $tInfo)
    $iFind_1 = _GUICtrlListView_GetItemText ($hWnd, $iFind_1, $nColumn)
    $iFind_2 = _GUICtrlListView_GetItemText ($hWnd, $iFind_2, $nColumn)

    $nResult = 0 ; No change of item1 and item2 positions

    If $iFind_1 < $iFind_2 Then
        $nResult = -1 ; Put item2 before item1
    ElseIf $iFind_1 > $iFind_2 Then
        $nResult = 1 ; Put item2 behind item1
    EndIf

    $nResult *= $nSortDir

    Return $nResult
EndFunc  ;==>LVSort

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_COLUMNCLICK
                    Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
                    $bSort_Set = 0
                    $nCurCol = $nHold_Column
                    GUICtrlSendMsg($hListView, $LVM_SETSELECTEDCOLUMN, DllStructGetData($tInfo, "SubItem"), 0)
                    DllCall("user32.dll", "int", "InvalidateRect", "hwnd", $hWndListView, "int", 0, "int", 1)
                Case $LVN_BEGINLABELEDIT, $LVN_BEGINLABELEDITW
                    Local $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
                    Return False
                Case $LVN_ENDLABELEDIT, $LVN_ENDLABELEDITW
                    Local $tInfo = DllStructCreate($tagNMLVDISPINFO, $ilParam)
                    Local $iTextMax = DllStructGetData($tInfo, "TextMax")
                    Local $pText = DllStructGetData($tInfo, "Text")
                    If $pText = 0 Then Return False

                    Local $sBuffer = "char Text[" & $iTextMax & "]"
                    If $iCode = $LVN_ENDLABELEDITW Then $sBuffer = "wchar Text[" & $iTextMax & "]"

                    Local $tBuffer = DllStructCreate($sBuffer, $pText)
                    Local $sNewText = DllStructGetData($tBuffer, "Text")

                    If StringLen($sNewText) Then Return True
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc  ;==>WM_NOTIFY


Creat0R 23-01-2008 17:22 723880

kalikanzaros,
Цитата:

если значение 1 - скрипт отрабатывает (меняет значение на 0, прописыв себя в автозагрузку и ребутит комп), если значение 0 - выход из скрипта (удаляет себя из автозагрузки)
Код:

$WindowMetrics_Value = RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics", "MinAnimate")

If $WindowMetrics_Value = 1 Then
    ;Пишем 0 в ветку <HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\MinAnimate>
    RegWrite("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics", "MinAnimate", "REG_SZ", 0)

    ;Пишем скрипт в автозапуск
    RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", _
        @ScriptName, "REG_SZ", FileGetShortName(@ScriptFullPath))

    ;Ребутим.
    Shutdown(6)
    Exit
Else

    ;Удаляем скрипт из автозапуска
    RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", @ScriptName)
    Exit
EndIf

Не тестировал :)

kalikanzaros 23-01-2008 17:47 723900

Creat0R,
большое спасибо, проверю - отпишусь, думаю все будет прекрасно работать

Creat0R 24-01-2008 00:56 724153

Поправил свой пост с примером сортировки и редактирования списка, немного некорректно задавалась переменная ($sNewText) с новым текстом, при юникодной версии нужно использовать wchar а не char.

gregaz 24-01-2008 04:44 724223

Цитата:

Цитата Creat0R
А почему бы не использовать обычную Callback функцию, скорость гораздо выше. Я полагал что совместимость с правкой элементов мешает, но спросив на оф. форуме, эта проблема уже вроде не актуальна »

Creat0R, Cпасибо
Причина была именно в этом -иметь все возможности управления ListView при одном из способов его создания

Vadikan 24-01-2008 07:57 724256

All
Я разбил старую тему на части и перевел ее в архивное состояние. Все темы по Autoit (архивные и текущую) можно увидеть по этой ссылке. В течение суток я размещу в шапке архив, содержащий версии для печати архивных тем (два огромных HTML-файла, в несжатом виде > 6мб).

Я постарался перенести последние обсуждения в текущую тему. Если ваш вопрос остался неотвеченным в архивной теме, задайте его снова. Приношу извинения за причиненные неудобства.

Angelus 24-01-2008 13:19 724459

Подскажите пожалусто....как заставить в GUI интерфейсе двигаться полосу прокрутки???

Maza Faka 24-01-2008 15:27 724552

Angelus
Поподробнее пожалуйста, какую полосу прокрутки?

Vadikan 25-01-2008 01:09 724986

All
7z архив, содержащий версии для печати архивных тем по Autoit, прикреплен к шапке. Этот же архив также размещен на FTP, ссылка в шапке.

Angelus 25-01-2008 09:03 725100

При создании GUICtrlCreateLabel можно указать стиль $WS_VSCROLL, который добавит скрол по вертикали, но он не двигается....чет не то наверное делаю....

Maza Faka 25-01-2008 10:44 725148

Angelus
А что именно ты хочешь сделать, может лучше использовать GuiCtrlCreateEdit? Всё таки Label - это статичный элемент.

Angelus 25-01-2008 12:17 725224

Maza Faka, вариант...спс...

gregaz 26-01-2008 07:31 725837

Опять попал под вилы
Как изменить состояние окна ListView ,созданного UDF ( _GUICtrlListView_Create($Gui,"Items|SubItems1|SubItems2", 2, 2, 320, 120) ) ?
GUICtrlSetState(-1,$GUI_HIDE) не проходит

Maza Faka 26-01-2008 12:33 725951

gregaz
Потому, что функция _GUICtrlListView_Create() возвращает не ID элемента, а Handle. Навскидку 2 варианта: 1) Создавать элемент ListView стандартной функцией, 2)
Код:

ControlHide("Test", "", "SysListView321")
.

gregaz 26-01-2008 17:19 726149

Цитата:

Цитата Maza Faka
Код:
ControlHide("Test", "", "SysListView321") »

Понял,спасибо

Angelus 28-01-2008 10:08 727172

Maza Faka, не подскажеш как ты решил проблему с проигрованием звука??...а то я пытаюсь запустить какой то файл через _SoundPlay, файл то проигрывается но звук отсутствует....

Код:

#include <Sound.au3>

$s = _SoundOpen ( 'D:\cd\Dwarf.wma' )
$sound = _SoundPlay ( $s, 1 )
MsgBox ( 64, '', $s )
MsgBox ( 64, '', $sound )

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

Maza Faka 28-01-2008 14:19 727338

Angelus
Привет! Когда-то я начал писать аудио плеер, но потом забросил этот проект. Почему-то некоторые файлы не проигрывались, начал копать, обнаружил, что иногда, если в пути к файлу имеются пробелы, то файл не проигрывается, но, что самое странное, если я удалял папку и создавал её снова с тем же именем, то файл проигрывался без проблем. Просмотрел библиотеку Sound.au3 и как я понял проблемы возникают при получении короткого имени (8.3) файла функцией FileGetShortName(). Проблему так и не поборол :(. Но если ты найдёшь решение стукни мне. ;)

Senka11 28-01-2008 18:58 727516

помогите Auto it скрипт не в какую не ваходит!!!!!!
 
PHP код:

#include <GUIConstants.au3>

GUICreate("Computer ID system;) created by Senka!;)"320200)
GUICtrlCreateLabel("Input Computer ID"11010)
$okbutton GUICtrlCreateButton("Ready"11012060)
GUISetState(@SW_SHOW)
$nEdit GUICtrlCreateInput ("inventory no.", -1,3,175,20)
$nEdit GUICtrlCreateInput ("Everest no.", -1,30,175,20)

While 
1
  $msg 
GUIGetMsg()
Select
Case $msg $okbutton
          MsgBox
(0"11""You pressed OK!")
    Case 
$msg $GUI_EVENT_CLOSE
      MsgBox
(0"GUI Event""You clicked CLOSE! Exiting...")
      
ExitLoop
  EndSelect
WEnd 



Ребята выручайте кто знает!!!! мне нужно чтоб информация которая вбивается в ети два поля после нажатия на кнопку ОК сохранялась в /txt файлик!!!!!!!!!


Зараннеее оч признателен!!!!!!

HORRIBLE 29-01-2008 01:30 727795

Senka11,

#include <GUIConstants.au3>

GUICreate("Computer ID system;) created by Senka!;)", 320, 200)
GUICtrlCreateLabel("Input Computer ID", 10, 10)
$okbutton = GUICtrlCreateButton("Ready", 110, 120, 60)
$nEdit = GUICtrlCreateInput ("inventory no.", -1,3,175,20)
$aEdit = GUICtrlCreateInput ("Everest no.", -1,30,175,20)
GUISetState ()

While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
MsgBox(0, "GUI Event", "You clicked CLOSE! Exiting...")
exit

Case $msg = $okbutton
MsgBox(0, "11", "You pressed OK!")
filewrite(FileOpen("Data.txt",1),"Data from $nEdit: " & $nEdit &@CRLF& "Data from $aEdit: "& $NEdit & @CRLF)

EndSelect
WEnd



Можно ли как нить сделать так, что при добавлениии информации в файл, как допустим в filewrite(FileOpen("Data.txt",1),"Data from $nEdit: " & $nEdit &@CRLF& "Data from $aEdit: "& $NEdit & @CRLF), можно было бы увидить информацию которая записалась в файл не прибегая к закрытию всей программы, а только потом после закрытия открывать файл куда записалась информация?
Тут же если использовать в FileOpen("Data.txt",4) вместо 1, 4 или любую другую цифру то вооще у меня фал даже не создается, в чем может быть проблема?

Есть вордовский файл, в нем записи, каждая новая запись начинается с числа, т.е. там 1. бла бла, следующая строка: 2. аха ха .........., как сделать поиск по этому номеру, номер нужно вводить в Input.

Спасибо.

Creat0R 29-01-2008 02:17 727820

HORRIBLE,
Цитата:

filewrite(FileOpen("Data.txt",1),....
Это не корректно... нужно потом закрывать хендл (FileClose(Handle)).

Цитата:

Можно ли как нить сделать так, что при добавлениии информации в файл, как допустим в filewrite(FileOpen("Data.txt",1),"Data from $nEdit: " & $nEdit &@CRLF& "Data from $aEdit: "& $NEdit & @CRLF), можно было бы увидить информацию которая записалась в файл не прибегая к закрытию всей программы, а только потом после закрытия открывать файл куда записалась информация?
Не удалось понять вопрос :) - отобразить данные можно не закрывая программу, просто выводим MsgBox(64, "", FileRead("Data.txt")).

Цитата:

в чем может быть проблема?
В том что 4 это флаг для чтения файла, не записи, читаем справку для этой функции ;)

Цитата:

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

Код:

$Number = 4
$sRead_Doc = FileRead(@ScriptDir & "\My_File.doc")

$aRead_Doc = StringSplit($sRead_Doc, @CRLF)

For $i = 1 To UBound($aRead_Doc)-1
    If StringRegExp($aRead_Doc[$i], "\A(" & $Number & ").*$") Then
        MsgBox(64, "Found", _
            StringFormat("Numer <%d> found at the line [%d], and the founded string line is:\n\n%s", $Number, $i, $aRead_Doc[$i]))
    EndIf
Next


Angelus 29-01-2008 09:18 727905

Maza Faka, та прикол в том что файл то проигрывается...сообщения выскакиваю по истичении окончания файла (например файл длится 7сек, через 7сек сообщение и выскакивает), звук просто при этом отсутсвует....Пробывал проиграть звуки винды C:\windows\media\...так там только одна миди проиграла и wav из всех файлов......вообщем как я понял с этим пока лучше не связовать...мож в следующих версиях каданить исправят....

Creat0R 29-01-2008 10:25 727944

Angelus,
Цитата:

вообщем как я понял с этим пока лучше не связовать...мож в следующих версиях каданить исправят....
У меня всё отлично работает, это видимо что то в системе/файле...
И кстати, они не исправят (если и вправду есть проблема) если им об этом не сообщить ;)

P.S
Можешь залить проблемный файл, попробую у себя запустить.
И какую кстати версию AutoIt'а юзаешь?

Maza Faka 29-01-2008 11:25 727997

Angelus
Проблемный аудио-файл в студию!

Angelus 29-01-2008 12:39 728059

Проблемных аудио файлов нет))))....в обычных проигрывателях звук есть...версия 3.2.10.....мож глюк винды....

Senka11 29-01-2008 16:56 728263

#include <GUIConstants.au3>

GUICreate("Computer ID system created by Senka!", 320, 200)
GUICtrlCreateLabel("Input Computer ID", 10, 10)
$okbutton = GUICtrlCreateButton("Ready", 110, 120, 60)
$nEdit = GUICtrlCreateInput ("inventory no.", -1,3,175,20)
$aEdit = GUICtrlCreateInput ("Everest no.", -1,30,175,20)
GUISetState ()

While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
MsgBox(0, "GUI Event", "You clicked CLOSE! Exiting...")
exit

Case $msg = $okbutton
MsgBox(0, "11", "You pressed OK!")
filewrite(FileOpen("Data.txt",1),"Data from $nEdit: " & $nEdit &@CRLF& "Data from $aEdit: "& $NEdit & @CRLF)

EndSelect
WEnd

работает но не так как нужно!

filewrite(FileOpen("Data.txt",1),"Data from $nEdit: " & $nEdit &@CRLF& "Data from $aEdit: "& $NEdit & @CRLF)
записывает в файл:

Data from $nEdit: 6

что бы я не вводил в
$nEdit = GUICtrlCreateInput ("inventory no.", -1,3,175,20)
подскажите че исправить!!!!

HORRIBLE 29-01-2008 17:19 728281

Creat0R,
ага, спасибо за FileClose(Handle)- эту команду воткнул в код и все получил ответ на свой вопрос который ты не понял)

Creat0R 29-01-2008 17:23 728288

Senka11,
Во-первых код заключать нужно в тег [code] (#)... или использовать утилиту для раскраски ;)

Цитата:

подскажите че исправить!
Код:

#include <GUIConstants.au3>

GUICreate("Computer ID system created by Senka!", 320, 200)

GUICtrlCreateLabel("Input Computer ID", 10, 10)

$OK_Button = GUICtrlCreateButton("Ready", 110, 120, 60)

$nEdit = GUICtrlCreateInput("inventory no.", -1, 3, 175, 20)
$aEdit = GUICtrlCreateInput("Everest no.", -1, 30, 175, 20)

GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            MsgBox(0, "GUI Event", "You clicked CLOSE! Exiting...")
            Exit
        Case
$OK_Button
            MsgBox(0, "11", "You pressed OK!")

            Local $sDataFrom_nEdit = GUICtrlRead($nEdit)
            Local $sDataFrom_aEdit = GUICtrlRead($aEdit)

            Local $hOpenFile = FileOpen("Data.txt", 1)

            FileWriteLine($hOpenFile, _
                "Data from $nEdit: " & $sDataFrom_nEdit & @CRLF & _
                "Data from $aEdit: "& $sDataFrom_aEdit)

            FileClose($hOpenFile)
    EndSwitch
WEnd


HORRIBLE 29-01-2008 17:42 728305

Creat0R, а почему в моем примере для Senka11, ересть какая то записывалась в файл,несмотря на то, что ты в водишь в поля ?

#include <GUIConstants.au3>

GUICreate("Computer ID system created by Senka!", 320, 200)
GUICtrlCreateLabel("Input Computer ID", 10, 10)
$okbutton = GUICtrlCreateButton("Ready", 110, 120, 60)
$nEdit = GUICtrlCreateInput ("inventory no.", -1,3,175,20)
$aEdit = GUICtrlCreateInput ("Everest no.", -1,30,175,20)
GUISetState ()

While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
MsgBox(0, "GUI Event", "You clicked CLOSE! Exiting...")
exit

Case $msg = $okbutton
MsgBox(0, "11", "You pressed OK!")
filewrite(FileOpen("Data.txt",1),"Data from $nEdit: " & $nEdit &@CRLF& "Data from $aEdit: "& $NEdit & @CRLF)
FileClose("Data.txt")

EndSelect
WEnd

Senka11 29-01-2008 18:09 728326

я вот переделал и упростил свою задачу!!!!!!
PHP код:

$nEdit InputBox("Input inventory ID""Input inventory ID""""", -1,3,175,20)
$aEdit InputBox("Input Everest ID""Input Everest ID""""", -1,30,175,20)
FileWrite(FileOpen("Data.txt",1),"inventory ID:" &$nEdit&@CRLF"Everest ID:"$NEdit & @CRLF

работает все супер !!!!
теперь вопрос в след. я хочу создать меседж бокс который выводил бы на екран IP тачки !!!!!!!!
и дописывал его вместе с мак адресом в txt файлик!!!!!!Help если ктото знает!!!!!!!!


P.S
Огромное спасибо CREATOR-e за неоценимую помощь!!!!!!!!!!

Creat0R 30-01-2008 02:44 728637

HORRIBLE,
Цитата:

почему в моем примере для Senka11, ересть какая то записывалась в файл,несмотря на то, что ты в водишь в поля ?
Записываются идентификаторы контролов, чтобы получить данные введённые в эти элементы, нужно использовать GUICtrlRead() ;) (см. мой пример выше).

Senka11,
Цитата:

создать меседж бокс который выводил бы на екран IP тачки
Для этого есть макрос @IPAddress2.

Цитата:

Огромное спасибо CREATOR-e за неоценимую помощь!
Для этого есть ссылочка внизу у каждого сообщения - Полезное сообщение ;)

Maza Faka 30-01-2008 08:06 728701

Senka11
Мдааа...ты хоть сам понял, что написал?
Функция InputBox() не является создаваемым элементом пользовательского GUI, это встроенное стандартное окно диалога. Пример создания пользовательского GUI:
Код:

#include <GUIConstants.au3>

GUICreate("Computer ID system created by Senka!", 260, 160)

GUICtrlCreateLabel("Input Computer ID", 15, 30, 90, 15)
GUICtrlCreateLabel("Input Everest ID", 160, 30, 90, 15)

$nEdit = GUICtrlCreateInput("", 10, 50, 100, 17)
$aEdit = GUICtrlCreateInput("", 150, 50, 100, 17)

$OK_Button = GUICtrlCreateButton("Ready", 10, 130, 60, 20)
GUICtrlSetCursor(-1, 0)
$Close_Button = GUICtrlCreateButton("Close", 190, 130, 60, 20)
GUICtrlSetCursor(-1, 0)

GUISetState()

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE, $Close_Button
        Exit
    Case
$OK_Button
        $sDataFrom_nEdit
= GUICtrlRead($nEdit)
        $sDataFrom_aEdit = GUICtrlRead($aEdit)

        If $sDataFrom_nEdit = '' Or $sDataFrom_aEdit = '' Then
            MsgBox(16, "Error", "Please fill in the forms")
            ContinueCase
        EndIf


        $DataFile = FileOpen(@ScriptDir & "\Data.txt", 1)
        FileWriteLine($DataFile, _
        "Data from $nEdit: " & $sDataFrom_nEdit & @CRLF & _
        "Data from $aEdit: "& $sDataFrom_aEdit)
        FileClose($DataFile)
    EndSwitch
WEnd

Цитата:

я хочу создать меседж бокс который выводил бы на екран IP тачки!
и дописывал его вместе с мак адресом в txt файлик!
Какой тачки? Локальной или удалённой? Для получения IP-адреса используй макро @IPAddress1 или @IPAddress2, а ещё лучше брать его из реестра. Для получения MAC-адреса используй утилиту getmac.exe есть по умолчанию в WindowsXP, для справки вбей в консоль getmac /?.

HORRIBLE 30-01-2008 11:52 728880

Creat0R, мда, тупим по маленьку (это я про себя) , спасибо.

А вот у меня вопрос, интернет страничка игрушки, на ней 2 поля ввода и кнопочка, AutoIt Window Info не показывает ни координат, ни id этих полей, а как можно к чему нить привязаться, чтобы вводить в поле информацию и кнопку жать ?? Конечно, самое простое это tab понажимать, а еще как нить можно?
Когда ввели данные, нажимаем кнопку войти, вошли, другой вопрос, слева наверху есть картинка персонажа, над картинкой его ХП, как в автоите сказать ждать пока не наберется определенное кол-во ХП ждать ?? опять таки привязаться не к чему.

amel27 30-01-2008 11:59 728888

Цитата:

Цитата Maza Faka
Для получения IP-адреса используй макро @IPAddress1 или @IPAddress2, а ещё лучше брать его из реестра. Для получения MAC-адреса используй утилиту getmac.exe »

ИМХО лучше без вызова внешних прог - через WMI:
Код:

#include <array.au3>

$a = _NetAdapterGetProp()
_ArrayDisplay($a)

Func _NetAdapterGetProp($sHostName = "localhost")
    Local $objItem, $objWMIService = ObjGet( "winmgmts:\\"& $sHostName &"\root\CIMV2")
    Local $sQuery = 'SELECT Index, Caption, MACAddress, IPAddress FROM Win32_NetworkAdapterConfiguration Where IPEnabled = True'
    Local $colItems = $objWMIService.ExecQuery($sQuery, "WQL", 0x30)
    If IsObj($colItems) Then
        Local
$aRes[1][3], $i=0
        For $colItem In $colItems
            ReDim $aRes[$i+1][3]
            $aRes[$i][0] = $colItem.Caption
            $aRes[$i][1] = $colItem.IPAddress(0)
            $aRes[$i][2] = $colItem.MACAddress
            $i+=1
        Next
        Return
$aRes
    EndIf
    Return
SetError(1)
EndFunc  ;==> _NetAdapterGetProp


Maza Faka 30-01-2008 12:13 728904

amel27
Привет! Ты как всегда на высоте! Отличный пример! :up:

amel27 30-01-2008 12:34 728926

Цитата:

Цитата Maza Faka
Привет! Ты как всегда на высоте! Отличный пример! »

Спасибо, всем привет!.. вот, решил восстановить подписку на топик после его разделения... ;)


Кстати, полный список поддерживаемых параметров и методов объекта "Win32_NetworkAdapterConfiguration"
описан по адресу: http://msdn2.microsoft.com/en-us/library/aa394217.aspx

Angelus 31-01-2008 11:38 729732

а в скрипте случайно функции шифрования нет???

Maza Faka 31-01-2008 11:48 729744

Angelus
Смотри в справке _StringEncrypt(), если я правильно тебя понял.

Angelus 31-01-2008 12:46 729784

Да правильно понял, сенкс...а то я смотрел не нашол....

thief_89 01-02-2008 10:32 730516

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

Maza Faka 01-02-2008 11:14 730539

thief_89
Цитата:

скинте код
Лови! :)
Код:

#include <GuiConstants.au3>

$Gui = GuiCreate("Simulation Progress Demo", 350, 120)

$ProgressLabel = GUICtrlCreateLabel("Status: Press the button! ", 20, 30, 330)
$Progress = GUICtrlCreateProgress(20, 50, 300, 20)

$StartButton = GUICtrlCreateButton("Start Simulation Progress", (350/2)-(140/2), 80, 140)

GUISetState()

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case -3
            Exit
        Case
$StartButton
            GUICtrlSetData($ProgressLabel, "Status: Please wait...")

            Dim $FilesArr[1000]
            For $i = 1 To UBound($FilesArr)-1
                $FilesArr[$i] = _GetRandomName(6) & ".test"
            Next

            Local
$FilesCount = UBound($FilesArr)-1
            Local $CurrentFName, $ProgressSet = 0

            GUICtrlSetData($ProgressLabel, "Status: 0% Done...")
            GUICtrlSetData($StartButton, "Abort Simulation Progress")

            For $i = 1 To $FilesCount
                Sleep(40)
                $CurrentFName = $FilesArr[$i]
                $ProgressSet = Round(100 / ($FilesCount / $i))
                GUICtrlSetData($ProgressLabel, "Status: " & $ProgressSet & "% Done, [" & $CurrentFName & "]")
                GUICtrlSetData($Progress, $ProgressSet)
                If GUIGetMsg() = $StartButton Then ExitLoop
            Next


            GUICtrlSetData($Progress, 0)
            GUICtrlSetData($ProgressLabel, "Status: Finish!")
            GUICtrlSetData($StartButton, "Start Simulation Progress")
    EndSwitch
WEnd

Func
_GetRandomName($Lenght=3)
    Local $RetName = ''
    For $i = 1 To $Lenght
        $RetName
&= Chr(Random(97, 122, 1))
    Next
    Return
$RetName
EndFunc


NikLok 01-02-2008 14:31 730724

Вот тут кто макрос для оперы недавно кидал, так может он могет наваять такой, который сможет отмечать в скролируемом списке задаваемые форумы на torrents.ru? А то ихние админы ну никак не могут встроить таку фичу!!!

Creat0R 01-02-2008 14:52 730741

thief_89,
Цитата:

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

NikLok,
Цитата:

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

Цитата:

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

NikLok 01-02-2008 18:43 730913

Creat0R, На сайте torrents.ru есть в разделе торенты прокручиваемы список форумов среди которых происходит поиск торентов - вернее их анонсов. Если выбрать не все а только интересующие, то список сильно от мусора очищается. Беда в том что одно неловкое движение и выдиление снимается и на тебя опять сваливается куча всякого Г-на. Если захочется порнухи я уж специяльно за ней зайду, а так каждый раз об это глаза ломаются! Вот и мечтается нажать кнопку и выделятся те которые, ну допустим записаны в файл, а еще лучше кнопкой фиксировать выбранные на машину и выбирать по другой кнопке из фиксированных. Список прокручиваемый по вертикали. Вот ссылка Torrent forum selector
К сожалению нуна регистрироваться, но треккер стоящий.

Senka11 01-02-2008 18:52 730921

PHP код:

MsgBox(0"IP-Adress", @IPAddress1)
MsgBox(0"Computer-name", @ComputerName)
$nEdit InputBox("Input inventory ID""Input inventory ID""""", -1,3,175,20)
$aEdit InputBox("Input Everest ID""Input Everest ID""""", -1,30,175,20)
FileWriteLine(FileOpen("\\192.168.0.254\public\senka1985\ipconfig.txt",1),"" &$nEdit" "$aEdit &" "&@IPAddress1 

а как теперь добавить чтоб и мак дописывал ся!!!!!!!!!!??)))))))

Creat0R 01-02-2008 20:26 730970

NikLok,
Это не для AutoIt'а задачка, тут видимо нужно смотреть в сторону javascript/css, по этим вопросам лучше обратиться сюда ;)

Senka11,
Цитата:

как теперь добавить чтоб и мак дописывал ся!
amel27 привёл функцию на предыдущей страничке:

Код:

MsgBox(0, "IP-Adress", @IPAddress1)
MsgBox(0, "Computer-name", @ComputerName)
$nEdit = InputBox("Input inventory ID", "Input inventory ID", "", "", -1,3,175,20)
$aEdit = InputBox("Input Everest ID", "Input Everest ID", "", "", -1,30,175,20)

$aMac = _NetAdapterGetProp()

$hOpen = FileOpen("\\192.168.0.254\public\senka1985\ipconfig.txt",1)
FileWriteLine($hOpen, "" & $nEdit & " " & $aEdit & " " & @IPAddress1 & " " & $aMac[0][2])
FileClose($hOpen)

Func _NetAdapterGetProp($sHostName = "localhost")
    Local $objItem, $objWMIService = ObjGet( "winmgmts:\\"& $sHostName &"\root\CIMV2")
    Local $sQuery = 'SELECT Index, Caption, MACAddress, IPAddress FROM Win32_NetworkAdapterConfiguration Where IPEnabled = True'
    Local $colItems = $objWMIService.ExecQuery($sQuery, "WQL", 0x30)
    If IsObj($colItems) Then
        Local
$aRes[1][3], $i=0
        For $colItem In $colItems
            ReDim $aRes[$i+1][3]
            $aRes[$i][0] = $colItem.Caption
            $aRes[$i][1] = $colItem.IPAddress(0)
            $aRes[$i][2] = $colItem.MACAddress
            $i+=1
        Next
        Return
$aRes
    EndIf
    Return
SetError(1)
EndFunc


Creat0R 04-02-2008 09:05 732404

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

Код:

#include <GuiConstants.au3>
#include <Misc.au3>

Global $Bk_Color = 0xFFFFFF

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

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

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

GUISetState(@SW_SHOW, $GUI)

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

            GUICtrlSetBkColor($Label, $Bk_Color)

            If $sShade Then
                GUICtrlSetColor($Label, 0xFFFFFF)
            Else
                GUICtrlSetColor($Label, 0x000000)
            EndIf
    EndSwitch
WEnd

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

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

    Return ($i_Red + $i_Green + $i_Blue) < $iMidle_Color_Val
EndFunc

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

amel27 04-02-2008 09:38 732418

2All
ламерский вопрос: для чего используется оператор #region ?

2Creat0R
случайно наткнулся на его цветовое обозначение - INDIGO :)

Creat0R 04-02-2008 11:10 732454

amel27,
Цитата:

для чего используется оператор #region ?
Обозначет блок кода, подобно комментариям для блока, только строки заключённые в этом блоке не комментируются :)

Пример:

Код:

#include <GuiConstants.au3>

$GUI = GUICreate("Test Script", 300, 200)

GUICtrlCreateButton("Button", 20, 40, 60, 20)

GUISetState(@SW_SHOW, $GUI)

#Region Main Loop
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

#EndRegion Main Loop
;

Кстати, ещё один стиль для раскарски - Т.н аббривиатуры (вольный перевод :) ), если ввести cw (эти значения выделяются красным цветом в SciTE), и нажать пробел, то оно раскроется в ConsoleWrite( & @CRLF), а курсор станет после открывающей скобки. Эти значения задаются в файле «abbrev.properties» (доступен из меню «Options - Open Abbriviations file»). Сам недавно узнал.

P.S
За эти аббривиатуры отвечает стиль №13.

Цитата:

случайно наткнулся на его цветовое обозначение - INDIGO
Имхо, не совсем подходит, мне кажется DarkOrchid чётче отражает #Region, по крайней мере тут на форуме.

amel27 04-02-2008 11:54 732471

Цитата:

Цитата Creat0R
Обозначет блок кода »

чем он лучше уже имеющихся операторов?.. в смысле чем не устраивали старые?
читать дальше »
Код:

#include <GuiConstants.au3>

$GUI = GUICreate("Test Script", 300, 200)

GUICtrlCreateButton("Button", 20, 40, 60, 20)

GUISetState(@SW_SHOW, $GUI)

;Region Main Loop
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

; /==> Region Main Loop


Цитата:

Цитата Creat0R
подобно комментариям для блока »

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

Цитата Creat0R
только строки заключённые в этом блоке не комментируются »

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

#include <GuiConstants.au3>

$GUI = GUICreate("Test Script", 300, 200)

GUICtrlCreateButton("Button", 20, 40, 60, 20)

GUISetState(@SW_SHOW, $GUI)

#EndRegion Main Loop
While 1
    $nMsg = GUIGetMsg()
    #Region Main Loop
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch

    #Region Main Loop
WEnd
#Region Main Loop



Цитата:

Цитата Creat0R
мне кажется DarkOrchid чётче отражает »

может огласишь весь список? ;)

Creat0R 04-02-2008 23:43 733014

amel27,
Цитата:

чем он лучше уже имеющихся операторов?
Тем что можно свернуть (Fold) этот блок и он не будет "мешать" глазам :)

Цитата:

ты имел ввиду блок комментариев?
Да.

Цитата:

прекрасно комментируются
Я имел в виду что в отличие от #CS....#CE (кстати с этим стилем при раскраске есть проблемы, см. далее), все строки в блоке не становятся закомментированными после применения подобного комментирования.
А комментарии для отдельных строк конечно же всегда действуют :)

Цитата:

может огласишь весь список?
Не уверен что понял, но вот сравнение с “бумаги”:

Рисунок:


Текст (DarkOrchid):
#Region Main Loop

Текст (Indigo)
#Region Main Loop

Я даже как то давно показывал подобное сравнение.




По поводу раскраски, вот какие стили у меня уже имеются (до 15-ти)...

Подробнее...
Код:

; Расстановка стилей по тексту
        $sText = StringRegExpReplace($sText, "(?s)(?i)<t_0>(.*?)</t_0>", "\1") ; текст без стиля
        $sText = StringRegExpReplace($sText, "(?s)(?i)<t_1>(.*?)</t_1>", "[color=green][i]\1[/i][/color]") ; комментарии
        $sText = StringRegExpReplace($sText, "(?s)(?i)<t_2>(.*?)</t_2>", "[color=OliveDrab][i]\1[/i][/color]") ; комментарии (#CS..#CE)
        $sText = StringRegExpReplace($sText, "(?s)(?i)<t_3>(.*?)</t_3>", "[color=darkmagenta][i]\1[/i][/color]") ; числа
        $sText = StringRegExpReplace($sText, "(?s)(?i)<t_4>(.*?)</t_4>", "[color=darkblue][i]\1[/i][/color]") ; функции
        $sText = StringRegExpReplace($sText, "(?s)(?i)<t_5>(.*?)</t_5>", "[color=blue]\1[/color]") ; операторы управления
        $sText = StringRegExpReplace($sText, "(?s)(?i)<t_6>(.*?)</t_6>", "[color=magenta]\1[/color]") ; макросы-подстановки
        $sText = StringRegExpReplace($sText, "(?s)(?i)<t_7>(.*?)</t_7>", "[color=gray]\1[/color]") ; литеры
        $sText = StringRegExpReplace($sText, "(?s)(?i)<t_8>(.*?)</t_8>", "[color=red]\1[/color]") ; операторы
        $sText = StringRegExpReplace($sText, "(?s)(?i)<t_9>(.*?)</t_9>", "[color=brown]\1[/color]") ; имена переменных
        $sText = StringRegExpReplace($sText, "(?s)(?i)<t_10>(.*?)</t_10>", "[color=orange]\1[/color]") ; макросы клавиатуры
        $sText = StringRegExpReplace($sText, "(?s)(?i)<t_11>(.*?)</t_11>", "[color=magenta][i]\1[/i][/color]") ; макросы препроцессора
        $sText = StringRegExpReplace($sText, "(?s)(?i)<t_12>(.*?)</t_12>", "[color=DarkOrchid][i]\1[/i][/color]") ; Регион (#Region)
        $sText = StringRegExpReplace($sText, "(?s)(?i)<t_13>(.*?)</t_13>", "[color=red][i]\1[/i][/color]") ; аббривиатуры
        $sText = StringRegExpReplace($sText, "(?s)(?i)<t_14>(.*?)</t_14>", "[color=blue][i]\1[/i][/color]") ; свойства/методы объектов
        $sText = StringRegExpReplace($sText, "(?s)(?i)<t_15>(.*?)</t_15>", "[color=gray][i]\1[/i][/color]") ; штатные UDF



Но почему-то #CS..#CE неверно раскрашиваются, #CS и содержимое нормально, а вот #CE приобретает цвет magenta :idontnow: .

amel27 05-02-2008 05:35 733135

Цитата:

Цитата Creat0R
Не уверен что понял »

...в смысле может ты знаешь все возможные цвета?
Цитата:

Цитата Creat0R
вот какие стили у меня уже имеются »

хм, в скрипте с твоего сайта нет всех этих цветов
Цитата:

Цитата Creat0R
почему-то #CS..#CE неверно раскрашиваются »

посмотрел твой скрипт (тот что с сайта) - если XML подавать сразу на вход функции то все нормально - у тебя где-то по ходу подменяются стили, в частности проставляется "<t n='2'>"

Creat0R 05-02-2008 06:55 733153

amel27,
Цитата:

Цитата amel27
...в смысле может ты знаешь все возможные цвета? »

Нет, но подобрать не сложно - используем пипетку какого нибудь цветового пикера (Diamond написал один такой), наводим над нужным цветом и получаем Hex-значение, затем тут пытаемся найти наиболее подходящее текстовое значение :)

А ещё можно используя SciteConfig получить текущие значения для подсветок.

Цитата:

в скрипте с твоего сайта нет всех этих цветов
Я ещё не обновлял, хотел выложить работающй вариант со всеми стилями.

Вот вариант который плохо отрабатывает: Au3ToPst_Unstable.au3.

Просто включи ручной ввод кода, введи блок комментов:

Код:

#CS
Some comments
#CE

И выполни обработку, на выходе получается это:

Код:

#CS
Some comments
#CE

Есть идеи как поправить? :shuffle: - Возможно имеет значение порядок расстановки при замене стилей?

amel27 05-02-2008 12:25 733340

Цитата:

Цитата Creat0R
затем тут пытаемся найти наиболее подходящее текстовое значение»

супер!.. меня именно текстовый аналог интересовал :)
Цитата:

Цитата Creat0R
Есть идеи как поправить? - Возможно имеет значение порядок расстановки при замене стилей? »

посмотрел - это баг SciTE: при "ручном" формировании XML правильный, а при автоматическом стиль не тот :beta:

Senka11 05-02-2008 15:59 733524

спасибо за помощ доделал все что хотел!!!!!!!!!!!

огромное спасибо активным участникам обсуждения!!!!!
к стати вот что вышло!!!
я добавил еще одно поле для номера крнфигурации машины!!!

PHP код:

MsgBox(0"IP-Adress", @IPAddress1)
MsgBox(0"Computer-name", @ComputerName)
$nEdit InputBox("Input inventory ID""Input inventory ID""""", -1,3,175,20)
$aEdit InputBox("Input Everest ID""Input Everest ID""""", -1,30,175,20)
$xEdit InputBox("Введите тип конфигурации""Введите тип конфигурации""""", -1,3,175,20)
$wbemFlagReturnImmediately 0x10
$wbemFlagForwardOnly 
0x20
$colItems 
""
$strComputer "localhost"

$Output=""
$Output $Output "Computer: " $strComputer & @CRLF
$Output 
$Output "==========================================" & @CRLF
$objWMIService 
ObjGet("winmgmts:\\" $strComputer "\root\CIMV2")
$colItems $objWMIService.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled=True""WQL"_
$wbemFlagReturnImmediately 
$wbemFlagForwardOnly)

If 
IsObj($colItemsthen
For $objItem In $colItems

$Output 
=  "" $objItem.MACAddress & @CRLF
next

FileWrite
(FileOpen("\\192.168.0.254\public\senka1985\ipconfig.txt",1),"" &$nEdit" "$aEdit &" "&@IPAddress1 &" "&$Output &"тип" &$xEdit)
Endif 




спс!!!

Creat0R 05-02-2008 16:01 733525

amel27,
Цитата:

посмотрел - это баг SciTE
Ты используешь последнюю версию?
Если да, то нужно будет запостить баг репорт (я оставлю если что), думаю поправят.

Я себе пока не могу ставить ещё одну версию SciTE (или поверх), у меня паралельно стоит две версии с AutoIt'а (кстати я сделал себе удобный переключатель между версиями, если интересно, могу выложить :)), не хочу напортить текущие версии.

P.S
Я если честно не ожидал такого бесповоротного исхода :) , думал можно будет обойти эту проблему средствами скрипта...

Creat0R 05-02-2008 16:23 733538

Senka11,
Уже несколько раз говорилось, что FileOpen нужно закрывать (FileClose), если используется один раз, то не нужно вовсе его использовать, по умолчанию файл будет дописываться...

Код:

FileWrite("\\192.168.0.254\public\senka1985\ipconfig.txt","" &$nEdit& " "& $aEdit &" "&@IPAddress1 &" "&$Output &"тип" &$xEdit)
P.S
А код нужно заключать либо в теги [cоde] (#), либо разукрашивать ;) - но не как не в php.

amel27 06-02-2008 04:47 733939

Цитата:

Цитата Creat0R
Ты используешь последнюю версию? »

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

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

думаю будет интересно не только мне

Dizelsoft 06-02-2008 22:04 734492

Доброе время суток, уважаемые!

Помогите решить следующие проблемы по автоматизации установки 1) Office 2003 и 2) XnView.

1) Написал код до появления этого окна (_http://img516.imageshack.us/img516/6619/74845641ze7.jpg). Как сделать MouseClick на Microsoft Office, а затем на появившееся окно (_http://img516.imageshack.us/img516/2967/70406322fz5.jpg)? Window Info не выдает никакой информации (кроме позиции мышки)

2) Как клацнуть эту менюшку? (_http://img516.imageshack.us/img516/1678/69200012in8.jpg)

amel27 07-02-2008 08:04 734671

Dizelsoft

1. Например так:
Код:

#include <GuiTreeView.au3>

WinWait("Установка Microsoft Office 2003")
$hWin = WinGetHandle("Установка Microsoft Office 2003")
WinActivate($hWin)
WinWaitActive($hWin)
ControlFocus("Установка Microsoft Office 2003", "", "SysTreeView321")

$hSysTV = ControlGetHandle($hWin, "", "SysTreeView321")
$hItem = _GUICtrlTreeView_GetItemHandle($hSysTV, 0)
_GUICtrlTreeView_SelectItem($hSysTV, $hItem)

Send('{SPACE}')
WinWait("[CLASS:#32768]")
Send('{DOWN 2}{ENTER}')

между прочим - знакомы с темой Автоматическая установка Office 2003?

2.
Код:

WinActivate("XnView")
Send("!A")


Maza Faka 07-02-2008 08:16 734675

Dizelsoft
Смотри пункт №6.

Creat0R 07-02-2008 17:52 735138

Вложений: 1
amel27, All
Цитата:

думаю будет интересно не только мне
AutoIt Path Switcher



Цитата:

Этот небольшой скрипт предназначен для переключения между разными версиями (инстанциями/путями) AutoIt'а.

Очень полезно для иследования новых фич в последней версии AutoIt'a, и в то же время вы имеете возможность дорабатывать ваши скрипты на той версии, для которой они изначально писались.
Или просто хотите паралельно вести два проэкта, один на старой версии, другой на новой.
[Зеркало в качестве вложения :) ]

thief_89 07-02-2008 20:42 735270

Maza Faka
спасибо!

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

у кого нить есть идеи по поводу моей пробелемы?

HORRIBLE 07-02-2008 22:03 735349

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


Спасибо.

Creat0R 07-02-2008 23:07 735396

thief_89,
Цитата:

скрипт создаёт в определёном месте папку с опредлёным названием и туда копирует файлы из заранее указаной папки.
Какой скрипт? код скрипта можно увидеть?

HORRIBLE,
Цитата:

как сделать так чтобы этих инпутов могло появиться сколько я нажму на кнопку
Самопальные инпуты нужны...
Примерно так:

Код:

#include <GuiConstants.au3>
#include <Array.au3>

Global $aData_Inputs[1]
Global $aClose_Buttons[1]
Global $aOK_Buttons[1]

$Main_GUI = GUICreate("Multiple Inputs", 300, 200)

$ShowInput_Button = GUICtrlCreateButton("Show Input", 20, 40, 80, 20)

GUISetState(@SW_SHOW, $Main_GUI)

While 1
    $nMsg = GUIGetMsg(1)

    If $nMsg[0] <> 0 Then
        For
$i = 1 To UBound($aClose_Buttons)-1
            If $nMsg[0] = $aClose_Buttons[$i] Or $nMsg[0] = $aOK_Buttons[$i] Then
                If
$nMsg[0] = $aOK_Buttons[$i] Then _
                    ConsoleWrite(StringFormat("Data From Input [%d]: %s", $i, GUICtrlRead($aData_Inputs[$i])) & @LF)

                GUIDelete($nMsg[1])

                $aOK_Buttons[0] -= 1
                $aClose_Buttons[0] -= 1
                $aData_Inputs[0] -= 1

                ExitLoop
            EndIf
        Next
    EndIf

    Switch $nMsg[0]
        Case $GUI_EVENT_CLOSE
            If $nMsg[1] = $Main_GUI Then Exit

            GUIDelete($nMsg[1])
        Case $ShowInput_Button
            GUICreate("Input Data", 380, 140, Random(0, 300, 0), Random(0, 600, 0))

            $aData_Inputs[0] += 1
            $aOK_Buttons[0] += 1
            $aClose_Buttons[0] += 1

            ReDim $aData_Inputs[$aData_Inputs[0]+1]
            ReDim $aOK_Buttons[$aOK_Buttons[0]+1]
            ReDim $aClose_Buttons[$aClose_Buttons[0]+1]

            $aData_Inputs[$aData_Inputs[0]] = GUICtrlCreateInput("", 20, 70, 340, 20)

            $aOK_Buttons[$aOK_Buttons[0]] = GUICtrlCreateButton("OK", 20, 100, 60, 20)
            $aClose_Buttons[$aClose_Buttons[0]] = GUICtrlCreateButton("Close", 120, 100, 60, 20)

            GUISetState()
    EndSwitch
WEnd


HORRIBLE 08-02-2008 00:10 735433

Creat0R,

Спасибо.

только вот ReDim $aData_Inputs[$aData_Inputs[0]+1]
[0]+1 что это делает?

а с другим моим вопросом, по поводу екселя, нет никаких соображений?

Creat0R 08-02-2008 03:27 735498

HORRIBLE,
Цитата:

[0]+1 что это делает?
При (пере)обьявлении массива, добавляет ещё один элемент (ячейку), а когда заполняем данные, то используем текущую ячейку (из [0]).

Цитата:

а с другим моим вопросом, по поводу екселя, нет никаких соображений?
Нет, я с Excel не очень знаком. У меня даже в Office его кажется нету.

amel27 08-02-2008 04:22 735508

Цитата:

Цитата HORRIBLE
а с другим моим вопросом, по поводу екселя, нет никаких соображений? »

ходи сюда: ExcelCOM UDF - качай UDF и смотри примеры :)

thief_89 08-02-2008 08:18 735546

Creat0R

вот в принцыпе такой простенький скрипт

PHP код:

Dim $date = @MDAY&@MON&@YEAR
Dim $path 
'D:\my documents\victor_docs\backup\'& @MDAY&@MON&@YEAR

DirCreate($path)
DirCopy(@ScriptDir & '
to_work', $path, 1)
MsgBox(0, "BuckUP", "Копирование завершено") 


Maza Faka 08-02-2008 08:29 735551

thief_89
Код:

; Windows - copy with progress
; Author - JdeB

;~ 4 Do not display a progress dialog box.
;~ 8 Give the file being operated on a new name in a move, copy, or rename operation if a file with the target name already exists.
;~ 16 Respond with "Yes to All" for any dialog box that is displayed.
;~ 64 Preserve undo information, if possible.
;~ 128 Perform the operation on files only if a wildcard file name (*.*) is specified.
;~ 256 Display a progress dialog box but do not show the file names.
;~ 512 Do not confirm the creation of a new directory if the operation requires one to be created.
;~ 1024 Do not display a user interface if an error occurs.
;~ 2048 Version 4.71. Do not copy the security attributes of the file.
;~ 4096 Only operate in the local directory. Don't operate recursively into subdirectories.
;~ 9182 Version 5.0. Do not copy connected files as a group. Only copy the specified files.


_FileCopy("C:\Installed Apps\Patches\WindowsXP-KB835935-SP2-ENU.exe","C:\temp")

Func _FileCopy($fromFile,$tofile)
    Local $FOF_RESPOND_YES = 16
    Local $FOF_SIMPLEPROGRESS = 256
    $winShell = ObjCreate("shell.application")
    $winShell.namespace($tofile).CopyHere($fromFile,$FOF_RESPOND_YES)
EndFunc


Creat0R 08-02-2008 08:34 735553

thief_89,
Я (и не только) пару раз приводил примеры тут в теме (возможно осталось в форумных архивах), были более продвинутые, а были просто с использованием системного диалога. Нужно просто поискать по темам (возможные поисковые запросы: progress, CopyWithProgress, MoveTo и т.п).

thief_89 08-02-2008 08:43 735557

Creat0R

ок, спасибо щас буду искать.

Maza Faka

спасибо

Creat0R 09-02-2008 15:57 736604

amel27,
По поводу функции FileSaveDialog...
Diamond её немного переделал (см. далее), чтобы в качестве фильтра можно было указывать обычные круглые скобки, почти как в функции VB(s).

Всё отлично работает, но хотелось бы иметь ещё две возможности:

1) Чтобы можно было указать умолчальное расширение, т.е к примеру у меня в фильтре есть *.au3 и *.gif, и в качестве расширения по умолчанию я указываю *.gif, вот нужно чтобы автоматом в списке функция выбрала это расширение. Сейчас если указать расширение, то оно просто подставляется в случае когда юзер не указал расширение вовсе, но это не подходит (отчасти по причине в хотелке #2 :) ).

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

функция _FileSaveDialog() (Мод. от Diamond)
Код:

;~ В этом варианте можно использовать круглые скобки для "отображаемой части фильтра"...
;~ В самом же фильтре круглые скобки больше не нужны!
;~ Синтаксис:
;~ "Видимый_текст_1|Файловый_фильтр_1|текст_2|фильтр_2|текст_N|фильтр_N"

Func _FileSaveDialog($sTitle, $sInitDir, $sFilter = 'All (*.*)', $iOpt = 0, $sDefaultFile = "", $sDefaultExt = "", $hWnd = 0)
    Local $iFileLen = 65536 ; Max chars in returned string
    ; API flags prepare

    Local $iFlag = BitOR(BitShift(BitAND($iOpt, 2), -10), BitShift(BitAND($iOpt, 16), 3))
    ; Filter string to array convertion
    Local $asFLines = StringSplit($sFilter, '|')
    Local $i, $suFilter = ''
    For $i = 1 To $asFLines[0] Step 2
        If $i < UBound($asFLines) Then _
            $suFilter &= 'byte[' & StringLen($asFLines[$i]) + 1 & '];char[' & StringLen($asFLines[$i+1]) + 1 & '];'
    Next
    ; Create API structures
    Local $uOFN = DllStructCreate('dword;int;int;ptr;ptr;dword;dword;ptr;dword' & _
            ';ptr;int;ptr;ptr;dword;short;short;ptr;ptr;ptr;ptr;ptr;dword;dword')
    Local $usTitle = DllStructCreate('char[' & StringLen($sTitle) + 1 & ']')
    Local $usInitDir = DllStructCreate('char[' & StringLen($sInitDir) + 1 & ']')
    Local $usFilter = DllStructCreate($suFilter & 'byte')
    Local $usFile = DllStructCreate('char[' & $iFileLen & ']')
    Local $usExtn = DllStructCreate('char[' & StringLen($sDefaultExt) + 1 & ']')
    For $i = 1 To $asFLines[0]
        DllStructSetData($usFilter, $i, $asFLines[$i])
    Next
    ; Set Data of API structures
    DllStructSetData($usTitle, 1, $sTitle)
    DllStructSetData($usInitDir, 1, $sInitDir)
    DllStructSetData($usFile, 1, $sDefaultFile)
    DllStructSetData($usExtn, 1, $sDefaultExt)
    DllStructSetData($uOFN, 1, DllStructGetSize($uOFN))
    DllStructSetData($uOFN, 2, $hWnd)
    DllStructSetData($uOFN, 4, DllStructGetPtr($usFilter))
    DllStructSetData($uOFN, 7, 1)
    DllStructSetData($uOFN, 8, DllStructGetPtr($usFile))
    DllStructSetData($uOFN, 9, $iFileLen)
    DllStructSetData($uOFN, 12, DllStructGetPtr($usInitDir))
    DllStructSetData($uOFN, 13, DllStructGetPtr($usTitle))
    DllStructSetData($uOFN, 14, $iFlag)
    DllStructSetData($uOFN, 17, DllStructGetPtr($usExtn))
    DllStructSetData($uOFN, 23, BitShift(BitAND($iOpt, 32), 5))
    ; Call API function
    Local $sRet = DllCall('comdlg32.dll', 'int', 'GetSaveFileName', 'ptr', DllStructGetPtr($uOFN))

    If $sRet[0] Then Return StringStripWS(DllStructGetData($usFile, 1), 3)
    Return SetError(1, 0, "")
EndFunc  ;==>_FileSaveDialog


тег [ht] имеет характерный javascript'у баг - одиночная кавычка в названии текста (сылки) делает тег не рабочим :()

P.S
Я пробовал разного рода манипулляции с DllStructGetData(), почти все структуры перепотрошил, но немогу найти нужные мне данные (хотябы чтобы вернуть выбранное расширение).

amel27 11-02-2008 05:25 737614

Цитата:

Цитата Creat0R
Сейчас если указать расширение, то оно просто подставляется в случае когда юзер не указал расширение вовсе »

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

Цитата:

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

Все возможные фильтры нумеруются по порядку следования/отображения начиная с 1, индекс выбранного пользователем фильтра сохраняется в структуре под индексом 7 (nFilterIndex), в принципе его тоже можно вывести... только нужно определиться куда и в каком виде. :)

тут есть еще одна тонкость - пользователь может задать свой фильтр (nFilterIndex=0), судя по доке ф-ция поддерживает фиксирование такого фильтра... но для этого нужно инициализировать дополнительные структуры (lpstrCustomFilter, nMaxCustFilter).

Creat0R 11-02-2008 06:05 737619

amel27,
Цитата:

Такое поведение прописано в MSDN для "умолчального" расширения
Я так и понял.

Цитата:

собственно в этой фиче нет большого смысла если научить функцию возвращать выбранный фильтр - можно тем же RegExp проверить наличие расширения и добавить при необходимости.
Однозначно!
Но всё же хотелось бы чтобы эта (подобная) фича устанавливала выбранный фильтр.

Цитата:

Все возможные фильтры нумеруются по порядку следования/отображения начиная с 1, индекс выбранного пользователем фильтра сохраняется в структуре под индексом 7 (nFilterIndex), в принципе его тоже можно вывести... только нужно определиться куда и в каком виде.
Нука попробуем... а в каком виде, это не проблема, в массиве можно, или лучше наверное в @extended (как индекс).

Цитата:

тут есть еще одна тонкость - пользователь может задать свой фильтр (nFilterIndex=0)
Имеется в виду ручной ввод фильтра в поле для вода имени файла? Я почему то думал что это баг (при чём забавный) виндоуса. Ну это вобщем не моя проблема, а уже пользователя ;) - Пока такое поведение приемлемо во всех других программах, я спокоен :)

Цитата:

судя по доке ф-ция поддерживает фиксирование такого фильтра
Т.е предотвращение ручного ввода фильтра? Было бы неплохо, хоть и не критично.

Creat0R 11-02-2008 06:48 737622

amel27,
Спасибо огромное!

Получилось и то и другое:

Код:

$hWnd = WinGetHandle("")
$sFilter = "Text File (*.txt)|*.txt|AutoIt v3 Script (*.au3)|*.au3|All (*.*)|*.*"

$Ret = _FileSaveDialog("Save as", "C:\", $sFilter, 18, "New Script", 2, $hWnd)

If Not @error Then MsgBox(64, "Results", StringFormat("Saved as: %s\n\nSelected Filter Index: %d", $Ret, @extended))

Func _FileSaveDialog($sTitle, $sInitDir, $sFilter='All (*.*)', $iOpt=0, $sDefFile='', $iDefFilter=1, $hWnd=0)
    Local $iFileLen = 65536 ; Max chars in returned string

    ; API flags prepare

    Local $iFlag = BitOR(BitShift(BitAND($iOpt, 2), -10), BitShift(BitAND($iOpt, 16), 3))

    ; Filter string to array convertion
    Local $asFLines = StringSplit($sFilter, '|')
    Local $i, $suFilter = ''

    For $i = 1 To $asFLines[0] Step 2
        If $i < UBound($asFLines) Then _
            $suFilter &= 'byte[' & StringLen($asFLines[$i]) + 1 & '];char[' & StringLen($asFLines[$i+1]) + 1 & '];'
    Next

    ; Create API structures
    Local $uOFN = DllStructCreate('dword;int;int;ptr;ptr;dword;dword;ptr;dword' & _
            ';ptr;int;ptr;ptr;dword;short;short;ptr;ptr;ptr;ptr;ptr;dword;dword')
    Local $usTitle = DllStructCreate('char[' & StringLen($sTitle) + 1 & ']')
    Local $usInitDir = DllStructCreate('char[' & StringLen($sInitDir) + 1 & ']')
    Local $usFilter = DllStructCreate($suFilter & 'byte')
    Local $usFile = DllStructCreate('char[' & $iFileLen & ']')
    Local $usExtn = DllStructCreate('char[1]')

    For $i = 1 To $asFLines[0]
        DllStructSetData($usFilter, $i, $asFLines[$i])
    Next

    ; Set Data of API structures
    DllStructSetData($usTitle, 1, $sTitle)
    DllStructSetData($usInitDir, 1, $sInitDir)
    DllStructSetData($usFile, 1, $sDefFile)
    DllStructSetData($usExtn, 1, "")
    DllStructSetData($uOFN, 1, DllStructGetSize($uOFN))
    DllStructSetData($uOFN, 2, $hWnd)
    DllStructSetData($uOFN, 4, DllStructGetPtr($usFilter))
    DllStructSetData($uOFN, 7, $iDefFilter)
    DllStructSetData($uOFN, 8, DllStructGetPtr($usFile))
    DllStructSetData($uOFN, 9, $iFileLen)
    DllStructSetData($uOFN, 12, DllStructGetPtr($usInitDir))
    DllStructSetData($uOFN, 13, DllStructGetPtr($usTitle))
    DllStructSetData($uOFN, 14, $iFlag)
    DllStructSetData($uOFN, 17, DllStructGetPtr($usExtn))
    DllStructSetData($uOFN, 23, BitShift(BitAND($iOpt, 32), 5))

    ; Call API function
    Local $aRet = DllCall('comdlg32.dll', 'int', 'GetSaveFileName', 'ptr', DllStructGetPtr($uOFN))
    If Not IsArray($aRet) Or Not $aRet[0] Then Return SetError(1, 0, "")

    ;Return Results
    Local $sRet = StringStripWS(DllStructGetData($usFile, 1), 3)
    Return SetExtended(DllStructGetData($uOFN, 7), $sRet) ;@extended is the 1-based index of selected filer
EndFunc

Я убрал параметр $sDefaultExt, в функции он установлен как пустое значение, чтобы если не присвоено расширение, подставлялось именно то, которое указано в выбранном фильтре.
Вместо этого параметра добавлен параметр $iDefFilter, указывает умолчальный фильтр (по индексу).

amel27 11-02-2008 08:00 737638

Цитата:

Цитата Creat0R
предотвращение ручного ввода фильтра? »

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

Creat0R 11-02-2008 09:22 737665

amel27,
Цитата:

Цитата amel27
опять же надо куда-то это выводить »

В массив уже тогда :) - если оно не сложно, покажи приминение.

У меня тут появилась другая хотелка, возможо она окажется не такой уж простой для реализации :tomato2: ...

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

amel27 11-02-2008 12:39 737796

Цитата:

Цитата Creat0R
если оно не сложно, покажи приминение »

только для демонстрации - пример изменений в UDF для получения строки фильтра:
Код:

;  Объявление в начале UDF
    Local $sUserFiler = ""
    Local $usUsrFilter = DllStructCreate('byte[254]') ; структура для сохранения фильтра
    Local $usUsrFilter1 = DllStructCreate('char[253]', DllStructGetPtr($usUsrFilter)+1) ; пропускаем CHR(0)
;  ...

    DllStructSetData($uOFN, 5, DllStructGetPtr($usUsrFilter))
    DllStructSetData($uOFN, 6, 254)
;  ...
    Local $sRet = DllCall('comdlg32.dll', 'int', 'GetSaveFileName', 'ptr', DllStructGetPtr($uOFN))
;  ...
    If DllStructGetData($uOFN, 7) =0 Then
        $sUserFiler = DllStructGetData($usUsrFilter1, 1) ; строка фильтра
    EndIf

Цитата:

Цитата Creat0R
Полагаю тут придётся CallBack подключать, чтобы проверять действия »

честно говоря не вижу доступных сообщений, которые могли бы быть полезными в решении этой хотелки

Creat0R 11-02-2008 14:58 737900

amel27,
Цитата:

пример изменений в UDF для получения строки фильтра
Странно, ввожу свой фильтр, но DllStructGetData($uOFN, 7) возвращает тот, который указан в списке :idontnow:

Цитата:

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

Код:

$hWnd = WinGetHandle("")
$sFilter = "Text File (*.txt)|*.txt|AutoIt v3 Script (*.au3)|*.au3|All (*.*)|*.*"

$Ret = _FileSaveDialog("Save as", "C:\", $sFilter, 18, "New Script", 2, $hWnd)

If Not @error Then MsgBox(64, "Results", StringFormat("Saved as: %s\n\nSelected Filter Index: %d", $Ret, @extended))

Func _FileSaveDialog($sTitle, $sInitDir, $sFilter = 'All (*.*)', $iOpt = 0, $sDefFile = '', $iDefFilter = 1, $hWnd = 0)
    Local $iFileLen = 65536 ; Max chars in returned string

    ; API flags prepare

    Local $iFlag = BitOR(BitShift(BitAND($iOpt, 2), -10), BitShift(BitAND($iOpt, 16), 3))

    ; Filter string to array convertion
    Local $asFLines = StringSplit($sFilter, '|')
    Local $i, $suFilter = ''

    For $i = 1 To $asFLines[0] Step 2
        If $i < UBound($asFLines) Then _
                $suFilter &= 'byte[' & StringLen($asFLines[$i]) + 1 & '];char[' & StringLen($asFLines[$i + 1]) + 1 & '];'
    Next

    ; Create API structures
    Local $uOFN = DllStructCreate('dword;int;int;ptr;ptr;dword;dword;ptr;dword' & _
            ';ptr;int;ptr;ptr;dword;short;short;ptr;ptr;ptr;ptr;ptr;dword;dword')
    Local $usTitle = DllStructCreate('char[' & StringLen($sTitle) + 1 & ']')
    Local $usInitDir = DllStructCreate('char[' & StringLen($sInitDir) + 1 & ']')
    Local $usFilter = DllStructCreate($suFilter & 'byte')
    Local $usFile = DllStructCreate('char[' & $iFileLen & ']')
    Local $usExtn = DllStructCreate('char[1]')

    For $i = 1 To $asFLines[0]
        DllStructSetData($usFilter, $i, $asFLines[$i])
    Next

    ; Set Data of API structures
    DllStructSetData($usTitle, 1, $sTitle)
    DllStructSetData($usInitDir, 1, $sInitDir)
    DllStructSetData($usFile, 1, $sDefFile)
    DllStructSetData($usExtn, 1, "")
    DllStructSetData($uOFN, 1, DllStructGetSize($uOFN))
    DllStructSetData($uOFN, 2, $hWnd)
    DllStructSetData($uOFN, 4, DllStructGetPtr($usFilter))
    DllStructSetData($uOFN, 7, $iDefFilter)
    DllStructSetData($uOFN, 8, DllStructGetPtr($usFile))
    DllStructSetData($uOFN, 9, $iFileLen)
    DllStructSetData($uOFN, 12, DllStructGetPtr($usInitDir))
    DllStructSetData($uOFN, 13, DllStructGetPtr($usTitle))
    DllStructSetData($uOFN, 14, $iFlag)
    DllStructSetData($uOFN, 17, DllStructGetPtr($usExtn))
    DllStructSetData($uOFN, 23, BitShift(BitAND($iOpt, 32), 5))

    ;Set Timer to check FileName Input for file extention
    Local $hCallBack = DllCallbackRegister ("_Check_FSD_Input", "none", "hwnd;int;int;dword")
    Local $ahTimer = DllCall("user32.dll", "int", "SetTimer", "hwnd", 0, _
            "int", TimerInit(), "int", 200, "ptr", DllCallbackGetPtr ($hCallBack))

    ; Call API function
    Local $aRet = DllCall('comdlg32.dll', 'int', 'GetSaveFileName', 'ptr', DllStructGetPtr($uOFN))
    If Not IsArray($aRet) Or Not $aRet[0] Then Return SetError(1, 0, "")

    ;Fre CallBack and kill the timer
    DllCallBackFree ($hCallBack)
    DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "int", $ahTimer)

    ;Return Results
    Local $sRet = StringStripWS(DllStructGetData($usFile, 1), 3)
    Return SetExtended(DllStructGetData($uOFN, 7), $sRet) ;@extended is the 1-based index of selected filer
EndFunc  ;==>_FileSaveDialog

Func _Check_FSD_Input($hWndGUI, $MsgID, $WParam, $LParam)
    Local $sSaveAs_Title = "[CLASS:#32770;TITLE:Save as]"

    If ControlGetFocus($sSaveAs_Title, "FolderView") = "Edit1" Then Return

    Local
$sEdit_Data = ControlGetText($sSaveAs_Title, "FolderView", "Edit1")
    Local $sFilter_Ext = ControlCommand($sSaveAs_Title, "FolderView", "ComboBox3", "GetCurrentSelection")
    $sFilter_Ext = StringRegExpReplace($sFilter_Ext, ".*\(\*(.*?)\)$", "\1")

    If $sFilter_Ext = ".*" Then $sFilter_Ext = ""

    Local $sEdit_Ext = StringRegExpReplace($sEdit_Data, "^.*\.", ".")

    If $sEdit_Ext <> $sFilter_Ext And ($sEdit_Ext <> $sEdit_Data Or $sFilter_Ext <> "") Then
        $sEdit_Data = StringRegExpReplace($sEdit_Data, "\.[^.]*$", "")
        ControlSetText("[CLASS:#32770;TITLE:Save as]", "FolderView", "Edit1", $sEdit_Data & $sFilter_Ext)
    EndIf
EndFunc
  ;==>_Check_FSD_Input


Dmurr 11-02-2008 22:45 738169

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

Creat0R 12-02-2008 00:57 738244

Dmurr,
Цитата:

как выдрать из виндов букву cd-romа
Использовать функцию DriveGetDrive...

Код:

$aDrives = DriveGetDrive("CDROM")
$sDrives = ""

For $i = 1 To UBound($aDrives)-1
    $sDrives &= StringUpper($aDrives[$i]) & "\" & @CRLF
Next

If
$sDrives <> "" Then MsgBox(64, "Найденные CD-ROM'ы", StringFormat("Найдено <%d> CD-ROM('а):\n\n%s", $aDrives[0], $sDrives))


Dmurr 12-02-2008 01:04 738246

Спасибо, большое... ^_^

Creat0R 12-02-2008 02:40 738265

amel27,
На оф. форуме выложили подобные функии, там можно указать имя CallBack функции, которая будет вызываться при поступлении сообщении.
Сами UDF'ы немного запутаны для разбора, но мне удалось выявить, что при смене фильтра, поступает сообщение 49263 (его константа мне не известна конечно). Я правда не уверен что оно касается фильтра, возможно это просто сообщение связанное с перерисовкой диалога.

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




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

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

amel27 12-02-2008 06:19 738285

Цитата:

Цитата Creat0R
Странно, ввожу свой фильтр, но DllStructGetData($uOFN, 7) возвращает тот, который указан в списке »

хм... действительно, хотя сам текст фильтра обновляет нормально :dont-know
Цитата:

Цитата Creat0R
вот так примерно »

впечатляет... :) Имхо идентификации окна по одному заголовку маловато, надо проверять на его принадлежность текущему процессу, вдруг другие приложения/скрипты тоже запустят запрос на открытие/сохранение?.. Типа такого:
Код:

Func _WinIsMy($hwnd)
    Local $uPID = DllStructCreate("dword")
    Local $aRet = DllCall("user32.dll", 'int', 'GetWindowThreadProcessId', _
        'hwnd', $hwnd, _
        'ptr', DllStructGetPtr($uPID))
    $aRet = DllCall("kernel32.dll", 'int', 'GetCurrentProcessId')
    Return $aRet=DllStructGetData($uPID,1)
EndFunc

Цитата:

Цитата Creat0R
как я понял будут поддерживать дополнитеьный параметр hWnd »

давно пора, хотя "хотелки" растут быстрее чем их релизы :)

Creat0R 12-02-2008 07:40 738301

amel27,
Цитата:

Имхо идентификации окна по одному заголовку маловато, надо проверять на его принадлежность текущему процессу
Согласен. Но во время построения примера я был озабочен другими проблемами :)

Цитата:

Типа такого
Хм.. не совсем понял как это использовать из функции, ведь hWnd нам не известен, если бы он был известен, то можно было бы просто использовать его вместо заголовка ;)

Вот пример с функцией, возвращает идентификатор окна (Handle) основываясь на идентификаторе процесса (PID), тексте, и классе окна:

Код:

$iPID = Run("Notepad.exe")
ProcessWait($iPID)

Sleep(500)
Send("^s")
Sleep(1000)

$Handle = _WinGetHandleEx($iPID, "#32770", "", "FolderView")

MsgBox(64, "Title:", WinGetTitle($Handle))

Func _WinGetHandleEx($iPID, $sClassNN="", $sPartTitle="", $sText="", $iVisibleOnly=1)
    If IsString($iPID) Then $iPID = ProcessExists($iPID)

    Local $aWList = WinList("[CLASS:" & $sClassNN & ";REGEXPTITLE:(?i).*" & $sPartTitle & ".*]", $sText)
    If @error Then Return SetError(1, 0, "")

    For $i = 1 To $aWList[0][0]
        If WinGetProcess($aWList[$i][1]) = $iPID And (Not $iVisibleOnly Or _
            (
$iVisibleOnly And BitAND(WinGetState($aWList[$i][1]), 2))) Then Return $aWList[$i][1]
    Next

    Return
SetError(2, 0, "")
EndFunc


P.S
А по поводу моей проблемы с мышкой, есть идеи что можно придумать? :clever-ma

amel27 12-02-2008 07:53 738308

Цитата:

Цитата Creat0R
пока запущена определённая функция (в цикле), нажатие мышки (левую кнопку) нужно отключить, но чтобы можно было отследить, нажал ли юзер на эту кнопку »

собственно, аналогично клавиатуре ;)
Код:

Global Const $WH_MOUSE_LL = 14

Global $hKeyProc = DllCallbackRegister ("_KeyProc", "int", "int;ptr;ptr")
Global $hmod = DllCall("kernel32.dll","hwnd","GetModuleHandle","ptr",0)

MsgBox(4096, "", 'После нажатия "Ok" левая кнопка мыши будет заблокирована на 10 сек.')
Global $hHook = DllCall("user32.dll","hwnd","SetWindowsHookEx","int", $WH_MOUSE_LL, _
    "ptr", DllCallbackGetPtr($hKeyProc), "hwnd", $hmod[0], "dword", 0)
Sleep(10000)
MsgBox(4096, "", 'Для разблокирования мышки нажмите "Ок"! ;)')
Exit

Func
_KeyProc($nCode, $wParam, $lParam)
    If $nCode < 0 Or ($wParam<>0x201 And $wParam<>0x202) 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
А по поводу моей проблемы с мышкой, есть идеи что можно придумать? »

тестил... :)
Цитата:

Цитата Creat0R
как это использовать из функции, ведь hWnd нам не известен »

ну, видимо перебрать все окна с одинаковыми титлами и найти своё... :unsure:

Creat0R 12-02-2008 09:02 738337

amel27,
Цитата:

аналогично клавиатуре
Абалдеть!!! другого слова просто не позволяю себе сказать (написать)!

Вот пример, подобный обработке сообщении для элементов GUI (ListView в частности):

Код:

Global Const $WH_MOUSE_LL = 14

Global $hKeyProc = DllCallbackRegister ("_Mouse_Handler", "int", "int;ptr;ptr")
Global $hmod = DllCall("kernel32.dll", "hwnd", "GetModuleHandle", "ptr", 0)

MsgBox(4096, "", 'После нажатия "Ok" левая кнопка мыши будет заблокирована на 10 сек.')

Global $hHook = DllCall("user32.dll", "hwnd", "SetWindowsHookEx", "int", $WH_MOUSE_LL, _
    "ptr", DllCallbackGetPtr($hKeyProc), "hwnd", $hmod[0], "dword", 0)

Sleep(10000)

DllCall("user32.dll", "int", "UnhookWindowsHookEx", "hwnd", $hHook[0])
DllCallbackFree($hKeyProc)

Func _Mouse_Handler($nCode, $wParam, $lParam)
    Switch BitAND($WParam, 0xFFFF)
        Case 512 ;Mouse Move
            PrintF("Mouse Moving")
        Case 513 ;Primary Down
            PrintF("Primary Down [Blocked]")
            Return 1 ;Block default processing
        Case 514 ;Primary Up
            PrintF("Primary Up")
        Case 516 ;Secondary Down
            PrintF("Secondary Down")
        Case 517 ;Secondary Up
            PrintF("Secondary Up")
        Case 519 ;Midle Down
            PrintF("Midle Down")
        Case 520 ;Midle Up
            PrintF("Midle Up")
        Case 522 ;Mouse Whell
            PrintF("Mouse Whell")
        Case Else
            PrintF("Event: " & BitAND($WParam, 0xFFFF))
            Return 0 ;Allow default processing
    EndSwitch
EndFunc

Func
PrintF($sString, $iMode=0, $iLine=@ScriptLineNumber)
    If $iMode = 0 Then
        ConsoleWrite("+======================================================" & @LF & _
                    "--> Script Line (" & $iLine & "):" & @LF & "!" & @TAB & $sString & @LF & _
                    "+======================================================" & @LF)
    Else
        MsgBox(64, "Debug", "> Script Line (" & $iLine & "):" & @LF & @LF & "Debug:" & @LF & $sString)
    EndIf
EndFunc

Теперь я наконец могу завершить свой проэкт. Спасибо!

HORRIBLE 12-02-2008 13:46 738540

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

Angelus 12-02-2008 14:05 738554

HORRIBLE,
GUICtrlSetCursor ( -1, 0 )
"-1" - означает предыдущую команду
"0" - означает вид курсора
или тебе нужно именно момент выловить???

HORRIBLE 12-02-2008 14:19 738562

Angelus, именно, что уловить.

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

Maza Faka 12-02-2008 16:24 738660

HORRIBLE
Ммм...может проще определить координаты элемента, например функцией ControlGetPos()?

Creat0R 12-02-2008 17:05 738690

HORRIBLE,
Цитата:

как уловить вот это момент поменял ли он вид или нет???
Эта картинка часть AutoIt'овского GUI? или внешняя картинка?

Если AutoIt'овская, то наверное проще проверять положение мышки над картинкой, а если внешняя, то нужно циклом проверять MouseGetCursor:

Код:

HotKeySet("{ESC}", "Quit")

$Last_Cursor = MouseGetCursor()

While 1
    Sleep(100)

    $Current_Cursor = MouseGetCursor()

    If $Last_Cursor <> $Current_Cursor Then
        MsgBox(64, "Внимание!", _
            StringFormat("Смена курсора:\n\nПредыдущий <%s>, Текущий <%s>", _
            _GetCursorStringValue($Last_Cursor), _GetCursorStringValue($Current_Cursor)), 2)

        $Last_Cursor = $Current_Cursor
    EndIf
WEnd

Func
_GetCursorStringValue($iValue)
    Local $aStr_Values[16] = ["Pointing/Grabbing hand", "APPSTARTING", "ARROW (Default?)", "CROSS", "HELP", "IBEAM (Selection)", _
        "ICON", "NO", "SIZE", "SIZEALL", "SIZENESW", "SIZENS", "SIZENWSE", "SIZEWE", "UPARROW", "WAIT"]

    If $iValue < UBound($aStr_Values) And $iValue >= 0 Then Return $aStr_Values[$iValue]
    Return $iValue
EndFunc

Func
Quit()
    Exit
EndFunc

В случае с курсором руки (наведение над ссылкой), будет выведено «Текущий: Pointing/Grabbing hand».

Creat0R 13-02-2008 10:36 739183

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



_FilePrint/ShellExecute (одно и тоже) не подходят, они вызывают программу просмотра изображении и всё, печать не происходит (возможно потому что принтер у меня не установлен? :) ). Но если нажать кнопку «Печать» в этой самой программе просмотра, то выводится диалог мастера печати. Вот он мне и нужен, только без программы просмотра.

Чувствую есть спец. команда для Dll'ки принтера, но какая, этого мне не удалось узнать. Есть список комманд RunDll32, но там вроде нет ничего подходящего.

Maza Faka 13-02-2008 11:03 739205

Creat0R
Это пробовал?

Creat0R 13-02-2008 13:47 739331

Maza Faka,
Цитата:

Это пробовал?
Спасибо за ссылку, я никак не мог найти этот ресурс (знал о нём давно) :).

Но проблема в том что ручной вызов не срабатывает так как ожидалось. Эта-же команда используется в реестре, но там выводится диалог мастера (если к примеру на файле изображения, вызвать пункт «Печать»), а ручной вызов отображает диалог сохранения файла *.xps (при сохранении начинается печать), и то, это только если указать имя принтера, которое скрипт естественно, не знает.

Timurko 14-02-2008 10:29 739932

Люди добрые помогите решить проблему. GUI элемент Edit поддерживает максимум 30 000 символов, это лажа =(( даже ничего поделать не могу... Можно ли как то увеличить это допустимое значение?

Creat0R 14-02-2008 15:03 740107

Timurko,
Цитата:

GUI элемент Edit поддерживает максимум 30 000
На основе чего это (неверное :) ) утверждение?

Вот пример, доказывает что Edit поле может содержать больше чем 30000 символов (пару минут правда подождать нужно, прежде чем поле заполнится ;)):

Код:

#include <GuiConstants.au3>

$GUI = GUICreate("Test Script", 300, 200)

$Edit = GUICtrlCreateEdit("", 20, 40, 260, 140)

GUISetState(@SW_SHOW, $GUI)

For $i = 1 To 31000
    GUICtrlSetData($Edit, GUICtrlRead($Edit) & "a")
    Sleep(1)
Next

GUICtrlSetData($Edit, GUICtrlRead($Edit) & "b")
ConsoleWrite(StringLen(GUICtrlRead($Edit)))

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

По завершению, последние символы:

...aaaaaab

А длина 31000.

zero_1632 14-02-2008 15:54 740149

подскажите, как отслеживать консольные программы, написанные на c++ (предположительно). Выводятся параметры, надо следить за тем, повесилась программа или нет, если параметры в окне меняются - отлично. Нет - закрывам процесс. Проблема в том, что ничего, по мнению autoit (autoit info tool) не выводит. Можно как-то победить?

Посоветовали через StdOutRead, но при этом процесс должен быть запущен чтобы получить process_id.

Пробовал делать даже так,хотя это крайне нежелательно. В итоге - не смог даже запустить эту консольную программу - то есть она работает, но в окно ничего не выводит, и приведенный пример для функции StdOutRead в самом autout ничего не выводит. Даже простая dir *.* выводит только по завершению процесса(по ощущуениям) , а мне нужно чтобы эта консольная программа "крутилась".

Ворос - можно как-то получить process_id, не запуская программу из autoit?
Как потом запускать прогу через run, но так, чтобы было нормальное окно и в нем что-то отображалось? Если делать через start _приложение_ то наверное process_id изменится?

Creat0R 14-02-2008 16:34 740179

Цитата:

В итоге - не смог даже запустить эту консольную программу - то есть она работает, но в окно ничего не выводит
Нужно использовать @SW_SHOW как третьий параметр.

Цитата:

можно как-то получить process_id, не запуская программу из autoit?
Можно, ProcessExists("ProcName.exe") вернёт PID процесса.

Но проблема тут в другом, выводит ли эта программа данные в поток (Stream), который потом можно перехватывать через StdOutRead...

Цитата:

Как потом запускать прогу через run, но так, чтобы было нормальное окно и в нем что-то отображалось?
Код:

$iPID = Run("Proga.exe", "", @SW_SHOW, 2 + 4)

zero_1632 14-02-2008 22:13 740382

Цитата:

Цитата Creat0R
Но проблема тут в другом, выводит ли эта программа данные в поток (Stream), который потом можно перехватывать через StdOutRead... »

Блин никак.

$iPID = ProcessExists("program.exe")
MsgBox (4096,$iPID,StdoutRead ($iPID)) - ничего не выводит. Можно ли делать с помощью autoit скриншоты окна или его любой части?

вообще народ рекомендовал pid искать через вызов user32.dll, неужели все так просто?

Maza Faka 15-02-2008 07:34 740497

zero_1632
Цитата:

$iPID = ProcessExists("program.exe")
MsgBox (4096,$iPID,StdoutRead ($iPID)) - ничего не выводит
Выводит, посмотри на заголовок окна MsgBox(). А вот, что бы читать данные через StdoutRead(), нужно запустить программу с помощью функции Run().

garbage 15-02-2008 08:31 740510

прошу прощение за свой банальнейший вопрос - возможно он уже поднимался на форуме, но я не смог найти по нему ничего.
Есть две программы
Program1 и Program2
у меня в скрипте сначала запускается
Program1 а потом после ее окончания Program2
вся проблема в том что Program1 работает в фоновом режиме
можно ли приостановить запуск Program2 на какое то время или как то отследить окончание Program1?

garbage 15-02-2008 09:10 740525

или может есть какой то таймер? что бы отсрочить запуск второго приложения скажем минуты на 2?

SvetlanaK 15-02-2008 09:47 740553

Здравствуйте! кто-нибудь пользовался SQLite ? что он дает? просто создание базы данных и работа с ней из автоита? а можно ли вытянуть данные из существующей базы, например из аксесс-а? поделитесь опытом пожалуйста, кто пользовался. Может у кого ссылки есть на статьи и литературу по использованию SQLite библиотеки. В любом случае буду благодарна всем откликнувшимся.

Maza Faka 15-02-2008 11:07 740605

garbage
Цитата:

отследить окончание Program1
Смотри функцию
Код:

ProcessWaitClose()
.

Creat0R 15-02-2008 15:00 740769

zero_1632,
Цитата:

MsgBox (4096,$iPID,StdoutRead ($iPID)) - ничего не выводит
Если приложение program.exe пишет в StdOut поток, то можно пробовать читать этот поток, но не одним вызовом, а из цикла...

Код:

Run(@ComSpec & " /c echo I am an StdOut Stream Data", "", @SW_SHOW, 2 + 4)

$iPID = ProcessExists("Cmd.exe")

While 1
    $Read = StdoutRead($iPID)
    If @error Then ExitLoop
    MsgBox(0, "STDOUT read:", $Read)
WEnd

Цитата:

Можно ли делать с помощью autoit скриншоты окна или его любой части?
Можно, в последней версии есть функции _ScreenCapture_Capture()/_ScreenCapture_CaptureWnd().


garbage
Кроме упомянутого ProcessWaitClose, если программа запускается из скрипта, то проще использовать RunWait() ;)


SvetlanaK,
Цитата:

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

Цитата:

Может у кого ссылки есть на статьи и литературу по использованию SQLite библиотеки
Только ссылка на оф. форум :)

HORRIBLE 17-02-2008 01:44 742030

У меня проблема возникла. Вот мой код.
.......................................
$i=0
$y = 208
$stroka = 0
do
ClipPut("")
MouseClickDrag("left", 93, $y+$i, 385,$y+$i)
Send("^{c}")
$creater = StringLen(GUICtrlRead($Label_2))
$len = StringLen(ClipGet())

If $len <= 11 then
$Name = ClipGet()
else
$len_1 = $len - $creater
$Name = StringTrimRight(ClipGet(),$len_1)
$len_11 = StringLen($Name)
Endif
$login_2 = GUICtrlRead($Label_2)
$test = StringCompare ( $Name, $login_2,2)
If $test = 0 then
$stroka = $stroka + 1
else

$i =$i + 22
$y_2 = $y+$i
$stroka = $stroka + 1
endif
until $test= 0

MsgBox(0,"","найден в строке: " &$stroka,3)

$len_3 = 0

while $len_3 > $len_11

MouseClickDrag("left", 93, $y_2, 385,$y_2)
Send("^{c}")
$len_3 = StringLen(ClipGet())

Wend

У меня не работает все после while...... как мне достать из первого цикла: $y_2 и $len_11 .

Creat0R 17-02-2008 02:19 742042

HORRIBLE,
Цитата:

не работает все после while...... как мне достать из первого цикла: $y_2 и $len_11
Во первых, код нужно заключать в тег Code, а во-вторых, это больше на кашу похоже чем на код :) (без обиды).

Переменная $len_11 объявляется условно, поэтому есть шанс что она не будет создана в момент перехода ко второму циклу (и естественно будет ошибка). Тоже самое и с $y_2.

Что нужно достичь этим скриптом?

Angelus 17-02-2008 10:17 742153

Хочу команду ControlGetText ( 'Настройка', '', 'Edit1' ) добавить в цикл, что бы не писать пятдесят с лишним строк.....можно ли как нибудь плюсовать Edit1, что бы получилось Edit2 и тд в этом цикле???

Maza Faka 17-02-2008 11:45 742196

Angelus,
Цитата:

Цитата Angelus
можно ли как нибудь плюсовать Edit1, что бы получилось Edit2 »

Код:

For $i = 1 To 50
    ControlGetText ('Настройка', '', 'Edit' & $i)
Next


HORRIBLE 17-02-2008 21:50 742607

Creat0R,
Хы, ну критику ни кто не отменял... Учетем, спасибо..... А если бредово или через одно место ) написано, ну уж как умеем пока), как говориться как умею так и выкручиваюсь ).
Ты имел ввиду,что оформлять надо:

читать дальше »

PHP код:

$i=0
$y 
208
$stroka 
0

Do

      
ClipPut("")
      
MouseClickDrag("left"93$y+$i385,$y+$i)
      
Send("^{c}")
      
$len StringLen(ClipGet())

            If 
$len <= 11 then
            $Name 
ClipGet()

            else
                    
$creater StringLen(GUICtrlRead($Label_2))
                    
$len_1 $len $creater
                    $Name 
StringTrimRight(ClipGet(),$len_1)
                    
$len_11 StringLen($Name)

            Endif

        
$login_2 GUICtrlRead($Label_2)
        
$test StringCompare $Name$login_2,2)

            If 
$test 0 then
                    $stroka 
$stroka 1

            
else
                    
$i =$i 22
                    $y_2 
$y+$i
                    $stroka 
$stroka 1

           
endif

Until $test0

MsgBox
(0,"","найден в строке: " &$stroka,3)

              
$len_3 0

              
while $len_3 $len_11
                     MouseClickDrag
("left"93$y_2385,$y_2)
                     
Send("^{c}")
                     
$len_3 StringLen(ClipGet())

            
Wend 


Эм, этим, я хотел получить такую вещь.....Да это все делается на интернет страничке... Есть список в который я заношу свое имя: $creater , далее после того как имя внесено, оно появляется на n-строчке, которую я определяю (сравнивая скопированную строчку, предварительно обрезав ее до 11 знаков, с $creater ).Это все делается в Do..... Until.
Нашел такую строчку, теперь работаю с ней, жду пока в этой строчке не появиться еще ченить, короче пока длинна не измениться...... Как только появилось, жму на кнопку.... Это должно делаться в while.....Wend
Примерно так.......


Цитата:

Цитата Creat0R
Переменная $len_11 объявляется условно, поэтому есть шанс что она не будет создана в момент перехода ко второму циклу (и естественно будет ошибка). Тоже самое и с $y_2.

А как тогда быть?

У меня еще вопpосы:

1. Как отправить в сон неограниченный (или поставить его на паузу) при помощи: HotKeySet
2. Вот есть цикл, как ему сказать, что если он превысил n-е кол-во шагов и не нашел результатов, вернуться в начало и продолжить делать все по новой.
3. Можно ли сделать связь между 2-мя файлами автоита. Ну т.е. есть 2 файла. Первый высчитывает некий параметр, который необходим для работы второго файла, а запускаются эти 2-ва файлика из 3-го файла. Тут вопрос в удобстве, нехочется иметь один файл очень большой, в котором слишком много буков ), а хочется чтоб было 2 но в которых не так много написано.
4. Если уже открыта интернет страница и ее ну ни как закрывать нельзя, как применять команды связанные с управлением IE?
Спасибо!!!

Creat0R 18-02-2008 00:51 742722

HORRIBLE,
Цитата:

критику ни кто не отменял
Это была не критика, а всего лишь совет..

Цитата:

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

Цитата:

Ты имел ввиду,что оформлять надо:
Примерно, так хотябы понятнее, уже есть больше желания присмотреться и попытаться найти суть проблемы :).

Цитата:

Эм, этим, я хотел получить такую вещь.....Да это все делается на интернет страничке... Есть список в который я заношу свое имя: $creater , далее после того как имя внесено, оно появляется на n-строчке, которую я определяю (сравнивая скопированную строчку, предварительно обрезав ее до 11 знаков, с $creater ).Это все делается в Do..... Until.
Нашел такую строчку, теперь работаю с ней, жду пока в этой строчке не появиться еще ченить, короче пока длинна не измениться...... Как только появилось, жму на кнопку.... Это должно делаться в while.....Wend
Примерно так.......
Примерно не достаточно, я из вышеописанного так и не понял что требуется... что за список, где $Label_2, и т.п.

Цитата:

А как тогда быть?
Объявлять заранее переменные :)

Цитата:

Как отправить в сон неограниченный (или поставить его на паузу) при помощи: HotKeySet
Примерно так
Код:

#include <GuiConstants.au3>

$Paused = False
HotKeySet("^p", "ToggleScriptPause")

$GUI = GUICreate("Test Script", 300, 200)

$PauseToggle_Button = GUICtrlCreateButton("test", 20, 40)

GUISetState(@SW_SHOW, $GUI)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$PauseToggle_Button
            MsgBox(0, "", "Just a test")
    EndSwitch
WEnd

Func
ToggleScriptPause()
    $Paused = Not $Paused

    Local $iOpt_GOEM = Opt("GuiOnEventMode", 1)
    If $iOpt_GOEM = 1 Then Opt("GuiOnEventMode", 0)

    While $Paused
        Sleep(100)
    WEnd

    Opt("GuiOnEventMode", $iOpt_GOEM)
EndFunc



Цитата:

Вот есть цикл, как ему сказать, что если он превысил n-е кол-во шагов и не нашел результатов, вернуться в начало и продолжить делать все по новой.
Использовать счётчик, и сбрасывать его при достижении лимита.
Подробнее
Код:

;Проверка результата
$Results_Val = 123

;Счётчик попыток
$Loop_Counter = 1

;Лимит попыток
$Loop_Limit_Atempts = 122

While 1
    If $Loop_Counter = $Results_Val Then ExitLoop ;Найден результат

    If $Loop_Counter > $Loop_Limit_Atempts Then

        ;Сбрасываем счётчик
        $Loop_Counter = 1

        ContinueLoop
    EndIf


    $Loop_Counter += 1

    Sleep(1)
WEnd



Цитата:

Можно ли сделать связь между 2-мя файлами автоита
Через #Include...

Код:

If MsgBox(36, "Question", "Include second script?") = 6 Then
    #include <MySecondScript.au3>
EndIf

MySecondScript.au3:

Код:

MsgBox(0, "", "Hi, i am a second script")
;)

Angelus 18-02-2008 10:40 742896

Maza Faka, я так пробЫвал...но он возвращает пустое значение....

Creat0R 18-02-2008 10:51 742902

HORRIBLE,
Цитата:

Если уже открыта интернет страница и ее ну ни как закрывать нельзя, как применять команды связанные с управлением IE?
Как понять “ни как закрывать нельзя”? эта страница открыта скриптом? вообще то в справке есть описания для функии _IE...

Angelus,
Цитата:

возвращает пустое значение
Значит неверный элемент.. можно попробовать использовать как CLASSNN...

Код:

For $i = 1 To 50
      $Text = ControlGetText ('Настройка', '', '[CLASSNN:Edit' & $i & ']')
Next

Или просто CLASS.

Котяра 19-02-2008 20:59 744163

Может глупый вопрос, но... нашел тут на форуме такой AutoIt-скрипт создания удаленного соединения:
Код:

Run("rundll32.exe netshell.dll,StartNCW")
WinWaitActive ('Мастер новых подключений','Мастер новых подключений')
Send('{Enter}')
Sleep ('500')
WinWaitActive ('Мастер новых подключений','Подключить к Интернету для просмотра веб-узлов и чтения  электронной почты.')
ControlClick ('Мастер новых подключений','Подключить к Интернету для просмотра веб-узлов и чтения  электронной почты.','Button1')
Sleep ('500')
Send('{Enter}')

WinWaitActive ('Мастер новых подключений','Каким образом подключиться к Интернету')
ControlClick ('Мастер новых подключений','Каким образом подключиться к Интернету','Button2')
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Данное подключение использует модем и обычную телефонную линию или телефонную линию ISDN.')
ControlClick ('Мастер новых подключений','Данное подключение использует модем и обычную телефонную линию или телефонную линию ISDN.','Button1')
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Им&я поставщика услуг')
ControlSetText ( 'Мастер новых подключений', '', 'Edit1', 'Peterstar' )
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Номер &телефона:')
ControlSetText ( 'Мастер новых подключений', '', 'Edit1', '3203370,,,' )
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','&Имя пользователя:')
sleep (100)
ControlSetText ( 'Мастер новых подключений', '', 'Edit1', 'Login')
sleep (100)
ControlSetText ( 'Мастер новых подключений', '', 'Edit2', 'Password')
Send('{tab}')
sleep (100)
ControlSetText ( 'Мастер новых подключений', '', 'Edit3', 'Password')
Sleep ('500')
ControlCommand ( 'Мастер новых подключений', '', 'Button13', 'Check', '' )
ControlCommand ( 'Мастер новых подключений', '', 'Button2', 'Check', '' )
Sleep ('500')
Send('{Enter}')
WinWaitActive ('Мастер новых подключений','Завершение работы мастера новых подключений')
ControlCommand ( 'Мастер новых подключений', '', 'Button20', 'UnCheck', '' )
Send('{Enter}')
Exit

Можно ли чуть-чуть его усовершенствовать. Дело в том, что номер дозвона и имя соединения должны быть заданы как тут,а логин и пароль скрипт должен спросить у пользователя. Или это никак не сделать? Я имею ввиду, чтобы после запуска скрипт вывелось окно "Введите логин и пароль" с этими полями. А все остальное как тут.

Котяра 19-02-2008 21:23 744182

Все! Нашел! Надо добавить в самый верх скрипта:
Код:

$login= InputBox("Установка Интернета", "Введите логин Интернета:", "", "")
А потом в скрипте убрать 'Login', а вместо него написать $login
С паролем все по аналогии.

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

Котяра 19-02-2008 21:57 744213

Сделал проверку данных примерно так:
Код:

if $name = '' Then        Exit
Но как перед выходом вывести окно типа "Установка Интернета не удалась."?

Creat0R 19-02-2008 22:11 744223

Котяра,
Цитата:

Надо добавить в самый верх скрипта:
Можно и так, а можно создать сразу окошко с двумя полями ввода..

Код:

_Input_LoginPass_Dialog()
If @error Then Exit

;Тут основное содержание скрипта

Func _Input_LoginPass_Dialog()
    #include <GuiConstants.au3>
    Local $GUI = GUICreate("Ввод данных", 300, 200)

    GUICtrlCreateLabel("Ввод логина:", 20, 30)
    Local $Login_Input = GUICtrlCreateInput("", 20, 50, 260, 20)

    GUICtrlCreateLabel("Ввод пароля:", 20, 90)
    Local $Password_Input = GUICtrlCreateInput("", 20, 110, 260, 20)

    Local $OK_Button = GUICtrlCreateButton("OK", 20, 160, 60, 20)
    Local $Cancel_Button = GUICtrlCreateButton("Отмена", 100, 160, 60, 20)

    GUISetState(@SW_SHOW, $GUI)

    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE, $Cancel_Button
                GUIDelete($GUI)
                Return SetError(1, 0, 0)
            Case $OK_Button
                Local $aRet[2] = [GUICtrlRead($Login_Input), GUICtrlRead($Password_Input)]

                If $aRet[0] = "" Then
                    MsgBox(48, "Внимание!", "Введите пожалуйста логин.")
                    ControlFocus($GUI, "", $Login_Input)
                    ContinueLoop
                EndIf

                If $aRet[1] = "" Then
                    MsgBox(48, "Внимание!", "Введите пожалуйста пароль.")
                    ControlFocus($GUI, "", $Password_Input)
                    ContinueLoop
                EndIf

                GUIDelete($GUI)

                Return $aRet
        EndSwitch
    WEnd
EndFunc

Цитата:

как сделать, чтобы при нажатии Cancel работа скрипт завершалась
Нужно проверять @error:

Код:

$login= InputBox("Установка Интернета", "Введите логин Интернета:", "", "")
If @error = 1 Then Exit

Цитата:

Но как перед выходом вывести окно типа "Установка Интернета не удалась."?
Код:

$login = InputBox("Установка Интернета", "Введите логин Интернета:", "", "")

If @error = 1 Or $login = "" Then
    MsgBox(48, "Внимание!", "Установка Интернета не удалась." & @LF & @LF & "OK  ---->    EXIT")
    Exit
EndIf


Котяра 20-02-2008 00:34 744297

Creat0R, спасибо за ответ.
Теперь я делаю так, чтобы спрашивались 4 параметра: имя подключения, номер, логин, пароль. Цель: создать программу, которая помогала бы "чайникам" настроить подключение к Интернету

Creat0R 20-02-2008 00:55 744311

Котяра,
Цитата:

Теперь я делаю так, чтобы спрашивались 4 параметра: имя подключения, номер, логин, пароль.
Получилось? :)

На всякий случай:

Код:

$aInputs = _Input_LoginPass_Dialog()
If @error Then Exit

$ConnectionName    = $aInputs[0]
$Number            = $aInputs[1]
$Login              = $aInputs[2]
$Password          = $aInputs[3]

MsgBox(64, "Результаты:", _
    StringFormat("Имя подключения: %s \nНомер: %s \n\nЛогин: %s \nПароль: %s", _
    $aInputs[0], $aInputs[1], $aInputs[2], $aInputs[3]))

;Тут основное содержание скрипта

Func _Input_LoginPass_Dialog()
    #include <GuiConstants.au3>
    Local $GUI = GUICreate("Ввод данных", 300, 280)

    GUICtrlCreateLabel("Ввод имени подключения:", 20, 20)
    Local $ConnectionName_Input = GUICtrlCreateInput("", 20, 40, 260, 20)

    GUICtrlCreateLabel("Ввод номера (подключения?):", 20, 70)
    Local $Number_Input = GUICtrlCreateInput("", 20, 90, 260, 20)

    GUICtrlCreateLabel("Ввод логина:", 20, 120)
    Local $Login_Input = GUICtrlCreateInput("", 20, 140, 260, 20)

    GUICtrlCreateLabel("Ввод пароля:", 20, 170)
    Local $Password_Input = GUICtrlCreateInput("", 20, 190, 260, 20, $ES_LEFT+$ES_AUTOHSCROLL+$ES_PASSWORD)

    Local $OK_Button = GUICtrlCreateButton("OK", 20, 240, 60, 20)
    Local $Cancel_Button = GUICtrlCreateButton("Отмена", 100, 240, 60, 20)

    GUISetState(@SW_SHOW, $GUI)

    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE, $Cancel_Button
                GUIDelete($GUI)
                Return SetError(1, 0, 0)
            Case $OK_Button
                Local $aRet[4]

                $aRet[0] = GUICtrlRead($ConnectionName_Input)
                $aRet[1] = GUICtrlRead($Number_Input)
                $aRet[2] = GUICtrlRead($Login_Input)
                $aRet[3] = GUICtrlRead($Password_Input)

                If $aRet[0] = "" Then
                    MsgBox(48, "Внимание!", "Введите пожалуйста имя подключения.")
                    ControlFocus($GUI, "", $ConnectionName_Input)
                    ContinueLoop
                EndIf

                If $aRet[1] = "" Then
                    MsgBox(48, "Внимание!", "Введите пожалуйста номер (подключения?).")
                    ControlFocus($GUI, "", $Number_Input)
                    ContinueLoop
                EndIf

                If $aRet[2] = "" Then
                    MsgBox(48, "Внимание!", "Введите пожалуйста логин.")
                    ControlFocus($GUI, "", $Login_Input)
                    ContinueLoop
                EndIf

                If $aRet[3] = "" Then
                    MsgBox(48, "Внимание!", "Введите пожалуйста пароль.")
                    ControlFocus($GUI, "", $Password_Input)
                    ContinueLoop
                EndIf

                GUIDelete($GUI)

                Return $aRet
        EndSwitch
    WEnd
EndFunc


Creat0R 20-02-2008 08:18 744409

Известно что у функции FileSetTime есть баг (довольно критичный в моём случае).

Установленные секунды округляются до чётного числа:

Код:

$File = @TempDir & "\Test.txt"

$hOpenFile = FileOpen($File, 2)
FileWrite($hOpenFile, "Test")
FileClose($hOpenFile)

$SetTime = 20060322083529 ; - 2

FileSetTime($File, $SetTime)

$GetTime = FileGetTime($File, 0, 1)

MsgBox(0, "", StringFormat("Set Time: %s \nGet Time: %s", $SetTime, $GetTime))

FileDelete($File)

Мне нужно установить время какими нибудь другими средствами (API?), более точными, но не используя внешние утилиты (типа Nircmd).

Это возможно реализовать? нет возможности ждать пока исправят это дело в AutoIt (на бету переходить не могу по техническим причинам :) ).

P.S
А на счёт печяти никто так и не знает решения? amel27, не подскажешь? :shuffle:

Котяра 20-02-2008 20:19 744910

Creat0R, у меня получается. Вообще, AutoIt, классная штука :)
Можно даже программы писать. Например, деинсталлятор:
Код:

$proceeduninstall = MsgBox(4148, "Внимание!", "Сейчас программа будет удалена. Хотите продолжить?")
if $proceeduninstall = '7' Then Exit
FileDelete(@ScriptDir & "\example.txt")

Правильно я понял, как деинсталлятор делать?

тут удаляется один файл example.txt
Uninstall.exe (скомпиленный скрипт) кладете в папку программу

Creat0R 20-02-2008 21:32 744984

Котяра,
Цитата:

Правильно я понял, как деинсталлятор делать?
Простой, да. Если делать более продвинуты, например, чтобы брал информацию об установленных приложении с системы, то нужно поработать ещё :) - Например вот неплохой деинсталлятор.

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

Creat0R 21-02-2008 12:04 745344


CaptureIt v1.0 - Эта утилита предназначена для захвата изображений с вашего экрана.


=================
Главные возможности:
=================

  • Захват всего экрана.
  • Захват отдельных окон или выбранных элементов окна.
  • Захват выбранной части экрана.
  • Сохранение захваченного изображения в тихом режиме.
  • Открытие захваченного изображения в графическом редакторе.
  • Вывод на печать захваченного изображения.
  • Помещение захваченного изображения в буфер обмена.
  • Закачка захваченного изображения (на imageshack.us).
  • Поддерживаемые форматы изображений:

    PNG
    GIF
    JPG - Качество настраивается.
    BMP - Формат настраивается.


Особое спасибо amel27 за функции _FileOpen/SaveDialog, и за решение с улавливанием событий мышки :)

Котяра 21-02-2008 18:09 745618

Creat0R, спасибо за ответ. Деинсталлятор мой действительно простой, а то, что предложили Вы - это де инсталлятор как программа, а я говрю о Uninstall для какой-то конкретной программы.

Котяра 21-02-2008 18:30 745627

Вот так делаются Setup'ы:
Код:

$installpath = InputBox("Установка", "Введите путь установки.", @ProgramFilesDir & "\Example", "")
if $installpath = '' then Exit
if @error = 1 then Exit
DirCreate($installpath)
FileCopy(@ScriptDir & "\example.txt", $installpath & "\example.txt")
FileCopy(@ScriptDir & "\Uninst.exe", $installpath & "\Uninst.exe")
MsgBox(4160, "Установка", "Установка успешно завершена!")
; Write a single REG_SZ value
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Example", "DisplayName", "REG_SZ", "Example v1.00")
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Example", "UninstallString", "REG_SZ", $installpath & "\Uninst.exe")

А так Uninstall'ы:
Код:

$installpath = InputBox("Установка", "Введите путь установки.", @ProgramFilesDir & "\Example", "")
if $installpath = '' then Exit
if @error = 1 then Exit
DirCreate($installpath)
FileCopy(@ScriptDir & "\example.txt", $installpath & "\example.txt")
FileCopy(@ScriptDir & "\Uninst.exe", $installpath & "\Uninst.exe")
MsgBox(4160, "Установка", "Установка успешно завершена!")
; Write a single REG_SZ value
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Example", "DisplayName", "REG_SZ", "Example v1.00")
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Example", "UninstallString", "REG_SZ", $installpath & "\Uninst.exe")

Устанавливается и удаляется один файл. Минус один - не создаются ярлыки и после деинсталляции Uninst.exe остается лежать. Uninst.exe - это скомплированный деинсталлятор.

Давно искал инструмент типа AutoIt'а. Bat-файлы обладают малой функциональстью, малым средства для создания пользовательского интерфейса, VBS-скрипты сложны в освоений. AutoIt - классная вещь! :) :) :) :) :)

Котяра 21-02-2008 18:51 745638

При желании можно в Uninstall добавить проверку на установленность программы:
Код:

$installed = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Example", "UninstallString")
if $installed = '' Then Exit

это в самое начало

Котяра 21-02-2008 19:40 745672

Creat0R, да, классный деинсталлятор. Замена всяким платным Best Uninstaller'ам и прочим.
Только одного смущает - нет кнопки для запуска изменения программы.

И самое главное, чем меня НЕ устроили батники: плохая поддержка русского языка

Maza Faka 22-02-2008 10:02 746008

Котяра
Цитата:

Цитата Котяра
Замена всяким платным Best Uninstaller'ам »

Попробуй InnoSetup, очень удобный и простой в освоении, бесплатен.

DNK_Inc 22-02-2008 11:40 746062

Подскажите:help:, пожалуйста :cry: , какими командами в AutoIt можно запустить окно свойств необходимого логического диска и эмулировать нажатие необходимых кнопок на активной вкладке? А также, как запустить из скрипта консольную команду control userpasswords2 ?

Всю справку облазил - по свойствам диска и по консольным командам вообще ничего не нашёл, а по поводу кнопки - в команде ControlClick в качестве параметров указываю текст заголовка окна, текст на кнопке, classnameNN (эти данные взял с помощью утилиты AutoIt Window Info), а команда либо не исполняется вообще, либо эмулирует нажатие кнопки из совершенно другой вкладки данного окна свойств :( . Из ситуации выхожу эмулированием нажатий клавиш и их комбинаций. Но, во-первых, скрипт из-за этого получается довольно-таки громоздким и тяжёлым для разбора, а во-вторых, не всегда работает (не всегда срабатывает команда Send при передвижении по объектам проводника).

amel27 22-02-2008 11:50 746067

Creat0R
Цитата:

Цитата Creat0R
Установленные секунды округляются до чётного числа »

нет, баг не в этом - для FAT четное число будет всегда, просто AutoIT округляет неправильно... вот цитата из MSDN:
Цитата:

Not all file systems can record creation and last access time and not all file systems record them in the same manner. For example, on NT FAT, create time has a resolution of 10 milliseconds, write time has a resolution of 2 seconds, and access time has a resolution of 1 day (really, the access date). On NTFS, access time has a resolution of 1 hour. Therefore, the GetFileTime function may not return the same file time information set using the SetFileTime function. Furthermore, FAT records times on disk in local time. However, NTFS records times on disk in UTC.
вот вариант UDF, который показывает заодно и причину округления:
Код:

$File = "s:\Test.txt"

$hOpenFile = FileOpen($File, 2)
FileWrite($hOpenFile, "Test")
FileClose($hOpenFile)

$SetTime = '20060322083528' ; - 2

_FileSetTime($File, $SetTime)
;FileSetTime($File, $SetTime)

$GetTime = FileGetTime($File, 0, 1)
MsgBox(0, "", StringFormat("Set Time: %s \nGet Time: %s", $SetTime, $GetTime))
FileDelete($File)

Func _FileSetTime($strFile, $strTime, $intType = 0)
    Local $iY=Number(StringLeft($strTime,4))
    Local $iM=Number(StringMid($strTime,5,2))
    Local $iD=Number(StringMid($strTime,7,2))
    Local $iH=Number(StringMid($strTime,9,2))
    Local $iN=Number(StringMid($strTime,11,2))
    Local $iS=Number(StringMid($strTime,13))
    ; DOS-формат для времени
    Local $iFatDate = BitShift($iY-1980,-9) + BitShift($iM,-5) + $iD
    Local $iFatTime = BitShift($iH,-11) + BitShift($iN,-5) + $iS/2 ; вот тут косячок в хранении секунд
    ; базовые структуры

    Local $FILETIME = DllStructCreate("dword;dword")
    Local $SYSTEMTIME = DllStructCreate("ushort;ushort;ushort;ushort;ushort;ushort;ushort;ushort")
    ; туда-сюда-обратно
    Local $ret = DllCall("kernel32.dll", "int", "DosDateTimeToFileTime", "ushort", $iFatDate, "ushort", $iFatTime, "ptr", DllStructGetPtr($FILETIME))
    If $ret[0] =0 Then Return SetError(1, 1, False)
    $ret = DllCall("kernel32.dll", "int", "FileTimeToSystemTime", "ptr", DllStructGetPtr($FILETIME), "ptr", DllStructGetPtr($SYSTEMTIME))
    If $ret[0] =0 Then Return SetError(1, 2, False)
    DllStructSetData($SYSTEMTIME,7,$iS) ; пытаемся откорректировать
    $ret = DllCall("kernel32.dll", "int", "SystemTimeToFileTime", "ptr", DllStructGetPtr($SYSTEMTIME), "ptr", DllStructGetPtr($FILETIME))
    If $ret[0] =0 Then Return SetError(1, 3, False)
    ; открываем файл
    $ret = DllCall("kernel32.dll", "int", "CreateFile", _
        "str", $strFile, "dword", 0x100, "dword", 0, "ptr", 0, "dword", 3, "dword", 0, "ptr", 0 )
    If $ret[0] =0 Then Return SetError(2, 1, False)
    ; правим время и закрываем файл
    Local $hFile=$ret[0], $aSysTime[3] = [0,0,0]
    $aSysTime[$intType]=DllStructGetPtr($FILETIME)
    $ret = DllCall("kernel32.dll", "int", "SetFileTime", "int", $hFile, "ptr", $aSysTime[1], "ptr", $aSysTime[2], "ptr", $aSysTime[0])
    DllCall("kernel32.dll", "int", "CloseHandle", "int", $hFile)
    If $ret[0] =0 Then Return SetError(2, 2, False)
    Return True
EndFunc

Цитата:

Цитата Creat0R
А на счёт печяти никто так и не знает решения? amel27, не подскажешь? »

может невнимательно читал, но ты про что? :unsure:

Dump 22-02-2008 13:23 746131

Помогите пожалуйста.
Как в AutoIT можно написать скрипт, чтобы он выполнял такое действие: Если в папке C:\123 появились файлы, то нужно отправить сообщение пользователю через netsend. А в идеале было бы, чтобы по почте отправлялись сообщения. Почтовый сервер на exchange2003

Creat0R 22-02-2008 16:25 746284

amel27,
Цитата:

для FAT четное число будет всегда
Действительно, даже NirCmd не справляется.
Тогда у меня проблема намного серъёзнее чем я думал...

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

Цитата:

вот вариант UDF, который показывает заодно и причину округления:
Спасибо, для NTFS пригодится :)


Цитата:

ты про что?
Нужно напечатать файл-изображение, но при печати должен быть выведен диалог Мастера печати...

Но кажется я нашёл решение:

Код:

Run('Rundll32.exe "' & @SystemDir & '\mshtml.dll",PrintHTML "c:\image.png"', @SystemDir)
Правда пока негде потестить, дома у меня принтер не работает. Диалог то выводится, но печатает ли, вот это и нужно проверить.

DNK_Inc,
Цитата:

как запустить из скрипта консольную команду control userpasswords2 ?
Код:

Run(@ComSpec & ' /c control userpasswords2', '', @SW_HIDE)
Dump,
Цитата:

Если в папке C:\123 появились файлы, то нужно отправить сообщение пользователю через netsend
Код:

If FileExists("C:\123\*.*") Then Run(@ComSpec & ' /c net send {имя | * | /DOMAIN[:имя] | /USERS} сообщение', '', @SW_HIDE)
Цитата:

А в идеале было бы, чтобы по почте отправлялись сообщения.
Есть неплохой UDF: _INetSmtpMailCom.

amel27 23-02-2008 11:09 746721

Creat0R
Цитата:

если дата файла в сети имеет не чётные секунды, то у меня всегда будет разница в данных »
не понял в чем проблема?.. просто округляй секунды перед сравнением до четного числа
Цитата:

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

_FileOpenPrint("D:\BUF\P1010376.JPG")

While 1
    Sleep (100)
WEnd

Func
_FileOpenPrint ($sFilePath)
    Local $oShellApp = ObjCreate('shell.application')
    Local $sPath = StringRegExpReplace($sFilePath, "\\[^\\]+$", "")
    If @extended =0 Then $sPath = @WorkingDir
    Local $oPath = $oShellApp.Namespace ($sPath), $oItem
    For $oItem In $oPath.items
        If $oItem.Path = $sFilePath Then
            ConsoleWrite($oItem.Path &@CRLF)
            $oItem.InvokeVerb('&Печать')
        EndIf
    Next
EndFunc
; => _FileOpenPrint

; Эта UDF может быть полезна для просмотра поддерживаемых Verbs

Func _FileListVerbs($sFilePath)
    Local $oShellApp = ObjCreate('shell.application')
    Local $sPath = StringRegExpReplace($sFilePath, "\\[^\\]+$", "")
    If @extended =0 Then $sPath = @WorkingDir
    Local $oPath = $oShellApp.Namespace ($sPath), $oItem
    For $oItem In $oPath.items
        If $oItem.path = $sFilePath Then
            Local
$oVerbs = $oItem.Verbs
            For $oVerb In $oVerbs
                ConsoleWrite($oVerb.Name &@CRLF)
            Next
        EndIf
    Next
EndFunc
; => _FileListVerbs


Creat0R 23-02-2008 11:44 746742

amel27,
Цитата:

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

В общем ладно, не так уж и страшно. Кстати, странно что на той же Fat(32), время создания файла может быть не чётным :dont-know

Цитата:

можно и через Shell.Application:
Вот именно этот диалог мне нужен!
Но тут проблема, «&Печать» может быть чем то другим на другой системе. А также возвращается проблема с “висячим” скриптом.

Через API нельзя этот же вызов делать? мне казалось что это будет намного проще, я удивляюсь почему вообще внедрили UDF _FilePrint(), который почти не работает. Хотя я так понял оно только для текстовых файлов?


P.S
Я всё пытаюсь научиться пользоваться MSDN, но так и не понял, как переписывать функции/описания приведённые там, в синтаксис AutoIt? Мне бы только алгоритм узнать, я уже интуитивно как нибудь разберусь думаю. Я так понимаю что многие берут за основу (как вспомогательные средства) библиотеки от C/C++ и т.п., я как то ставил себе, но тогда ещё про API даже и речи небыло. Но как это всё использовать, к примеру там пишут:

Цитата:

lpfnInternetCallback

A pointer to the callback function to call when progress is made, or NULL to remove the existing callback function.
Как узнать, что это за указатель, я пытался от DllCallBackRegister указать, но видимо не то :(.

amel27 23-02-2008 17:58 746913

Creat0R
Цитата:

округлять нужно в две стороны, либо больше, либо меньше »
если не брать в расчет AutoIT'овский баг, то однозначно в сторону уменьшения
Цитата:

на той же Fat(32), время создания файла может быть не чётным »
из той же цитаты MSDN "on NT FAT, create time has a resolution of 10 milliseconds"
Цитата:

«&Печать» может быть чем то другим на другой системе »
это несложно определить через реестр, к примеру для HTML-файлов это ключ "HKEY_CLASSES_ROOT\htmlfile\shell\Print\command", хотя для PNG я бы пожалуй смотрел в сторону ветки "HKEY_CLASSES_ROOT\pngfile"... кстати, там же можно подсмотреть и команды печати ;)
Цитата:

Через API нельзя этот же вызов делать? »
ну, имена DLL и функции у тебя есть, почему бы не попробовать? :)
Цитата:

Как узнать, что это за указатель, я пытался от DllCallBackRegister указать, но видимо не то »
думаю то, тут вроде подробней расписано: http://www.podgoretsky.com/ftp/Docs/...oc/WinInet.doc

DNK_Inc
Цитата:

какими командами в AutoIt можно запустить окно свойств необходимого логического диска »
Код:

;Opt("TrayIconHide",1)
;Opt("ExpandEnvStrings",1)


$sDir = "C:"
$sName = _OpenFolderProperties($sDir)

WinWait("Свойства: "& $sName, "", 5)
;WinWaitClose("Свойства: "& $name)

While 1
    Sleep(100)
WEnd

Func
_OpenFolderProperties($sDir)
    Local $oShellApp = ObjCreate('shell.application')
    Local $oDir = $oShellApp.Namespace ($sDir)
    Local $oItem = $oDir.Self
    $oItem.InvokeVerb('Сво&йства')
    Return $oItem.Name
EndFunc


Creat0R 24-02-2008 17:15 747466

amel27,
Цитата:

там же можно подсмотреть и команды печати
Там есть это:

rundll32.exe C:\WINDOWS\system32\shimgvw.dll,ImageView_PrintTo /pt "%1" "%2" "%3" "%4"

Судя по описанию, последние два параметра не используются, первый это путь к файлу, а второй имя принтера, которое тоже нужно узнать. Но даже указав верное имя принтера, выводится диалог сохранения в файл *.xps :dont-know - Хотя при вызове этой команды из контекстного меню изображения, сразу выводится диалог мастера печати. Интересно, что там передаётся в качестве второго параметра (или может быть всё же в качестве третьего/четвёртого?).

Цитата:

имена DLL и функции у тебя есть, почему бы не попробовать?
Я попробовал с "comdlg32.dll" (PrintDlg). Но просидев пару часов с MSDN, ничего не вышло, я видимо не так первожу значения структуры, а где подставлять имя файла я вовсе не нашёл, или там только hDC поддерживается?

Код:

#Include <ScreenCapture.au3>

$hwnd = WinGetHandle("")
$hDC = __ScreenCapture_Capture()
$File = "C:\Temp\fog.png"

;Строем структуру (WORD это вроде char?)
$stFilePath = DllStructCreate('dword;hwnd;int;int;hwnd;dword;char;char;char;char;char;hwnd;lparam;ptr;ptr;int;int')

;Заполняем структуру
DllStructSetData($stFilePath, 1, DllStructGetSize($stFilePath))
DllStructSetData($stFilePath, 2, $hwnd)
DllStructSetData($stFilePath, 5, $hDC)

;Пытаемся показать диалог печати, безуспешно :(
$aRet = DllCall("comdlg32.dll", "int", "PrintDlg", "ptr", DllStructGetPtr($stFilePath))
ConsoleWrite($aRet[0])

;Функция возвращает Device context захваченного изображения
Func __ScreenCapture_Capture($sFileName = "", $iLeft = 0, $iTop = 0, $iRight = -1, $iBottom = -1)
    Local $iH, $iW, $hWnd, $hDDC, $hCDC, $hBMP

    If $iRight = -1 Then $iRight = _WinAPI_GetSystemMetrics($SM_CXSCREEN)
    If $iBottom = -1 Then $iBottom = _WinAPI_GetSystemMetrics($SM_CYSCREEN)
    If $iRight < $iLeft Then Return SetError(-1, 0, 0)
    If $iBottom < $iTop Then Return SetError(-2, 0, 0)

    $iW = $iRight - $iLeft
    $iH
= $iBottom - $iTop
    $hWnd
= _WinAPI_GetDesktopWindow()
    $hDDC = _WinAPI_GetDC($hWnd)
    $hCDC = _WinAPI_CreateCompatibleDC($hDDC)
    $hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iW, $iH)
    _WinAPI_SelectObject($hCDC, $hBMP)
    _WinAPI_BitBlt($hCDC, 0, 0, $iW, $iH, $hDDC, $iLeft, $iTop, $SRCCOPY)

    _WinAPI_ReleaseDC($hWnd, $hDDC)
    _WinAPI_DeleteDC($hCDC)

    Return $hCDC
EndFunc


Цитата:

тут вроде подробней расписано
Спасибо, будем смотреть.

Dump 25-02-2008 14:24 747958

Цитата:

Цитата Creat0R
Dump,
Цитата:
Если в папке C:\123 появились файлы, то нужно отправить сообщение пользователю через netsend
Код:
If FileExists("C:\123\*.*") Then Run(@ComSpec & ' /c net send {имя | * | /DOMAIN[:имя] | /USERS} сообщение', '', @SW_HIDE) »

Так не получилось, даже при пустой папке всё равно отрабатывает, пошел другим путём сделал так:
Код: If DirGetSize("C:\temp")>0 Then Run(@ComSpec & ' /c net send 192.168.105.84 Внимание ДИСПЕТЧЕР', '', @SW_HIDE)

HORRIBLE 25-02-2008 16:40 748048

Если я использую ToolTip, можно как нибудь задать шрифт (сделать его жирным или курсивом )?

Моя програмка использует команду MouseClick (почему взял именно эту команду, потому что мне известны только координаты кнопок), тем самым пока прога работает комп занят. А возможно ли такое, чтоб и прога работала и пользоваться компьтером было бы можно? (Сразу оговорюсь эта прога работает в окне интернет экспловера, да есть команды которые специально предназначены для IE, но честно с помощью них у меня ничего не получилось. )

amel27 26-02-2008 06:16 748396

Creat0R
Цитата:

Интересно, что там передаётся в качестве второго параметра (или может быть всё же в качестве третьего/четвёртого?).
ТУТ они расшифрованы, последние два применяются только в 9x/NT4
Цитата:

даже указав верное имя принтера, выводится диалог сохранения в файл »
Не знаю - у меня оба варианта нормально работают, причем "rundll32.exe C:\WINDOWS\system32\mshtml.dll,PrintHTML" вызывает приглашение на выбор принтера, а "rundll32.exe C:\WINDOWS\system32\shimgvw.dll,ImageView_PrintTo /pt" сразу отправляет на указанный в параметре принтер. Сомневаюсь, что получится вызвать эти функции напрямую без использования rundll32, по крайней мере никакой информации по их другому использованию я не нашел... если помнишь, аналогичная ситуация была у меня с запуском INF-файлов - функция вроде документирована в MSDN, но на прямой вызов не реагирует, и судя по Гуглю не у меня одного... :dont-know
Цитата:

Я попробовал с "comdlg32.dll" (PrintDlg). »
ИМХО оно не стоит того - эти диалоги только помогают визуально инициализировать требуемые структуры, но использовать их для последующей печати AFAIK средствами AutoIT не получится.

И еще по поводу Verbs - в MSDN сказано, что для стандартных Verbs всегда существует универсальный идентификатор, не зависящий от языка... и видимо без знака "&", во всяком случае для "Print" у меня сработало.
Цитата:

canonical verb names remain constant regardless of platform or language, which makes it possible for developers to invoke known canonical verbs without knowing the details about a Shell namespace item

HORRIBLE 28-02-2008 00:40 749646

Как правильно объявить свою функцию, чтобы после выполнения этой функции прога не отключалась, а ждала пока функция закончит свои действия и продолжила работу далее?

PHP код:

MouseClickDrag("left"186561100,226)
MouseClickDrag("left"12611811261,472)
MouseClickDrag("left"100,226100,344)
mouseClick("left"902241)


_health() ; до сюда все выполняетсяа далее прога отключаетсячто я не так делаю ???? 


sleep(600)
MouseClick("left",1170225)
sleep(600)
MouseClick("left",1202,225)


Func _health()
..........
EndFunc 


Maza Faka 28-02-2008 07:11 749716

Цитата:

Цитата HORRIBLE
Как правильно объявить свою функцию, чтобы после выполнения этой функции прога не отключалась, а ждала пока функция закончит свои действия и продолжила работу далее? »

Да вроде бы так и работает, для проверки вставил ConsoleWrite()
Код:

MouseClickDrag("left", 186, 561, 100,226)
MouseClickDrag("left", 1261, 181, 1261,472)
MouseClickDrag("left", 100,226, 100,344)
mouseClick("left", 90, 224, 1)

_health() ; Вызывается функция, а затем выполняется всё, что идёт ниже :)

sleep(600)
ConsoleWrite("sleep 600" & @LF)
MouseClick("left",1170, 225)
sleep(600)
ConsoleWrite("sleep 600_2" & @LF)
MouseClick("left",1202,225)

Func _health()
    ConsoleWrite("_health" & @LF)
EndFunc


Котяра 02-03-2008 21:32 751992

Распространенная задача, с которой возникают трудности - создание загрузчика. Загрузчик запускает файл как программу. Это надо для создания меню своего CD. Так вот в AutoIt делается загрузчик простейшим образом. Все решается одной строчкой
Код:

ShellExecute("file.html")
Можно доделать, например. скрыть икону (хотя она все равно висит лишь пару секунд)
Код:

Opt("TrayIconHide", 1)
ShellExecute("file.html")

Этот скрипт потом надо скомпилировать, естественно.

AnGI_Burn 02-03-2008 23:01 752051

А вот интересно, на AutoIt реально написать простенький файловый менеджер?

Maza Faka 03-03-2008 11:05 752258

Котяра
Цитата:

скрыть икону (хотя она все равно висит лишь пару секунд)
Лучше вставить в начало скрипта #NoTrayIcon

Котяра 03-03-2008 19:39 752628

Код:

#NoTrayIcon
ShelLExecuteWait("file.msi")

А это загрузчик MSI-файла. Сама Microsoft называет их "bootstrapper". Позволяет переделать MSI в EXE. Как? А так:
1. Поменять file.msi на имя MSI-файла
2. Откомпилировать скрипт
3. Сжать скомпилированный скрипт setup.exe и MSI-файл в SFX-архив с распаковкой во временную папку и запуском setup.exe после завершения распаковки (это можно делать программой iexpress.exe)

unikum111 03-03-2008 21:02 752679

Помогите написать часть скрипта. Цель: после отработки основной части скрипта мне необходимо изменить параметр "объект" у ярлыка (рабочая папка таже), затем необходимо чтобы файл скрипта удалился.

Maza Faka 04-03-2008 09:18 752930

unikum111
Попробуй так:
Код:

$aShortcut = FileGetShortcut("c:\Documents and Settings\All Users\Рабочий стол\NOTEPAD.lnk")

FileCreateShortcut("c:\notepad.exe", "c:\Documents and Settings\All Users\Рабочий стол\NOTEPAD.lnk", "c:\", $aShortcut[2], $aShortcut[3], $aShortcut[4], $aShortcut[5], $aShortcut[6])

$OpenFile = FileOpen(@TempDir & "\tmp.bat", 2)

FileWrite($OpenFile, "@Echo off" & @CRLF & _
        "chcp 1251" & @CRLF & _
        "ping -n 6 127.0.0.1" & @CRLF & _
        "del /f /q " & '"' & @ScriptFullPath & '"' & @CRLF & _
        "del /f /q tmp.bat")

FileClose($OpenFile)

ShellExecute(@TempDir & "\tmp.bat", "", "", "open", @SW_HIDE)


unikum111 04-03-2008 15:47 753194

Maza Faka, здорово! Спасибо. А зачем нужна эта строка:
Код:

"ping -n 6 127.0.0.1" & @CRLF & _

Dmurr 04-03-2008 16:25 753229

Всем доброго времени суток! Сталкнулся с такой проблемой. При установке программы Comodo AntiVirus 2.0.17.58 beta открываются последовательно три окна:Comodo AntiVirus Beta 2.0 Installer (отрабатывает все свои действия и уходит в неактив) => COMODO AntiVirus Installer(распаковывает файлы самой программы) => License Activation (линцензионный запрос - просто нажимаю далее)! После всех этих действий снова становиться активным основное окно Comodo AntiVirus Beta 2.0 Installer, на котором нужно нажать кнопку "Finish"(хотя AutoIt Window Info пишет что это кнопка "Next >" - чему верить не знаю)! помогите нажать последнюю кнопку чтобы ОС пошла на перезагрузку, тк ни WinWait + send, ни WinWait + WinWaitActive + controlclick, ни WinWait + WinWaitActive + controfocus + controlclick, ни WinWait + WinWaitActive + controfocus + controlsend (Space) | не проходят! помогите пожалуйста всетаки нажать на последнюю кнопку! ^_^ Р.s. такое ощущение, что окно не активно и вследствии этого комады не проходят.

Котяра 05-03-2008 00:42 753538

Делаю на Autoit программу, суть которой сводится к следующему: попросить пользователя некоторые данные в поле, а потом сравнить их с разными образцами и вывести сообщение. Я делаю примерно так:
Код:

$zapros = MsgBox(36, "Добро пожаловать", "bla-bla-bla")
if $zapros = 7 Then Exit
$nomer = InputBox("Ввод номера", "Ля-ля", "", "")
if @error = 1 Then Exit
if $nomer = '' Then MsgBox(4096, "Ошибка", "Номер не введен.", 10)
if $nomer = '100' Then MsgBox(4096, "-", "Стольник", 10)
if $nomer = '1000' Then MsgBox(4096, "-", "Тыячник", 10)

Вопрос: как сделать, что при вводе иного числа, чем определенные, выводилось что-то типа "Номер не числится в БД"

SmallGod 05-03-2008 08:47 753648

В последней версии AutoIt Beta при считывании из StdOut процесс не блокируется.
Кто нибудь знает как его заблокировать?

Цитата:

Цитата Котяра
$zapros = MsgBox(36, "Добро пожаловать", "bla-bla-bla")
if $zapros = 7 Then Exit
$nomer = InputBox("Ввод номера", "Ля-ля", "", "")
if @error = 1 Then Exit
if $nomer = '' Then MsgBox(4096, "Ошибка", "Номер не введен.", 10)
if $nomer = '100' Then MsgBox(4096, "-", "Стольник", 10)
if $nomer = '1000' Then MsgBox(4096, "-", "Тыячник", 10) »

Код:

$zapros = MsgBox(36, "Добро пожаловать", "bla-bla-bla")
if $zapros = 7 Then Exit
$nomer = InputBox("Ввод номера", "Ля-ля", "", "")
if @error = 1 Then Exit
Switch $nomer
Case ''
        MsgBox(4096, "Ошибка", "Номер не введен.", 10)
Case '100'
        MsgBox(4096, "-", "Стольник", 10)
Case '1000'
        MsgBox(4096, "-", "Тыячник", 10)
Case Else
        MsgBox(4096, "Ошибка", "Номер не числится в БД", 10)
EndSwitch


Maza Faka 05-03-2008 12:19 753777

unikum111,
Цитата:

А зачем нужна эта строка:
Для паузы в 5 секунд :) Просто подстраховка, что бы скомпилированный скрипт успел выгрузиться, иначе не удалится. ;)

Maza Faka 05-03-2008 14:50 753888

Цитата:

Цитата Котяра
попросить пользователя некоторые данные в поле, а потом сравнить их с разными образцами и вывести сообщение »

Пример:
Код:

$GetInput = InputBox("Запрос данных...", "Введите данные", 5)
If @error Then Exit

Switch
$GetInput
Case 5
    MsgBox(0, "", 5)
Case 3
    MsgBox(0, "", 3)
Case Else
    MsgBox(16, "Ошибка", "Нет совпадений")
EndSwitch

Цитата:

Цитата Dmurr
помогите пожалуйста всетаки нажать на последнюю кнопку! »

Выложи скриншот проблемной кнопки.

HORRIBLE 05-03-2008 22:15 754234

Не могу понять как сделать:
У меня есть код хтмл странички, в нём я ищу <script>top.setHP(323,323,120); </script> при чем в этой строчке меняются только цифры, <script>top.setHP(........); </script> как это сделать??

Maza Faka 06-03-2008 11:33 754518

HORRIBLE
Возвращает массив совпадений:
Код:

#include <Array.au3>

$ReadFile = FileRead(@ScriptDir & "\test.html")
If @error Then Exit

$result = StringRegExp($ReadFile, "(?i)(<script>top\.setHP\(.*\);\s*</script>)", 3)

_ArrayDisplay($result)


Котяра 06-03-2008 23:44 755043

Нашел такой скрипт:
Код:


#include <GUIConstants.au3>
 
$Title = "About Info"
 
$MainLabel = "My program Name"
$CopyRLabel = "Copyright © " & @YEAR & " Company/Author. All rights reserved."
 
$NameURL1 = "App Web Page"
$URL1 = "http://www.autoitscript.com"
$NameURL2 = "Email"
$URL2 = "mailto:my_email@mail.com"
$NameURL3 = "Some additional link"
$URL3 = "http://personalwebpafe.com"
$LinkColor = 0x0000FF
$BkColor = 0xFFFFFF
 
$ParentGui = GUICreate('Parent For "About Program" Demo', 200, 100)
 
$Menu = GUICtrlCreateMenu("Help")
$AboutItem = GUICtrlCreateMenuitem("About...", $Menu)
 
GUISetState()
 
While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $AboutItem
            _AboutGUI($Title, $MainLabel, "Program version: " & @LF & "v1.0", $CopyRLabel, _
                $NameURL1, $URL1, $NameURL2, $URL2, $NameURL3, $URL3, $ParentGui, @AutoItExe, $LinkColor, $BkColor, 500, 300)
    EndSwitch
WEnd
 
Func _AboutGUI($Title, $MainLabel, $TextLabel, $CopyRLabel, $NameURL1, $URL1, $NameURL2, $URL2, $NameURL3, $URL3, $Parent=0, $IconFile="", $LinkColor=0x0000FF, $BkColor=0xFFFFFF, $Width=300, $Height=120, $Left=-1, $Top=-1, $Style=-1, $ExStyle=-1)
    Local $OldEventOpt = Opt("GUIOnEventMode", 0)
    Local $OldRunErrOpt = Opt("RunErrorsFatal", 0)
    Local $About_GUI, $LinkTop=120, $About_Msg, $CurInfo
    Local $CurIsOnCtrlArr[1]
 
        Local $LinkVisitedColor[4] = [3, $LinkColor, $LinkColor, $LinkColor]
    Local $LinkLabel[4]
 
        WinSetState($Parent, "", @SW_DISABLE)
 
        If $ExStyle = -1 Then $ExStyle = ""
    $About_GUI = GUICreate($Title, $Width, $Height, $Left, $Top, $Style, 0x00000080+$ExStyle, $Parent)
    GUISetBkColor($BkColor)
 
    GUICtrlCreateLabel($MainLabel, 0, 20, $Width, 25, 1)
    GUICtrlSetFont(-1, 14)
 
    GUICtrlCreateIcon($IconFile, 0, 10, 20)
    GUICtrlSetState(-1, 128)
 
        GUICtrlCreateGraphic(5, 75, $Width-10, 3, $SS_ETCHEDFRAME)
 
        For $i = 1 To 3
        $LinkLabel[$i] = GUICtrlCreateLabel(Eval("NameURL" & $i), $Width-150, $LinkTop, 145, 15, 1)
        GUICtrlSetCursor(-1, 0)
        GUICtrlSetColor(-1, $LinkColor)
        GUICtrlSetFont(-1, 9, 400, 0)
        GUICtrlSetTip(-1, Eval("URL" & $i))
        $LinkTop += 30
    Next
 
    GUICtrlCreateLabel($TextLabel, 10, 100, $Width-155, 35)
    GUICtrlSetFont(-1, 10, 600, 0, "Tahoma")
 
        GUICtrlCreateLabel($CopyRLabel, 0, $Height-20, $Width, -1, 1)
    GUICtrlSetColor(-1, 0x969696)
    GUICtrlSetState(-1, 128)
 
        GUISetState(@SW_SHOW, $About_GUI)
 
    While 1
        $About_Msg = GUIGetMsg()
 
                Switch $About_Msg
            Case -3
                ExitLoop
            Case $LinkLabel[1], $LinkLabel[2], $LinkLabel[3]
                GUISetCursor(0, 1, $About_GUI)
                $CurInfo = GUIGetCursorInfo($About_GUI)
                If $About_Msg = $LinkLabel[1] Then $i = 1
                If $About_Msg = $LinkLabel[2] Then $i = 2
                If $About_Msg = $LinkLabel[3] Then $i = 3
 
                                While $CurInfo[2] = 1
                    $CurInfo = GUIGetCursorInfo($About_GUI)
                    Sleep(10)
                WEnd
 
                                If $CurInfo[4] = $About_Msg Then
                    GUISetCursor(-1, 0, $About_GUI)
                    $LinkVisitedColor[$i] = 0xAC00A9
                    GUICtrlSetColor($About_Msg, $LinkVisitedColor[$i])
                    ShellExecute(Eval("URL" & $i))
                EndIf
                GUISetCursor(-1, 0, $About_GUI)
        EndSwitch
 
                Sleep(10)
        ControlHover($About_GUI, $LinkLabel[1], 1, $CurIsOnCtrlArr, 0xFF0000, $LinkVisitedColor[1])
        ControlHover($About_GUI, $LinkLabel[2], 2, $CurIsOnCtrlArr, 0xFF0000, $LinkVisitedColor[2])
        ControlHover($About_GUI, $LinkLabel[3], 3, $CurIsOnCtrlArr, 0xFF0000, $LinkVisitedColor[3])
    WEnd
    WinSetState($Parent, "", @SW_ENABLE)
    GUIDelete($About_GUI)
    GUISwitch($Parent)
    Opt("GUIOnEventMode", $OldEventOpt)
    Opt("RunErrorsFatal", $OldRunErrOpt)
EndFunc
 
Func ControlHover($hWnd, $CtrlID, $CtrlNum, ByRef $CurIsOnCtrlArr, $HoverColor=0xFF0000, $LinkColor=0x0000FF)
    Local $CursorCtrl = GUIGetCursorInfo($hWnd)
    ReDim $CurIsOnCtrlArr[UBound($CurIsOnCtrlArr)+1]
    If $CursorCtrl[4] = $CtrlID And $CurIsOnCtrlArr[$CtrlNum] = 1 Then
        GUICtrlSetFont($CtrlID, 9, 400, 6)
        GUICtrlSetColor($CtrlID, $HoverColor)
        $CurIsOnCtrlArr[$CtrlNum] = 0
    ElseIf $CursorCtrl[4] <> $CtrlID And $CurIsOnCtrlArr[$CtrlNum] = 0 Then
        GUICtrlSetFont($CtrlID, 9, 400, 0)
        GUICtrlSetColor($CtrlID, $LinkColor)
        $CurIsOnCtrlArr[$CtrlNum] = 1
    EndIf
EndFunc

Выводит список дисков и свободное место. Как доделать его, чтобы добавить столбец "total size" с полным объемом диска?

Creat0R 07-03-2008 01:08 755095

amel27,
Цитата:

ИМХО оно не стоит того - эти диалоги только помогают визуально инициализировать требуемые структуры, но использовать их для последующей печати AFAIK средствами AutoIT не получится.
Это я скорее пытался практиковать навыки в Dll*, чем получить конкретные результаты :)

Цитата:

в MSDN сказано, что для стандартных Verbs всегда существует универсальный идентификатор, не зависящий от языка... и видимо без знака "&", во всяком случае для "Print" у меня сработало.
У меня тоже сработало, спасибо. А случаем не вкурсе, как получать эти самые уникальные идентификаторы?

P.S
Сорри за поздний ответ, много дел было.


...

Котяра,
Цитата:

Выводит список дисков и свободное место.
Хм... скрипт то мой, и он совсем не делает этих действий, это пример диалога «О программе» ;)

Для вывода информации о дисках и свободного места на них, используй функции «DriveGetDrive(), DriveGetLabel(), DriveSpaceFree(), DriveSpaceTotal() и т.п.».

Котяра 07-03-2008 15:00 755397

:) :) :) :) :) :) :) :) :) :) :) :)
Сам смеюсь с себя....
Скрипт вот этот:
Код:

$Gui = GUICreate("Drives List", 350, 300)
 
$ListView = GUICtrlCreateListView("Drives|Free Space (MB)", 20, 50, 310, 200)
 
$DrivesArr = DriveGetDrive("Fixed")
If IsArray($DrivesArr) Then
    For $i = 1 To $DrivesArr[0]
        $FreeSpace = DriveSpaceFree($DrivesArr[$i])
        GUICtrlCreateListViewItem(StringUpper($DrivesArr[$i]) & "\|" & Round($FreeSpace, 1), $ListView)
    Next
EndIf
 
GUISetState()
 
While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case Else
            ;;;
    EndSwitch
WEnd

А тот, если можете, уберите...

Да я перепутал - не то вставил с буфера обмена :)

Вопрос: можно ли "научить" скомпилированный скрипт понимать параметры командной строки. Например, у меня есть скрипт инсталляции и хочу, чтобы при запуске "E:\install.exe /s" (install.exe - скомпиленный скрипт) действие скрипта менялось.

Maza Faka 07-03-2008 16:23 755459

Цитата:

Цитата Котяра
можно ли "научить" скомпилированный скрипт понимать параметры командной строки »

Смотри здесь

Котяра 08-03-2008 21:28 756157

Я "рою" тему создания с помощью AutoIt инсталлятора. Так вот, для этого необходимо разработать скрипты Install и Uninst. Назначение скрипта Install - установить программу, а Uninst - удалить ее. Скрипт Uninst должен копироваться в папку программы скриптом Install. Так вот, для этого нужно использовать функции FileCopy, FileDelete (FileRecycle), RegRead, RegWrite, RegDelete. Используя их можно гибко управлять установкой. Сегодня нашел еще один способ - FileInstall. Функция выглядит так:
Код:

FileInstall("E:\source\readme.html", "C:\destination\readme.html")
Она позволяет СЖАТЬ файл в скрипт при компиляции. Т.е. компиленый Install и станет дистрибутивом! А если использовать FileCopy, потом сжимаем Install, Uninst и файлы программы в 7z, делаем SFX с помощью альтернативного SFX-модуля с таким комментарием:
Код:

;!@Install@!UTF-8!
GUIFlags="8"
RunProgram="Install.exe"
GUIMode="2"
HelpText="Example v1.00"
ErrorTitle="Ошибка установки Example v1.00"
;!@InstallEnd@!

Вряд ли что-то в этом комментарии нужно пояснять. :)
Сами скрипты (с FileCopy) я приводил в прошлых сообщениях.

Нужно добавить в скрипты инсталлятора #NoTrayIcon, т.к. лишние иконки в трее ни к чему :)

DENoszone 10-03-2008 15:25 757060

ИЗвените. но я вообще не понял как эта программа работает.
мне нужно что бы в определеные места нажимала мышка...
с циклом.
ну к примеру в 10 местах нажимает...потом ещё в 1 месте и опять в тех же 10 местах. вот такое можно сделать?

prokazzza 10-03-2008 15:47 757078

Creat0R, Как в скрипте выполнить регистрацию dll библиотеки например:

%windir%\system32\regsvr32.exe "%currentdir%Test.dll"

Maza Faka 10-03-2008 17:42 757154

Цитата:

Цитата DENoszone
мне нужно что бы в определеные места нажимала мышка...
с циклом. »

Велкам!
Пример:
Код:

Opt("MouseClickDelay", 50) ;Задаём паузу между кликами мыши в 50 милисекунд

HotKeySet("{Esc}", "_Exit") ;задаём горячую клавишу (Escape) для завершения скрипта

Global $aMousePos[11][2] ;создаём двумерный массив

$aMousePos[0][0] = 10 ;указываем кол-во элементов

;Заполняем 0 размерность Х-координатами

$aMousePos[1][0] = 100
$aMousePos[2][0] = 200
$aMousePos[3][0] = 300
$aMousePos[4][0] = 400
$aMousePos[5][0] = 500
$aMousePos[6][0] = 600
$aMousePos[7][0] = 700
$aMousePos[8][0] = 800
$aMousePos[9][0] = 900
$aMousePos[10][0] = 1000

;Заполняем 1 размерность Y-координатами
$aMousePos[1][1] = 50
$aMousePos[2][1] = 100
$aMousePos[3][1] = 150
$aMousePos[4][1] = 200
$aMousePos[5][1] = 250
$aMousePos[6][1] = 300
$aMousePos[7][1] = 350
$aMousePos[8][1] = 400
$aMousePos[9][1] = 450
$aMousePos[10][1] = 500

;запускаем цикл
While 1
    For $i = 1 To $aMousePos[0][0]
        MouseClick("left", $aMousePos[$i][0], $aMousePos[$i][1]) ;кликаем в 10 разных местах
    Next

    MouseClick("left", 10, 10, 1, 50) ;потом ещё в 1 месте :)
    Sleep(50)
WEnd

Func
_Exit()
    $aMousePos = 0
    Exit
EndFunc

;)

Цитата:

Цитата prokazzza
Как в скрипте выполнить регистрацию dll библиотеки »

Надеюсь, что Creat0R не обидится, если отвечу я ;)
Код:

Run(@SystemDir & "\regsvr32.exe " & '"' & @ScriptDir & "\Test.dll")

DENoszone 10-03-2008 18:14 757186

а может эта программа производить поиск по брауеру по открытой странице и нажимать на определыные фразы?


как добавить в скрипт что бы нажималась "Page Down"
Maza Faka, как сделать что бы последний клик в цикле все время изменялся +10 по Х

Maza Faka 11-03-2008 07:14 757598

Цитата:

Цитата DENoszone
а может эта программа производить поиск по брауеру по открытой странице и нажимать на определыные фразы? »

Смотри в справке функцию _IELinkClickByText().

Цитата:

Цитата DENoszone
как добавить в скрипт что бы нажималась "Page Down" »

Код:

Send("{PGDN}")
Цитата:

Цитата DENoszone
как сделать что бы последний клик в цикле все время изменялся +10 по Х »

Если я правильно тебя понял:
Код:

Opt("MouseClickDelay", 50) ;Задаём паузу между кликами мыши в 50 милисекунд

HotKeySet("{Esc}", "_Exit") ;задаём горячую клавишу (Escape) для завершения скрипта

Dim $plus = 0
Global $aMousePos[11][2] ;создаём двумерный массив

$aMousePos[0][0] = 10 ;указываем кол-во элементов

;Заполняем 0 размерность Х-координатами

$aMousePos[1][0] = 100
$aMousePos[2][0] = 200
$aMousePos[3][0] = 300
$aMousePos[4][0] = 400
$aMousePos[5][0] = 500
$aMousePos[6][0] = 600
$aMousePos[7][0] = 700
$aMousePos[8][0] = 800
$aMousePos[9][0] = 900
$aMousePos[10][0] = 1000

;Заполняем 1 размерность Y-координатами
$aMousePos[1][1] = 50
$aMousePos[2][1] = 100
$aMousePos[3][1] = 150
$aMousePos[4][1] = 200
$aMousePos[5][1] = 250
$aMousePos[6][1] = 300
$aMousePos[7][1] = 350
$aMousePos[8][1] = 400
$aMousePos[9][1] = 450
$aMousePos[10][1] = 500

;запускаем цикл
While 1
    For $i = 1 To $aMousePos[0][0]
        If $i = 10 Then
            $plus += 10
            MouseClick("left", $aMousePos[$i][0] + $plus, $aMousePos[$i][1]) ;последний клик в цикле все время изменяется +10 по Х
            ContinueLoop
        EndIf

        MouseClick("left", $aMousePos[$i][0], $aMousePos[$i][1]) ;кликаем в 10 разных местах
    Next

    MouseClick("left", 10, 10, 1, 50) ;потом ещё в 1 месте :)
    Sleep(50)
WEnd

Func
_Exit()
    $aMousePos = 0
    Exit
EndFunc


DENoszone 11-03-2008 23:13 758231

я уже наверное достал.но не как не могу понять как это все работает =((

1. как кликать в браузере по определеному тексту "Нажми сюда"
2. Как можно копировать title сайта и вставлять на другой сайт в форму поиска.
3. Как обновлять страницу? браузер.
4. можно начинать цикл только когда сайт полностью заргружен или на 90% ?
5. есть какой то норм мануал русский по этой проге?
заранее спасибо

prokazzza 12-03-2008 00:41 758260

Maza Faka,
Цитата:

Цитата Maza Faka
Надеюсь, что Creat0R не обидится, если отвечу я »

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

HORRIBLE 12-03-2008 00:41 758261

DENoszone,

1. как кликать в браузере по определеному тексту "Нажми сюда"

PHP код:

#include <IE.au3>
$oIE _IECreate ("http://forum.oszone.net" )

_IELoadWait ($oIE)
MsgBox(0,_IEPropertyGet ($oIE,"title"),"Кликаем по: << Автоматическая установка приложений >>",3)
_IELinkClickByText ($oIE"Автоматическая установка приложений")
   
 
_IELoadWait ($oIE)
 
MsgBox(0,_IEPropertyGet ($oIE,"title"),"Кликаем по: << AutoIt скрипты .:[общие вопросы]:. >>",3)
 
_IELinkClickByText ($oIE"AutoIt скрипты .:[общие вопросы]:.")

  
_IELoadWait ($oIE)
  
MsgBox(0,_IEPropertyGet ($oIE,"title"),"Кликаем по: << Последняя » >>",3)
  
_IELinkClickByText ($oIE"Последняя »"

2. Как можно копировать title сайта и вставлять на другой сайт в форму поиска.
PHP код:

#include <IE.au3>
$oIE _IECreate ("http://forum.oszone.net" )
_IELoadWait ($oIE)

MsgBox(0"<title> сайта"_IEPropertyGet ($oIE,"title")) ;title  форума

$oIE_2 
_IECreate ("http://www.yandex.ru")
_IELoadWait ($oIE_2)
$oForm _IEFormGetObjByName ($oIE_20)
$oQuery _IEFormElementGetObjByName ($oForm0)
_IEFormElementSetValue ($oQuery_IEPropertyGet ($oIE,"title"))
_IEFormSubmit ($oForm

3. Как обновлять страницу? браузер.
PHP код:

_IEAction ($oIE"refresh"

4. можно начинать цикл только когда сайт полностью заргружен.
Код:

_IELoadWait ($oIE) ;ждем пока все не загрузится, после чего работаем дальше.

DENoszone 12-03-2008 01:07 758267

Блин. как научится работать с этой программой?=(
а то стыдно уже тут спрашивать.

PHP код:

#include <IE.au3>   $oIE = _IECreate ("http://forum.oszone.net" )   _IELoadWait ($oIE)   MsgBox(0,_IEPropertyGet ($oIE,"title"),"Кликаем по: << Автоматическая установка приложений >>",3)   _IELinkClickByText ($oIE, "Автоматическая установка приложений")   _IELoadWait ($oIE)   MsgBox(0,_IEPropertyGet ($oIE,"title"),"Кликаем по: << AutoIt скрипты .:[общие вопросы]:. >>",3)   _IELinkClickByText ($oIE, "AutoIt скрипты .:[общие вопросы]:.")   _IELoadWait ($oIE)   MsgBox(0,_IEPropertyGet ($oIE,"title"),"Кликаем по: << Последняя » >>",3)   _IELinkClickByText ($oIE, "Последняя »") 

как из этого сделать цикл?

PHP код:

#include <IE.au3>   $oIE = _IECreate ("http://forum.oszone.net" )   _IELoadWait ($oIE)     MsgBox(0, "AddressBar Status", _IEPropertyGet ($oIE,"title")) ;title  форума     $oIE_2 = _IECreate ("http://www.yandex.ru")   _IELoadWait ($oIE_2)   $oForm = _IEFormGetObjByName ($oIE_2, 0)   $oQuery = _IEFormElementGetObjByName ($oForm, 0)   _IEFormElementSetValue ($oQuery, _IEPropertyGet ($oIE,"title"))   _IEFormSubmit ($oForm) 

это классно...но билн даже не могу сделать что бы загружалась страница с таитлом...потом в другой сайт куда в писывает title вписывало и переходило обратно на сайт с title и обновлял её....опять брал title и шел в писывал в сайт.
понятно?=)

HORRIBLE 12-03-2008 01:17 758271

PHP код:

$oFrames _IEFrameGetCollection ($oIE)
            
$iNumFrames = @extended
            
For $i 0 to ($iNumFrames 1)
              
local $oFrame _IEFrameGetCollection ($oIE$i)
               
_IELoadWait ($oFrame)
           
next 

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

и еще одно, я наверно что то не так делаю. Не получается скопировать, что угодно со странички если использовать ClipPut(""), как тогда быть, если мне перед выполнением необходимо его все таки почистить ?
вот есть
читать дальше »
PHP код:

ClipPut("")

$start_2 "Этаж 1"
      
_WaitLoad();ожидание загрузки
      MouseClickDrag
("left"9721681178,168)
      
ControlSend("title","","","{Ctrl}+{C}") <-- это правильно написано?
;
ControlSend("title","","[Class: Internet Explorer_Server; Instance:1]","{Ctrl}+{C}") <--или это?
      ;
Send("^{c}")

         ;
обрезаем излишки скопированного слова........
         
$len_start_2 StringLen($start_2)
         
$len_Clip_2 StringLen(ClipGet())
         
$len_Clip_sum_2 Abs($len_Clip_2 $len_start_2)
         
$result_start_2 StringTrimRight(ClipGet(), $len_Clip_sum_2)

            
$compare_2=StringCompare $result_start_2$start_22)
            if 
$compare_2 0 then
            
exit
            endif 




Спасибо.

Creat0R 12-03-2008 01:46 758278

prokazzza,
Цитата:

мне не нужно окно, с надписью о том что библиотека загрегина
regsvr32.exe /?
Цитата:

Использование: regsvr32 [/u] [/s] [/n] [/i[:строка_команд]] DLL-файл

/u - Отменяет регистрацию DLL
/s - "Тихий" режим; окна сообщения не отображаются
/i - Вызывает DllInstall, передавая параметром необязательную строку_команд,
при использовании с ключом /u вызывает DllUnInstall
/n - Не вызывает DllRegisterServer; это может использоваться с ключом /i
Соответственно:

Код:

Run(@SystemDir & '\regsvr32.exe /s "' & @ScriptDir & '\Test.dll"')
:)

DENoszone 12-03-2008 08:28 758351

Код:

#include <IE.au3>


While 1

   
        #include <IE.au3>
$oIE = _IECreate ("http://www.old-school.ru" )

_IELoadWait ($oIE)
MsgBox(0,_IEPropertyGet ($oIE,"title"),"Кликаем по: << Всем любителям проходить тест >>",3)
_IELinkClickByText ($oIE, "Всем любителям проходить тест")
   
 _IELoadWait ($oIE)
 MsgBox(0,_IEPropertyGet ($oIE,"title"),"Кликаем по: << Пригласить в группу >>",3)
 _IELinkClickByText ($oIE, "Пригласить в группу")

  _IELoadWait ($oIE)
  MsgBox(0,_IEPropertyGet ($oIE,"title"),"Кликаем по: << Начать поиск » >>",3)
  _IELinkClickByText ($oIE, "Начать поиск »")
       
wend

вот по пытался.
не фига не вышло.
КАК отметить галочку? она единственая на странице

NikLok 12-03-2008 10:33 758428

Возник вопрос о сохранении - загрузке данных. Имеется скрипт, кончено же с туевой хучей данных-переменных. После его завершения требуется сохранить все установки, до след сеанса работы, в котором конечно прочитать их. Данные эти весьма разнородны, от переменных до состояния чекбоксов. Что посоветуете коллеги?!

Maza Faka 12-03-2008 11:37 758474

NikLok
Сохраняй в *.ini файле, либо, если данных очень много - в реестре.

NikLok 12-03-2008 13:29 758583

Maza Faka, Можно примерчик кода небольшой ! Я просто как подумаю о синтаксическом анализе и т.п. :o

Maza Faka 12-03-2008 15:51 758690

Цитата:

Цитата NikLok
Можно примерчик кода небольшой »

Что-то вроде этого:
Код:

#include <GuiConstants.au3>

Global $CfgFile = @ScriptDir & "\Config.ini"

Global $Input_State = IniRead($CfgFile, "Settings", "Input", "")
Global $Radio1_State = IniRead($CfgFile, "Settings", "Radio1", 4)
Global $Radio2_State = IniRead($CfgFile, "Settings", "Radio2", 4)
Global $CheckBox1_State = IniRead($CfgFile, "Settings", "CheckBox1", 4)
Global $CheckBox2_State = IniRead($CfgFile, "Settings", "CheckBox2", 4)

$hGUI = GUICreate("Test GUI", 320, 240)

$hInput = GUICtrlCreateInput("", 10, 10, 160, 20)
GUICtrlSetData(-1, $Input_State)

GUICtrlCreateGroup("Group", 10, 50, 160, 100)
$Radio1 = GUICtrlCreateRadio("Radio1", 20, 75, 60, 16)
GUICtrlSetState(-1, $Radio1_State)
$Radio2 = GUICtrlCreateRadio("Radio2", 20, 120, 60, 16)
GUICtrlSetState(-1, $Radio2_State)
GUICtrlCreateGroup("", -99, -99, 1, 1)

$CheckBox1 = GUICtrlCreateCheckbox("Param 1", 200, 75, 60, 20)
GUICtrlSetState(-1, $CheckBox1_State)

$CheckBox2 = GUICtrlCreateCheckbox("Param 2", 200, 120, 60, 20)
GUICtrlSetState(-1, $CheckBox2_State)

$AcceptButton = GUICtrlCreateButton("Ok", 10, 200, 60, 25)

$CancelButton = GUICtrlCreateButton("Cancel", 250, 200, 60, 25)

GUISetState()

While 1
    $msg = GUIGetMsg()

    Switch $msg
    Case $GUI_EVENT_CLOSE, $CancelButton
        ExitLoop
    Case
$AcceptButton
        _SaveCfg()
        ExitLoop
    EndSwitch
WEnd

Func
_SaveCfg()
    IniWrite($CfgFile, "Settings", "Input", GUICtrlRead($hInput))
    IniWrite($CfgFile, "Settings", "Radio1", GUICtrlRead($Radio1))
    IniWrite($CfgFile, "Settings", "Radio2", GUICtrlRead($Radio2))
    IniWrite($CfgFile, "Settings", "CheckBox1", GUICtrlRead($CheckBox1))
    IniWrite($CfgFile, "Settings", "CheckBox2", GUICtrlRead($CheckBox2))
EndFunc


Creat0R 12-03-2008 19:42 758859

Maza Faka,
Цитата:

Что-то вроде этого:
Неплохой пример, я тоже так почти всегда делаю, но хотел подметить несколько моментов...

* Если чекбоксов и т.п. много, то пока главное окно программы закроется пройдёт время, поэтому перед записью всегда лучше скрывать окно (GUISetState(@SW_HIDE, $hGUI) но не в коем случае не удалять, т.к чтение контролов приведёт к нулевому значению).
* В Ini-шку можно и не записывать “реальные” значения (для чекбокса к примеру, это 1 и 4), можно было бы сделать что-то в этом духе:

Код:

Func _SaveCfg()
    GUISetState(@SW_HIDE, $hGUI)

    $Input_Data = GUICtrlRead($hInput)
    $Radio1_State = Number(GUICtrlRead($Radio1) = $GUI_CHECKED)
    $Radio2_State = Number(GUICtrlRead($Radio2) = $GUI_CHECKED)
    $CheckBox1_State = Number(GUICtrlRead($CheckBox1) = $GUI_CHECKED)
    $CheckBox2_State = Number(GUICtrlRead($CheckBox2) = $GUI_CHECKED)

    IniWrite($CfgFile, "Settings", "Input", $Input_Data)
    IniWrite($CfgFile, "Settings", "Radio1", $Radio1_State)
    IniWrite($CfgFile, "Settings", "Radio2", $Radio2_State)
    IniWrite($CfgFile, "Settings", "CheckBox1", $CheckBox1_State)
    IniWrite($CfgFile, "Settings", "CheckBox2", $CheckBox2_State)
EndFunc


DENoszone 12-03-2008 22:14 758989

как с симулировать нажатие колесика?

как нажимать на конопку на сайте *в опере) адрес ссылки http://www.*.com/index.php?ext=searc...d=1498&start=* (меняется) и текст имеет ">"

NikLok 12-03-2008 22:18 758993

Creat0R,
Цитата:

Цитата Creat0R
Если чекбоксов и т.п. много »

Хаачу гуй для winnt.sif. !!! Сам понимаю что поздновато, но к сожалению нужон!
Соотв. чекбоксов стоко же скоко параметров!

Цитата:

Цитата Creat0R
В Ini-шку можно и не записывать “реальные” значения (для чекбокса к примеру, это 1 и 4), »

Даже более того там же значения 1 или 0, Yes или No. Значит млин еще дополнит. обработка будет?! Или имеются какие нить механизмы?!

Creat0R,
Цитата:

Цитата Creat0R
GUISetState(@SW_HIDE, $hGUI) »

То есть что получается что $hGUI глобальная переменная? Аесли параметром передавать?!

Чуствую этот материал на вики страничку по автоиту просится?

Creat0R 13-03-2008 00:15 759066

NikLok,
Цитата:

там же значения 1 или 0
Это после моей обработки ;)

Цитата:

имеются какие нить механизмы?!
Не уверен что понимаю что тут спрашивается? :) - все записи нужно делать вручную, это самый надёжный метод.

Цитата:

получается что $hGUI глобальная переменная?
Поскольку она обьявлена в начале скрипта (не в циклах или в функциях/условиях), то она считается глобальной, хотя надёжнее всё же обьявлять её (Global $hGUI = ...)

Цитата:

Аесли параметром передавать?!
Можно конечно.

Цитата:

Чуствую этот материал на вики страничку по автоиту просится?
Кто бы этим занялся, у меня если честно времени не хватает (желание есть немернное :yes: ).

DENoszone,
Цитата:

как с симулировать нажатие колесика?
MouseClick("Middle") ?

Цитата:

как нажимать на конопку на сайте *в опере
Внешними средствами в Opera проблематично. Кстати по этой теме (по Opera) написал библиотеку автоматизации.

NikLok 13-03-2008 01:32 759095

Цитата:

Цитата Creat0R
все записи нужно делать вручную, это самый надёжный метод. »

Вот и получился у меня тупой, но надежный код аж на 1 500 строк только для секции Components !!!

Maza Faka 13-03-2008 08:33 759192

Цитата:

Цитата NikLok
Вот и получился у меня тупой, но надежный код аж на 1 500 строк только для секции Components »

Неужели нужно вырезать столько компонентов? Для чего?

NikLok 13-03-2008 11:52 759297

Maza Faka,
Цитата:

Цитата Maza Faka
столько компонентов? Для чего? »

А ля winnt.sif users manager.

Вот вырезка для 2-х компонент:
Код:

#include <GuiConstants.au3>
Global $CfgFile = "winnt.sif"
Global $AccessOpt_state = "On"
Global $Appsrv_console_state = "Off"

$hGUI = GuiCreate("WIndows XP winnt.Sif managers - feesh 0.0.1", 1020, 620)

GuiCtrlCreateTabItem("Components")
;CreateGUI
$AccessOpt = GUICtrlCreateCheckbox("AccessOpt",35,50,210,15)
GUICtrlSetState($AccessOpt,$GUI_UNCHECKED)

$Appsrv_console = GUICtrlCreateCheckbox("Appsrv_console",35,70,210,15)
GUICtrlSetState($Appsrv_console,$GUI_UNCHECKED)

; GUI MESSAGE LOOP
GuiSetState()
While GuiGetMsg() <> $GUI_EVENT_CLOSE
WEnd

Func _LoadCfg()
        $State = IniRead($CfgFile,"Settings","AccessOpt","Off")
        If $State == "On" Then
                $AccessOpt_State=$GUI_CHECKED
                ;GUICtrlSetState($AccessOpt,$GUI_CHECKED)
        Else
                $AccessOpt_State=$GUI_UNCHECKED
                ;GUICtrlSetState($AccessOpt,$GUI_UNCHECKED)
        EndIf
        $State = IniRead($CfgFile,"Settings","Appsrv_console","Off")
        If $State == "On" Then
                $Appsrv_console_State=$GUI_CHECKED
                ;GUICtrlSetState($Appsrv_console,$GUI_CHECKED)
        Else
                $Appsrv_console_State=$GUI_UNCHECKED
                ;GUICtrlSetState($Appsrv_console,$GUI_UNCHECKED)
        EndIf
EndFunc

Func _SaveCfg()
    GUISetState(@SW_HIDE, $hGUI)
        If GUICtrlRead($AccessOpt) = $GUI_CHECKED Then
                $AccessOpt_State="On"
        Else
                $AccessOpt_State="Off"
        EndIf
    IniWrite($CfgFile,"Settings","AccessOpt",$AccessOpt_State)
        If GUICtrlRead($Appsrv_console) = $GUI_CHECKED Then
                $Appsrv_console_State="On"
        Else
                $Appsrv_console_State="Off"
        EndIf
    IniWrite($CfgFile,"Settings","Appsrv_console",$Appsrv_console_State)
EndFunc
Exit

При грубой прикидке получаем 20-25 строк на параметр.
Очень мне не нравится забор из конструкций - GUICtrlCreateCheckbox("AccessOpt",35,50,210,15)
Особенно задание абсолютных координат. Ну ладно, допустим заменю на переменные с инкрементом по вертикали и горизонтали, но возникают проблемы если захочется делать окно масштабируемым?! Сейчас что бы вывести все компоненты без скролинга требуется окно шириной в 1000!
А если монитор не поддерживает такого разрешения! Кто как решает проблему масштабируемости?

Еще почему-то при проведении мышкой над чекбоксом его подпись меняет фон на темно серый! Как отключить?

Как задать высоту табов создаваемых при помощи GuiCtrlCreateTabItem ?!?!

Кто нить достал книгу по autoit - AutoIt v3: Your Quick Guide (Andy Flesner, O'Reilly)
Очень хочется электронный вариант!!!

Creat0R 13-03-2008 13:46 759394

NikLok,
Цитата:

возникают проблемы если захочется делать окно масштабируемым?
А в чём проблема задать относительные координаты? можно создать переменную $GUI_WIDTH и $GUI_HEIGHT, и соответственно строить элементы:

Код:

GUICtrlCreateCheckbox("AccessOpt", 35, 50, $GUI_WIDTH-70, 15)
-70 это 35 + 35, таким образом ширена чекбокса будет ровно по ширине GUI (т.е с равномерными отступами с боков).

Цитата:

Кто как решает проблему масштабируемости?
Очень просто, для этого существует GUICtrlCreateTab(), ну или в крайнем случае TreeView (правда процесс переключения элементов придётся обрабатывать вручную). Или в ещё более крайних случаях, ListView с чекбоксами.

Цитата:

при проведении мышкой над чекбоксом его подпись меняет фон на темно серый!
Такой “эффект” может наблюдаться если с чекбоксом пересекаются другие (в частности Group) контроли. Пример можно увидеть где это происходит?

Цитата:

Кто нить достал книгу по autoit - AutoIt v3: Your Quick Guide
Судя по Wikipedia, издание от O'Reilly в сентябре 2007-ого только было опубликовано. Не думаю что так уже распространена эта книга. Хотя 8$ не так уж и много для книги подобного типа... вопрос в том насколько эта книга поможет ;) - Можно собрать книгу хотябы из всех архивов (по AutoIt) на этом форуме, я уже не говорю об офф. форуме.

NikLok 13-03-2008 15:13 759461

Creat0R,
Цитата:

Цитата Creat0R
Пример можно увидеть где это происходит? »

Ох и длинный он однако:
Код:

;Автор скрипта: NikLok (http://forum.oszone.net/member.php?u=15218)
; 12 March 2008 - SRISA _ LNM
#include <GuiConstants.au3>
AutoItSetOption("TrayIconDebug",1)
AutoItSetOption("SendKeyDelay",40)

Opt("WinWaitDelay",100)
Opt("WinTitleMatchMode",4)
Opt("WinDetectHiddenText",1)
Opt("MouseCoordMode",0)

Global $CfgFile = "winnt.sif"
Global $AccessOpt_state=$GUI_CHECKED
Global $Appsrv_console_state=$GUI_UNCHECKED
Global $Aspnet_state=$GUI_UNCHECKED

$fn="winnt.sif"
If        FileExists($fn) Then
        $file = FileOpen($fn,0)
        ; Check if file opened for writing OK
        If $file = -1 Then
            MsgBox(0, "Error", "Unable to open " & $fn & " file.")
        Else
;                $newfile = FileOpen("winnt_assemble.sif",1)
                ; Check if file opened for writing OK
;                If $newfile = -1 Then MsgBox(0, "Error", "Unable to open winnt_assemble.sif file.")
                ; Read in lines of text until the EOF is reached
                While 1
                    $line = FileReadLine($file)
                    If @error = -1 Then ExitLoop
;                        FileWriteLine($newfile, $line)
                        $r=StringRegExp($line,"OemPnPDriversPath",0)
                    If $r <> 0 Then
                                $t=StringInStr($line,'=')
                                If $t <> 0 Then
                                        $WSOemPnPDriversPath = StringTrimLeft($line,$t)
                                        $OemPnPDriversPath = StringStripWS($WSOemPnPDriversPath,3)
                                        ;$OemPnPDriversPath=StringInStr($line,'=')
                                        ;MsgBox(0,"Info",$OemPnPDriversPath)
                                Else
                                        $OemPnPDriversPath=''
                                EndIf
                                        $array = StringSplit($OemPnPDriversPath,';',1)
                        EndIf
                Wend
                FileClose($file)
        EndIf
EndIf

$hGUI = GuiCreate("WIndows XP winnt.Sif managers - feesh 0.0.1", 1020, 620)

$LoadButton  = GUICtrlCreateButton("Load", 600, 5, 80, 25 )
$SaveButton  = GUICtrlCreateButton("Save", 700, 5, 80, 25 )
$ExitButton  = GUICtrlCreateButton("Exit", 800, 5, 80, 25 )
$AcceptButton = GUICtrlCreateButton("Ok",  500, 5, 60, 25)
$CancelButton = GUICtrlCreateButton("Cancel",900,5, 60, 25)

; TAB
GuiCtrlCreateTab(30, 10, 960, 590)
GuiCtrlCreateTabItem("User")
;GuiCtrlCreateLabel("Sample Tab with tabItems", 250, 40)
        GuiCtrlCreateLabel("FullName", 50, 80)
        GuiCtrlCreateLabel("OrgName", 50, 100)
        GuiCtrlCreateLabel("ComputerName", 50, 120)
        GuiCtrlCreateLabel("Workgroup", 50, 140)

GuiCtrlCreateTabItem("Ip")
        ; CHECKBOX
        GuiCtrlCreateCheckbox("RIS installation", 50, 50, 80, 20)
        GuiCtrlSetState(-1, $GUI_CHECKED)
        GuiCtrlCreateLabel("IP adress", 50, 80)
        GuiCtrlCreateLabel("Gateway", 50, 100)
        GuiCtrlCreateLabel("DNS Server", 50, 120)
        GuiCtrlCreateLabel("Proxy Server", 50, 140)
        GuiCtrlCreateLabel("Proxy Override", 50, 160)

GuiCtrlCreateTabItem("Drivers")

        $treeDrivers = GuiCtrlCreateTreeView(30,50,980,500, $TVS_CHECKBOXES)
        $n=StringLen($OemPnPDriversPath)
        If $n <> 0 Then
                $array = StringSplit($OemPnPDriversPath,';',1)
                For $m=1 to $array[0] Step 1
                        GuiCtrlCreateTreeViewItem($array[$m], $treeDrivers)
                Next       
        EndIf
        ; CHECKBOX
        GuiCtrlCreateCheckbox("Check existense",35,560,140,20)
        GuiCtrlSetState(-1, $GUI_CHECKED)

GuiCtrlCreateTabItem("Screen")
        GuiCtrlCreateLabel("Bits Per Pixel", 50, 80)
        GuiCtrlCreateLabel("Xresolution", 50, 100)
        GuiCtrlCreateLabel("Yresolution", 50, 120)
        GuiCtrlCreateLabel("Vertical refresh", 50, 140)
        ;GuiCtrlCreateLabel("Proxy Override", 50, 160)

GuiCtrlCreateTabItem("Components")
;CreateGUI
$AccessOpt = GUICtrlCreateCheckbox("AccessOpt",35,50,210,15)
GUICtrlSetState($AccessOpt,$AccessOpt_State)
$Appsrv_console = GUICtrlCreateCheckbox("Appsrv_console",35,90,210,15)
GUICtrlSetState($Appsrv_console,$Appsrv_console_State)
$Aspnet = GUICtrlCreateCheckbox("Aspnet",35,130,210,15)
GUICtrlSetState($Aspnet,$Aspnet_State)

GuiCtrlCreateTabItem("Settings")
        GuiCtrlCreateLabel("Base directory", 50, 80)
        GuiCtrlCreateLabel("Builderman", 50, 100)
        GuiCtrlCreateLabel("Contacts", 50, 120)

; GUI MESSAGE LOOP
GuiSetState()
While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE, $CancelButton
        ExitLoop
    Case $AcceptButton
        ;_SaveCfg()
        ExitLoop
    EndSwitch
WEnd

Func _LoadCfg()
        $AccessOpt_State = IniRead($CfgFile,"Components","AccessOpt","Off")
        If $AccessOpt_State == "On" Then
                $AccessOpt_State=$GUI_CHECKED
                ;GUICtrlSetState($AccessOpt,$GUI_CHECKED)
        Else
                $AccessOpt_State=$GUI_UNCHECKED
                ;GUICtrlSetState($AccessOpt,$GUI_UNCHECKED)
        EndIf
        $Appsrv_console_State = IniRead($CfgFile,"Components","Appsrv_console","Off")
        If $Appsrv_console_State == "On" Then
                $Appsrv_console_State=$GUI_CHECKED
                ;GUICtrlSetState($Appsrv_console,$GUI_CHECKED)
        Else
                $Appsrv_console_State=$GUI_UNCHECKED
                ;GUICtrlSetState($Appsrv_console,$GUI_UNCHECKED)
        EndIf
        $Aspnet_State = IniRead($CfgFile,"Components","Aspnet","Off")
        If $Aspnet_State == "On" Then
                $Aspnet_State=$GUI_CHECKED
                ;GUICtrlSetState($Aspnet,$GUI_CHECKED)
        Else
                $Aspnet_State=$GUI_UNCHECKED
                ;GUICtrlSetState($Aspnet,$GUI_UNCHECKED)
        EndIf
EndFunc


Func _SaveCfg()
    GUISetState(@SW_HIDE, $hGUI)
        If GUICtrlRead($AccessOpt) = $GUI_CHECKED Then
                $AccessOpt_State="On"
        Else
                $AccessOpt_State="Off"
        EndIf
    IniWrite($CfgFile,"Components","AccessOpt",$AccessOpt_State)
        If GUICtrlRead($Appsrv_console) = $GUI_CHECKED Then
                $Appsrv_console_State="On"
        Else
                $Appsrv_console_State="Off"
        EndIf
    IniWrite($CfgFile,"Components","Appsrv_console",$Appsrv_console_State)
        If GUICtrlRead($Aspnet) = $GUI_CHECKED Then
                $Aspnet_State="On"
        Else
                $Aspnet_State="Off"
        EndIf
    IniWrite($CfgFile,"Components","Aspnet",$Aspnet_State)
EndFunc
Exit

В директории запуска должон быть winnt.sif - или корректировать $CfgFile

Цитата:

Цитата Creat0R
Хотя 8$ не так уж и много для книги подобного типа... »

Согласен, но дело принципа. Я просмотрел её содержимое и сильно разочаровался!!! Это краткий справочник скорее чем книга!

Maza Faka 13-03-2008 15:51 759494

NikLok
Скрипт-то нерабочий. Ты вот, что сделай: напиши небольшой скриптик содержащий только проблемное место, так всем будет легче и охотней его смотреть, чем огромный и нерабочий код. ;)

NikLok 13-03-2008 16:35 759519

Maza Faka, Sorry. У меня работает! Вот еще сократил. Оставил одну вкладку и все почистил.
Код:

;Автор скрипта: NikLok (http://forum.oszone.net/member.php?u=15218)
; 12 March 2008 - SRISA _ LNM
#include <GuiConstants.au3>
AutoItSetOption("TrayIconDebug",1)
AutoItSetOption("SendKeyDelay",40)

Opt("WinWaitDelay",100)
Opt("WinTitleMatchMode",4)
Opt("WinDetectHiddenText",1)
Opt("MouseCoordMode",0)

Global $CfgFile = "winnt.sif"
Global $AccessOpt_state=$GUI_CHECKED
Global $Appsrv_console_state=$GUI_UNCHECKED
Global $Aspnet_state=$GUI_UNCHECKED

$hGUI = GuiCreate("WIndows XP winnt.Sif managers - feesh 0.0.1", 1020, 620)

$LoadButton  = GUICtrlCreateButton("Load", 600, 5, 80, 25 )
$SaveButton  = GUICtrlCreateButton("Save", 700, 5, 80, 25 )
$ExitButton  = GUICtrlCreateButton("Exit", 800, 5, 80, 25 )
$AcceptButton = GUICtrlCreateButton("Ok",  500, 5, 60, 25)
$CancelButton = GUICtrlCreateButton("Cancel",900,5, 60, 25)

GuiCtrlCreateTab(30, 10, 960, 590)
GuiCtrlCreateTabItem("Components")
;CreateGUI
$AccessOpt = GUICtrlCreateCheckbox("AccessOpt",35,50,210,15)
GUICtrlSetState($AccessOpt,$AccessOpt_State)
$Appsrv_console = GUICtrlCreateCheckbox("Appsrv_console",35,90,210,15)
GUICtrlSetState($Appsrv_console,$Appsrv_console_State)
$Aspnet = GUICtrlCreateCheckbox("Aspnet",35,130,210,15)
GUICtrlSetState($Aspnet,$Aspnet_State)

; GUI MESSAGE LOOP
GuiSetState()
While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE, $CancelButton
        ExitLoop
    Case $AcceptButton
        ExitLoop
    EndSwitch
WEnd
Exit

Нужно провести по чекбоксам и увидите.

Creat0R 13-03-2008 16:56 759535

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

P.S
Вместо 1020 лучше использовать макрос @DesktopWidth ;)
И по поводу Opt("WinTitleMatchMode",4) - это можно не использовать (оставлено в целях обратной совместимости), при поиске окон есть другой метод (см. раздел Window Titles and Text (Advanced) в справке).

NikLok 13-03-2008 17:29 759560

Creat0R,
Цитата:

Цитата Creat0R
Возможно у тебя какая то тема оформления установлена, которая вызывает такие глюки? »

Это возможно - стоит тема VistaXP ! Правда смена темы на классическую ничего не дала.! Подвижка на 100 тоже не исправила дела!
Цитата:

Цитата Creat0R
Вместо 1020 лучше использовать макрос @DesktopWidth »

Это ширина десктопа, а я не хочу на весь экран распахивать то!
А как узнать ширину родительского GUI. То есть ширину для $hGUI ?

Creat0R 13-03-2008 23:43 759852

NikLok,
Цитата:

Это ширина десктопа, а я не хочу на весь экран распахивать то!
У меня 1020 это почти ширена экрана, я просто привёл пример, у кого то разрешение экрана может быть очень низким, и часть GUI не будет видно.

Цитата:

как узнать ширину родительского GUI
$aGUI_Coords = WinGetPosition($hGUI)

Возвращённое значение:
Код:

$aGUI_Coords[0] = Left
$aGUI_Coords[1] = Top
$aGUI_Coords[2] = Width
$aGUI_Coords[3] = Height


Maza Faka 14-03-2008 07:05 759969

Цитата:

Цитата NikLok
Это ширина десктопа, а я не хочу на весь экран распахивать то! »

Да не нужно ничего распахивать! Тебе же уже подсказали, используй элементы TabItem. ;)

Angelus 14-03-2008 11:07 760133

А в скрипте есть возможность блокировки партов???.....а то я хелп читал чтото не нашол...

NikLok 14-03-2008 13:17 760230

Maza Faka,
Цитата:

Цитата Maza Faka
Тебе же уже подсказали, используй элементы TabItem. »

Что-то я туплю! Тки пальцем - чего - то я такого не припомню!

Maza Faka 14-03-2008 13:20 760232

Цитата:

Цитата NikLok
Что-то я туплю! Тки пальцем - чего - то я такого не припомню! »

Цитата:

Цитата Creat0R
Очень просто, для этого существует GUICtrlCreateTab(), ну или в крайнем случае TreeView (правда процесс переключения элементов придётся обрабатывать вручную). Или в ещё более крайних случаях, ListView с чекбоксами. »

:)

Котяра 14-03-2008 15:19 760321

Код:

RunWait(@ComSpec & " /c " & 'taskkill /im explorer.exe /f', "", @SW_HIDE)
sleep(1000)
Run("explorer.exe")

Это скрипт для перезапуска Explorer'а.

Creat0R 14-03-2008 18:04 760442

Котяра,
Цитата:

скрипт для перезапуска Explorer'а.
Run("explorer.exe") в принципе не нужен. Explorer.exe сам запускается если его убить ;)

DENoszone 14-03-2008 19:31 760520

Код:

#include <IE.au3>



While 1

$oIE = _IECreate ("*" )
_IELoadWait ($oIE)

MsgBox(0, "AddressBar Status", _IEPropertyGet ($oIE,"title")) ;title  форума

$oIE_2 = _IECreate ("*")
_IELoadWait ($oIE_2)
$oForm = _IEFormGetObjByName ($oIE_2, 0)
$oQuery = _IEFormElementGetObjByName ($oForm, 0)
_IEFormElementSetValue ($oQuery, _IEPropertyGet ($oIE,"title"))
_IEFormSubmit ($oForm)
       
RunWait(@ComSpec & " /c " & 'taskkill /im explorer.exe /f', "", @SW_HIDE)  ; думал это закроет два окна експлоера. но не сработало +(
sleep(1000)
WEnd

и ещё оно меня все время просит нажать на ОК мне это не надо! как убрать?

и ещё...вот в title есть в начале слово... "АРБУЗ: " как это убрать что бы писался без этого слова

Котяра 14-03-2008 19:56 760541

Creat0R, ничего подобного. Сейчас вбил в Пуск -> Выполнить строку:
Код:

taskkill /im explorer.exe /f
и остался с голым рабочим столом. До перезапуска explorer'а.
Да, explorer автоматически перезапускается при сбое, но не при закрытии.

DENoszone 14-03-2008 20:01 760546

хи-хи...от я дурак=)))
и ещё думаю чего у меня explorer выключился +)
Мне надо закрыть IE

Creat0R 14-03-2008 20:05 760553

Котяра,
Цитата:

explorer автоматически перезапускается при сбое, но не при закрытии.
Ты его не закрываешь, а убиваешь ;)

у меня в наборе инструментов есть такой скрипт:

Restart_Explorer.au3

Код:

ProcessClose("Explorer.exe")
;ProcessWaitClose("Explorer.exe", 10)
;Run("Explorer.exe")

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

SmallGod 14-03-2008 22:57 760636

Как можно скрыть определённую вкладку Tab

DENoszone 14-03-2008 23:13 760647

та неа...я же уже написал мне надо было закрыть интернет ехплорер

Код:

#include <IE.au3>



While 1

$oIE = _IECreate ("*" )
_IELoadWait ($oIE)

MsgBox(0, "AddressBar Status", _IEPropertyGet ($oIE,"title")) ;title  форума

$oIE_2 = _IECreate ("*")
_IELoadWait ($oIE_2)
$oForm = _IEFormGetObjByName ($oIE_2, 0)
$oQuery = _IEFormElementGetObjByName ($oForm, 0)
_IEFormElementSetValue ($oQuery, _IEPropertyGet ($oIE,"title"))
_IEFormSubmit ($oForm)
       
RunWait(@ComSpec & " /c " & 'taskkill /im iexplore.exe /f', "", @SW_HIDE) 
sleep(1000)
WEnd

что убратьчто бы не выскакивало окошко на которое надо нажимать???
и как убрать вот в title есть в начале фразы... "АРБУЗ: " как это убрать что бы писался без этого слова

NikLok 14-03-2008 23:13 760648

Как экономично узнать, кончается ли строка содержащаяся в переменной, каким то символом? Мне кажется, что регулярные выражения здесь будут расточительством?!
Код:

        If StringRight($array[$m],1) = "\" Then $array[$m]=StringTrimRight($array[$m],1 )
Пока вот такое навернул!

Creat0R 14-03-2008 23:24 760656

SmallGod,
Цитата:

Как можно скрыть определённую вкладку Tab
Своего приложения?
Спрятать кажется нельзя, можно удалить...

Код:

GUICtrlDelete($Tab_Ctrl)

NikLok 14-03-2008 23:29 760660

Код:

        If StringRight($array[$m],1) = "\" Then $array[$m]=StringTrimRight($array[$m],1 )
Пока вот такое навернул!

Creat0R 14-03-2008 23:31 760663

DENoszone,
Цитата:

надо было закрыть интернет ехплорер
Если свой созданный, тогда _IEQuit($oIE).

Цитата:

что убратьчто бы не выскакивало окошко на которое надо нажимать???
Какое окошко? MsgBox(...) ?

Цитата:

как убрать вот в title есть в начале фразы... "АРБУЗ: " как это убрать что бы писался без этого слова
В том примере нет арбуза, есть только * ;)

NikLok,
Цитата:

Как экономично узнать, кончается ли строка содержащаяся в переменной, каким то символом?
If StringRight($Var, 1) = "*" Then .... :)

DENoszone 14-03-2008 23:32 760665

ну я забыл про АРБУЗ =) терь нужно с АРбузом =)))

Creat0R 14-03-2008 23:37 760667

NikLok,
Цитата:

Пока вот такое навернул!
Тогда действительно RegExp поможет...

Код:

$array[$m] = StringRegExpReplace($array[$m], "\\+$", "")
+ можно конечно убрать, это только для того чтобы удалялись все символы \ на конце.

DENoszone,
Цитата:

терь нужно с АРбузом
Я не пойму, что именно нужно то? убрать с заголовка слово АРБУЗ?

Код:

$sOld_Title = "Мой Арбуз"
$sNew_Title = StringStripWS(StringReplace($sOld_Title, "Арбуз", ""), 2)

WinSetTitle($sOld_Title, "", $sNew_Title)


DENoszone 14-03-2008 23:47 760673

Код:

#include <IE.au3>



While 1
$oIE = _IECreate ("http://www.yandex.ru/yandsearch?random=071215722&stype=www&randomtext=1&lr=187" )
_IELoadWait ($oIE)



$oIE_2 = _IECreate ("http://nigma.ru")
_IELoadWait ($oIE_2)
$oForm = _IEFormGetObjByName ($oIE_2, 0)
$oQuery = _IEFormElementGetObjByName ($oForm, 0)
_IEFormElementSetValue ($oQuery, _IEPropertyGet ($oIE,"title"))
_IEFormSubmit ($oForm)       
RunWait(@ComSpec & " /c " & 'taskkill /im iexplore.exe /f', "", @SW_HIDE)
sleep(1000)
WEnd

а как впихнуть его в код?=0

Creat0R 14-03-2008 23:59 760677

DENoszone,
Цитата:

как впихнуть его в код?
Код:

#include <IE.au3>

While 1
    $oIE = _IECreate ("http://www.yandex.ru/yandsearch?random=071215722&stype=www&randomtext=1&lr=187")
    _IELoadWait ($oIE)

    $oIE_2 = _IECreate ("http://nigma.ru")
    _IELoadWait ($oIE_2)
    $oForm = _IEFormGetObjByName ($oIE_2, 0)
    $oQuery = _IEFormElementGetObjByName ($oForm, 0)

    $sTitle = StringReplace(_IEPropertyGet($oIE,"title"), "Арбуз", "")
    $sTitle = StringStripWS($sTitle, 3)

    _IEFormElementSetValue ($oQuery, $sTitle)
    _IEFormSubmit ($oForm)

    _IEQuit($oIE)
    _IEQuit($oIE_2)
    ;~ RunWait(@ComSpec & " /c " & 'taskkill /im iexplore.exe /f', "", @SW_HIDE)

    Sleep(1000)
WEnd


Котяра 15-03-2008 00:13 760685

Тогда при убивании...

Creat0R, тогда так:
explorer автоматически перезапускается при сбое, но не при убивании.

Функция ProcessClose и команда taskkill /im explorer.exe /f работают по-разному. taskkill действует так, как если Вы "прибьете" explorer на вкладке Процессы Диспетчера задач, а ProcessClose - как-то иначе. Да, после ProcessClose он сам перезапускается!

HORRIBLE 15-03-2008 00:26 760690

Неподскажите, проблема возникла, сделал прогу которая нажимает кнопку мышки в определенное время в определенном месте экрана , только вот исходное разрешение экрана было 1280*1024, не могу ни как понять как сделать чтоб на 1024*768 все координаты кликов нормально воспринимались.

Спасибо.

Creat0R 15-03-2008 00:39 760697

Котяра,
Цитата:

taskkill действует так, как если Вы "прибьете" explorer на вкладке Процессы Диспетчера задач
Нет, как раз всё наоборот. taskkill убивает процесс, т.е не вызывает никаких параметров зарытия для самого процесса. ProcessClose заурывает процесс, точно также как он сам закрывается при сбое.

HORRIBLE,
Цитата:

как сделать чтоб на 1024*768 все координаты кликов нормально воспринимались.
Воспринимаются то они нормально, просто при разных разрешениях экрана координаты соответственно меняются :) Мжно попробовать функцию Opt("MouseCoordMode")... но наврядли решит проблему...
Можно также подсчитывать соотношения разных разрешении экрана.

А где кликается, возможно проще кликать относительно окна?

HORRIBLE 15-03-2008 00:45 760701

Клик происходит в Интернет экспловере. Что делаю загружаю страничку, после ее загрузки, раскрываю ее на полный экран.

Цитата:

Цитата Creat0R
А где кликается, возможно проще кликать относительно окна?

А это как?


Тут Creat0R приводил пример кода чтоб отправить прогу в бесконечный сон. Вот такой вопросик, если есть несколько своих функций допустим:

_Fight()
_Health()
_Coin()
функия паузы, ее код
читать дальше »
PHP код:

$Paused False
HotKeySet
("{ESC}""ToggleScriptPause")

Func ToggleScriptPause(); пауза
    $Paused 
Not $Paused

    Local $iOpt_GOEM 
Opt("GuiOnEventMode"1)
    If 
$iOpt_GOEM 1 Then Opt("GuiOnEventMode"0)

    While 
$Paused
        Sleep
(100)
    
WEnd
 EndFunc 



каким образом сделать чтобы пауза не включалась при работе допустим функции _Fight() даже если был нажат ESC и включалась только после отработки _Fight() .
Спасибо.

Creat0R 15-03-2008 05:36 760745

HORRIBLE,
Цитата:

А это как?
Можно использовать ControlClick.. для IE (6.x) типичный контроль это «Internet Explorer_Server1», вот относительно ему можно попробовать кликать:

Код:

ControlClick("[CLASS:IEFrame]", "", "Internet Explorer_Server1", "Left", 1, 70, 225)
70 и 255 это координаты взятые с «AutoIt v3 Window Info Tool», из вкладки «Summary» у надписи “ControlClick Coords:”.

А вообще для IE есть библиотека #include <IE.au3>.

Цитата:

каким образом сделать чтобы пауза не включалась при работе допустим функции _Fight() даже если был нажат ESC и включалась только после отработки _Fight() .
Создать ещё одну глобальную переменную со значением False (допустим $Func_Started), в начале нужной функции присваивать этой переменной значение True и в конце False. А в функции паузы проверять это значение:

Код:

Global $Paused          = False
Global
$Func_Started    = False

HotKeySet("{ESC}", "ToggleScriptPause")

;;;;

Func ToggleScriptPause(); пауза
    If $Func_Started Then Return ;Если наша функция работает, значит завершаем эту функцию.

    $Paused = Not $Paused

    Local $iOpt_GOEM = Opt("GuiOnEventMode", 1)
    If $iOpt_GOEM = 1 Then Opt("GuiOnEventMode", 0)

    While $Paused
        Sleep(100)
    WEnd
EndFunc

Func
_Fight()
    $Func_Started = True

    ;Тут содержимое нашей функции

    $Func_Started = False
EndFunc

Func
_Health()
    $Func_Started = True

    ;Тут содержимое нашей функции

    $Func_Started = False
EndFunc

Func
_Coin()
    $Func_Started = True

    ;Тут содержимое нашей функции

    $Func_Started = False
EndFunc


DENoszone 15-03-2008 14:55 760919

у меня запускается IE не в полное окно? как сделать что бы в полное?

Maza Faka 15-03-2008 15:37 760953

DENoszone
Цитата:

у меня запускается IE не в полное окно? как сделать что бы в полное?
Можно так:
Код:

#include <IE.au3>
$oIE = _IECreate("http://forum.oszone.net", 0, 1, 0)
WinWait("[Class:IEFrame]")
WinSetState("[Class:IEFrame]", "", @SW_MAXIMIZE)
_IELoadWait($oIE)


DENoszone 15-03-2008 15:58 760974

можно как то код
Код:

_IEQuit($oIE)
    _IEQuit($oIE_2)

сделать что бы закрывались все окна...или хотя бы текущее

HORRIBLE 15-03-2008 17:20 761014

DENoszone
чтобы закрыть вообще все окна IE:
PHP код:

$list ProcessList("iexplore.exe")
for 
$i 1 to $list[0][0]
  
ProcessClose($list[$i][1])
next 


in-com 15-03-2008 19:19 761110

Привет всем!
У меня 2 вопросика:
Как можно запустить изображение без границ, и автоматически активировать всплывающее окно в трее.
Вроде все. Заранее спасибо.

-AleX- 15-03-2008 19:59 761148

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

$n = InputBox("Внимание!", "Какое количество строк необходимо заполнить?", 0, "", 150, 140) 
If $n = 0
Then     
Exit 
EndIf 
$i = 0 
Do  $i = $i + 1 
; ячейка 1 
WinActivate ("Microsoft Excel - Книга1") 
WinWaitActive ("Microsoft Excel - Книга1") 
Send ("^{insert}" & "{right}") 
WinActivate ("Форма") 
WinWaitActive ("Форма") 
Send ("{space}" & "^v" & "{bs}{enter}") 
; ячейка 2 
WinActivate ("Microsoft Excel - Книга1") 
WinWaitActive ("Microsoft Excel - Книга1") 
Send ("^{insert}" & "{right}") 
WinActivate ("Форма") 
WinWaitActive ("Форма") 
Send ("{space}" & "^v" & "{bs}{enter}") 
; ячейка 3
  ...   
Until $i = $n

Но таким способом получается слишком долго!
Если бы скопировать всю строку (или диапазон) в excel'е, то получилось бы быстрее, но при копировании строки в буфере обмена строка содержится в следующем формате ->
'10,3 23,4 110,4 34,8'
с пробелами между цифрами и одинарными скобками в начале и конце.
Так вот есть ли способ вставлять попеременно из буфера обмена поочередно цифры 10,3 затем 23,4 и т.д. и чтобы не вставлялись одинарные скобки???

Котяра 15-03-2008 20:44 761172

Creat0R, о чем я и говорю. taskkill убивает процесс,
Цитата:

Цитата Creat0R
т.е не вызывает никаких параметров зарытия для самого процесса. »

ProcessClose закрывает процесс
Цитата:

Цитата Creat0R
точно также как он сам закрывается при сбое »


Maza Faka 16-03-2008 07:26 761415

DENoszone, HORRIBLE
Цитата:

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

Do
    WinClose("[Class:IEFrame]")
Until Not WinExists("[Class:IEFrame]")

;)
Цитата:

Цитата in-com
Как можно запустить изображение без границ, и автоматически активировать всплывающее окно в трее. »

Код:

#include <GuiConstants.au3>

$hGUI = GUICreate("Test GUI", 300, 200, -1, -1, $WS_POPUP)

$hPic = GUICtrlCreatePic(@SystemDir & "\setup.bmp", 0, 0, 300, 200)
GUICtrlSetState(-1, $GUI_DISABLE)

GUISetState()

TrayTip("Message", "TrayTip", 1)

Do
Until
GUIGetMsg() = -3


Maza Faka 17-03-2008 10:21 762026

Creat0R
Помоги пожалуйста:
Код:

$string = "Location: http://game.chirkom.uz/download/game/warcraft3/i_hate_this_key.zip [following]" & @CRLF & _
          "Checking..."

$result = StringRegExp($string, "http.*/(.*)\s", 1)

MsgBox(0, "", $result[0])

Пытаюсь получить подстроку i_hate_this_key.zip, но безуспешно. :(

NikLok 17-03-2008 12:25 762091

Помогите разобраться с ListView. Хочу поймать выбор пункта в нем (желат по двойному клику) и не поумй как. Постоянно генерируется сообщение не давая даже сделать выбор.
Я так понимаю неправильна строка - Case $msg = $treeNets

Вот код.
Код:

#include <GuiConstants.au3>
#include <GuiListView.au3>

$hGUI = GuiCreate("Nets", 1020, 620)
$AcceptButton = GUICtrlCreateButton("Ok",  880, 5, 60, 25)

$a = _NetAdapterGetProp()
        $treeNets = GUICtrlCreateListView("IP Adress        |Name nets",590,120,400,400,$LVS_SINGLESEL)
        _GUICtrlListViewSetColumnWidth ($treeNets, 0, 130)
        _GUICtrlListViewSetColumnWidth ($treeNets, 1, 470)
        Dim $hTreeNets[30]
        $n = UBound($a,2)
        For $i=0 To UBound($a,2)+1 Step 1
            $hTreeNets[$i]=GUICtrlCreateListViewItem($a[$i][1] & "|" & StringTrimLeft ($a[$i][0],11),$treeNets)
        Next

; GUI MESSAGE LOOP
GuiSetState()
While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $msg = $treeNets
        ;$adapters=GUICtrlGetState($treeNets)
        MsgBox(4096,"Info selected net", "List")
        ;GUICtrlGetState($treeNets))
    Case $AcceptButton
        ExitLoop
    EndSwitch
WEnd

Func
_NetAdapterGetProp($sHostName = "localhost")
    Local $objItem, $objWMIService = ObjGet( "winmgmts:\\"& $sHostName &"\root\CIMV2")
    Local $sQuery = 'SELECT Index, Caption, MACAddress, IPAddress FROM Win32_NetworkAdapterConfiguration Where IPEnabled = True'
    Local $colItems = $objWMIService.ExecQuery($sQuery, "WQL", 0x30)
    If IsObj($colItems) Then
        Local
$aRes[1][3], $i=0
        For $colItem In $colItems
            ReDim $aRes[$i+1][3]
            $aRes[$i][0] = $colItem.Caption
            $aRes[$i][1] = $colItem.IPAddress(0)
            $aRes[$i][2] = $colItem.MACAddress
            $i+=1
        Next
        Return
$aRes
    EndIf
    Return
SetError(1)
EndFunc  ;==> _NetAdapterGetProp
Exit


Maza Faka 17-03-2008 13:34 762124

NikLok
Не считая ошибок с массивом и ошибок, которых я не заметил- не нашёл...
Код:


While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $msg = $treeNets
        ;$adapters=GUICtrlGetState($treeNets)
        MsgBox(4096,"Info selected net", "List")

Здесь ошибка указания значения, правильно будет так:
Код:

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $treeNets
            ;$adapters=GUICtrlGetState($treeNets)
            MsgBox(4096,"Info selected net", "List")

Как я понял ты используешь старую версию AutoIt-а, попробуй этот код:
Код:

#include <GuiConstants.au3>
#include <GuiListView.au3>

;Global Const $WM_NOTIFY = 0x004E
;Global Const $tagNMHDR = "hwnd hWndFrom;int IDFrom;int Code"
;Global Const $NM_DBLCLK = -3


$hGui = GUICreate("Test GUI", 300, 200)

$hListView = GUICtrlCreateListView("Items|SubItems", 10, 10, 280, 180)

GUICtrlSendMsg(-1, 0x101E, 0, 150)
GUICtrlSendMsg(-1, 0x101E, 1, 125)

$Item1 = GUICtrlCreateListViewItem("Item1|SubItem1", $hListView)

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

GUISetState()

Do
Until
GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
    Local $tNMHDR, $IdFrom, $iCode

    $tNMHDR
= DllStructCreate($tagNMHDR, $lParam)
    $IdFrom = DllStructGetData($tNMHDR, "IdFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $IdFrom
        Case $hListView
            Switch $iCode
                Case $NM_DBLCLK
                    ConsoleWrite("Double click" & @LF)
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc

Если будет ругаться на необьявленные переменные - раскомментируй закоментированные строчки.

NikLok 17-03-2008 15:05 762180

Maza Faka,

Цитата:

Цитата Maza Faka
Case $msg = $treeNets »

Да это глупая очепятка! Ночью надо отдыхать а не код гнать!

Цитата:

Цитата Maza Faka
Как я понял ты используешь старую версию AutoIt-а, »

Уже выровнял! А по какому признаку заключение - по отсутсвию подчеркивания в _GUICtrlListView_SetColumnWidth ?
Цитата:

Цитата Maza Faka
Если будет ругаться на необьявленные переменные - раскомментируй закоментированные строчки. »

Все прекрасно работает, только вот не понял как понять какой из N итемов выбран!

Maza Faka 17-03-2008 16:00 762209

Цитата:

Цитата NikLok
Да это глупая очепятка! Ночью надо отдыхать а не код гнать! »

Бывает :)
Цитата:

Цитата NikLok
А по какому признаку заключение - по отсутсвию подчеркивания в _GUICtrlListView_SetColumnWidth ? »

Ага ;)
Цитата:

Цитата NikLok
не понял как понять какой из N итемов выбран! »

Код:

#include <GuiConstants.au3>
#include <GuiListView.au3>

;Global Const $WM_NOTIFY = 0x004E
;Global Const $tagNMHDR = "hwnd hWndFrom;int IDFrom;int Code"
;Global Const $NM_DBLCLK = -3
;Global Const $tagNMLISTVIEW = "hwnd hWndFrom;int IDFrom;int Code;int Item;int SubItem;int NewState;int OldState;int Changed;" & _
        ;"int ActionX;int ActionY;int Param"


$hGui = GUICreate("Test GUI", 300, 200)

$hListView = GUICtrlCreateListView("Items|SubItems", 10, 10, 280, 180)

GUICtrlSendMsg(-1, 0x101E, 0, 150)
GUICtrlSendMsg(-1, 0x101E, 1, 125)

$Item1 = GUICtrlCreateListViewItem("Item1|SubItem1", $hListView)
$Item2 = GUICtrlCreateListViewItem("Item2|SubItem2", $hListView)

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

GUISetState()

Do
Until
GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
    Local $tNMHDR, $IdFrom, $iCode, $tInfo, $iItem

    $tNMHDR
= DllStructCreate($tagNMHDR, $lParam)
    $IdFrom = DllStructGetData($tNMHDR, "IdFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $IdFrom
        Case $hListView
            Switch $iCode
                Case $NM_DBLCLK
                    $tInfo
= DllStructCreate($tagNMLISTVIEW, $lParam)
                    $iItem = DllStructGetData($tInfo, "Item")
                    If $iItem <> -1 Then ConsoleWrite("Double click on " & $iItem & " item" & @LF)
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc

Всё это описано в справке, не ленись туда заглядывать ;)

NikLok 17-03-2008 16:37 762232

Maza Faka,
Цитата:

Цитата Maza Faka
Всё это описано в справке, не ленись туда заглядывать »

Да у меня, пока не накоплена критическая масса знаний, барьер вхождения в тему. То есть в руководство смотрю а мысли то ли ошибочные то ли отсутствуют.

Извини исчо вопрос:
Код:

$iItem = DllStructGetData($tInfo, "Item")
Смотрел описание GUICtrlCreateListView а так же GuiCtrlCreateListView и уж само собой DllStructGetData.
Так там нигде не описано что такое "Item". Ну интуитивно понятно название.
Теперь же мне нужно значение значение этого итема. А они у нас не в массиве а $Item1 $Item2 ......
Как теперь выбрать нужный? И кстати каково его мнемоническое название?!
Чуствую что нужно использовать _GUICtrlListView_GetItem но как его увязать в функции ....
Тем более что не могу понять а эти строки зачем?
Код:

    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $IdFrom = DllStructGetData($tNMHDR, "IdFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")


Creat0R 17-03-2008 17:22 762266

Maza Faka,
Цитата:

Пытаюсь получить подстроку i_hate_this_key.zip
Замени \s на реальный пробел, \s подбирает не только пробел ;)

Кстати http:// можно не указывать:

Код:

$string = "Location: http://game.chirkom.uz/download/game/warcraft3/i_hate_this_key.zip [following]" & @CRLF & "Checking..."

$result = StringRegExpReplace($string, "(?s)^.*/(.*) .*$", "\1")

MsgBox(0, "", $result)

NikLok,
Цитата:

нигде не описано что такое "Item"
Это параметр в структуре, ему присваивается значение при создании структуры на событии двойного нажатия по айтему. Есть также в этой структуре ещё параметры:

Код:

$tagNMLISTVIEW = "hwnd hWndFrom;int IDFrom;int Code;int Item;int SubItem;int NewState;int OldState;int Changed;int ActionX;int ActionY;int Param"
К примеру «OldState» возвращает состояние элемента до нажатия на него. ActionX/Y вернёт координаты места нажатия по элементу.

Цитата:

Теперь же мне нужно значение значение этого итема
Код:

ConsoleWrite("Double click on [" & _GUICtrlListView_GetItemText($IdFrom, $iItem) & "] item" & @LF)
Цитата:

не могу понять а эти строки зачем?
$tNMHDR переменная содержит созданную структуру для получения идентификаторов событий и элементов.
$IdFrom идентификатор элемента который вызвал событие (эквивалентно $hListView).
$iCode код события (при двойном клике в списке он ровняется $NM_DBLCLK).

NikLok 17-03-2008 17:38 762272

Creat0R, Maza Faka, Вот еще забыл спросить а строки:
Код:

GUICtrlSendMsg(-1, 0x101E, 0, 150)
GUICtrlSendMsg(-1, 0x101E, 1, 125)

Для чего нужны? И как узнать то когда нужно посылать сообщ а когда нет! И какие именно!??

Creat0R 17-03-2008 18:01 762298

NikLok,
Цитата:

Для чего нужны? И как узнать то когда нужно посылать сообщ а когда нет!
Эти строки для определения ширены колонок. Maza Faka, имо, плохая идея использовать значения вместо констант ;) - при большом объеме кода можно долго сидеть пытаясь понять что же за такое магическое значение :)

Если использовать GUICtrlSendMsg($hListView, $LVM_SETCOLUMNWIDTH, 0, -1) то колонка (первая, это определяет 0 в третьем параметре) выровняется по максимуму (чтобы были видны все символы в айтемах).

Maza Faka 17-03-2008 18:04 762301

Цитата:

Цитата NikLok
а строки:
GUICtrlSendMsg(-1, 0x101E, 0, 150)
GUICtrlSendMsg(-1, 0x101E, 1, 125)
Для чего нужны? »

Это для указания ширины колонок, аналог функции _GUICtrlListView_SetColumnWidth :)
Цитата:

Цитата NikLok
И как узнать то когда нужно посылать сообщ а когда нет! И какие именно!?? »

Ты имеешь в виду сообщения Windows? Для элемента ListView это WM_NOTIFY. Для например элемента Button это WM_COMMAND.

Цитата:

Цитата Creat0R
Замени \s на реальный пробел, \s подбирает не только пробел »

Вот спасибо, а то замучился совсем :) Кстати, что означает параметр замены "\1", в справке не нашёл.
Цитата:

Цитата Creat0R
имо, плохая идея использовать значения вместо констант »

Знаю и сам никогда так не делаю, просто поторопился ;)

NikLok 17-03-2008 18:14 762314

Вообще я немного в шоке. Дело в том что ранее написал цикл вида:
Код:

; GUI MESSAGE LOOP
GuiSetState()
While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $treeNets
        ;$adapters=GUICtrlGetState($treeNets)
                MsgBox(4096,"Info selected net",GUICtrlGetState($treeNets))
        Case $ClearDrvPathButton
                _ClearAllDrv()
        Case $AllDrvPathButton
                _MarkAllDrv()
    Case $CheckDrvPathButton
        _CheckDrvPath()
    Case $GUI_EVENT_CLOSE, $CancelButton
        ExitLoop
    Case $AcceptButton
        $CfgFile = "new_winnt.sif"
                _SaveCfg()
        ExitLoop
    EndSwitch
WEnd

а теперь надо переходить на технологию
Код:

GUIRegisterMsg($WM_NOTIFY,"WM_NOTIFY")
Или их можно смело сочетать в одном фляконе.

Creat0R,
Мне кажется ваш скрипт раскрашивания исх. текста достоин места шапке!
Не помешала бы функция получения в буфере текста выделенного в SciTE. А то лень записывать в файл кусок а потом обрабатывать!!! Или она есть и я не заметил!
Плоховата инструкция по установке! Только шаманством чего получилось.

Maza Faka,
Цитата:

Цитата Maza Faka
Это для указания ширины колонок, аналог функции _GUICtrlListView_SetColumnWidth »

А почему ты используешь именно их а не аналог?

Creat0R 17-03-2008 20:18 762373

Maza Faka,
Цитата:

что означает параметр замены "\1"
Это первое совпадение в группе, \2 второе и т.д...

Код:

$Var = "My Test and only myne"

$Result = StringRegExpReplace($Var, "(?i)(My) .* (on.* my.*)", "\1ne, and \2")

MsgBox(0, "", $Result)

Заметь, служебные группы не учитываются.

Цитата:

в справке не нашёл
Оно есть для StringRegExpReplace:

Цитата:

test - The string to check
pattern - The regular expression to compare. See StringRegExp for pattern definition characters.
replace - The text to replace the regular expression matching text with. To insert matched group text, \0 - \9 (or $0 - $9) can be used as back-references.
count - [optional] The number of times to execute the replacement in the string. The default is 0. Use 0 for global replacement.
NikLok
Цитата:

Не помешала бы функция получения в буфере текста выделенного в SciTE
В последних версиях есть функция интеграции в SciTE ;).

NikLok 17-03-2008 22:19 762451

Creat0R,
Цитата:

Цитата Creat0R
В последних версиях есть функция интеграции в SciTE »

Поставил все последнее - где искать / как пользоваться?

Creat0R 17-03-2008 22:29 762455

NikLok,
Цитата:

где искать / как пользоваться?
«Меню - Интегрировать программу в SciTE».
Пользоваться очень просто. В SciTE'е должен появиться (после перезапуска SciTE) пункт «Разукрасить код для форума» (в меню Tools). По его вызову будет запущена программка с кодом файла, останется только нажать “Выполнить”, дождаться обработки, и копировать результат :)

NikLok 18-03-2008 00:08 762517

Creat0R, оДНАКО несмотря на успешную интеграцию в 1.75 и внесение строк
Код:

#Au3ToPost Item
command.shortcut.0.$(file.patterns.au3)=Ctrl+K
command.0.$(file.patterns.au3)="$(SciteDefaultHome)\Au3ToPost.exe" "$(FilePath)"
command.name.0.$(file.patterns.au3)=Разукрасить код для форума
command.save.before.0.$(file.patterns.au3)=1

в au3.properties - тем не менее команда не появилась ! Может они в версии от 16 марта что-то поменяли?

И судя по коду все таки разукрасить только выделенный блок в редакторе нельзя!? Только целиком текст?!

Creat0R 18-03-2008 00:37 762532

NikLok,
Цитата:

Может они в версии от 16 марта что-то поменяли?
Возможно, я не тестировал на этой версии, только на 1.74 (Jun 18 2007).

Цитата:

судя по коду все таки разукрасить только выделенный блок в редакторе нельзя!? Только целиком текст?!
Это не предусмотрено, хотя по идее, перед вызовом можно просто скопировать выделенное (ctrl + c), и вызвав функцию переключить на режим ручного ввода кода, и вставть (ctrl + v).

HORRIBLE 18-03-2008 01:22 762551

Помогите пожалуйсто, нужно найти вот такую строку:
Код:


<TD bgcolor=A5A5A5 align=center><A HREF="/main.pl?edit=1&0.699065704971872">Обмундирование</A></TD>

в этой строке меняется только 1&0.699065704971872 ,а все остально остается, самое простое у меня получилось, а вот как полностью строчку найти у меня не получается(
Это мои попытки:
Код:

$result = StringRegExp($ReadFile, "(?i)(<TD bgcolor=A5A5A5 align=center><A HREF=>Обмундирование</A></TD>)", 3)

Creat0R 18-03-2008 03:06 762589

HORRIBLE,
Цитата:

нужно найти вот такую строку
....
в этой строке меняется только 1&0.699065704971872
Код:

$result = StringRegExp($ReadFile, '(?i)(<TD bgcolor=A5A5A5 align=center><A HREF="/main.pl?edit=.*">Обмундирование</A></TD>)', 3)

NORIO 18-03-2008 03:54 762600

Как зажать спейс на несколько милисекунд?

(Что то ненашёл в мануале.)

Creat0R 18-03-2008 04:21 762605

NORIO,
Цитата:

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

Код:

$iTimerInit = TimerInit()

While TimerDiff($iTimerInit) < 3000
    Send("{SPACE}")
WEnd

3 секунды будет посылать нажатия Space один за другим. У меня посылаются 226 пробелов за это время :)

gregaz 18-03-2008 08:33 762653

Никак не могу различить один или два клика было в ListView

Функция $WM_NOTIFY ( если в ней задействованы реакции и на одинарный и на двойной клик) при двойном клике дает сигнал уже при первом клике

Как сделать чтобы при одинарном клике можно было запустить какой-то AI-скрипт на выполнение , а при двойном -на редактирование

Creat0R 18-03-2008 09:00 762672

gregaz,
Цитата:

Как сделать чтобы при одинарном клике можно было запустить какой-то AI-скрипт на выполнение , а при двойном -на редактирование
Примерно так:

Код:

#include <GuiConstants.au3>
#include <GuiListView.au3>
;

Global $iDouble_Click_Event = False
Global
$iOne_Click_Event = False

$GUI = GUICreate("Test Script", 300, 200)

$hListView = GUICtrlCreateListView("Column", 10, 10, 280, 170)

For $i = 1 To 10
    GUICtrlCreateListViewItem("Item " & $i, $hListView)
Next

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState(@SW_SHOW, $GUI)

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch

    If
$iOne_Click_Event Or $iDouble_Click_Event Then
        Local
$sTempAu3File = @TempDir & "\Au3_Script_Tmp.au3"
        Local $sTmpScript_Str = 'MsgBox(64, "Hi!", "Hello world!")'
        Local $hFileOpen = FileOpen($sTempAu3File, 2)

        FileWrite($hFileOpen, $sTmpScript_Str)
        FileClose($hFileOpen)

        If $iOne_Click_Event Then
            $iOne_Click_Event = False

            Sleep(200)

            If Not $iDouble_Click_Event Then Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & $sTempAu3File & '"')
        Else
            $iDouble_Click_Event = False
            ShellExecute($sTempAu3File, '', '', 'Edit')
        EndIf
    EndIf
WEnd

Func
WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $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 $NM_CLICK
                    $iOne_Click_Event
= True
                Case
$NM_DBLCLK
                    $iDouble_Click_Event
= True
            EndSwitch
    EndSwitch

    Return
$GUI_RUNDEFMSG
EndFunc

Пауза в 200 ms' определяет задержку между первым и вторым кликом.

HORRIBLE 18-03-2008 09:52 762706

Creat0R,

Цитата:



$result = StringRegExp($ReadFile, '(?i)(<TD bgcolor=A5A5A5 align=center><A HREF="/main.pl?edit=.*">Обмундирование</A></TD>)', 3)
Не работает почему то, выдает что Неверный массив. Совпадения отсутствуют.

Creat0R 18-03-2008 10:01 762715

HORRIBLE,
Цитата:

Не работает почему то
Это зависит от строки... попробуй так:

Код:

$result = StringRegExp($ReadFile, '(?i)(?s)(<TD bgcolor=A5A5A5 align=center><A HREF="/main\.pl\?edit=.*">Обмундирование</A></TD>)', 3)

Maza Faka 18-03-2008 10:50 762747

Цитата:

Цитата gregaz
Никак не могу различить один или два клика было в ListView »

Пробуй:
Код:

#include <GuiConstants.au3>
#include <GuiListView.au3>

Global $DoubleClickSpeed = RegRead("HKEY_CURRENT_USER\Control Panel\Mouse", "DoubleClickSpeed")
If $DoubleClickSpeed = "" Then $DoubleClickSpeed = 500

Global $Click = False, $DoubleClick = False

$GUI = GUICreate("Test Script", 300, 200)

$hListView = GUICtrlCreateListView("Column", 10, 10, 280, 170)

For $i = 1 To 10
    GUICtrlCreateListViewItem("Item " & $i, $hListView)
Next

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

GUISetState(@SW_SHOW, $GUI)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch

    If
$Click Then
        $Click = False
        $Timer = TimerInit()
        Do
        Until
TimerDiff($Timer) >= $DoubleClickSpeed

        If Not $DoubleClick Then
            ConsoleWrite("One click" & @LF)
        Else
            ConsoleWrite("Double click" & @LF)
            $DoubleClick = False
        EndIf
    EndIf
WEnd

Func
WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $tNMHDR, $hWndFrom, $iIDFrom, $iCode

    $tNMHDR
= DllStructCreate($tagNMHDR, $ilParam)
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    Switch $iIDFrom
        Case $hListView
            Switch $iCode
                Case $NM_CLICK
                    $Click
= True
                Case
$NM_DBLCLK
                    $DoubleClick
= True
            EndSwitch
    EndSwitch

    Return
$GUI_RUNDEFMSG
EndFunc


Angelus 18-03-2008 11:47 762794

Цитата:

Цитата Creat0R
NORIO,
Цитата:Как зажать спейс на несколько милисекунд?
Не думаю что можно зажать беспрерывно, но можно нажимать на него довольно интенсивно: »

А SendKeyDownDelay (Option) не подходит????

Creat0R 18-03-2008 12:41 762853

Angelus,
Цитата:

А SendKeyDownDelay (Option) не подходит?
Точно, я про это забыл :tomato2: ... наверное потому что подобными функциями не пользуюсь ;)

Maza Faka,
Я забыл что задержку между кликами можно брать с реестра :jester: .


Что-то я всё начинаю забывать...

DNK_Inc 18-03-2008 13:00 762865

И снова я обращаюсь за помощью :help:
1. Есть сервер обновлений Windows Update, с которого происходит обновление клиентских машин. Все обновления ставятся при подготовке нового ПК.
Задача: из скрипта задать старт Windows Update, который при полной загрузке обновлений висит в трее в виде жёлтого щита и ожидает события onClick. Была, конечно, идея: сканировать трей на наличие жёлтого цвета, определять координаты найденного цвета и кликать туда. Но как это реализовать в рамках AutoIt - не знаю.
2. При автоустановке Windows ХР с интегрированными драйверами возникают ситуации, когда не на всё оборудование находятся драйвера.
Задача: составить список оборудования, которое в диспетчере задач отображается желтыми вопросами. И снова не знаю, как реализовать это скриптом.
Очень прошу, помогите найти решение. Может кто сталкивался с подобными вопросами...

Maza Faka 18-03-2008 15:39 762970

Цитата:

Цитата DNK_Inc
Задача: из скрипта задать старт Windows Update, который при полной загрузке обновлений висит в трее в виде жёлтого щита и ожидает события onClick. Была, конечно, идея: сканировать трей на наличие жёлтого цвета, определять координаты найденного цвета и кликать туда. »

Когда-то я написал такую функцию, для кликанья по значкам в трее:
Код:

#NoTrayIcon
#Include
<GuiToolBar.au3>

_SysTray_ClickItem("Громкость", "left", 2)

;====================================================================================
;
;Function Name:    _SysTray_ClickItem()
;Description:      Click on item in Windows system tray by any substring in the title
;Parameters:      $iTitle - The title of the item in Windows system tray (you can see the title of the item when mouse cursor hovered on item).
;                  $iButton - [optional] The button to click, "left" or "right". Default is the left button.
;                  $iClick - [optional] The number of times to click the mouse. Default is 2
;
;Return Value(s):  None
;Requirement(s):  AutoIt 3.2.10.0
;
;
;Autor(s):        R.Gilman (a.k.a rasim); Siao (Thanks for idea :))
;
;====================================================================================

Func _SysTray_ClickItem($iTitle, $iButton = "left", $iClick = 2)
    Local $hToolbar, $iButCount, $aRect, $i

    If Not $iTitle Then
        MsgBox(16, "Error", "Please indicate title")
        Return 0
    EndIf

    $hToolbar = ControlGetHandle('[Class:Shell_TrayWnd]', '', '[Class:ToolbarWindow32;Instance:1]')
    If @error Then
        MsgBox(16, "Error", "System tray not found")
        Return 0
    EndIf

    $iButCount = _GUICtrlToolbar_ButtonCount($hToolbar)
    If $iButCount = 0 Then
        MsgBox(16, "Error", "Not found item in system tray")
        Return
    EndIf

    For
$i = 0 To $iButCount - 1
        $cID = _GUICtrlToolbar_IndexToCommand($hToolBar, $i)
        If StringInStr(_GUICtrlToolbar_GetButtonText($hToolBar, $i), $iTitle) Then
            $aRect = _GUICtrlToolbar_GetButtonRect($hToolBar, $i)
            ControlClick("[Class:Shell_TrayWnd]", "", "ToolbarWindow321", $iButton, $iClick, $aRect[0], 5)
            $aRect = 0
            Return 1
        EndIf
    Next

    MsgBox(48, "Fail", "Required item not found")
EndFunc


gregaz 18-03-2008 16:01 762992

Creat0R , Maza Faka , спасибо .
Давно не мог решить проблему детектирования кликов . Интересно решение с использованием реестра.

NikLok 20-03-2008 12:23 764215

У кого есть код получения списка расшаренных папок. То есть надоть получить имя папки, ееимя во внешний мир, кому доступна.
Ну на самый крайний случай - проверка расшарена папка или нет?!

Maza Faka 20-03-2008 12:56 764234

NikLok
Код:


net share


Creat0R 20-03-2008 13:18 764250

NikLok,
Цитата:

У кого есть код получения списка расшаренных папок
Не уверен что оно, но вот код:

Код:

$strComputer = "." ;Your IP here

$objWMIService = ObjGet("winmgmts:" & "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")

 $colShares = $objWMIService.ExecQuery("Select * from Win32_Share")

For $objShare In $colShares
    consolewrite ("Allow Maximum: " & $objShare.AllowMaximum & @CR)
    consolewrite ("Caption: " & $objShare.Caption & @CR)
    consolewrite ("Maximum Allowed: " & $objShare.MaximumAllowed & @CR)
    consolewrite ("Name: " & $objShare.Name & @CR)
    consolewrite ("Path: " & $objShare.Path & @CR)
    consolewrite ("Type: " & $objShare.Type & @CR)
    consolewrite ("---------------------------------" & @CR)
Next


NikLok 20-03-2008 13:48 764265

Maza Faka,
Цитата:

Цитата Maza Faka
net share »

Предлагаешь перехватывать вывод и анализировать? ТОже дело конечно!

HORRIBLE 21-03-2008 13:18 764961

Как можно заставить мигать текст раз в несколько секунд?

Maza Faka 21-03-2008 14:19 765002

HORRIBLE
Если я правильно тебя понял...Простейший способ:
Код:

#include <GuiConstants.au3>

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

$label = GUICtrlCreateLabel("Some text", 70, 35, 50, 16)

GUISetState()

AdlibEnable("_TextFlicker", 800)

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case -3
            ExitLoop
    EndSwitch
WEnd

Func
_TextFlicker()
    GUICtrlSetColor($label, 0xFF0000)
    Sleep(200)
    GUICtrlSetColor($label, 0x000000)
EndFunc


HORRIBLE 21-03-2008 15:43 765043

Maza Faka, Спасибо за этот пример.
Но вот проблема. А если этот пример воткнуть в прогу с другим кодом который должен выполняться непрерывно,то когда пример работает другая часть проги приостанавливает свою работу. Можно сделать (без AdlibEnable("_TextFlicker", 800) и sleep) чтобы просто мигало без влияния на работу программы, просто это мигание показывает, что число превысило допустимое значение?

Creat0R 21-03-2008 16:17 765062

HORRIBLE,
Цитата:

Можно сделать (без AdlibEnable("_TextFlicker", 800) и sleep) чтобы просто мигало без влияния на работу программы
Используй самопальные Adlib* с CallBack'ами...

Код:

#include <GuiConstants.au3>

$iMark = 1

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

$label = GUICtrlCreateLabel("Some text", 70, 35, 50, 16)

GUISetState()

_AdlibEnable("_TextFlicker", 800, $hGui)

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case -3
            _AdlibDisable($hGui)
            ExitLoop
    EndSwitch
WEnd

Func
_TextFlicker($hWndGUI, $MsgID, $WParam, $LParam)
    If $iMark = 1 Then
        GUICtrlSetColor($label, 0xFF0000)
        $iMark = 0
    Else
        GUICtrlSetColor($label, 0x000000)
        $iMark = 1
    EndIf
EndFunc

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", $hWnd, "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", $hWnd)
    Return Number(IsArray($aRet) And $aRet[0])
EndFunc


DENoszone 21-03-2008 22:49 765285

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

Maza Faka 22-03-2008 07:30 765430

Цитата:

Цитата DENoszone
при выключеном компе »

И как ты себе это представляешь?

DENoszone 22-03-2008 08:27 765439

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

Maza Faka 22-03-2008 09:34 765462

DENoszone
Используй планировщик заданий:
Schtasks /?
at /?

DENoszone 22-03-2008 13:53 765554

Мне надо
1. Заходит на сайт http://ru2.voyna-plemyon.ru вписывает в первое поле Имя
2. во второе пароль
3. выбрать из выпадающего меню "мир 2".
4.перейти по ссылке http://ru2.voyna-plemyon.ru/game.php...*!&screen=main вместо !*! любые цифры
5. К примеру надо после ссылки "Железная шахта" Улучшить до следущего уровня. не важно какой там написан? если у кого то будет время посмотрите можно литак?

и надо что бы скрипт запускался в определеное время.

voventij 22-03-2008 14:22 765565

Добрый день, подскажите как для выполнения скрипта установить в языках и региональных стандартах Русский язык?

Maza Faka 23-03-2008 07:28 765911

Цитата:

Цитата voventij
как для выполнения скрипта установить в языках и региональных стандартах Русский язык? »

В шапке есть FAQ, посмотри последний вопрос-ответ.

Maza Faka 23-03-2008 08:19 765916

Цитата:

Цитата DENoszone
1. Заходит на сайт http://ru2.voyna-plemyon.ru вписывает в первое поле Имя
2. во второе пароль
3. выбрать из выпадающего меню "мир 2". »

Вот для начала:
Код:

#include <IE.au3>

$oIE = _IECreate("http://www.voyna-plemyon.ru/")

$oForm = _IEFormGetObjByName($oIE, 0)

$oLogin = _IEFormElementGetObjByName($oForm, "user")
$oPass = _IEFormElementGetObjByName($oForm, "password")
$oServer = _IEFormElementGetObjByName($oForm, "server")

_IEFormElementSetValue($oLogin, "mylogin")
_IEFormElementSetValue($oPass, "mypass")
_IEFormElementSetValue($oServer, "ru2")

_IEFormSubmit($oForm)

Дальше либо сам, либо дай логин и пасс, региться нет ни малейшего желания.

DENoszone 23-03-2008 10:41 765951

логин test123
пароль 123456

Maza Faka 23-03-2008 11:00 765963

Цитата:

Цитата DENoszone
перейти по ссылке http://ru2.voyna-plemyon.ru/game.php...*!&screen=main вместо !*! любые цифры »

Ну перехожу, в ответ Forbidden
Ммм...
Цитата:

Цитата DENoszone
перейти по ссылке http://ru2.voyna-plemyon.ru/game.php...*!&screen=main вместо !*! любые цифры »

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

DENoszone 23-03-2008 11:05 765966

нет ты не понял.
у каждого игрока там свои цифры. нажимать на ссылку которая имеет такой формат !*! - не имеет значения что там.
http://ru2.voyna-plemyon.ru/game.php...*!&screen=main

voventij 23-03-2008 12:01 765998

Цитата:

Цитата Maza Faka
как для выполнения скрипта установить в языках и региональных стандартах Русский язык? »
В шапке есть FAQ, посмотри последний вопрос-ответ. »

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

HORRIBLE 23-03-2008 18:08 766197

В TOOLTIP можно задавать шрифт(его размер и толщину?)

HORRIBLE 23-03-2008 19:14 766235

Цитата:

Цитата DENoszone
нет ты не понял.
у каждого игрока там свои цифры. нажимать на ссылку которая имеет такой формат !*! - не имеет значения что там.
http://ru2.voyna-plemyon.ru/game.php...*!&screen=main

Проще было привести полный вид ссылки. на которую в дальнейшем надо было перейти.

PHP код:

#include <IE.au3>

$oIE _IECreate("http://www.voyna-plemyon.ru/")

$oForm _IEFormGetObjByName($oIE0)

$oLogin _IEFormElementGetObjByName($oForm"user")
$oPass _IEFormElementGetObjByName($oForm"password")
$oServer _IEFormElementGetObjByName($oForm"server")

_IEFormElementSetValue($oLogin"test123")
_IEFormElementSetValue($oPass"123456")
_IEFormElementSetValue($oServer"ru2")

_IEFormSubmit($oForm)
_IELoadWait ($oIE)


;
тут делаем от болды много цифероки делаем новую URL
$num 
random(99999,999999999999)
$new_link StringReplace(_IEPropertyGet($oIE,"locationurl"),"screen=overview&intro",$num&"&screen=main")

А тут я незнаю как вставить получившуюся URL  обратно в строку адрессаможет кто подскажет буду очень признателен. (Из-за этого просто создал новое окно)
$oIE_2 _IECreate($new_link 


korochinskiy 23-03-2008 22:34 766356

Помогите пожалуйста. Как вностить и извлекать информацию из окон у которых класс Internet Explorer_Server?

Creat0R 23-03-2008 23:49 766407

HORRIBLE,
Цитата:

В TOOLTIP можно задавать шрифт
ToolTip это тоже окно, т.ч в принципе можно:

Код:

ToolTip("My ToolTip")

$hWnd = WinGetHandle("[CLASS:tooltips_class32]")
$hFont = _GUICtrlSetFont($hWnd, 18, 800, 4, "Comic Sans MS")

Sleep(5000)

DllCall('user32.dll', 'int', 'DeleteObject', 'hwnd', $hFont)

Func _GUICtrlSetFont($hWnd, $nFontSize=8.5, $nFontWeight=400, $nFontAtrribute=0, $szFont="")
    Local $hDc = DllCall("user32.dll", "hwnd", "GetDC", "hwnd", $hWnd)
    Local $nPixel = DllCall("gdi32.dll", "int", "GetDeviceCaps", "hwnd", $hDc[0], "int", 90)
    Local $nHeight = DllCall("kernel32.dll", "int", "MulDiv", "int", $nFontSize, "int", $nPixel[0], "int", 72)

    Local $hFont = DllCall('gdi32.dll', 'hwnd', 'CreateFont', _
        'int', -$nHeight[0], _
        'int', 0, _
        'int', 0, _
        'int', 0, _
        'int', $nFontWeight, _
        'int', BitAND($nFontAtrribute, 2), _
        'int', BitAND($nFontAtrribute, 4), _
        'int', BitAND($nFontAtrribute, 8), _
        'int', 1, _
        'int', 0, _
        'int', 0, _
        'int', 0, _
        'int', 0, _
        'str', $szFont)

    ; Other possibility to select a font to the control:
    ;
    ; $hFont = DllCall('gdi32.dll', 'hwnd', 'GetStockObject', 'int', 11); Get "DEFAULT_GUI_FONT"
    ;
    ;    -> font numbers can be :
    ;    OEM_FIXED_FONT      10
    ;    ANSI_FIXED_FONT    11
    ;    ANSI_VAR_FONT      12
    ;    SYSTEM_FONT        13
    ;    DEVICE_DEFAULT_FONT 14
    ;    DEFAULT_PALETTE    15
    ;    SYSTEM_FIXED_FONT  16
    ;    DEFAULT_GUI_FONT    17
    ;
    ;    !!! Before 'Exit' has to be called:
    ;              DllCall('user32.dll', 'int', 'DeleteObject', 'hwnd', $hFont)


    DllCall('user32.dll', 'int', 'SendMessage', 'hwnd', $hWnd, 'int', 0x0030, 'int', $hFont[0], 'int', 1) ;$WM_SETFONT = 0x0030

    Return $hFont[0]
EndFunc

Цитата:

как вставить получившуюся URL обратно в строку адресса
Код:

_IENavigate($oIE, $new_link)
korochinskiy,
Цитата:

Как вностить и извлекать информацию из окон у которых класс Internet Explorer_Server?
Смотря какую информацию, для Internet Explorer есть библиотека #include <IE.au3>.

DENoszone 24-03-2008 00:03 766414

HORRIBLE, хорошо к примеру эту переменую вписывают.
или она сама как то находится и записывается.
как сделать что бы строилось что то?!

HORRIBLE 24-03-2008 00:16 766419

DENoszone, переменная $num произвольным образом выбирается ($num = random(99999,999999999999)) Ты ж сам сказал числа вписываем произвольные, и указал куда мы их вписываем.
Строилось??? что именно?

DENoszone 24-03-2008 00:19 766421

нет. ты не понял.
я имел ввиду ..что не имеет значение что там написано. но на эту ссылку нажималось +)
ты заходил в акк?
там есть Ратуша - в ней к примеру есть Склад а с права ссылка по котому начинается постройка нового уровня Склада.
вот на это и нажималось

DENoszone 24-03-2008 20:07 766838

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

Maza Faka 25-03-2008 06:44 767057

Цитата:

Цитата DENoszone
Все я решил проблему. »

Выложи решение :)

Цитата:

Цитата DENoszone
можено как то сделать что бы скрипт запускался без этой програмы.ну в exe формате »

В папке с установленным AutoIt есть прожка Aut2exe.exe для компиляции скриптов или в Scite выполни нажатие Ctrl+F7.

Цитата:

Цитата DENoszone
как делать что бы скрипт запускался через 3 часа. или в обределённое время »

Воспользуйся Windows-планировщиком.

DENoszone 25-03-2008 08:56 767096

Решение...поменять поменять путь работы=)
возможно запускать скрипт с хостинга?
а можно как то сделать что бы челвоек вписывал в прорграмму свои данные?

Maza Faka 25-03-2008 10:06 767143

Цитата:

Цитата DENoszone
сделать что бы челвоек вписывал в прорграмму свои данные? »

В какую программу? Функция InputBox()?

DENoszone 25-03-2008 10:38 767162

в програме есть переменные.
эти переменные должен записывать сам человек.

Creat0R 25-03-2008 13:10 767301

DENoszone,
Цитата:

эти переменные должен записывать сам человек.
Два варианта: либо научить его писать/править AutoIt скрипты, либо научиться самому использовать динамические переменные ;) - А именно, использовать IniWrite/Read, RegWrite/Read.

N0rB 25-03-2008 17:00 767492

Добрый день!Дабы облегчить себе жизнь решил написать скрипт на AutoIt ,но возникла одна проблема (( Не знаю как этим скриптом поменять IP на локальном компе , установить обои на рабочий стол из нужной мне папки и открыть общий доступ к определенной папке!! Если кто поможет буду очень признателен!
Заранее спасибо,N0rB.

Maza Faka 25-03-2008 17:16 767502

Цитата:

Цитата N0rB
поменять IP на локальном компе »

В Windows есть консольная утилита netsh.exe, выполни в командной строке netsh /? там всё описано.

Цитата:

Цитата N0rB
установить обои на рабочий стол из нужной мне папки!! »

Можно через реестр, здесь вроде бы:
[HKEY_CURRENT_USER\ControlPanel\Desktop]
"ConvertedWallpaper"="D:\\wallpaper\\New\\winxp1280.JPG"

N0rB 25-03-2008 17:18 767503

спасибо!!

DENoszone 25-03-2008 19:16 767589

ну вот можно с помощью этой проги написать калькулятор???
преведите пример=)
как пользоватся IniWrite/Read, RegWrite/Read. ?

Creat0R 25-03-2008 19:33 767599

DENoszone,
Цитата:

можно с помощью этой проги написать калькулятор?
Да, я приводил пример калькулятора ;).

Цитата:

как пользоватся IniWrite/Read, RegWrite/Read. ?
В справке оно расписано:

Reads a value from a standard format .ini file.
Цитата:

IniRead ( "filename", "section", "key", "default" )
Parameters

Цитата:

filename - The filename of the .ini file.
section - The section name in the .ini file.
key - The key name in the in the .ini file.
default - The default value to return if the requested key is not found.

Return Value

Цитата:

Success: Returns the requested key value.
Failure: Returns the default string if requested key not found.

Creat0R 26-03-2008 09:24 767865

Функция _GUICtrlCreateGroupEx() - Создание «Group» элемента в стиле Web-формы :)

Код:

#include <GuiConstants.au3>

$hGUI = GUICreate("_GUICtrlCreateGroupEx() Demo")

$aGroup_Ctrls1 = _GUICtrlCreateGroupEx("", 25, 40, 350, 150, 3.5, 0xFF0000, 0) ;1 to able set color for the Group frame

GUICtrlCreateRadio("Radio 1 (Group 1)", 60, 70)
GUICtrlCreateRadio("Radio 2 (Group 1)", 230, 70)
GUICtrlCreateRadio("Radio 3 (Group 1)", 60, 140)
GUICtrlCreateRadio("Radio 4 (Group 1)", 230, 140)

$iRandom_Radio = Random($aGroup_Ctrls1[1]+1, $aGroup_Ctrls1[1]+4, 1)
GUICtrlSetState($iRandom_Radio, $GUI_CHECKED)

$aGroup_Ctrls2 = _GUICtrlCreateGroupEx("Group 2", 25, 220, 350, 150, 3.5, 0x0000FF, 0)

GUICtrlCreateRadio("Radio 1 (Group 2)", 60, 250)
GUICtrlCreateRadio("Radio 2 (Group 2)", 230, 250)
GUICtrlCreateRadio("Radio 3 (Group 2)", 60, 320)
GUICtrlCreateRadio("Radio 4 (Group 2)", 230, 320)

$iRandom_Radio = Random($aGroup_Ctrls2[1]+1, $aGroup_Ctrls2[1]+4, 1)
GUICtrlSetState($iRandom_Radio, $GUI_CHECKED)

GUISetState(@SW_SHOW, $hGUI)

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func
_GUICtrlCreateGroupEx($sText, $iLeft, $iTop, $iWidth, $iHeight, $iLineWidth=3, $nColor=0, $iStyle=0)
    Local $aIDs[2] ;First + Last IDs

    Local $nLabel_Style = $SS_ETCHEDFRAME
    If $iStyle > 0 Then $nLabel_Style = $SS_SUNKEN

    GUIStartGroup()

    $aIDs[0] = GUICtrlCreateLabel("", $iLeft+1, $iTop, $iWidth-2, $iLineWidth, $nLabel_Style)
    GUICtrlSetBkColor(-1, $nColor)

    GUICtrlCreateLabel("", $iLeft+2, $iTop+5, $iLineWidth, $iHeight-4, $nLabel_Style)
    GUICtrlSetBkColor(-1, $nColor)

    GUICtrlCreateLabel("", ($iLeft+$iWidth), $iTop-3, $iLineWidth, $iHeight-3, $nLabel_Style)
    GUICtrlSetBkColor(-1, $nColor)

    $aIDs[1] = GUICtrlCreateLabel("", $iLeft+6, ($iTop+$iHeight)-5, $iWidth, $iLineWidth, $nLabel_Style)
    GUICtrlSetBkColor(-1, $nColor)

    If $sText <> "" Then
        $aIDs[1] = GUICtrlCreateLabel("  " & $sText, $iLeft+20, $iTop-6)
        GUICtrlSetColor(-1, $nColor)
    EndIf

    Return
$aIDs
EndFunc

+ Опция установки цвета для рамки.

djgoodwin 26-03-2008 10:12 767890

Вложений: 1
Привет, сорри если повторяюсь, тема большая, в справке не нашел, в AutoIT пока чайник
Как сделать окно с такими контролами и еще слева там динамически выпадающие меню в таком же стиле.
Или тулбар как Quicklaunch (панель быстрого запуска) ? чтобы иконка + текст
Спасибо.

djgoodwin 26-03-2008 10:16 767894

Вложений: 1
http://forum.oszone.ru/attachment.ph...1&d=1206515624
Howtodo_cpl.jpg

Maza Faka 26-03-2008 10:47 767916

Цитата:

Цитата Creat0R
Функция _GUICtrlCreateGroupEx() - Создание «Group» элемента в стиле Web-формы »

А не проще сделать так:
Код:

#include <GuiConstants.au3>

$hGUI = GUICreate(":-)", 400, 210)

$Group = GUICtrlCreateGroup("Group1", 10, 10, 380, 180, $BS_CENTER)
GUICtrlSetColor(-1, 0xFF0000)
DllCall("UxTheme.dll", "int", "SetWindowTheme", "hwnd", GUICtrlGetHandle($Group), "wstr", "", "wstr", "")

$Radio1 = GUICtrlCreateRadio("Radio 1", 40, 40, 60, 16)
$Radio2 = GUICtrlCreateRadio("Radio 2", 40, 120, 60, 16)
$Radio3 = GUICtrlCreateRadio("Radio 3", 280, 40, 60, 16)
$Radio4 = GUICtrlCreateRadio("Radio 4", 280, 120, 60, 16)

GUICtrlCreateGroup("", -99, -99, 1, 1)

GUISetState()

Do
Until
GUIGetMsg() = -3

:)

Цитата:

Цитата djgoodwin
Как сделать окно с такими контролами »

Смотри в справке функцию GuiCtrlCreateIcon()

Цитата:

Цитата djgoodwin
тулбар как Quicklaunch »

Смотри в справке функцию _GUICtrlToolbar_Create()

TERMINAL 26-03-2008 11:34 767959

Народ, помогите плз...пробовал добавить в ниже приведённый файл строчки
читать дальше »
HKLM,"SYSTEM\CurrentControlSet\Services\VgaSave\Device0","DefaultSettings.XResolution",0x00010001,10 24
HKLM,"SYSTEM\CurrentControlSet\Services\VgaSave\Device0","DefaultSettings.YResolution",0x00010001,76 8
HKLM,"SYSTEM\CurrentControlSet\Control\Video\{23A77BF7-ED96-40EC-AF06-9B1F4867732A}\0000","DefaultSettings.XResolution",0x00010001,1024
HKLM,"SYSTEM\CurrentControlSet\Control\Video\{23A77BF7-ED96-40EC-AF06-9B1F4867732A}\0000","DefaultSettings.YResolution",0x00010001,768

в категорию [AddReg]-ничего не получается либо идут каракули...

Creat0R 26-03-2008 11:34 767962

Maza Faka,
Цитата:

А не проще сделать так:
Хех, UxTheme ничего не напоминает? это только для XP ;).
И во-вторых, тут нельзя задать цвет самой линии, а в третьих я же написал:
Цитата:

Создание «Group» элемента в стиле Web-формы

DENoszone 26-03-2008 11:57 767985

$oPass1 = InputBox("Внимание!", "Введите пасс")
как тут сделать что бы водилось звездочками .ну пароль был закрытый

Maza Faka 26-03-2008 12:15 768000

DENoszone
Ты в справку заглядываешь? Хотя бы иногда? Четвёртый параметр в функции делает это.

DENoszone 26-03-2008 13:06 768029

я просто не дома. а тут нету справки =(

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

TERMINAL 26-03-2008 13:09 768031

Народ ! помогите мне плз с ниже указанной проблемой....

Maza Faka 26-03-2008 13:40 768056

Цитата:

Цитата DENoszone
вместо текста пользователя водился другой текст »

Не понял, а, какой (другой) текст должен вводится?

Цитата:

Цитата TERMINAL
помогите мне плз с ниже указанной проблемой »

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

IniWrite("c:\HIVESYS.INF", "AddReg", _
'HKLM,"SYSTEM\CurrentControlSet\Services\VgaSave\Device0","DefaultSettings.XResolution",0x00010001,10 24', "")

Правда записывал в пустой файл. Может есть ограничение кол-ва строк для INF-файла?

TERMINAL 26-03-2008 13:47 768062

Maza Faka, мне нужно чтобы данные записывальсь в прикреплённый файл и в конце небыло =....

Maza Faka 26-03-2008 13:54 768066

Цитата:

Цитата TERMINAL
мне нужно чтобы данные записывальсь в прикреплённый файл и в конце небыло = »

Так, во первых твой файл слишком большой для того, что бы работать с ним при помощи функций Ini*()
А во вторых, что бы в конец файла не добавлялся символ =, лучше воспользоваться другими фунциями:
FileWrite(), FileWriteLine(), _FileWriteFromArray().

DENoszone 26-03-2008 17:28 768239

ну человек пишеть...не важно что...и на кажду нажатую клавишу(написанную) появляется другая.
к примеру человек пиште "привет" а программа пишет "123456"

DENoszone 26-03-2008 19:49 768364

как запустить ссылку www.ya.ru/staemme.php? переменая &screen=main переменая =build переменая

korochinskiy 26-03-2008 21:43 768457

Цитата:

Цитата Creat0R
korochinskiy,
Цитата:
Как вностить и извлекать информацию из окон у которых класс Internet Explorer_Server?
Смотря какую информацию, для Internet Explorer есть библиотека #include <IE.au3>. »

Извлекать текст для опознавания окна. Ставить чекбоксы и нажимать кнопки. Только это окно не Internet Explorer, а например установка CorelDraw X4 или регистрачия AutoCad 2008 ну и т.д., а AutoIt Window Info показывает класс окна Internet Explorer_Server и никакого текста (включая скрытый).

Creat0R 27-03-2008 00:29 768605

korochinskiy,
Цитата:

Извлекать текст для опознавания окна.
Код:

$Title = WinGetTitle("[CLASS:Internet Explorer_Server]")
Если Au3Info не видит текст, то вероятней всего, получить его будет почти невозможно.

korochinskiy 27-03-2008 15:35 769021

Цитата:

Цитата Creat0R
Если Au3Info не видит текст, то вероятней всего, получить его будет почти невозможно. »

Но ведь и при наведении на окно Internet Explorer Au3Info не отображает текст, а извлечь его от туда можно (я имею введу тело страницы).

Цитата:

Цитата Creat0R
$Title = WinGetTitle("[CLASS:Internet Explorer_Server]") »

Мне нужен не заголовок а именно текст в окне. С WinGetText не прокатывает :(

HORRIBLE 27-03-2008 22:19 769367

korochinskiy,
Чтоб вытащить скелет странички воспользуйся этим:

$oIE = _IE_Example ("basic")
$sHTML = _IEDocReadHTML ($oIE) ; вот эта команда и извлечет тебе код странички
MsgBox(0, "Document Source", $sHTML)

DENoszone 28-03-2008 08:37 769510

Вопросы:


как запустить ссылку www.site.ru/staemme.php? переменая &screen=main переменая =build переменая


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


как добавить что то в форму во фрайме???

korochinskiy 28-03-2008 14:52 769796

Цитата:

Цитата HORRIBLE
korochinskiy,
Чтоб вытащить скелет странички воспользуйся этим:
$oIE = _IE_Example ("basic")
$sHTML = _IEDocReadHTML ($oIE) ; вот эта команда и извлечет тебе код странички
MsgBox(0, "Document Source", $sHTML) »

Это не то что мне нужно. Я ищу способ опознавать и управлять окнами установки программ ну или регистрации класс которых Internet Explorer_Server. Почитайте мои посты выше.

Angelus 29-03-2008 14:28 770387

Как можно найти папку на какомто системном диске???

Например знаю имя папки но путь к ней не знаю....нада вывести путь.....

DENoszone 29-03-2008 14:30 770390

а просто поиск?=)

Maza Faka 30-03-2008 08:52 770801

Angelus
Можно средствами ком. строки:
Ищем папку AutoIt3 на диске C:\ ;)
Код:


dir c:\AutoIt3 /a:d /b /s


Angelus 30-03-2008 09:19 770805

Цитата:

Цитата DENoszone
а просто поиск? »

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

Angelus 30-03-2008 09:58 770817

Хм...прикол...антивир компилированые скрипты за вирус принимает....=)

Creat0R 31-03-2008 01:04 771248

Angelus,
Цитата:

антивир компилированые скрипты за вирус принимает
Известная проблема: Are my AutoIt EXEs really infected?




ALL (Все)

Библиотека для управления известным плеером Winamp!

В библиотеке содержится 28 функции.
Написана на основе SDK с оф. сайта Winamp.

Требования:

* Winamp 2.x +.
* Желательно последнюю версию AutoIt'а (хотя в принципе должно работать на любой версии которая поддерживает DllCalls). Тестировалось под v3.2.8.1.

Скачать по этой ссылке (6+ kb).

Жду комментариев, также хотелось бы знать каких ещё функции нехватает.

Angelus 31-03-2008 09:06 771335

Цитата:

Цитата Creat0R
Известная проблема: Are my AutoIt EXEs really infected? »

антивир Базы обновил и больше не воспринимает за вирус=)....я с него в шоке=)

amel27 31-03-2008 13:05 771507

Цитата:

Цитата Maza Faka
dir c:\AutoIt3 /a:d /b /s »

тогда уж лучше так (с корня диска по всем подкаталогам)
Код:

DIR /A:D /S /B "C:\"|FINDSTR /E /I "\\AutoIT3"
или вот UDF на основе командной строки откуда видно, что этот способ не подходит для русских имен... либо придется перекодировать текст из 866-й кодовой страницы в ANSI
Код:

#include <array.au3>

$a = _DirFindPath("AutoITX")
_ArrayDisplay($a)

Func _DirFindPath ($strDirName, $strRoot = @HomeDrive)
    ; Проверяем наличие оконечного слэша
    $strRoot = StringRegExpReplace($strRoot & "\", "\\+$", "\\")
    ; Запуск командной строки
    Local $strCMD = 'CMD /C DIR /A:D/S/B "'& $strRoot &'"|FINDSTR /E /I "\\'& $strDirName &'"'
    Local $intPID = Run($strCMD, @SystemDir, @SW_HIDE, 2)
    ; Цикл чтения выходных данных
    Local $strOUT = ""
    While 1
        $strOUT &= StdoutRead($intPID)
        If @error Then ExitLoop
    Wend

    ; Перевод текста в массив строк и вывод массива
    Return StringRegExp($strOUT, "(?m)^(.*\\).*$", 3)
EndFunc

Angelus
пошукай по архивам топика - проблема вывода в массив списка всех подкаталогов средствами AutoIT обсуждалась неоднократно, останется только оформить поиск по массиву нужных элементов

Mogidin 31-03-2008 18:20 771734

Здравствуйте. Мну такая проблема.
Есть окно программы. в нем есть скрытая форма (Static1). После определенных действий юзера (программы) она становится видной. Как на AutoIt узнать, скрытая эта форма, или нет.

В результате будет цикл While 1=1 ...... WEnd который прерывается когда форма Static1 становится видимой.

Creat0R 31-03-2008 18:37 771742

Mogidin,
Цитата:

Как на AutoIt узнать, скрытая эта форма, или нет.
Можно использовать ControlCommand... Типа такого:

Код:

#include <GuiConstants.au3>

$GUI = GUICreate("Test Script", 300, 200)

GUICtrlCreateLabel("Static Label", 20, 40)
ControlHide($GUI, "", "Static1")

$Show_Button = GUICtrlCreateButton("Show label", 20, 80, 60, 20)

GUISetState(@SW_SHOW, $GUI)

While ControlCommand($GUI, "", "Static1", "IsVisible") = 0
    Sleep(10)

    If GUIGetMsg() = $Show_Button Then ControlShow($GUI, "", "Static1")
WEnd

If
MsgBox(36, "", "Ok, first loop is done, exit?") = 6 Then Exit

While
1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd


Creat0R 31-03-2008 19:17 771761

amel27,
С возвращением! :)

Нужна помощь с одной проблемой, если есть возможность/время, глянь плиз...

Вобщем нужно создать окно с собственным именем класса.
Типа DllCall("USER32.DLL", "hwnd", "CreateWindowEx", "long", 0, "str", "My_Custom_Class".....)

Это вообще реально на AutoIt, или я просто трачу своё (и других) время?
Я уже пару часов сижу с кучей открытых вкладок на MSDN (вот самая гав.. главная), и со скриптом который просто издевается надомной :cry: Вылетает на каждом шагу... то ему поинтер не нравится, то значение в структуре, то ещё что-то....

TERMINAL 01-04-2008 10:48 772200

Creat0R, вопрос !
делаю такую фишку
RegWrite("HKEY_CURRENT_USER\Software\Data","Key","REG_SZ",@MDAY)
$dat = RegRead("HKEY_CURRENT_USER\Software\Data","Key")
$dates=$dat+1
нужно чтобы выдавалось значение 02 а не 2 и как сделать чтобы когда делаешь $dates=$dat-1 получалось 31 или 30 (взависимости от месяца) а не результат 0?

Maza Faka 01-04-2008 15:38 772444

TERMINAL
Попробуй так:
Код:

#include <Date.au3>

Dim $Date

RegWrite("HKCU\Software\Data", "Key", "REG_SZ", @MDAY)
$Date = RegRead("HKCU\Software\Data", "Key")

$Date = _DateAdd("D", -1, _NowCalcDate())

$Date = StringRegExpReplace($Date, "^.*/", "")

MsgBox(0, "", StringFormat("%02i", $Date))


Ded Vova 01-04-2008 22:41 772759

Вложений: 1
Доброе время суток. Помогите с проблемой.Мучаюсь второй день, нужно выбраьт чебокс в окне, клавиши выбора "TAB" и "8" или стрелка вверх. "TAB" срабатывает, а вот вторая нет. Пробую по ID; clas; radiobutton. Результат 0. Останавливается на этом окне .Какой выход? Спасибо.

Vadikan 02-04-2008 00:15 772809

Ded Vova, это InnoSetup, оно не ставится с ключами, раз вы Autoit пытаетесь прикрутить?

Creat0R 02-04-2008 03:25 772862

Ded Vova,
Цитата:

Пробую по ID; clas; radiobutton. Результат 0
Можно увидеть код пробы? :) и по всей видимости (судя по скрину) там класс «TNewCheckListBox».

Кликать примерно так:

Код:

ControlClick("Установка - Фото МИКСЕР", "", "TNewCheckListBox")

DENoszone 02-04-2008 10:28 772968

не могу логинится на http://www.nigma.ru и ещё на этом сайте надо что бы проверялось что написанно в поле email , если там qwe@mail.ru то продолжать работу. елси нет то закрывать окно

N0rB 02-04-2008 13:24 773065

Меняю с помощью скрипта IP на локальном компе через вызов cmd
netsh interface ip set address Local static 192.168.0.2 255.255.255.0
где Local - имя подключения. При замене имени подключения на стандартное Подключение по локальной сети эта конструкция перестает работать.не подскажет ли кто что можно сделать??Эт наверное из-за пробелов.....????

Ded Vova 02-04-2008 16:05 773170

Вложений: 2
Спасибо за советы. С ключами " /VERYSILENT /SP- " не ставится, других не знаю , :) .
Класс «TWizardForm», button «TRadioButton 1», ID:983410.
Ошибку не выводит, при запуске останавливается на этом окне и ...тишина.
Пробывал "ControlClick" и "MouseClick", "text ""Я &принимаю условия соглашения"".
Сейчас попробую "ControlShow" и "MouseClick".
А голова уже квадратная!
P.S. А вот как указать MouseClick("left",x,y,1)? Я ,чайник, не знаю. Пробую только,всего три дня.
Блин! пробыва,получил см. 4рис.

Ded Vova 02-04-2008 16:53 773202

Вложений: 1
Вот такая ерунда!

Creat0R 02-04-2008 20:05 773332

Ded Vova,
Цитата:

Класс «TWizardForm», button «TRadioButton 1», ID:983410.
Вот так должно сработать:

Код:

ControlClick("[CLASS:TWizardForm]", "", "TRadioButton1")
Цитата:

Вот такая ерунда!
ControlCommand() требует как минимум 4 параметра, я только не понял зачем там нужна эта команда?

amel27 03-04-2008 06:54 773601

Creat0R
Цитата:

Я уже пару часов сижу »
пары часов маловато будет... :huh:
Цитата:

нужно создать окно с собственным именем класса. »
этот код вроде работает:
Код:

#include <WinAPI.au3>
#include <GUIConstants.au3>

Global Const $CS_VREDRAW = 1
Global Const $CS_HREDRAW = 2
Global Const $IDI_APPLICATION = 32512
Global Const $WHITE_BRUSH = 0
Global Const $CW_USEDEFAULT = 0x80000000

Global $hMsgHelloWndProc ; переменная для хранения хэндла CallBack-функции класса
; Тестовый ГУИ

$hWndMain = GUICreate("My GUI")
GUISetState (@SW_SHOW)
; Создаем и регистрируем класс
$iRet = MsgHelloReg("HelloMsg", $hMsgHelloWndProc)
; Создаем и активизируем экземпляр класса
$hWndHello = _WinAPI_CreateWindowEx(0, "HelloMsg", "Hello Application", $WS_OVERLAPPEDWINDOW, $CW_USEDEFAULT, 0, $CW_USEDEFAULT, 0, $hWndMain, 0, _WinAPI_GetModuleHandle(""), 0)
$iRet = _WinAPI_ShowWindow($hWndHello)

While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend

; Разрегистрируем класс перед выходом
$iRet = MsgHelloUnReg("HelloMsg", $hMsgHelloWndProc)

; UDF для создания и регистрации нашего класса

Func MsgHelloReg($sClassName, ByRef $hWndProc)
    ; Выбираем иконки и курсоры (тут способов много)
    Local $aIcon = DllCall("user32.dll", "hwnd", "LoadIcon", "hwnd", 0, "int", $IDI_APPLICATION)
    Local $aCursor = DllCall("user32.dll", "hwnd", "LoadCursor", "hwnd", 0, "int", $IDC_ARROW)
    ; Регистрируем оконную процедуру, как CallBack-функцию
    $hWndProc = DLLCallbackRegister ("MsgHelloWndProc", "int", "hwnd;int;wparam;lparam")
    ;Создаем и инициализируем структуры класса
    Local $tWndClassEx = DllStructCreate("uint cbSize;uint style;ptr lpfnWndProc;int cbClsExtra;int cbWndExtra;hwnd hInstance;hwnd hIcon;hwnd hCursor;hwnd hbrBackground;ptr lpszMenuName;ptr lpszClassName;hwnd hIconSm")
    Local $tClassName = DllStructCreate("char["& StringLen($sClassName)+1 &"]")
    DllStructSetData($tClassName, 1, $sClassName)

    DllStructSetData($tWndClassEx, "cbSize", DllStructGetSize($tWndClassEx) )
    DllStructSetData($tWndClassEx, "style", BitOR($CS_VREDRAW, $CS_HREDRAW) )
    DllStructSetData($tWndClassEx, "lpfnWndProc", DllCallbackGetPtr($hWndProc))
    DllStructSetData($tWndClassEx, "hInstance", _WinAPI_GetModuleHandle(""))
    DllStructSetData($tWndClassEx, "hIcon", $aIcon[0])
    DllStructSetData($tWndClassEx, "hCursor", $aCursor[0])
    DllStructSetData($tWndClassEx, "hbrBackground", _WinAPI_GetStockObject($WHITE_BRUSH))
    DllStructSetData($tWndClassEx, "lpszClassName", DllStructGetPtr($tClassName))
    DllStructSetData($tWndClassEx, "hIconSm", $aIcon[0])
    ; Собственно процедура регистрации
    Local $aRet = DllCall("user32.dll", "dword", "RegisterClassExA", "ptr", DllStructGetPtr($tWndClassEx) )
    Return $aRet[0]
EndFunc ; ==> MsgHelloReg

; UDF для разрегистрации класса (не должно быть экземпляров класса)


Func MsgHelloUnReg($sClassName, ByRef $hWndProc)
    DllCallbackFree($hWndProc)
    Local $aRet = DllCall("user32.dll", "int", "UnregisterClassA", "str", $sClassName, "hwnd", _WinAPI_GetModuleHandle(""))
    Return $aRet[0]
EndFunc ; ==> MsgHelloUnReg

; Код оконной процедуры нашего оконного класса


Func MsgHelloWndProc($hWnd, $uMsg, $wParam, $lParam)
    Local $aRet, $iRet, $hDC, $tRect, $sDrawText = "Hello, World!"
    Switch $uMsg
        Case $WM_PAINT
            $hDC
= _WinAPI_GetDC($hWnd) ; получаем контекст устройства
            $tRect = _WinAPI_GetClientRect($hWnd) ; получаем координаты клиентской области
            $aRet = DllCall("user32.dll", "int", "ValidateRect", "hwnd", $hWnd, "ptr", DllStructGetPtr($tRect) ) ; делаем область "валидной"
            ; здесь код рисования окна

            $aRet = DllCall("user32.dll", "int", "FillRect", "hwnd", $hDC, "ptr", DllStructGetPtr($tRect), "hwnd", _WinAPI_GetStockObject($WHITE_BRUSH) )
            $iRet = _WinAPI_DrawText($hDC, $sDrawText, $tRect, BitOR($DT_SINGLELINE, $DT_CENTER, $DT_VCENTER))
            ; освобождаем контекст устройства
            _WinAPI_ReleaseDC($hWnd, $hDC)
        Case $WM_CLOSE
            _WinAPI_DestroyWindow($hWnd)
        Case $WM_DESTROY
;          $aRet = DllCall("user32.dll", "none", "PostQuitMessage", "int", 0 )
        Case Else
            Return
_WinAPI_DefWindowProc($hWnd, $uMsg, $wParam, $lParam) ; передаем "чужие" сообщение дальше на обработку
    EndSwitch
    Return
0
EndFunc ; ==> MsgHelloWndProc

З.Ы. Есть одна проблемка... почему-то стандартный ход для WM_PAINT (пара ф-ций BeginPaint / EndPaint) у меня не заработал, а именно BeginPaint не возвращает контекст и не заполняет структуру PAINTSTRUCT, поэтому пришлось делать все за нее.

amel27 03-04-2008 07:22 773605

N0rB,
Цитата:

Эт наверное из-за пробелов.....???? »
если в батнике все работает, а в AutoIT нет, значит дело не в пробелах... ;)
NETSH работает с OEM-кодировкой, а AutoIT с ANSI... поэтому нельзя передавать русский текст из AutoIT "как есть" сразу в NETSH. Решений проблемы много, я к примеру использую UDF, предварительно преобразующий текст команды в OEM-кодировку:
Код:

$strANSI= "Подключение по локальной сети"
$strOEM = _StringToOEM($strANSI)
MsgBox(0,'',"Текст в ANSI: "& $strANSI &@CRLF& _
            "Текст в OEM : "& $strOEM )

Func _StringToOEM($strText)
    Local $oem = DllStructCreate("char["& StringLen($strText)+1 &"]")
    Local $ret = DllCall("User32.dll", "int", "CharToOem", "str", $strText, "ptr", DllStructGetPtr($oem))
    If Not(IsArray($ret)) Then Return SetError(1, 0, '') ; ошибка DLL
    If $ret[0]=0 Then Return SetError(2, $ret[0], '') ; ошибка функции
    Return DllStructGetData($oem, 1)
EndFunc  ;==> _StringToOEM

FYI: еще возможные варианты: преобразование в самом CMD через командные утилиты (есть такие); правка параметров в реестре с последующим вызовом NETSH int ip reset, etc.

Creat0R 03-04-2008 07:27 773606

amel27,
Низкий поклон! :pray: я уже подумал что это нереально добиться средствами AutoIt'а.
Буду разбирать что к чему, я просто обязан понять как оно работает, ведь столько времени было потрачено на попытки реализовать это самому... а за коменты отдельное спасибо :).

Ded Vova 03-04-2008 08:44 773627

Здравствуйте.
Цитата:

Цитата Creat0R
Вот так должно сработать:
Код:
ControlClick("[CLASS:TWizardForm]", "", "TRadioButton1") »

Ну блин,Спасибо!! Так сработало,а то я уже голову сломал. Вся фишка в " [CLASS:TWizardForm] !

Цитата:

Цитата Creat0R
ControlCommand() требует как минимум 4 параметра, я только не понял зачем там нужна эта команда? »

Теперь понятное дело не нужна.

homesad 03-04-2008 09:46 773662

Пока только читал, но вот появились вопросы и хочу их задать: (AutoIt 3.2.11.5)
1. Функция _GUICtrlStatusBar_SetBkColor($hWnd, $iColor) не устанавливает цвет у фона строки статуса,
это только у меня так или ...
2. Возможно ли сделать так чтобы вкладки TabControl controlа создавались вертикально (ну это можно с помощью $TCS_VERTICAL)
но надписи были горизонтальными ???
3. Как перехватить нажатие на кнопку в другом приложении ?

DENoszone 03-04-2008 10:16 773676

Мне кто скажет?=)

не могу логинится на http://www.nigma.ru и ещё на этом сайте надо что бы проверялось что написанно в поле email , если там qwe@mail.ru то продолжать работу. елси нет то закрывать окно


как запустить ссылку www.ya.ru/staemme.php? переменая &screen=main переменая =build переменая

amel27 03-04-2008 10:52 773689

Creat0R,
Цитата:

Буду разбирать что к чему, я просто обязан понять как оно работает, ведь столько времени было потрачено на попытки реализовать это самому »
крайне рекомендую почитать книгу Ю.Щупака "Win32 API. Эффективная разработка приложений", там все основательно разжевано... вся (!) книга так или иначе посвящена твоему вопросу... собственно, я лишь перевел первый пример из книги с Си на AutoIT. =)

P.S. пару линков кину в PM, но сам я по старинке предпочитаю бумажный вариант :)

Maza Faka 03-04-2008 10:56 773692

amel27
Если найдётся время посмотри пожалуйста где ошибка.
Пытаюсь реализовать вот такой хинт:
Код:

#include <GuiConstants.au3>

Global Const $HH_DISPLAY_TEXT_POPUP = 0xE
Global Const $HH_CLOSE_ALL = 0x12

Global $DllRet

$hGUI
= GUICreate("Test GUI", 300, 200, -1, -1, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_CONTEXTHELP)

$hInput1 = GUICtrlCreateInput("", 50, 50, 200, 20)

$hInput2 = GUICtrlCreateInput("Input text here", 50, 100, 200, 20)

$HelpButton = GUICtrlCreateButton("Help", 20, 160, 60, 25)

$HH_POPUP = DllStructCreate("int Size;hwnd Dll;int String;char Text[256];ptr Top;int Foreground;int Background;int Margins;str Font")

DllStructSetData($HH_POPUP, "Size", DllStructGetSize($HH_POPUP))
DllStructSetData($HH_POPUP, "String", 0)
DllStructSetData($HH_POPUP, "Text", "Help Popup")
DllStructSetData($HH_POPUP, "Top", 200)
DllStructSetData($HH_POPUP, "Foreground", -1)
DllStructSetData($HH_POPUP, "Background", -1)
DllStructSetData($HH_POPUP, "Margins", -1)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            ExitLoop
        Case
$HelpButton

            $DllRet
= DllCall("HHCtrl.ocx", "hwnd", "HtmlHelp", "hwnd", $hGUI, "str", 0, _
            "int", $HH_DISPLAY_TEXT_POPUP, "ptr", DllStructGetPtr($HH_POPUP))

            $DllRet = $DllRet[0]
            ConsoleWrite($DllRet & @LF)
    EndSwitch
WEnd


DllCall("HHctrl.ocx", "hwnd", "HtmlHelp", "hwnd", $DllRet, "str", "", "int", $HH_CLOSE_ALL, "int", 0)

Источники: 1; 2; 3

DENoszone 03-04-2008 11:00 773696

и ещё как с каждым циклом увеличивать переменую на 10 ?

Maza Faka 03-04-2008 11:59 773735

amel27
Нашёл неплохой пример на PowerBasic-e, но реализовать этот пример на AutoIt-е не получается :(
Код:

#include <GuiConstants.au3>
#include <WinAPI.au3>

Global Const $HH_DISPLAY_TEXT_POPUP = 0xE
Global Const $HH_CLOSE_ALL = 0x12

Global $DllRet

$hGUI
= GUICreate("Test GUI", 300, 200, -1, -1, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_CONTEXTHELP)

$hInput1 = GUICtrlCreateInput("", 50, 50, 200, 20)

$hInput2 = GUICtrlCreateInput("Input text here", 50, 100, 200, 20)

$HelpButton = GUICtrlCreateButton("Help", 20, 160, 60, 25)

$HH_POPUP = DllStructCreate("int Size;hwnd Dll;int String;char Text[128];ptr Coord[2];int Foreground;int Background;int Margins;str Font")

$aPos = MouseGetPos()

$tpoint = DllStructCreate("int X;int Y")
DllStructSetData($tpoint, "X", $aPos[0])
DllStructSetData($tpoint, "Y", $aPos[1])

DllStructSetData($HH_POPUP, "Size", DllStructGetSize($HH_POPUP))
DllStructSetData($HH_POPUP, "hwnd", _WinAPI_GetWindowLong($hGUI, $GWL_HINSTANCE))
DllStructSetData($HH_POPUP, "String", 0)
DllStructSetData($HH_POPUP, "Text", "Help Popup")
DllStructSetData($HH_POPUP, "Coord", DllStructGetPtr($tpoint, 1), 1)
DllStructSetData($HH_POPUP, "Coord", DllStructGetPtr($tpoint, 2), 2)
DllStructSetData($HH_POPUP, "Foreground", 0)
DllStructSetData($HH_POPUP, "Background", 0xFF0000)
DllStructSetData($HH_POPUP, "Margins", -1)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            ExitLoop
        Case
$HelpButton

            $DllRet
= DllCall("HHCtrl.ocx", "hwnd", "HtmlHelp", "hwnd", $hGUI, "str", 0, _
            "int", $HH_DISPLAY_TEXT_POPUP, "dword*", DllStructGetPtr($HH_POPUP))

            $DllRet = $DllRet[0]
            ConsoleWrite($DllRet & @LF)
    EndSwitch
WEnd


DllCall("HHctrl.ocx", "hwnd", "HtmlHelp", "hwnd", $DllRet, "str", "", "int", $HH_CLOSE_ALL, "int", 0)


kagorec 03-04-2008 15:20 773829

Всем привет, почитав ваши произведения в постах выше аж голова кругом...
Открыв мануал, решил сделать автоматизацию некоторых манипуляций в игре.
Написал скрипт, компилировал... а при запуске в ХР он в доли секунды включается и исчезает (в процессах тоже появляется на доли секунды и проподает)


PHP код:

Opt ("SendKeyDelay"25       )
Opt ("MouseClickDownDelay"25)
Global 
$Paused
HotKeySet
("{PAUSE}""Paused")

HotKeySet ("{F5}",  "pickup_5"     )
HotKeySet ("{F6}",  "pickup_10"     )

HotKeySet ("{NUMPAD0}""Right_Click")
HotKeySet ("{NUMPAD1}""Right_Click1")
HotKeySet ("{NUMPAD2}""Left_Click")



;********** 
Left Click **********

Func Left_Click ()
While (
1)
ToolTip('"LeftClicker"',200,0)
MouseClick ("Left")
MouseUp ("Left")

WEnd
EndFunc


;********** Right Click **********

Func Right_Click ()
While (
1)
ToolTip('"RightClicker + Pickup"',200,0)
MouseDown"Right" 
Send ("{SPACE}")
WEnd
EndFunc

Func Right_Click1 
()
While (
1)
ToolTip('"RightClicker"',200,0)
MouseClick ("Right")
WEnd
EndFunc

;********** Pause **********

Func Paused()
    
$Paused NOT $Paused
    
While $Paused
        sleep
(100)
        
ToolTip('Script is "Paused"',0,0)
    
WEnd
    ToolTip
("")
EndFunc



;********** pickup 4min. **********

Func pickup_5 ()
While (
1)
    
ToolTip('"Pickup every 5.min"',200,0)
Send ("{SPACE}")
Sleep (30000)

WEnd
EndFunc


;********** pickup 10min. **********

Func pickup_10 ()
While (
1)
    
ToolTip('"Pickup every 10.min"',200,0)
Send ("{SPACE}")
Sleep (60000)

WEnd
EndFunc 

Посмотрите что не так =)

Написал еще один и та же реакция... проподает.
PHP код:

Global $Paused
HotKeySet
("{F4}""Pausediii")
Func Pausediii()
    
$Paused NOT $Paused
    
While $Paused
         Send 
('{SPACE}')
    
WEnd
    ToolTip
("")
EndFunc 


Maza Faka 03-04-2008 15:41 773840

kagorec
Цитата:

Цитата kagorec
Посмотрите что не так »

Нет основного цикла. После назначения функций на горячие клавиши вставь бесконечный цикл:
Код:

While 1
    Sleep(100)
WEnd


amel27 04-04-2008 10:16 774363

Maza Faka
Цитата:

Пытаюсь реализовать вот такой хинт »
интересно, а чем не устраивает штатный ToolTip?
Цитата:

Если найдётся время посмотри пожалуйста где ошибка »
что касается структур подправил, но сразу после отображения окна скрипт все равно валится... возможно, причина в том что это OCX а не DLL, либо требуется что-то еще.. можешь, кстати, поинтересоваться на оффсайте:
Код:

#include <GuiConstants.au3>
#include <WinAPI.au3>

Global Const $HH_DISPLAY_TEXT_POPUP = 0xE
Global Const $HH_CLOSE_ALL = 0x12

Global $DllRet

$hGUI
= GUICreate("Test GUI", 300, 200, -1, -1, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_CONTEXTHELP)
$hInput1 = GUICtrlCreateInput("", 50, 50, 200, 20)
$hInput2 = GUICtrlCreateInput("Input text here", 50, 100, 200, 20)
$HelpButton = GUICtrlCreateButton("Help", 20, 160, 60, 25)

$HH_POPUP = DllStructCreate("int cbStruct;hwnd hinst;uint idString;ptr pszText;long pt[2];dword clrForeground;dword clrBackground;long rcMargins[4];ptr pszFont")
$tPoint = DllStructCreate("long X;long Y", DllStructGetPtr($HH_POPUP, "pt"))
$tRect = DllStructCreate("long L;long T;long R;long B", DllStructGetPtr($HH_POPUP, "rcMargins"))

$tText = DllStructCreate("char String[256]")
$tFont = DllStructCreate("char String[256]")

DllStructSetData($tText, "String", "Help Popup")
DllStructSetData($tFont, "String", "MS Sans Serif, 10, , BOLD")

DllStructSetData($tRect, "L", -1)
DllStructSetData($tRect, "R", -1)
DllStructSetData($tRect, "T", -1)
DllStructSetData($tRect, "B", -1)

DllStructSetData($HH_POPUP, "cbStruct", DllStructGetSize($HH_POPUP))
DllStructSetData($HH_POPUP, "hinst", _WinAPI_GetModuleHandle(""))
DllStructSetData($HH_POPUP, "idString", 0)
DllStructSetData($HH_POPUP, "pszText", DllStructGetPtr($tText))
DllStructSetData($HH_POPUP, "clrForeground", -1)
DllStructSetData($HH_POPUP, "clrBackground", -1)
DllStructSetData($HH_POPUP, "pszFont", DllStructGetPtr($tFont))

GUISetState()

While 1
    Switch GUIGetMsg()
      Case -3
            ExitLoop
      Case
$HelpButton
            $aPos
= MouseGetPos()
            DllStructSetData($tPoint, "X", $aPos[0])
            DllStructSetData($tPoint, "Y", $aPos[1])

            $DllRet = DllCall("HHCtrl.ocx", "hwnd", "HtmlHelpA", "hwnd", $hGUI, "ptr", 0, _
            "uint", $HH_DISPLAY_TEXT_POPUP, "dword", DllStructGetPtr($HH_POPUP))

                        Sleep(3000)
            DllCall("HHctrl.ocx", "hwnd", "HtmlHelpA", "hwnd", $DllRet[0], "ptr", 0, "uint", $HH_CLOSE_ALL, "dword", 0)
    EndSwitch
WEnd


Maza Faka 04-04-2008 11:57 774416

Цитата:

Цитата amel27
интересно, а чем не устраивает штатный ToolTip? »

Пытался реализовать справку What this.

Цитата:

Цитата amel27
что касается структур подправил, но сразу после отображения окна скрипт все равно валится... возможно, причина в том что это OCX а не DLL, либо требуется что-то еще.. можешь, кстати, поинтересоваться на оффсайте: »

Мдаа... жалко конечно, что валится, но всё равно спасибо за помощь, хотя бы за пример создания столь сложной структуры. ;)

Mogidin 04-04-2008 15:30 774585

Вопрос. Требуется сделать окно, которого не будет на панели задач, тока в трее.
И в догонку. Можно поменять иконку этого окна в трее? Как?

вопрос снимается. =)

Котяра 04-04-2008 18:10 774714

Помогите написать один скрипт. Короче, есть утилита fontinst.exe. Ее задача установить, шрифты, лежащие с ней в одной директории и прописанные в файле fontinst.inf. Синтаксис запуска:
Код:

fontinst.exe /f fontinst.inf
Так вот надо написать скрипт для формирования fontinst.inf . Файл выглядит так:
Код:

[fonts]
imya_faila1.ttf
imya_faila2.ttf
imya_failaX.ttf

Вариант 1: создать файл для всех шрифтов (*.ttf) из директории со скриптом.
Вариант 2: вывести окно со списком шрифтов из текущей директории и флажками.
Как это сделать? Хотя бы первый вариант...

Maza Faka 05-04-2008 09:20 775111

Котяра
IMHO эту задачу проще и быстрее будет решить с помощью bat-файла:
Код:


@echo off
echo [fonts]> fontinst.inf
for %%a in (*.ttf) do echo %%a>> fontinst.inf

Если же без AutoIt-а никак, то пожить этот батничек в папку с AutoIt скриптом и вызывать его такой командой:
Код:

ShellExecuteWait(@ScriptDir & "\fontinst.cmd", "", "", "open", @SW_HIDE)

amel27 05-04-2008 12:37 775199

Maza Faka
Цитата:

жалко конечно, что валится »
Вообще, случай с этим HH забавный (если не сказать грустный). Во-первых, есть такой KB для VB, но добавление команд HH_INITIALIZE/HH_UNINITIALIZE (на всякий случай запостил ниже) ситуацию не меняет... разве только ошибка быстрей валится. Во-вторых, на форуме родственной AutoHotkey лежит готовый пример от PhiLho 2006-го года и судя по отзывам он должен работать, но он не работает!.. у меня валится примерно та же ошибка, можешь кстати проверить.
Код:

Global Const $HH_INITIALIZE=0x1C
Global Const $HH_UNINITIALIZE=0x1D

$tCookie = DllStructCreate("dword")

$DllRet = DllCall("HHCtrl.ocx", "hwnd", "HtmlHelp", "hwnd", 0, "ptr", 0, _
    "uint", $HH_INITIALIZE, "dword", DllStructGetPtr($tCookie))

; .....

$DllRet = DllCall("HHCtrl.ocx", "hwnd", "HtmlHelp", "hwnd", 0, "ptr", 0, _
    "uint", $HH_UNINITIALIZE, "dword", DllStructGetData($tCookie, 1))

Котяра
Цитата:

Хотя бы первый вариант »
Код:

#Include <File.au3>

$sFileName = $cmdline[$cmdline[0]]
If IsNumber($sFileName) Then $sFileName = StringRegExpReplace(@ScriptFullPath, "\.au3|\.exe$", "") &".inf"

$aFileList=_FileListToArray(@ScriptDir, "*.ttf", 1)
If @Error Then Exit
$aFileList[0]="[fonts]"
_FileWriteFromArray($sFileName, $aFileList)


TERMINAL 05-04-2008 12:52 775202

Можно ли в реестре с помощью RegDelete едалить не значение, а полностью ветку (папку)?

amel27 05-04-2008 13:05 775211

Цитата:

Цитата TERMINAL
Можно ли в реестре с помощью RegDelete едалить не значение, а полностью ветку »

конечно можно, если не указывать необязательный параметр "valuename", цитата из справки:
Цитата:

Deletes a key or value from the registry

Maza Faka 05-04-2008 17:36 775437

amel27,
Цитата:

Цитата amel27
Вообще, случай с этим HH забавный »

Хмм.. интересная информация, как я понял функция HtmlHelp вызывается отдельным потоком и вероятно это вызывает ошибку? Может в будущих версиях AutoIt-а эта функция будет работать нормально...

Котяра 05-04-2008 19:08 775513

Maza Faka, а как после этого запустить fontinst.exe? Добавить в конец батника
fontinst.exe /f fontinst.inf
?

Проблема решилась созданием файла clickme.bat
Код:

call fontinst.cmd
fontinst.exe /f fontinst.inf


DENoszone 05-04-2008 23:19 775774

помогите скрипт перестал вставлять title . и пустое окно делает.
PHP код:

#include <IE.au3>                While 1      $oIE = _IECreate ("http://www.yandex.ru/yandsearch?random=071215722&stype=www&randomtext=1&lr=187", 0, 1, 0)      WinWait("[Class:IEFrame]")  WinSetState("[Class:IEFrame]", "", @SW_MAXIMIZE)      _IELoadWait ($oIE)      Send("{F5}")        $oIE_2 = _IECreate ("http://nigma.ru")       WinWait("[Class:IEFrame]")        WinSetState("[Class:IEFrame]", "", @SW_MAXIMIZE)        _IELoadWait ($oIE_2)      $oForm = _IEFormGetObjByName ($oIE_2, 0)      $oQuery = _IEFormElementGetObjByName ($oForm, 0)        $sTitle = StringReplace(_IEPropertyGet($oIE,"title"), "Яндекс:", "")      $sTitle = StringStripWS($sTitle, 3)              _IEFormElementSetValue ($oQuery, $sTitle)      _IEFormSubmit ($oForm)      Sleep(5000)  MouseClick("left", 69, 293, 1, 1)   Sleep(2000)  MouseClick("left", 394, 329, 1, 1)   Sleep(2000)  MouseClick("left", 379, 355, 1, 1)   Sleep(5000)    Do      WinClose("[Class:IEFrame]")  Until Not WinExists("[Class:IEFrame]")      ;~ RunWait(@ComSpec & " /c " & 'taskkill /im iexplore.exe /f', "", @SW_HIDE)        Sleep(1000)  WEnd 


amel27 06-04-2008 11:28 775932

DENoszone
Цитата:

скрипт перестал вставлять title »
не улавливаю смысл скрипта, но титул окна можно менять и без _IE-функций:
Код:

#include <IE.au3>

$oIE = _IECreate ("http://www.yandex.ru/yandsearch?random=071215722&stype=www&randomtext=1&lr=187", 0, 1, 0, 0)
WinSetState("", "", @SW_MAXIMIZE)

_IELoadWait($oIE)
$sTitleOld = _IEPropertyGet($oIE, "title")
$sTitleNew = StringStripWS(StringReplace($sTitleOld,"Яндекс:", ""), 3)
WinSetTitle($sTitleOld, "", $sTitleNew)


DENoszone 06-04-2008 11:32 775935

берет тайтл с яндекса и вставляет в поиск нигмы

amel27 06-04-2008 15:50 776027

Цитата:

Цитата DENoszone
берет тайтл с яндекса и вставляет в поиск нигмы »

как вариант:
Код:

#include <IE.au3>

$oIE = _IECreate("http://www.yandex.ru/yandsearch?random=071215722&stype=www&randomtext=1&lr=187", 0, 0, 0)
_IENavigate ($oIE, "http://www.yandex.ru/yandsearch?random=071215722&stype=www&randomtext=1&lr=187")

$sTitle = _IEPropertyGet($oIE, "title")
$sTextFind = StringStripWS(StringReplace(_IEPropertyGet($oIE, "title"),"Яндекс:", ""), 3)

$oIE = _IECreate("http://nigma.ru", 0, 1, 0, 0)
WinSetState("", "", @SW_MAXIMIZE)
_IELoadWait($oIE)

$oForm = _IEFormGetCollection($oIE, 0)
$oElement = _IEFormElementGetObjByName($oForm, "s")
_IEFormElementSetValue($oElement, $sTextFind)
_IEFormSubmit($oForm)

тот же вариант, оптимизированный по скорости загрузки:
Код:

#include <IE.au3>

_IEErrorHandlerRegister ("MyErrFunc")

$oIE = _IECreate("http://www.yandex.ru/yandsearch?random=071215722&stype=www&randomtext=1&lr=187", 0, 0, 0)
_IENavigate ($oIE, "http://www.yandex.ru/yandsearch?random=071215722&stype=www&randomtext=1&lr=187", 0)
Do
    Sleep(100)
    $iError = 0
    $sTitle = _IEPropertyGet($oIE, "title")
Until $iError=0

$sTextFind = StringStripWS(StringReplace(_IEPropertyGet($oIE, "title"),"Яндекс:", ""), 3)
$oIE = _IECreate("http://nigma.ru", 0, 1, 0, 0)
WinSetState("", "", @SW_MAXIMIZE)
Do
    Sleep(100)
    $oForm = _IEFormGetCollection($oIE, 0)
Until @error=0
Do
    Sleep(100)
    $oElement = _IEFormElementGetObjByName($oForm, "s")
Until @error=0

_IEFormElementSetValue($oElement, $sTextFind)
_IEFormSubmit($oForm)

Func MyErrFunc()
    $iError = $oIEErrorHandler.number
EndFunc


DENoszone 06-04-2008 18:47 776113

эээ не пашет

nevson 06-04-2008 21:10 776184

Подскажите,пожалуйста,как средствами AutoIT можно узнать количество байт,принятых через Dial-Up соединение?

Creat0R 07-04-2008 02:54 776343

Нужна помошь по ускорению работы функции:

Код:

Func __UTF8ToUnicode($Utf8String)
    Local $BufferSize = StringLen($Utf8String) * 2
    Local $Buffer = DllStructCreate("byte[" & $BufferSize & "]")

    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 $StrLen = StringLen($UnicodeHex1)
    Local $UnicodeString, $UnicodeHex2, $UnicodeHex3

    For $i = 1 To $StrLen Step 4
        $UnicodeHex2 = StringMid($UnicodeHex1, $i, 4)

        If $UnicodeHex2 = "0000" Then ContinueLoop

        $UnicodeHex3 = StringRegExpReplace($UnicodeHex2, "(..).(.)", "\2\1")
        $UnicodeString &= ChrW(Dec($UnicodeHex3))
    Next

    $Buffer = 0

    Return $UnicodeString
EndFunc

С большими блоками текста довольно медленно отрабатывает, всё дело в цикле, я уже пробовал разные комбинации вместо String*, но ничего значительно не ускорялось.. Или быть можеть есть другой вариант преобразовать UTF-8 в юникод? (UTF-16?)

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

Creat0R 07-04-2008 04:16 776354

“Век живи, век учись! © ”

Оказывается, любая обработка строк (функции String*) будет в несколько раз замедлена если вы используете «Opt("ExpandEnvStrings", 1)» или «Opt("ExpandVarStrings", 1)» :secret: .

Я в скрипте как раз использую Opt("ExpandEnvStrings", 1), поэтому обработка была медленнее, проверял же в другом скрипте, который создаётся и запускается из этого родительского скрипта.

amel27 07-04-2008 07:31 776375

Цитата:

Цитата DENoszone
эээ не пашет »

ну не знаю, у меня все пашет - проверил дома на диалапе и на работе через прокси... сверяй настройки: WinXP SP2 + IE6 + AutoIT v3.2.10.0. Чтобы разговор был предметным - отключай в первом запросе флаг невидимости и смотри в каком месте отходит от плана выполнения.

Цитата:

Цитата nevson
Подскажите,пожалуйста,как средствами AutoIT можно узнать количество байт,принятых через Dial-Up соединение? »

Попробуй следующий UDF:
Код:

MsgBox(0, "Статистика подключения:", "Получено "& Int(_Net_InterfaceBytes("Realtek", 1)/(1024*1024)) &" мегабайт")

; Возвращает количество байт, отправленых или принятых через сетевой интерфейс
;  $sInterfaceName - имя или часть имени сетевого интерфейса (не соединения!)
;      в свойствах соединения "подключаться через:"
;  $iFlag - что включать в расчет:
;      1 - принято,
;      2 - отправлено,
;      3 - всего.

Func _Net_InterfaceBytes($sInterfaceName, $iFlag = 3)
    Local $objWMIService = ObjGet("winmgmts:\\.\root\CIMV2"), $iBytes=0
    Local $colItems = $objWMIService.ExecQuery("SELECT Name,BytesReceivedPersec,BytesSentPersec FROM Win32_PerfRawData_Tcpip_NetworkInterface", "WQL", 0x30)
    If Not(IsObj($colItems)) Then Return SetError(1, 0, -1) ; Ошибка WMI
    For $objItem In $colItems
        If StringInStr($objItem.Name, $sInterfaceName) Then
            If
BitAND($iFlag, 1) Then $iBytes += $objItem.BytesReceivedPersec
            If BitAND($iFlag, 2) Then $iBytes += $objItem.BytesSentPersec
            Return $iBytes
        EndIf
    Next
    Return
SetError(2, 0, -1) ; Ошибка: интерфейс не найден
EndFunc ; --> _Net_InterfaceBytes

Creat0R,
Цитата:

Оказывается, любая обработка строк (функции String*) будет в несколько раз замедлена если вы используете «Opt("ExpandEnvStrings", 1)» или «Opt("ExpandVarStrings", 1)» »
Ну... в принципе, логично. Т.е. нужно в UDF-ах выставлять только при необходимости и не забывать возвращать обратно...
Кстати (не могу пробиться к тебе в ПМ) если разберешься насчет BeginPaint / EndPaint маякни сюда или в ПМ... а то зацепило :)

Creat0R 07-04-2008 07:59 776382

amel27,
Цитата:

в принципе, логично
Согласен, но об этом нужно было самому догадаться, мне пришлось распотрашить весь скрипт (более 5000 строк!), пока не дошёл до самого верху, где выставил вызов функции уже перед всеми Opt и Include, там то я и понял, что именно Opt и вызывает такую задержку. Нужно бы разработчикам на заметку кинуть мои доводы :), чтобы где нибудь в справке написали об этом. Теперь я начинаю понимать Valik'а, он постоянно возмущается, мол зачем внедрили Opt изначально...

Цитата:

нужно в UDF-ах выставлять только при необходимости и не забывать возвращать обратно...
Так и сделал ;)

Цитата:

не могу пробиться к тебе в ПМ
Немного почистил, на днях удалю все ПМ, нужно бы сначала сохранить всё, нативная функция кстати работает некорректно :(


Цитата:

если разберешься насчет BeginPaint / EndPaint маякни сюда или в ПМ
Хорошо, если ты не против, я на оф. форуме оставлю в моей теме твоё решение, и как бы между прочим спрошу об этой проблеме :), правда если честно не успел разобраться какой именно...

amel27 07-04-2008 11:29 776498

Creat0R
Цитата:

если ты не против, я на оф. форуме оставлю в моей теме твоё решение »
не против, все равно некогда - везде не поспеешь...
Цитата:

если честно не успел разобраться какой именно »
сравни обработку WM_PAINT у меня и в примере из книги для Hello1 - тот что в книге у меня не прокатил

DENoszone 07-04-2008 11:37 776500

amel27, а что у тебя он делает???
он делает заход на нигм...прописывает там тайтл из яндекса...и и делает поиск?
где флаг не видимости?=)

amel27 07-04-2008 12:53 776557

Цитата:

Цитата DENoszone
что у тебя он делает??? »

так понятней?
Код:

#include <IE.au3>

; Открытие окна Yandex (снял флаг невидимости и поставил ожидание загрузки - смотри справку!)
$oIE = _IECreate("http://www.yandex.ru/yandsearch?random=071215722&stype=www&randomtext=1&lr=187", 0, 1, 1, 0)
MsgBox(0, "Открытие окна Yandex", "Шаг 1 выполнен, проверьте результат!")

; Обновление окна IE
_IEAction ($oIE, "refresh")
MsgBox(0, "Обновление окна IE", "Шаг 2 выполнен, проверьте результат!")

; Читаем титул
$sTitle = _IEPropertyGet($oIE, "title")
MsgBox(0, "Читаем титул", 'Шаг 3 выполнен, титул окна: "'& $sTitle &'"')

; Выдергиваем из титула искомую фразу
$sTextFind = StringStripWS(StringReplace(_IEPropertyGet($oIE, "title"),"Яндекс:", ""), 3)
MsgBox(0, "Выдергиваем из титула искомую фразу", 'Шаг 4 выполнен, фраза: "'& $sTextFind &'"')

; Открытие окна Nigma
$oIE = _IECreate("http://nigma.ru", 0, 1, 0, 0)
WinSetState("", "", @SW_MAXIMIZE)
_IELoadWait($oIE)
MsgBox(0, "Открытие окна Nigma", "Шаг 5 выполнен, проверьте результат!")

; Вставка в элемент формы найденной фразы
$oForm = _IEFormGetCollection($oIE, 0)
$oElement = _IEFormElementGetObjByName($oForm, "s")
_IEFormElementSetValue($oElement, $sTextFind)
MsgBox(0, "Вставка в элемент формы найденной фразы", "Шаг 6 выполнен, проверьте результат!")

; Выполнение поиска
_IEFormSubmit($oForm)
MsgBox(0, "Выполнение поиска", "Шаг 7 выполнен, проверьте результат!")


DENoszone 07-04-2008 23:46 777062

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

и что бы проверялось что какое мыло написано в профеле если к примеру qwe@mail.ru то продолжать работу..если нет..то заканчивать

Creat0R 08-04-2008 02:16 777129

Цитата:

Нужно бы разработчикам на заметку кинуть мои доводы
Вроде кинул :)

Цитата:

сравни обработку WM_PAINT у меня и в примере из книги для Hello1 - тот что в книге у меня не прокатил
Сравнил, кажется понял что имеется в виду, но у меня не полчилось, пробовал примерно так:

Код:

; Код оконной процедуры нашего оконного класса

Func MsgHelloWndProc($hWnd, $uMsg, $wParam, $lParam)
    Local $aRet, $stPaint, $ahDC, $tRect, $sDrawText = "Hello, World!"
    Switch $uMsg
        Case $WM_PAINT
            $stPaint
= DllStructCreate("int;int;long;long;long;long;int;int;byte[32]")
            $ahDC = DllCall("user32.dll", "int", "BeginPaint", "hwnd", $hWnd, "ptr", _
                DllStructGetPtr($stPaint))

            _WinAPI_DrawText($ahDC[0], $sDrawText, $stPaint, BitOR($DT_SINGLELINE, $DT_CENTER, $DT_VCENTER))

            DllCall("user32.dll", "int", "EndPaint", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPaint))

            ; освобождаем контекст устройства
            _WinAPI_ReleaseDC($hWnd, $ahDC[0])
        Case $WM_CLOSE
            _WinAPI_DestroyWindow($hWnd)
        Case $WM_DESTROY
;          $aRet = DllCall("user32.dll", "none", "PostQuitMessage", "int", 0 )
        Case Else
            Return
_WinAPI_DefWindowProc($hWnd, $uMsg, $wParam, $lParam) ; передаем "чужие" сообщение дальше на обработку
    EndSwitch
    Return
0
EndFunc ; ==> MsgHelloWndProc

На оф. форуме оставил твой пример.

amel27,
Во, так вроде работает:

Код:

; Код оконной процедуры нашего оконного класса

Func MsgHelloWndProc($hWnd, $uMsg, $wParam, $lParam)
    Local $aRet, $stPaint, $ahDC, $tRect, $sDrawText = "Hello, World!"
    Switch $uMsg
        Case $WM_PAINT
            $stPaint
= DllStructCreate("int;int;long;long;long;long;int;int;byte[32]")
            $ahDC = DllCall("user32.dll", "int", "BeginPaint", _
                "hwnd", $hWnd, "ptr", DllStructGetPtr($stPaint))

            $tRect = _WinAPI_GetClientRect($hWnd) ; получаем координаты клиентской области

            _WinAPI_DrawText($ahDC[0], $sDrawText, $tRect, BitOR($DT_SINGLELINE, $DT_CENTER, $DT_VCENTER))

            DllCall("user32.dll", "int", "EndPaint", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPaint))
        Case $WM_CLOSE
            _WinAPI_DestroyWindow($hWnd)
        Case $WM_DESTROY
;          $aRet = DllCall("user32.dll", "none", "PostQuitMessage", "int", 0 )
        Case Else
            Return
_WinAPI_DefWindowProc($hWnd, $uMsg, $wParam, $lParam) ; передаем "чужие" сообщение дальше на обработку
    EndSwitch
    Return
0
EndFunc ; ==> MsgHelloWndProc

:)

Ну или я неверно понял о чём вообще речь

amel27 08-04-2008 04:19 777147

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

Creat0R
Цитата:

или я неверно понял о чём вообще речь »
не, у тебя как раз все правильно, это я накосячил в определении структуры PAINTSTRUCT (не заметил размерности [32]) :tomato2: так что вопрос снимается - одна голова хорошо, а две лучше... зато узнал роль BeginPaint и чем ее можно заменить. :)

DENoszone 08-04-2008 09:27 777212

amel27,
http://www.nigma.ru/index_menu.php?a...&display=login - авторизация
http://www.nigma.ru/index_menu.php?a...splay=userinfo - тут в поле проверить какое мыло если к примеру qwe@mail.ru то дальше продолжить работу... если что то другое то закрывать IE и дальше не чего не выполнять

TERMINAL 08-04-2008 09:35 777216

Помогите написать условие, если сегодня суббота-тогда выдаётся сообщение (при условии что эта суббота через 2 недели-тоесть сегодня 8.04.08-нужно чтобы выдалось сообщение не 12.04.08, а 19.04.08, потом 03.05.08 и т.д.) Заранее спс !

Creat0R 08-04-2008 10:20 777227

TERMINAL,
Цитата:

Цитата TERMINAL
Помогите написать условие, если сегодня суббота-тогда выдаётся сообщение (при условии что эта суббота через 2 недели-тоесть сегодня 8.04.08-нужно чтобы выдалось сообщение не 12.04.08, а 19.04.08, потом 03.05.08 и т.д.) »

Не знаю верно ли понял (долго вникал в суть вышесказанного ).. но вот:

Код:

#include <Date.au3>

$sDate = "2008/04/08"
$sNowDate = _NowCalcDate()

If @WDAY = 7 Then
    If
_DateDiff("w", $sDate, $sNowDate) >= 2 Then
        $sMsg_Data = StringFormat("Сегодня Суббота (%s), прошло две недели с момента последней проверки:\n\n%s", $sNowDate, $sDate)
        MsgBox(64, "Суббота наступила!", $sMsg_Data)
    EndIf
EndIf


Mogidin 08-04-2008 10:26 777231

Хочу вставить в форму диалог выбора файла (каталога). Возможно ли реализовать это на автоите?

TERMINAL 08-04-2008 10:40 777238

Creat0R, Спасибо огромное ! Чуть подправил под себя и получилось то что хотел...Не ожидал что так быстро поможешь...

Creat0R 08-04-2008 10:58 777246

Mogidin,
Цитата:

вставить в форму диалог выбора файла
FileOpenDialog() / FileSelectFolder()?

Mogidin 08-04-2008 11:31 777269

Воистину могат и богуч AutoIt Help.
Сколько ни смотри, что-нибудь да пропустишь.

Креатору спасибо.

DENoszone 08-04-2008 18:01 777583

$sTextFind = StringStripWS(StringReplace(_IEPropertyGet($oIE, "title"),"Яндекс:", ""), 3)
как тут сделать что бы уберался весь текст после Яндекс:

amel27 09-04-2008 04:56 777883

DENoszone
Цитата:

тут в поле проверить какое мыло если к примеру qwe@mail.ru то дальше продолжить работу... если что то другое то закрывать IE и дальше не чего не выполнять »
к сожалению твоя NIGMA не хочет меня регистрировать, поэтому проверить нет возможности :tongue:
Цитата:

как тут сделать что бы уберался весь текст после Яндекс: »
ты хоть понял что спросил?... собственно ответ: $sTextFind = "Яндекс:" (все что после него убрал) :biggrin:

TERMINAL 09-04-2008 11:58 778061

Возможно ли такое, на одном компе работают юзеров 15...Хотелось бы между ними сделать простенький час...т.е. определяется юзер примерно так If @UserName="User11" Then ....от которого идёт сообщение и передаётся другому юзеру...???

amel27 10-04-2008 05:59 778647

TERMINAL
на оффсайте навалом вариантов разной степени сложности, к примеру:

Proper Telnet Chat
P2P-Style Chat, Serverless Chat Client for LANs
TCP Chat

если хочешь поваять сам могу предложить простой алгоритм а-ля Web-чат без сетевых приблуд:

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

главное, чтобы клиент не занимал долго файл при отправке сообщения (с правами записи) - добавил текст и сразу освободил файл

KillHunter 10-04-2008 12:14 778834

Вложений: 1
Подскажите плз что нужно прописать что бы снять галочку "Desktop Shortcut"???

TERMINAL 10-04-2008 14:15 778910

amel27, Проблемка в том что у всех юзеров один и тот же айпишник а имена пользователей разные....

amel27 10-04-2008 16:13 778980

Цитата:

Цитата TERMINAL
у всех юзеров один и тот же айпишник а имена пользователей разные.... »

Если ты про мой гипотетический вариант, то там сеть вообще не нужна - файл может быть локальный... Если про готовые примеры то это тоже не проблема - там кроме IP еще и номер порта задается, так что (даже если в интерфейсе этого не видно) в скрипте можно указать разные номера портов для одного IP.

Цитата:

Цитата KillHunter
что нужно прописать что бы снять галочку "Desktop Shortcut"??? »

Эта ветка по общим вопросам, для вопросов по установке конкретных программ ищите соответствующую тему или создавайте новую (это из шапки)... Либо формулируйте вопрос без привязки к конкретной программе/версии... Подсказка: используйте "AutoIT Window Info" из комплекта AutoIT.

nevson 10-04-2008 19:57 779097

amel27 , спасибо, но это не совсем то... Не подскажешь, как получить статистику через Ras API?

KillHunter 10-04-2008 20:25 779118

Цитата:

Цитата amel27
Эта ветка по общим вопросам, для вопросов по установке конкретных программ ищите соответствующую тему или создавайте новую (это из шапки)... Либо формулируйте вопрос без привязки к конкретной программе/версии... Подсказка: используйте "AutoIT Window Info" из комплекта AutoIT. »

Я извиняюсь что влез не в ту тему,но эмуляцию клика я и сам могу прописать.Меня интересует эмуляция клавиатурных
нажатий(по идее там нужно нажать TAB,4 раза Down,SPACE и ENTER,я пишу что-то типа:
HTML код:

Send("{TAB}")
Send("{DOWN 4}")
Send("{SPACE}")
Send("{ENTER}")

но ярлык всё равно создаётся)

amel27 11-04-2008 09:45 779361

Цитата:

Цитата KillHunter
Меня интересует эмуляция клавиатурных
нажатий »

Эмуляция нажатий (равно как и "кликов") довольно ненадежна при работе с окнами, так как нужно быть уверенным что активизировано именно то окно и именно тот элемент окна, иначе комбинация не сработает или уйдет не туда и результат непредсказуем.... Поэтому для установки ПО этот метод применять нежелательно, либо как крайний случай. AutoIT имеет достаточно возможностей для прямой работы с окнами, главное однозначно идентифицировать окно и элемент (заголовок, класс, текст). Вот вариант для твоего случая:
Код:

#include <GuiTreeView.au3>

$hDTCtrl = ControlGetHandle("DAEMON Tools", "", "SysTreeView321"; ищем элемент окна
$hDTItem = _GUICtrlTreeView_FindItem($hDTCtrl, "Desktop Shortcut") ; ищем нужный пункт списка
_GUICtrlTreeView_SetChecked($hDTCtrl, $hDTItem, False)            ; снимаем чекбокс


amel27 11-04-2008 11:06 779412

DENoszone
Цитата:

проверить какое мыло если к примеру qwe@mail.ru то дальше продолжить работу... если что то другое то закрывать IE и дальше не чего не выполнять »
типа такого:
Код:

#include <IE.au3>

; Открытие окна Nigma
$oIE = _IECreate("http://www.nigma.ru/index_menu.php?action=authorization&display=login", 0, 1, 0, 0)
WinSetState("", "", @SW_MAXIMIZE)
_IELoadWait($oIE)
MsgBox(0, "Открытие окна Nigma", "Шаг 1 выполнен, проверьте результат!")

; Попытка регистрации
$oForm = _IEFormGetCollection ($oIE, 1)
If IsObj($oForm) Then
    $oLogin = _IEFormElementGetObjByName($oForm, "login")
    If IsObj($oLogin) Then
        $oPassw = _IEFormElementGetObjByName($oForm, "pass")
        If IsObj($oPassw) Then
            _IEFormElementSetValue($oLogin, "LoginName")
            _IEFormElementSetValue($oPassw, "Password")
            _IEFormSubmit($oForm)
            MsgBox(0, "Попытка регистрации", "Шаг 2 выполнен, проверьте результат!")
        EndIf
    EndIf
EndIf


; Переход на страницу профиля
$iRes = _IENavigate($oIE, "http://www.nigma.ru/index_menu.php?action=authorization&display=userinfo")
MsgBox(0, "Переход на страницу профиля", "Шаг 3 выполнен, проверьте результат!")

; Чтение почтового адреса
If $iRes Then
    $oForm = _IEFormGetCollection ($oIE, 1)
    If IsObj($oForm) Then
        $oMail = _IEFormElementGetObjByName($oForm, "email")
        If IsObj($oMail) Then
            $sMail = _IEFormElementGetValue($oMail)
            MsgBox(0, "Чтение почтового адреса", "Шаг 4 выполнен, мыло: "& $sMail)
        EndIf
    EndIf
EndIf


; Проверяем результат
If $sMail="qwe@mail.ru" Then
    MsgBox(0, "Успешная проверка", "Мыло правильное, чего дальше делать?")
Else
    _IEAction($oIE,"quit") ; Закрываем окно IE
    MsgBox(16, "Проверка не пройдена", "Типа облом, надо выходить")
    MsgBox(0, "Закрываем окно IE", "Шаг 5 выполнен")
    Exit
EndIf


KillHunter 11-04-2008 12:04 779448

Цитата:

Цитата amel27
Вот вариант для твоего случая: »

Всё равно ярлык остаётся...(((

amel27 11-04-2008 12:38 779463

Цитата:

Цитата KillHunter
Всё равно ярлык остаётся...((( »

ну коли не хошь в свою тему чтобы не оффтопить кидай ВЕСЬ скрипт в ПМ

NikLok 11-04-2008 14:10 779489

KillHunter, Может проще его удалять из AutoIt скрипта в конце?!

amel27 11-04-2008 17:01 779616

Цитата:

Цитата nevson
но это не совсем то... Не подскажешь, как получить статистику через Ras API? »

примерно так, проверяй:
Код:

; Возвращает количество байт, отправленых или принятых через RAS интерфейс
;  $iFlag - что включать в расчет:
;      1 - принято,
;      2 - отправлено,
;      3 - всего.

Func _RASConnBytes ($iFlags = 1)
    Local Const $MAX_PATH = 260
    Local Const $RAS_MaxDeviceType = 16
    Local Const $RAS_MaxEntryName = 256
    Local Const $RAS_MaxDeviceName = 128

    $tRASCONN = DllStructCreate("dword dwSize;hwnd hRasConn;char szEntryName["& $RAS_MaxEntryName+1 &"];" & _
                                "char szDeviceType["& $RAS_MaxDeviceType+1 &"];" & _
                                "char szDeviceName["& $RAS_MaxDeviceName+1 &"];" & _
                                "char szPhonebook[" & $MAX_PATH &"];" & _
                                "dword dwSubEntry;byte guidEntry[16];dword dwFlags;byte luid[8]")
    $tRAS_STATS = DllStructCreate(  "dword dwSize;dword dwBytesXmited;dword dwBytesRcved;dword dwFramesXmited;" & _
                                    "dword dwFramesRcved;dword dwCrcErr;dword dwTimeoutErr;dword dwAlignmentErr;" & _
                                    "dword dwHardwareOverrunErr;dword dwFramingErr;dword dwBufferOverrunErr;" & _
                                    "dword dwCompressionRatioIn;dword dwCompressionRatioOut;dword dwBps;dword dwConnectDuration")
    $iCntByte = DllStructCreate("dword")
    $iCntConn = DllStructCreate("dword")
    DllStructSetData($iCntByte,  1, DllStructGetSize($tRASCONN)  )
    DllStructSetData($tRASCONN,  1, DllStructGetSize($tRASCONN)  )
    DllStructSetData($tRAS_STATS,1, DllStructGetSize($tRAS_STATS))

    $aRet = DllCall("rasapi32.dll", "int", "RasEnumConnections", "ptr", DllStructGetPtr($tRASCONN), "ptr", DllStructGetPtr($iCntByte), "ptr", DllStructGetPtr($iCntConn))
    If $aRet[0] Then Return SetError(2, $aRet[0], -1)
    If DllStructGetData($iCntConn,1)<1 Then Return SetError(1, 0, 0) ; Ошибка: нет открытых соединений

    $aRet = DllCall("rasapi32.dll", "int", "RasGetConnectionStatistics", "hwnd", DllStructGetData($tRASCONN, "hRasConn"), "ptr", DllStructGetPtr($tRAS_STATS))
    If $aRet[0] Then Return SetError(3, $aRet[0], -1)

    Local $iBites = 0
    If BitAnd($iFlags,1) Then $iBites += DllStructGetData($tRAS_STATS,3)
    If BitAnd($iFlags,2) Then $iBites += DllStructGetData($tRAS_STATS,2)
    Return $iBites
EndFunc ; ==> _RASConnBytes


nevson 11-04-2008 20:49 779743

amel27, да, именно так! Спасибо огромное, все работает!

KillHunter 12-04-2008 02:31 779959

Цитата:

Цитата NikLok
Может проще его удалять из AutoIt скрипта в конце?! »

Может и проще,но мне интересно понять где я ошибся....
Если напишешь как ярлык удалить буду благодарен.

Maza Faka 12-04-2008 16:20 780169

amel27
Подскажи пожалуйста, имеется такая функция:
Код:

Global Const $FO_COPY = 0x0002
Global Const $FOF_ALLOWUNDO = 0x0040

_ExplorerCopy("d:\Video\Clips\New\02.avi", "C:\")

Func _ExplorerCopy($source, $dest)

    Local $SHFILEOPSTRUCT, $source_struct, $dest_struct

    $SHFILEOPSTRUCT
= DllStructCreate("hwnd hWnd;uint wFunc;ptr pFrom;ptr pTo;int fFlags;" & _
                                      "int fAnyOperationsAborted;ptr hNameMappings;ptr lpszProgressTitle")

    $source_struct = DllStructCreate("char[" & StringLen($source) + 2 & "]")
    DllStructSetData($source_struct, 1, $source)
    DllStructSetData($source_struct, 1, 0, StringLen($source) + 2)

    $dest_struct = DllStructCreate("char[" & StringLen($dest) + 2 & "]")
    DllStructSetData($dest_struct, 1, $dest)
    DllStructSetData($dest_struct, 1, 0, StringLen($dest) + 2)

    DllStructSetData($SHFILEOPSTRUCT, "hWnd", 0)
    DllStructSetData($SHFILEOPSTRUCT, "wFunc", $FO_COPY)
    DllStructSetData($SHFILEOPSTRUCT, "pFrom", DllStructGetPtr($source_struct))
    DllStructSetData($SHFILEOPSTRUCT, "pTo", DllStructGetPtr($dest_struct))
    DllStructSetData($SHFILEOPSTRUCT, "fFlags", $FOF_ALLOWUNDO)

    DllCall("shell32.dll", "int", "SHFileOperation", "ptr", DllStructGetPtr($SHFILEOPSTRUCT))
EndFunc  ;==>_ExplorerCopy

В вышеуказанной функции копируется один файл, а как скопировать несколько файлов из одной директории?
Поискал в инете, нашёл такое описание:
Цитата:

pFrom
Указатель на буфер, содержащий пути к одному или нескольким файлам. Если файлов несколько, между путями ставится нулевой байт. Список должен заканчиваться двумя нулевыми байтами.
Пример для Дельфи:
Цитата:

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


type TBuffer = array of Char;

procedure CreateBuffer( Names : array of string; var P : TBuffer );
var I, J, L : Integer;
begin
  for I := Low( Names ) to High( Names ) do
    begin
      L := Length( P );
      SetLength( P, L + Length( Names[ I ] ) + 1 );
      for J := 0 to Length( Names[ I ] ) - 1 do
        P[ L + J ] := Names[ I, J + 1 ];
      P[ L + J ] := #0;
    end;
  SetLength( P, Length( P ) + 1 );
  P[ Length( P ) ] := #0;
end;


Полдня бьюсь, не получается :(

amel27 13-04-2008 06:27 780464

Maza Faka,
Цитата:

Цитата Maza Faka
В вышеуказанной функции копируется один файл, а как скопировать несколько файлов из одной директории? »

зависит от того как передавать список файлов в функцию - массивом, строкой с разделителями или еще как... заполнить структуру можно так:
Код:

$sList = "File1" &Chr(0)& "File2" &Chr(0)& "File3" &Chr(0)&Chr(0)
$bList = StringToBinary($sList)

$iListLen = BinaryLen($bList)
$tList = DllStructCreate("byte["& $iListLen &"]")
DllStructSetData($tList, 1, $bList)

ConsoleWrite(DllStructGetData($tList,1) &@CRLF)

З.Ы. В примере на DELFI каждая строка заносится в структуру отдельной командой со сдвигом (чтобы оставлять нулевые байты), в моем примере сначала формируем искомую строку, которую потом сохраняем в структуре.

Maza Faka 13-04-2008 09:10 780484

amel27
Низкий тебе поклон за помощь и отличный пример! :pray: В жизни бы не додумался преобразовать строку в бинарник. ;) А я ведь пытался формировать строку с Chr(0) вот по этому примеру:
Цитата:

uses ShellApi;
...
var SHFileOpStruct:TSHFileOpStruct;
From:array [0..255] of Char;
begin
From:='D:\1.txt'+#0+'D:\2.txt'+#0+#0;
with SHFileOpStruct do begin
Wnd:=Handle;
wFunc:=FO_COPY;
pFrom:=@From;
pTo:='D:\';
fFlags:=FOF_RENAMEONCOLLISION;
fAnyOperationsAborted:=False;
hNameMappings:=nil;
lpszProgressTitle:=nil;
end;
SHFileOperation(SHFileOpStruct);
end;
да только безуспешно, так, как символы после первого нулевого байта игнорировались. Ещё раз огромное спасибо! :up:

P.S.
Интересно, а почему на Дельфи такое формирование строки получается, а на AutoIt-е нужно преобразовывать в бинарный код?

MaxxQ 13-04-2008 19:28 780747

Можно ли написать скрипт который бы включал и отключал сетевую плату через диспетчер устройств?

NikLok 13-04-2008 21:43 780834

KillHunter,
Цитата:

Цитата KillHunter
Если напишешь как ярлык удалить буду благодарен. »

Ну это детский вопрос и возможно мой ответ будет правильным.
Ярлык это файл с расширением lnk. Поэтому удалив этот файл ты удалишь ярлык.
Вот например я удаляю тотал мандер из автозапуска:
Код:

        If FileExists(@StartupDir & "\Total Commander.lnk") Then
          FileDelete(@StartupDir & "\Total Commander.lnk")
        EndIf

Аналогично с программами.
Когда хочешь удалить из панели быстрого запуска просто нужно правильно указать положение файла.
Это скорре всего что- то типа
Код:

@UserProfileDir & "\Application Data\Microsoft\Internet Explorer\Quick Launch\Твоя программа.lnk"

amel27 14-04-2008 04:07 780933

Maza Faka,
Цитата:

почему на Дельфи такое формирование строки получается, а на AutoIt-е нужно преобразовывать в бинарный код? »
ну хотя бы потому, что AutoIT не поддерживает указатели на переменные (в данном случае строковые) - только на структуры, поэтому приходится формировать структуру в два приема: сначала создаем строку (так же как в DELFI), потом присваиваем (т.е. "копируем") это значение в структуру... но при выполнении последней операции (копирования строки) AutoIT просто обязан оборвать строку на первом нулевом байте (конец строки!), только бинарные строки позволяют содержать нулевые байты (как в юникоде)


KillHunter
Цитата:

мне интересно понять где я ошибся »
похоже, что при входе в окно выбора компонент курсор находится совсем не в том месте где предполагалось - не на выборе режима (Standard/Custom), а уже на списке компонент, т.е. первый TAB будет лишний... Самое неприятное, что при таком положении "SPACE" отрабатывает не на компоненте ярлыка, а на кнопке "Next" что сбивает весь дальнейший ход установки. И еще неприятный момент - если вручную вернуться на этап выбора компонент (через "Back") курсор встанет как и положено на "Standard/Custom".

Цитата:

Цитата KillHunter
Всё равно ярлык остаётся »

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

#include <GuiTreeView.au3>

$Title='DAEMON

WinWait($Title,"Choose Components")
$hDTCtrl = ControlGetHandle($Title, "", "SysTreeView321")  ; ищем элемент окна
$hDTItem = _GUICtrlTreeView_FindItem($hDTCtrl, "Desktop Shortcut") ; ищем нужный пункт списка

WinActivate($Title,"Choose Components")
WinWaitActive($Title,"Choose Components")
_GUICtrlTreeView_ClickItem ($hDTCtrl, $hDTItem)


amel27 14-04-2008 10:29 781006

Цитата:

Цитата MaxxQ
Можно ли написать скрипт который бы включал и отключал сетевую плату через диспетчер устройств? »

Насколько важно именно через Диспетчер устройств?.. AFAIK через "сетевые подключения" можно добиться такого же результата... Как альтернатива для Висты можно использовать WMI, для 2К/XP - утилиту DevCon... думаю можно замутить аналогичное и в AutoIT через SetupAPI но вопрос: насколько это необходимо?
Код:

Func _NetConnection_Disable($sConnectionName)
    Local $sFolderName = "Сетевые подключения"
    Local $sVerbDisable= "&Отключить"

        Local $oNetConnections, $oConnection
    Local $oShellApp = ObjCreate("Shell.Application")
    Local $oControlPanel = $oShellApp.Namespace(3)
    For $oFolderItem In $oControlPanel.Items
        If $oFolderItem.Name = $sFolderName Then
            $oNetConnections = $oFolderItem.GetFolder
            ExitLoop
        EndIf
    Next
    If Not
(IsObj($oNetConnections)) Then Return SetError(1, 0, False)
    For $oFolderitem In $oNetConnections.Items
        If StringInStr($oFolderitem.Name, $sConnectionName) Then
            $oConnection = $oFolderitem
            ExitLoop
        EndIf
    Next
    If Not
(IsObj($oConnection)) Then Return SetError(2, 0, False)
    $oConnection.InvokeVerb($sVerbDisable)
    Sleep(1000)
EndFunc


TERMINAL 14-04-2008 12:50 781090

amel27, что-то попробовал скомпелировать чаты по твоей ссылке-все ошибки выдают:(

amel27 14-04-2008 12:57 781093

Цитата:

Цитата TERMINAL
ошибки выдают »

сам не хошь поразвлекаться? ;) какой выбрал?... там по ходу скрипты немного устарели, надо править для новых версий AutoIT

TERMINAL 14-04-2008 14:01 781133

amel27, у меня просто времени нет в чужих трудах копаться :( Пробовал все 3 которые ты давал-ниодин не заработал...

amel27 15-04-2008 09:45 781648

Цитата:

Цитата TERMINAL
у меня просто времени нет в чужих трудах копаться »

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

Maza Faka 16-04-2008 16:49 782655

amel27
Только ты можешь помочь! :pray:
Пытаюсь сменить разрешение экрана, но безуспешно :(
Код:

Global Const $CDS_TEST      = 0x00000002
Global Const $CCDEVICENAME  = 32
Global Const $CCFORMNAME    = 32
Global Const $DM_PELSWIDTH  = 0x80000
Global Const $DM_PELSHEIGHT = 0x100000
Global Const $DM_BITSPERPEL = 0x40000
Global Const $WM_DISPLAYCHANGE = 0x007E
Global Const $HWND_BROADCAST = 0xFFFF
Global Const $SPI_SETNONCLIENTMETRICS = 0x2A
Global Const $DM_DISPLAYFLAGS = 0x200000

$DEVMODE = DllStructCreate("char dmDeviceName[255];ushort dmSpecVersion;ushort dmDriverVersion;ushort dmSize;" & _
                          "ushort dmDriverExtra;dword dmFields;int dmOrientation;int dmPaperSize;int dmPaperLength;" & _
                          "int dmPaperWidth;int dmScale;int dmCopies;int dmDefaultSource;int dmPrintQuality;" & _
                          "int dmColor;int dmDuplex;int dmYResolution;int dmTTOption;int dmCollate;char dmFormName[255];" & _
                          "int dmUnusedPadding;int dmBitsPerPel;int dmPelsWidth;int dmPelsHeight;dword dmDisplayFlags;" & _
                          "dword dmDisplayFrequency")

DllStructSetData($DEVMODE, "dmDeviceName", $CCDEVICENAME)
DllStructSetData($DEVMODE, "dmFormName", $CCFORMNAME)
DllStructSetData($DEVMODE, "dmPelsWidth", 800)
DllStructSetData($DEVMODE, "dmPelsHeight", 600)
DllStructSetData($DEVMODE, "dmBitsPerPel", 16)
DllStructSetData($DEVMODE, "dmDisplayFrequency", 60)
DllStructSetData($DEVMODE, "dmSize", DllStructGetSize($DEVMODE))
DllStructSetData($DEVMODE, "dmFields", BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL))

$DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST)

ConsoleWrite("DllRet = " & $DllRet[0] & @LF)

DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _
        "int", $SPI_SETNONCLIENTMETRICS, "int", 0)


Creat0R 16-04-2008 17:45 782690

Maza Faka,
Цитата:

Пытаюсь сменить разрешение экрана
Многое уже до нас придумано ;)

Код:

$iWidth = 1024
$iHeight = 768
$iBitsPP = 32
$iRefreshRate = 85

$vRes = _ChangeScreenRes($iWidth, $iHeight, $iBitsPP, $iRefreshRate)
If @error Then
    MsgBox(262160, "ERROR", "Unable to change screen - check parameters")
EndIf

;===============================================================================
;
; Function Name:    _ChangeScreenRes()
; Description:      Changes the current screen geometry, colour and refresh rate.
; Version:          1.0.0.1
; Parameter(s):    $i_Width - Width of the desktop screen in pixels. (horizontal resolution)
;                  $i_Height - Height of the desktop screen in pixels. (vertical resolution)
;                  $i_BitsPP - Depth of the desktop screen in bits per pixel.
;                  $i_RefreshRate - Refresh rate of the desktop screen in hertz.
; Requirement(s):  AutoIt Beta > 3.1
; Return Value(s):  On Success - Screen is adjusted, @ERROR = 0
;                  On Failure - sets @ERROR = 1
; Forum(s):        http://www.autoitscript.com/forum/index.php?showtopic=20121
; Author(s):        Original code - psandu.ro
;                  Modifications - PartyPooper
;
;===============================================================================

Func _ChangeScreenRes($i_Width=@DesktopWidth, $i_Height=@DesktopHeight, $i_BitsPP=@DesktopDepth, $i_RefreshRate=@DesktopRefresh)
    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 = 0xffff
    Local Const $WM_DISPLAYCHANGE = 0x007E

    If $i_Width = "" Or $i_Width = -1 Then $i_Width = @DesktopWidth ; default to current setting
    If $i_Height = "" Or $i_Height = -1 Then $i_Height = @DesktopHeight ; default to current setting
    If $i_BitsPP = "" Or $i_BitsPP = -1 Then $i_BitsPP = @DesktopDepth ; default to current setting
    If $i_RefreshRate = "" Or $i_RefreshRate = -1 Then $i_RefreshRate = @DesktopRefresh ; default to current setting

    Local $stDEVMODE = DllStructCreate("byte[32];int[10];byte[32];int[6]")
    Local $aEnumDisplay = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "long", 0, _
        "ptr", DllStructGetPtr($stDEVMODE))

    If @error Then Return SetError(1, 0, 0)

    If $aEnumDisplay[0] <> 0 Then
        DllStructSetData($stDEVMODE, 2, BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY), 5)
        DllStructSetData($stDEVMODE, 4, $i_Width, 2)
        DllStructSetData($stDEVMODE, 4, $i_Height, 3)
        DllStructSetData($stDEVMODE, 4, $i_BitsPP, 1)
        DllStructSetData($stDEVMODE, 4, $i_RefreshRate, 5)

        $aEnumDisplay = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($stDEVMODE), "int", $CDS_TEST)

        If @error Then
            $aEnumDisplay = -1
        Else
            $aEnumDisplay = $aEnumDisplay[0]
        EndIf

        Select
            Case
$aEnumDisplay = $DISP_CHANGE_RESTART
                $stDEVMODE
= ""
                Return 2
            Case $aEnumDisplay = $DISP_CHANGE_SUCCESSFUL
                DllCall("user32.dll", "int", "ChangeDisplaySettings", _
                    "ptr", DllStructGetPtr($stDEVMODE), "int", $CDS_UPDATEREGISTRY)
                DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _
                        "int", $i_BitsPP, "int", $i_Height * 2 ^ 16 + $i_Width)

                $stDEVMODE = ""
                Return 1
            Case Else
                $stDEVMODE = ""
                Return SetError(1, 0, $aEnumDisplay)
        EndSelect
    EndIf
EndFunc ;==>_ChangeScreenRes


Maza Faka 16-04-2008 18:03 782713

Creat0R
Цитата:

Цитата Creat0R
Многое уже до нас придумано »

Я знаю, про этот код, но он у меня не работает, из 11 компьютеров срабатывает только на нескольких, да и то через раз. :( Так же есть утилитка написаная на C с использованием функции ChangeDisplaySettings и она прекрасно работает, вот я и пытаюсь написать рабочий код. :)

amel27 18-04-2008 05:03 783747

Maza Faka
Цитата:

из 11 компьютеров срабатывает только на нескольких, да и то через раз »
Тут немного погуглил - оказалось эта проблема встречается довольно часто когда функции ChangeDisplaySettings() и EnumDisplaySettings() для нормальной работы требуют снятия в свойствах экрана чекбокса "Скрыть неподдерживаемые режимы...", к примеру: http://www.codeproject.com/KB/system...lay_modes.aspx (см. комменты). Думаю это зависит от конкретного драйвера, но нигде не встречал решения равно как и программного способа снять эту галку... Тем более цепляет что:
Цитата:

есть утилитка написаная на C с использованием функции ChangeDisplaySettings и она прекрасно работает
может она использует EX-версии функций?

Maza Faka 18-04-2008 07:27 783765

amel27
Спасибо за информацию, как я уже тебе писал (в личку), всё дело именно в чекбоксе, а снять его несложно через реестр. :)
Спасибо ещё раз :up:

Creat0R 18-04-2008 09:00 783806

Maza Faka,
Цитата:

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

Maza Faka 18-04-2008 18:48 784201

Creat0R
Цитата:

Цитата Creat0R
Было бы полезно подсказать, где заветный раздел можно найти? »

Воть: :)
Код:

_ScreenSetting(800, 600, 32, 85)

Func _ScreenSetting($iWidth = @DesktopWidth, $iHeight = @DesktopHeight, $iDepth = @DesktopDepth, $iRefresh = @DesktopRefresh)
    Local Const $DISP_CHANGE_SUCCESSFUL = 0
    Local Const $DISP_CHANGE_RESTART    = 1
    Local Const $DISP_CHANGE_FAILED    = -1
    Local Const $DISP_CHANGE_BADMODE    = -2
    Local Const $DISP_CHANGE_NOTUPDATED = -3
    Local Const $DISP_CHANGE_BADFLAGS  = -4
    Local Const $DISP_CHANGE_BADPARAM  = -5

    Local Const $CDS_TEST          = 0x4
    Local Const $CDS_UPDATEREGISTRY = 0x1

    Local Const $DM_PELSWIDTH        = 0x80000
    Local Const $DM_PELSHEIGHT      = 0x100000
    Local Const $DM_BITSPERPEL      = 0x40000
    Local Const $DM_DISPLAYFREQUENCY = 0x400000

    Local Const $ENUM_CURRENT_SETTINGS  = -1
    Local Const $WM_DISPLAYCHANGE        = 0x007E
    Local Const $HWND_BROADCAST          = 0xFFFF
    Local Const $SPI_SETNONCLIENTMETRICS = 0x2A

    Local $DEVMODE, $DllRet

    $DEVMODE
= DllStructCreate("char dmDeviceName[32];ushort dmSpecVersion;ushort dmDriverVersion;short dmSize;" & _
                              "ushort dmDriverExtra;dword dmFields;short dmOrientation;short dmPaperSize;short dmPaperLength;" & _
                              "short dmPaperWidth;short dmScale;short dmCopies;short dmDefaultSource;short dmPrintQuality;" & _
                              "short dmColor;short dmDuplex;short dmYResolution;short dmTTOption;short dmCollate;" & _
                              "byte dmFormName[32];dword dmBitsPerPel;int dmPelsWidth;dword dmPelsHeight;" & _
                              "dword dmDisplayFlags;dword dmDisplayFrequency")

    $DllRet = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "dword", $ENUM_CURRENT_SETTINGS, _
                      "ptr", DllStructGetPtr($DEVMODE))
    $DllRet = $DllRet[0]

    If $DllRet = 0 Then
        MsgBox(16, "Error", "Unable to get graphic mode")
        Return False
    EndIf

    $VGA_MAP_KEY = RegRead("HKLM\HARDWARE\DEVICEMAP\VIDEO", "\Device\Video0")
    $VGA_KEY = StringReplace($VGA_MAP_KEY, "\Registry\Machine", "HKLM")

    RegWrite($VGA_KEY, "PruningMode", "REG_DWORD", 0)

    DllStructSetData($DEVMODE, "dmSize", DllStructGetSize($DEVMODE))
    DllStructSetData($DEVMODE, "dmPelsWidth", $iWidth)
    DllStructSetData($DEVMODE, "dmPelsHeight", $iHeight)
    DllStructSetData($DEVMODE, "dmBitsPerPel", $iDepth)
    DllStructSetData($DEVMODE, "dmDisplayFrequency", $iRefresh)
    DllStructSetData($DEVMODE, "dmFields", BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY))

    $DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST)
    $DllRet = $DllRet[0]

    If $DllRet <> $DISP_CHANGE_SUCCESSFUL Then
        Switch $DllRet
            Case $DISP_CHANGE_RESTART
                MsgBox(48, "Warning", "Restart your computer for change display settings")
            Case $DISP_CHANGE_FAILED
                MsgBox(16, "Error", "The video driver not set a new mode")
                Return False
            Case $DISP_CHANGE_BADMODE
                MsgBox(16, "Error", "Video mode not supported")
                Return False
            Case $DISP_CHANGE_NOTUPDATED
                MsgBox(16, "Error", "Unable to write in registry")
                Return False
            Case $DISP_CHANGE_BADFLAGS
                MsgBox(16, "Error", "Bad flags")
                Return False
            Case $DISP_CHANGE_BADPARAM
                MsgBox(16, "Error", "Bad parameters")
                Return False
        EndSwitch
    EndIf

    $DllRet = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_UPDATEREGISTRY)
    $DllRet = $DllRet[0]

    DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _
            "int", $SPI_SETNONCLIENTMETRICS, "int", 0)

    RegWrite($VGA_KEY, "PruningMode", "REG_DWORD", 1)

    $DEVMODE = ""
    $DllRet  = ""
EndFunc

P.S.
2 All! Пожалуйста протестируйте кому не лень. :)

Creat0R 22-04-2008 07:42 786470

Maza Faka,
Цитата:

Воть
Спасибо.

Цитата:

протестируйте кому не лень
Потестировал на двух совершенно разных машинах, работает отлично!

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




ALL

Такой вопрос: Как можно перекодировать текст кириллицы в Java-юникод?
К примеру «Привет Мир!» будет кодирован так (это я редактор yudit использовал):

Код:

\u041f\u0440\u0438\u0432\u0435\u0442 \u041c\u0438\u0440
Нашёл неплохую статью на эту тему, но самому не удаётся сообразить, как всё же (и можно ли вообще) средствами AutoIt'а кодировать кириллицу в Java-Unicode?

Maza Faka 22-04-2008 08:31 786478

Creat0R,
Цитата:

Цитата Creat0R
На заметку UDF'о-строителю; плохая идея отображать MsgBox'ы прямо из функции, в случае ошибки всегда нужно возвращать её код, пользователь (функцией ) сам решит что нужно делать в случае ошибки. »

Спасибо, учту на будущее :up:

amel27 23-04-2008 13:13 787428

Creat0R
Цитата:

как всё же (и можно ли вообще) средствами AutoIt'а кодировать кириллицу в Java-Unicode? »
типа такого?
Код:

MsgBox (0,"", _StringToJava("Привет Мир!"))

Func _StringToJava($sText)
    Local $tw = DllStructCreate("wchar["& StringLen($sText)+1 &"]"), $sOut=""
    Local $ts = DllStructCreate("ushort["&StringLen($sText)+1 &"]", DllStructGetPtr($tw))
    Local $tb = DllStructCreate("byte["&StringLen($sText)*2+2 &"]", DllStructGetPtr($tw))
    DllStructSetData($tw, 1, $sText)

    For $i=1 To StringLen($sText)
        If DllStructGetData($tb,1,$i*2) Then
            $sOut &= "\u"& Hex(DllStructGetData($ts,1,$i),4)
        Else
            $sOut &= DllStructGetData($tw,1,$i)
        EndIf
    Next
    Return
$sOut
EndFunc


Creat0R 23-04-2008 13:41 787453

amel27,
Цитата:

типа такого?
Супер!!! Спасибо :up

P.S
А обратно можно перекодировать? :blush2:

amel27 24-04-2008 02:03 787950

Creat0R
Цитата:

Супер!!!»
да нет, нашел ошибку :beta:
Цитата:

А обратно можно перекодировать? »
получилось вот что (включая исправленный вариант):
Код:

MsgBox (0,"_StringToJava()", '"Привет Мир!" ->'& @CRLF &'"'& _StringToJava("Привет Мир!") &'"')
MsgBox (0,"_JavaToString()", '"\u041f\u0440\u0438\u0432\u0435\u0442 \u041c\u0438\u0440!"'& @CRLF &'-> "'& _
    _JavaToString("\u041f\u0440\u0438\u0432\u0435\u0442 \u041c\u0438\u0440!") &'"')

Func _StringToJava($sText)
    Local $il = StringLen($sText)
    Local $tw = DllStructCreate("wchar["& $il+1 &"]"), $sOut=""
    Local $ts = DllStructCreate("ushort["&$il+1 &"]", DllStructGetPtr($tw))
    DllStructSetData($tw, 1, $sText)

    For $i=1 To StringLen($sText)
        If DllStructGetData($ts,1,$i)<128 Then
            $sOut &= DllStructGetData($tw,1,$i)
        Else
            $sOut &= "\u"& Hex(DllStructGetData($ts,1,$i),4)
        EndIf
    Next
    Return
$sOut
EndFunc

Func
_JavaToString($sText)
    Local $sOut="", $aText=StringRegExp($sText,"(?:\\u([[:xdigit:]]{4})|[[:ascii:]])",3)
    For $i=0 To UBound($aText)-1
        If StringLen($aText[$i])=1 Then
            $sOut &= $aText[$i]
        Else
            $sOut &= ChrW(Dec($aText[$i]))
        EndIf
    Next
    Return
$sOut
EndFunc

ADD: Возник вопрос с управляющими символами: я тут поиграл Yudit и не совсем понял как должно быть в формате Java, редактор часть ASCII-символов преобразует в Unicode, часть нет... и как быть с символом "\"?.. в Java вроде обозначается "\\" но редактор оставляет одиночным, или нужно учитывать только комбинацию "\u"?.. но тогда как она должна представляться если это обычный текст?... или не заморачиваться и преобразовывать в Unicode все подряд включая ASCII?

Creat0R 24-04-2008 18:44 788459

amel27,
Цитата:

как быть с символом "\"?.. в Java вроде обозначается "\\" но редактор оставляет одиночным
Редактор расчитан на Java-приложения как я понимаю, но в действительности (а точнее в браузерах), для управляющих символов нужно добавлять \.

Простой пример; если вставить это в адресную строку браузера (Opera / IE / FireFox):

Код:

javascript: alert('\u041F\u0440\u0438\u0432\u0435\u0442 \u041C\u0438\u0440 \ ' test');
То ничего не произойдёт, а если подставить \ под служебные символы:

Код:

javascript: alert('\u041F\u0440\u0438\u0432\u0435\u0442 \u041C\u0438\u0440 \\ \' test');
то будет отображено «Привет мир \ ' test».

Т.е по сути нужно в самом начале функции добавить примерно это:

Код:

$sText = StringRegExpReplace($sText, "(['\\])", "\\\1")
Только вопрос как пропарсить обратно в _JavaToString() ? хотя тоже наверно можно через RegExp...

P.S
Кстати, не помешало бы отключать «Opt("Expand(Var/Env)Strings", 0)» для подобной функции, для ускорения обработки :)

amel27 25-04-2008 05:50 788752

Creat0R
исправил с учетом твоих замечаний:
Код:

Func _StringToJava($sText)
    Local $iLen = StringLen($sText), $sChr, $iAsc
    Local $tChr = DllStructCreate("wchar["& $iLen+1 &"]"), $sOut=""
    Local $tAsc = DllStructCreate("ushort["&$iLen+1 &"]", DllStructGetPtr($tChr))
    DllStructSetData($tChr, 1, $sText)

    For $i=1 To StringLen($sText)
        $sChr = DllStructGetData($tChr,1,$i)
        $iAsc = DllStructGetData($tAsc,1,$i)
        If $sChr = "\" Or $sChr = "'" Then
            $sOut &= "\"& $sChr
        ElseIf $iAsc<128 Then
            $sOut &= $sChr
        Else
            $sOut &= "\u"& Hex($iAsc,4)
        EndIf
    Next
    Return
$sOut
EndFunc

Func
_JavaToString($sText)
    Local $sOut="", $aText=StringRegExp($sText,"(\\\\|\\'|\\u[[:xdigit:]]{4}|[[:ascii:]])", 3)
    For $i=0 To UBound($aText)-1
        Switch StringLen($aText[$i])
            Case 1
                $sOut &= $aText[$i]
            Case 2
                $sOut &= StringRight($aText[$i],1)
            Case 6
                $sOut &= ChrW(Dec(StringRight($aText[$i],4)))
        EndSwitch
    Next
    Return
$sOut
EndFunc


NikLok 26-04-2008 00:52 789404

amel27, Осеньно надоть в скрипте определять, данная директория или файл реальные или это ссылки ( в смысле NTFS связи ) И самое главное если связи, то на что они указывають?! С надеждой!

Creat0R 26-04-2008 01:36 789444

amel27,
Цитата:

исправил с учетом твоих замечаний:
Спасибо огромное, всё отлично работает!

У меня тут возникла проблема с твоими самопальными _FileSave/OpenDialog() и _FileSelectFolder(); на системе где нет поддержки кириллицы, заголовок с русским текстом отображается некорреткно. Как известно в AutoIt добавили поддержку юникода, и как раз оригинальные функции нормально отображают символы кириллицы, вот можно как то поправить и твои функции, чтобы поддерживали Unicode? :blush2:

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

amel27 26-04-2008 13:05 789594

NikLok
Насколько я понял речь о символических ссылках, так как для жестких ссылок нельзя отличить ссылку от файла... Имхо различить линк и экземпляр вполне реально через стандартные файловые API, а вот найти путь к оригиналу пока проблематично - полноценные API-функции добавили только в Vista/2008... хотя помнится у API-аналога FileOpenDialog() был флаг, задающий что фозвращает ф-ция - линк или путь к оригиналу... хотя вполне возможно это обычные ярлыки (*.LNK)

Creat0R
дай линки на используемые редакции (а то их уже было немеренно) или кинь в личку

NikLok 26-04-2008 17:55 789763

amel27,
Цитата:

Цитата amel27
Насколько я понял речь о символических ссылках, »

да совершенно верное понимание проблемы. Просто я этих стандартных API не знаю.

М..маленький прбмерчик бы!

amel27 28-04-2008 08:57 790627

NikLok
ну вроде что-то получилось - для обычного каталога UDF воспроизводит переданный в параметре путь к каталогу и устанавливает @extended=0, если каталог является только ссылкой, то восстанавливается его реальный путь и значение @extended=1 :
Код:

#include <Constants.au3>

Func _DirGetJunctionTarget($sDirPath)
    If StringInStr(FileGetAttrib($sDirPath),"D") =0 Then Return SetError(1, 0, "")  ; Ошибка: параметр не является каталогом
    Local $tRet = DllStructCreate("dword"), $aRet
    Local $tBuf = DllStructCreate("byte["& 1024 *16 &"]")
    Local $REPARSE_MOUNTPOINT_DATA_BUFFER = _
        DllStructCreate("int ReparseTag;dword ReparseDataLength;ushort;ushort ReparseTargetLength;ushort ReparseTargetMaximumLength;ushort;wchar ReparseTarget[260]", _
        DllStructGetPtr($tBuf))
    Local $aFile = DllCall("kernel32.dll", "int", "CreateFile", _
        "str", $sDirPath, "dword", 0, "dword", 0, "ptr", 0, "dword", $OPEN_EXISTING, "dword", 0x2200000, "ptr", 0 )
    If Not(IsArray($aFile)) Then Return SetError(2, 1, "") ; Ошибка вызова DLL
    If $aFile[0]=-1 Then
        $aRet = DllCall("kernel32.dll", "int", "GetLastError")
        Return SetError(3, $aRet[0], "") ; Ошибка доступа к каталогу
    EndIf
    $aRet = DllCall("kernel32.dll", "int", "DeviceIoControl", _
        "hwnd", $aFile[0], "dword", 0x900A8, "ptr", 0, "dword", 0, "ptr", DllStructGetPtr($tBuf), "dword", DllStructGetSize($tBuf), "ptr", DllStructGetPtr($tRet), "ptr", 0)
    DllCall("kernel32.dll", "int", "CloseHandle", "int", $aFile[0])
    If Not(IsArray($aRet)) Then Return SetError(2, 2, "") ; Ошибка вызова DLL
    If $aRet[0]=0 Then
        $aRet = DllCall("kernel32.dll", "int", "GetLastError")
        If $aRet[0] = 0x1126 Then Return SetError(0, 0, $sDirPath)
        Return SetError(4, $aRet[0], "") ; Другие ошибки ввода/вывода
    EndIf
    $sDirPath = StringRegExpReplace(DllStructGetData($REPARSE_MOUNTPOINT_DATA_BUFFER,"ReparseTarget"),"^\\\?\?\\","")
    Return SetError(0, DllStructGetData($REPARSE_MOUNTPOINT_DATA_BUFFER, "ReparseTag")=0xA0000003, $sDirPath)
EndFunc


NikLok 28-04-2008 22:20 791129

amel27, Огроменное спасибо! Все замечательно работает!!!

amel27 29-04-2008 06:57 791289

Цитата:

Цитата NikLok
Огроменное спасибо »

Спасибо сайту FlexHEX за исходники и описание недокументированных структур,
кстати, там есть и бинарники на случай CMD :)

NikLok 29-04-2008 20:44 791642

amel27, А в GUI можно мигающую строку (элемент ListView) сделать. Или обязательно программно самому мигать!?

amel27 30-04-2008 04:04 791840

NikLok
это не ко мне - в визуальных эффектах я не силен, имхо тут достаточно спецов по ГУИ

Creat0R
Цитата:

можно как то поправить и твои функции, чтобы поддерживали Unicode? »
легко ;) :

- заменить во всех структурах "char" на "wchar";
- в DllCall() жестко задать вызов WideChar-редакции API функции;
- заменить в SendMessage() коды сообщений с ANSI на WideChar.

Maza Faka 30-04-2008 08:19 791884

Цитата:

Цитата NikLok
А в GUI можно мигающую строку (элемент ListView) сделать. Или обязательно программно самому мигать!? »

По моему только программно и можно:
Код:

#include <GuiConstants.au3>

Global $color = 0xFF0000

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

$hListView = GUICtrlCreateListView("Item|SubItem", 10, 10, 280, 180)

$LV_Item = GUICtrlCreateListViewItem("Item1|SubItem1", $hListView)
GUICtrlSetColor(-1, $color)

GUISetState()

AdlibEnable("_FlashItem", 500)

Do
Until
GUIGetMsg() = $GUI_EVENT_CLOSE

AdlibDisable()

Func _FlashItem()
    $color = BitNOT($color)
    GUICtrlSetColor($LV_Item, $color)
EndFunc

Можно конечно и с помощью CallBack сделать, но много возни с рисованием текста и его раскрашиванием. :)

Creat0R 01-05-2008 06:44 792547

amel27,
Цитата:

Цитата amel27
легко :
- заменить во всех структурах "char" на "wchar";
- в DllCall() жестко задать вызов WideChar-редакции API функции;
- заменить в SendMessage() коды сообщений с ANSI на WideChar. »

Спасибо! Теперь я буду знать как добавлять поддержку Unicode! :up

HORRIBLE 01-05-2008 17:25 792758

А как переводить числа из 10-ой в двоичную систему??

Maza Faka 02-05-2008 08:16 793009

Цитата:

Цитата HORRIBLE
А как переводить числа из 10-ой в двоичную систему?? »

Наверное Binary()

babaytugur 02-05-2008 20:26 793354

Прошу помощи
Есть код
Код:

Dim $mass[1], $x=0,$Stop = 0
Do
    $mass[$x] = FileReadLine ("denylist.txt",$x+1)
    If @error=-1 Then
        $Stop=1
        ReDim $Mass[$x]
    Else
        $x = $x+1
        ReDim $Mass[$x+1]
    EndIf

Until
$Stop=1
Do
    $var = WinList()
    For $x=0 To UBound ($mass)-1
            For $i = 1 to $var[0][0]
                If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then
                    if
StringInStr($var[$i][0], $mass[$x])<>0 Then
                        beep(1000,250)
                        MsgBox (16,"Сообщение для " & @UserName,$mass[$x] & " - НЕТ ДОСТУПА!",7)
                        $GWP = WinGetProcess ($var[$i][0]) ;Получаем имя процесса по имени окна
                        if WinGetProcess("explorer.exe") Then ;Если процесс explorer.exe тогда просто закроем окно(если открыта папка, а то как-то некрасиво ))) )
                            WinClose ($var[$i][0])
                            Else
                        ProcessClose($GWP); Киляем полученный процесс

                        EndIf
                    EndIf
                EndIf
            Next
    Next
    Sleep(1000)
Until $i=1

Func IsVisible($handle)
  If BitAnd( WinGetState($handle), 2 ) Then
    Return 1
  Else
    Return 0
  EndIf

EndFunc

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

Последние содержатся в denylist.txt
icq
qip
и т.д.

Все работает, но скрипт сильно напрягает процессор
вопрос как разгрузить процессор?

Creat0R 03-05-2008 00:38 793523

babaytugur,
Цитата:

Цитата babaytugur
как разгрузить процессор? »

Хм, проверять только при изменении списка? Я бы немного подругому сделал:

Код:

#include <File.au3>

HotKeySet("^q", "QuitApp")

Dim $aDenyList, $aWinList, $aOld_WinList

;Читаем в массив файл denylist.txt
_FileReadToArray("denylist.txt", $aDenyList)

While 1
    $aWinList = WinList()

    ;Проверяем окна только если есть изменения в списке (с момента последней проверки)

    If Not _Array2DIsIdentical($aWinList, $aOld_WinList) Then
        $aOld_WinList = $aWinList

        For $i = 1 To UBound($aWinList)-1
            For $j = 1 To UBound($aDenyList)-1
                If _WinIsVisible($aWinList[$i][1]) And StringInStr($aWinList[$i][0], $aDenyList[$j]) Then
                    Beep(1000, 250)
                    _MsgBox(16, "Сообщение для " & @UserName, $aDenyList[$j] & " - НЕТ ДОСТУПА!", $aWinList[$i][1])

                    $iWinProcess = WinGetProcess($aWinList[$i][1])

                    If WinGetTitle("[CLASS:CabinetWClass;TITLE:" & $aWinList[$i][0] & "]") = $aWinList[$i][0] Then
                        WinClose($aWinList[$i][1])
                    Else
                        ProcessClose($iWinProcess)
                    EndIf
                EndIf
            Next
        Next
    EndIf

    Sleep(1000)
WEnd

Func _MsgBox($MsgBoxType, $MsgBoxTitle, $MsgBoxText, $Main_GUI=0)
    Local $aRet = DllCall("user32.dll", "int", "MessageBoxW", _
            "hwnd", $Main_GUI, _
            "wstr", $MsgBoxText, _
            "wstr", $MsgBoxTitle, _
            "int", $MsgBoxType)
    Return $aRet[0]
EndFunc

Func _Array2DIsIdentical($av2DArray_a, $av2DArray_b, $iLastElement=1)
    If UBound($av2DArray_a) <> UBound($av2DArray_b) Then Return False

    For $i = 0 To UBound($av2DArray_a)-1
        For $j = 0 To $iLastElement
            If $av2DArray_a[$i][$j] <> $av2DArray_b[$i][$j] Then Return False
        Next
    Next

    Return True
EndFunc

Func _WinIsVisible($handle)
    Return BitAnd(WinGetState($handle), 2)
EndFunc

Func QuitApp()
    Exit
EndFunc


babaytugur 03-05-2008 00:58 793539

Спасибо!!!
все работает
буду анализировать код

TERMINAL 03-05-2008 14:27 793807

Creat0R, Помоги плз написать скрипт....
Есть 40-50 папок с разными названиями, в каждой, из этих файлов, лежит скрипт с именем Auto.exe.
Мне нужно чтобы этот скрипт запускался по очереди (я так думаю это юудет команда RunWait ) из каждой папки и с помощью команды TrayTip("Установка скрипта ", "Выполняется установка NAME", 5, 4), где -номер очередной папки по счёту, а NAME имя папки из которой стартует скрипт, отображал данную процедуру...
А то приходится вручною прописывать каждую процедуру....Возможно ли вышеуказанное сделать на скрипте?!

Maza Faka 03-05-2008 15:29 793842

TERMINAL
Цитата:

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

TERMINAL 03-05-2008 17:49 793945

Maza Faka, спс-сделал !

amel27 04-05-2008 11:13 794334

Цитата:

Цитата babaytugur
Смысл скрипта в том, что он висит в памяти компьютера и блокирует окна в которых содержатся запрещенные слова »

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

$ProductName = FileGetVersion("C:\Program Files\ICQLite\ICQLite.exe", "ProductName")
$CompanyName = FileGetVersion("C:\Program Files\ICQLite\ICQLite.exe", "CompanyName")

MsgBox(0, "ICQLite Product Name", $ProductName)
MsgBox(0, "ICQLite Company Name", $CompanyName)


NikLok 04-05-2008 15:46 794564

amel27, А случайно кода для tftp сервера нету у Вас. А так же и binlsrv.py из пакета Ris-linux.

HORRIBLE 05-05-2008 00:12 794897

Maza Faka,
Binarу, я что то не понимаю, а как тогда, к примеру число 301 превратить в такое 100101101, а то эта команда что то не то выдает.
Спасибо.

amel27 05-05-2008 03:21 794940

NikLok
Цитата:

случайно кода для tftp сервера нету у Вас. А так же и binlsrv.py из пакета Ris-linux »
не понял вопроса - все указанные пакеты идут в исходниках

HORRIBLE
все не так просто - для текстового представления чисел предназначена ф-ция StringFormat(), но AutoIT штатно поддерживает только представления по основанию 16 и 8, для других оснований придется ваять UDF, как один из вариантов:
Код:

ConsoleWrite(_Bin(301) & @CRLF)

Func _Bin($iNumber)
    If Not IsInt($iNumber) Then Return SetError(1, 0, "")
    Local $sHex = StringFormat("%X",$iNumber), $sBin = ""
    Local Const $aHexToBin[16] = ["0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"]
    For $i=1 To StringLen($sHex)
        $sBin &= $aHexToBin[Dec(StringMid($sHex,$i,1))]
    Next
    Return
StringRegExpReplace($sBin, "^0+", "")
EndFunc

ADD: Более "продвинутый" вариант:
Код:

ConsoleWrite(_Bin(301) & @CRLF)

Func _Bin($iNumber)
    If Not IsInt($iNumber) Then Return SetError(1, 0, "")
    Local $sBin = ""
    If $iNumber>0 Then
        While
$iNumber
            $sBin
= BitAND($iNumber,1) & $sBin
            $iNumber
= BitShift($iNumber,1)
        WEnd
        Return
$sBin
    ElseIf $iNumber<0 Then
        For
$i=1 To 32
            $sBin = BitAND($iNumber,1) & $sBin
            $iNumber
= BitRotate($iNumber, -1, "D")
        Next
        Return
$sBin
    EndIf
    Return
"0"
EndFunc


TERMINAL 05-05-2008 09:28 795021

Помогите плз, у каждого диска (CD & DVD) присутствует свой серийный номер или порядковый номер. Его возможно как то узнать.

amel27 05-05-2008 10:04 795046

TERMINAL
ф-ция DriveGetSerial ()
FYI: клоны имеют одинаковый серийник

TERMINAL 05-05-2008 12:07 795135

amel27, спс-сделал-всё получилось, только вопрос -эти серийные номера повторяются или они уникальные?

Creat0R 05-05-2008 12:29 795149

amel27,
Не поможешь с RegExp?

Есть строка пути к файлу:

Код:

$Var = "c:\test\some app v3.2.6\file.db.bk"
нужно получить всё кроме расширении, т.е если строка такая как я привёл в пример, то нужно получить это: «c:\test\some app v3.2.6\file»
Но тот же результат должен быть если в строке нет вовсе расширения файла, или есть, но только одно; «c:\test\some app v3.2.6\file.db».

Как видно, в пути есть точки в версии программы, это мне и мешает решить проблему, если расширение файла не указано, то возвращается «c:\test\some app v3.2»...

Код:

$sPath = "c:\test\some app v3.2.6\file.db.bk"
$sPath = StringRegExpReplace($sPath, '\.[^.{2}]*.[^\.{2}]*$', '')

ConsoleWrite($sPath)


amel27 05-05-2008 12:48 795159

TERMINAL
Цитата:

эти серийные номера повторяются или они уникальные? »
генерятся случайным образом при создании/форматировании тома, соответственно если с диска сделать образ, подправить в редакторе типа UltraISO и залить обратно на болванку серийник не изменится

Creat0R
- вообще-то "расширением" называют только то, что следует в имени после последней точки ;)
- не понял смысл фигурных скобок внутри класса []
- нужно включить в рассмотрение "\"
Код:

$sPath = "c:\test\some app v3.2.6\file"
$sPath = StringRegExpReplace($sPath, '(?:\.[^\.\\]*)+$', '')
ConsoleWrite($sPath &@CRLF)


NikLok 05-05-2008 17:06 795375

amel27,
Цитата:

Цитата amel27
Цитата:
случайно кода для tftp сервера нету у Вас. А так же и binlsrv.py из пакета Ris-linux »
не понял вопроса - все указанные пакеты идут в исходниках »

Смысл в том что бы перевести их либо в автоит исходник либо получить как вызываемую функцию.
Я просто этот путь не проходил потому и спрашиваю.

Creat0R 05-05-2008 23:03 795680

amel27,
Цитата:

Цитата amel27
вообще-то "расширением" называют только то, что следует в имени после последней точки »

Да, но в имени файла, хотя расширение можно определяеть по количеству символов после точки (что и нужно в моём случае).

Цитата:

Цитата amel27
не понял смысл фигурных скобок внутри класса [] »

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

Цитата:

Цитата amel27
нужно включить в рассмотрение "\" »

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

Код:

$sPath = "c:\test\some app v3.2.6\file_version_1.2.0.db.bk"
Т.е тут нужно убрать только «.db.bk».

Creat0R 05-05-2008 23:36 795709

Кажется сделал:

Код:

$sPath = "c:\test\some app v3.2.6\file_version_1.2.0.db.back"
;$sPath = "c:\test\some app v3.2.6\file_version_1.2.0.db.bk"
;$sPath = "c:\test\some app v3.2.6\file_version_1.2.0.db"
;$sPath = "c:\test\some app v3.2.6\file_version_1.2.0"
;$sPath = "c:\test\some app v3.2.6\file.db.back"


$sPath = StringRegExpReplace($sPath, '(?i)(.*?)\.(..)(\.|$)(.{1,4})$', '\1')
ConsoleWrite($sPath & @CRLF)

Единственное что, нужно бы ещё задать что последнее расширение может содержать от одного до четырёх символов, а не 2 или 4 как у меня в шаблоне...
Мда.. иногда полезно в справку всё же заглядывать :)

Цитата:

{x, y} Repeat the previous character, set or group between x and y times, inclusive.

amel27 06-05-2008 05:03 795787

Creat0R
Цитата:

расширение можно определяеть по количеству символов после точки »
да все можно, только нужно предупреждать чтобы говорить об одном и том же :)
кстати, а разве версия не может состоять из 2-х цифр?.. типа: "file_version_1.2.10.db" ;)
Цитата:

первое расширение может содержаться только из двух символов »
я к тому, что внутри скобок [] это значит совсем другое - состав класса
Цитата:

Кажется сделал »
угу, то же самое, но короче:
Код:

$sPath = StringRegExpReplace($sPath, '\...(\..{1,4})?$', '')
теперь то же самое, но более правильно:
Код:

$sPath = StringRegExpReplace($sPath, '\.[^.\\]{2}(\.[^.\\]{1,4})?$', '')
NikLok
Цитата:

Смысл в том что бы перевести их либо в автоит исходник
Попробуйте убедить в необходимости порта... Одно дело когда вас не устраивает что-то конкретное, и совсем другое дело "спортивный интерес" :)
Цитата:

либо получить как вызываемую функцию
как вы себе ее представляете?.. какие данные должны подаваться на вход и что она должна возвращать?
Цитата:

Я просто этот путь не проходил потому и спрашиваю »
"путей" обычно много, а "цель" одна - вот она мне и непонятна ;)

Creat0R 06-05-2008 07:31 795812

amel27,
Цитата:

Цитата amel27
разве версия не может состоять из 2-х цифр? »

Может, но если это на конце, значит это расширение файла, дальше это не моя проблема :).

Цитата:

Цитата amel27
внутри скобок [] это значит совсем другое - состав класса »

Я позже это понял, спасибо.

Цитата:

Цитата amel27
то же самое, но более правильно »

Хм, не совсем, т.е если расширения будут указаны корректно, то это работает отлично, но если к примеру строка будет заканчиваться точкой («...\file.db.»), то первое расширение не будет удалено. Вобщем я остановился на таком варианте:

Код:

$sPath = "c:\test\some app v3.2.6\file_version_1.2.0.db.back"

$sPath = StringRegExpReplace($sPath, '\...(\.|$)(.{1,4}|)$', '')
ConsoleWrite($sPath & @CRLF)

Спасибо за помощь, потехоньку усовершенствуются знания в RegExp :)

amel27 06-05-2008 07:56 795824

Цитата:

Цитата Creat0R
если к примеру строка будет заканчиваться точкой »

ну это лечится как раз легко и без особых изменений в шаблоне ;)
Код:

$sPath = StringRegExpReplace($sPath, '\.[^.\\]{2}(\.[^.\\]{0,4})?$', '')

TERMINAL 07-05-2008 11:07 796812

Цитата:

Цитата amel27
генерятся случайным образом при создании/форматировании тома, соответственно если с диска сделать образ, подправить в редакторе типа UltraISO и залить обратно на болванку серийник не изменится »

проблема в том что он даже при подправке меняется-как выйти с такой ситуации или где увидить заранее этот серийник?!

amel27 07-05-2008 12:39 796891

Цитата:

Цитата TERMINAL
он даже при подправке меняется »

AFAIK серийник для томов на HDD/FDD можно поменять программно, но для CD/DVD все сложней и походу зависит от программ прожига... К примеру, MagicISO заявляет о такой фиче, но проверить самому не было случая.

TERMINAL 07-05-2008 15:22 797017

Цитата:

Цитата amel27
проблема в том что он даже при подправке меняется-как выйти с такой ситуации или где увидить заранее этот серийник?! »

Там тоже не показывает.....

Возможно ли вывести содержимое маленького текстового файла через команду MsgBox?

Creat0R 07-05-2008 15:51 797038

amel27,
Цитата:

Цитата amel27
это лечится как раз легко и без особых изменений в шаблоне »

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

TERMINAL,
Цитата:

Цитата TERMINAL
вывести содержимое маленького текстового файла через команду MsgBox? »

Код:

MsgBox(64, "", FileRead("File.txt"))
?
:)

EgOrus 07-05-2008 23:16 797330

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

Opt("ExpandEnvStrings", 1)
Opt("ExpandVarStrings", 1)

$tmpfle = @WindowsDir&'\Temp\files.tmp'
Call ("Listbase", "*.doc")
Call ("Listbase", "*.xls")
Call ("Listbase", "*.ppt")

;--- Function ------
func ListBase($ext)
;Получаем буквы имеющихся жёстких дисков
$drives = DriveGetDrive("FIXED")
        If @error Then Exit
        ;По очереди открываем каждый жёсткий диск
        For $i=1 to $drives[0]
                ;Получаем листинг файлов для текущего расширения на текущем диске и записываем его в файл
                $dr=$drives[$i]&'\'&$ext
                Run('%Comspec% /c chcp 1251 | dir "$dr$" /s /b >> $tmpfle$','',@SW_HIDE)
                Sleep (500)
        Next
EndFunc

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

;--- Func ----------------------------
func ListBase($ext)
;Получаем буквы имеющихся жёстких дисков
$drives = DriveGetDrive("FIXED")
        If @error Then Exit
        ;Открываем файл со списком
        $file = FileOpen($tmpfle, 1)
        ;По очереди открываем каждый жёсткий диск
        For $i=1 to $drives[0]
                ;Получаем листинг файлов для текущего расширения на текущем диске
                $dr=dir($drives[$i]&'\'&$ext)
                ;Заполняем файл со списком построчно из предыдущего листинга
                For $k=1 To $dr[0]-1
                        FileWrite($file, '"' & $dr[$k] & '"' & @CRLF)                                       
                Next
                $dr=0
        Next
        FileClose($file)
EndFunc

;Функция получения списка файлов по заданному пути для заданного расширения
Func dir($d)
 $dr = Run('%Comspec% /c dir "$d$" /s /b','',0,6)
 $f  = ''
 While not @error
  $f = $f & StdoutRead($dr)
 Wend
 Return (StringSplit(StringReplace($f,@LF,''),@CR))
EndFunc


Creat0R 08-05-2008 01:21 797382

EgOrus,
Во-первых я бы не стал пользоваться «Opt("ExpandEnv/VarStrings", 1)», значительно замедляет обработку строк.

Можно перебирать сразу нужные маски...

Код:

_ListFiles('*.doc|*.xls|*.ppt', @WindowsDir & '\Temp\files.tmp')

Func _ListFiles($sMasks, $sFile)
    ;Получаем буквы имеющихся жёстких дисков
    Local $aDrives = DriveGetDrive("FIXED")
    If @error Then Exit

    ;Если файл не существует, пишем в него типа сигнатуру для UTF-8 :)
    If Not FileExists($sFile) Then FileClose(FileOpen($sFile, 2 + 128))

    Local $hFileOpen = FileOpen($sFile, 1 + 64)
    Local $sDirList, $sDirMaskList

    For $i = 1 To $aDrives[0]
        ;Получаем строку с текущим диском и всеми масками
        $sDirMaskList = '"' & $aDrives[$i] & '\' & StringReplace($sMasks, '|', '" "' & $aDrives[$i] & '\') & '"'
        If @extended = 0 Then $sDirMaskList = '"' & $aDrives[$i] & '\' & $sMasks & '"'

        ;Получаем листинг файлов для текущих расширении на текущем диске
        $sDirList = _DirList($sDirMaskList)

        ;Заполняем файл со списком из листинга
        FileWrite($hFileOpen, $sDirList)
    Next

    FileClose($hFileOpen)
EndFunc

Func
_DirList($sPath)
    Local $iStdOut = Run(@Comspec & ' /c chcp 1251 | dir ' & $sPath & ' /s /b', '', '', 6)
    Local $sStdOutRead = ""

    While 1
        $sStdOutRead &= StdoutRead($iStdOut)
        If @error Then ExitLoop
    Wend

    Return
$sStdOutRead
EndFunc


EgOrus 08-05-2008 09:23 797496

Цитата:

Цитата Creat0R
Во-первых я бы не стал пользоваться «Opt("ExpandEnv/VarStrings", 1)», значительно замедляет обработку строк.

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

к сожалению я именно поэтому от варианта чтения stdout отказался, что он работает несколько дольше чем сразу листинг в файл это заметно при большом общем количестве файлов и соотв. файлов по маске - порядка 10 тысяч, кроме того это проще и меньше кода. Проблемму с кодировками также не снимает - в результирующем файле получается мешанина из 866 и 1251 кодировок (это и непонятно, видимо не всегда отрабатывается chcp, или есть какой-то ньюанс с этой командой, которого я не знаю). А UTF заголовок не влияет на то, в какой кодировке записываются данные в этот файл.
Если не использовать chcp 1251 то все идет в 866 кодировке. Но тогда придется готовый файл конвретировать в 1251, что без сторонних утилит сделать проблемматично.
В предыдущем посте я писал что скрипт работает нормально, но это не так, просто запамятовал что не использовал chcp, а конечный файл перекодировал с помощью утилиты xcode.exe
Нужно это все для того, чтобы при дальнейшей вычитке результирующего файла с помощью функции _FileReadToArray($tmpfle, $aFiles) корректно обрабатывались русские имена, для этого и нужен UTF или 1251

TERMINAL 08-05-2008 10:28 797541

Помогите, как и где можно узнать случайный номер имедж образа?

amel27 08-05-2008 11:09 797573

TERMINAL
Цитата:

как и где можно узнать случайный номер имедж образа? »
смонтировать образ в DAEMON Tools :)


Creat0R
Цитата:

последний вариант в моём посте отрубает нормально расширения »
в постановке задачи ты выставил требования именно к расширению, поэтому логично именно его и описывать шаблоном... кроме того, так будет проще (впоследствии) читать код RegExp

Цитата:

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


EgOrus
Цитата:

без сторонних утилит сделать проблемматично »
для AutoIT это не проблема, вот две UDF преобразования OEM в ANSI и обратно:
Код:

Func _StringANSI2OEM($strText)
    Local $buf = DllStructCreate("char["& StringLen($strText)+1 &"]")
    Local $ret = DllCall("User32.dll", "int", "CharToOem", "str", $strText, "ptr", DllStructGetPtr($buf))
    If Not(IsArray($ret)) Then Return SetError(1, 0, '') ; ошибка DLL
    If $ret[0]=0 Then Return SetError(2, $ret[0], '') ; ошибка функции
    Return DllStructGetData($buf, 1)
EndFunc  ;==> _StringANSI2OEM

Func _StringOEM2ANSI($strText)
    Local $buf = DllStructCreate("char["& StringLen($strText)+1 &"]")
    Local $ret = DllCall("User32.dll", "int", "OemToChar", "str", $strText, "ptr", DllStructGetPtr($buf))
    If Not(IsArray($ret)) Then Return SetError(1, 0, '') ; ошибка DLL
    If $ret[0]=0 Then Return SetError(2, $ret[0], '') ; ошибка функции
    Return DllStructGetData($buf, 1)
EndFunc  ;==> _StringOEM2ANSI


TERMINAL 08-05-2008 12:50 797650

amel27, проблема ещё в том что если пишешь образ болванкой то номер меняется на другой

NikLok 08-05-2008 13:05 797660

amel27, Насколько я понял в автоит нет структур?! Что все данные организовывать массивами?

amel27 08-05-2008 13:22 797675

TERMINAL
Цитата:

если пишешь образ болванкой то номер меняется на другой »
не знаю что такое "болванкой", но после некоторых замеров и не без помощи Гугля сделал вывод, что серийник для компакт-дисков НЕ ХРАНИТСЯ в образе (как я думал сначала), а РАССЧИТЫВАЕТСЯ из данных самого образа по НЕИЗВЕСТНОМУ алгоритму (точнее - известному только Microsoft), поэтому изменения в образе будут изменять серийный номер тома... В этом всем сбивает с толку то, что для разных типов носителей используется разный алгоритм расчета, к примеру для жестких дисков серийник не меняется с момента создания раздела и генерится на базе времени форматирования.

NikLok
Цитата:

Насколько я понял в автоит нет структур?!»
А как же команды DllStruct* ?!

NikLok 08-05-2008 17:23 797821

amel27,
Цитата:

Цитата amel27
А как же команды DllStruct* ?! »

Спасибо, а то прозевал!

Creat0R 08-05-2008 17:25 797824

EgOrus,
Цитата:

Проблемму с кодировками также не снимает
Странно, мой пример у меня всегда отрабатывает и пишет в нормальной кодировке.

Цитата:

А UTF заголовок не влияет на то, в какой кодировке записываются данные в этот файл.
Ну почему, без него как раз всё смешано и будет.
У меня кстати оказывается пишет нормально даже если сразу (при записи) использовать 1 + 128.

amel27,
Цитата:

вот две UDF преобразования OEM в ANSI и обратно
Отличные UDF, спасибо :)

EgOrus 09-05-2008 16:35 798359

Creat0R
у меня после отработки твоего также как и моего скрипта на рабочем и домашнем буке кодировки мешаются на виртуалке тоже, но не всегда, бывает что все нормально, из 10 запусков после 2-3 мешаются.
Причем происходит это не случайным образом а в пределах диска, т.е. например все файлы на диске С идут в 1251 а на диске Д уже в 866, может быть и наоборот. Т.е. в одном из циклов случайным образом почему-то не воспринимается команда chcp 1251

По поводу UTF, при использовании 1 + 128 не происходит перекодировки текста, это можно посмотреть в консоли если ее не скрывать, в файл записывается например
Код:

c:\Documents and Settings\Default User\˜*Ў«®*л\winword.doc
c:\Documents and Settings\Default User\˜*Ў«®*л\winword2.doc
c:\Documents and Settings\Default User\˜*Ў«®*л\excel.xls
c:\Documents and Settings\Default User\˜*Ў«®*л\excel4.xls
c:\Documents and Settings\Default User\˜*Ў«®*л\powerpnt.ppt

Проблемму решил следующим образом:
Run('%Comspec% /U /C dir "$d$" /s /b','',0,6)

Котяра 09-05-2008 22:10 798511

Если у кого-то есть дистрибутив SkypeSetup.exe, помогите. Хочу сделать скрипт, который бы нажимал на элементы:
- флажок
- кнопку установки
- отключил флажок про Google
- а в конце нажал Запустить

TERMINAL 10-05-2008 09:19 798706

Котяра, Делаешь так
RunWait ( @ScriptDir & "\" & "Setup.exe /lang=ru /verysilent /NoWpFinished /NoStart" )
WinWait("Skype™ - Создать пользователя","", 20)
If ProcessExists("Skype.exe") Then
ProcessClose("Skype.exe")
ProcessWaitClose("Skype.exe", 15)
EndIf
потом, если установлун гугл твой, делаешь тихое его удаление.
Скачать его можно сдесь

amel27 10-05-2008 10:01 798724

EgOrus
Цитата:

видимо не всегда отрабатывается chcp, или есть какой-то ньюанс с этой командой, которого я не знаю »
Гм... может проблема и не в этом, но последовательное выполнение CMD-команд осуществляется оператором "&" - с его помощью можно объединять несколько строк батника в одну CMD-строку (Conditional execution). Но мне таким образом не удалось ни в батнике, ни вручную заставить DIR выводить текст на экран (равно как в AutoIT) в Win-кодировке, хотя при выводе в файл все пишется нормально. Тем не менее, такое нестандартное применение оператора "|" вместо "&" позволяет выводить текст в WIN-кодировке прямо на экран... честно говоря для меня это было неожиданностью.

Котяра
читайте шапку - либо пишите в отдельную тему либо задавайте вопрос без привязки к установке конкретного софта - поставьте AutoIT, запустите "AutoIT Window Info" и дайте всю инфу по интересующему Вас окну и контролам.

Creat0R 10-05-2008 16:07 798896

EgOrus
Цитата:

при использовании 1 + 128 не происходит перекодировки текста, это можно посмотреть в консоли если ее не скрывать
Текст не трогается, я знаю, но в файл пишется корректно (у меня).

Цитата:

Проблемму решил следующим образом:
Хм, не знал о ключе /U.

Котяра
Цитата:

Если у кого-то есть дистрибутив SkypeSetup.exe, помогите. Хочу сделать скрипт, который бы нажимал на элементы:
У меня он есть, но в нём нет гугля ;)
Вот простой скрипт, нажимает кнопки для установки:

Код:

Run(@ScriptDir & "\SkypeSetup.exe")
If @error Then Exit

$SkypeTitleClass = "[CLASS:TssMainForm.UnicodeClass;REGEXPTITLE:Skype.*]"

ProcessWait("SkypeSetup.exe", 20)
WinWait($SkypeTitleClass, "", 20)

ControlClick($SkypeTitleClass, "", "TTntCheckBox.UnicodeClass1")
ControlClick($SkypeTitleClass, "", "TTntButton.UnicodeClass2")


Котяра 10-05-2008 16:48 798941

Creat0R, ваш скрипт работает. Но в мое инсталляторе (с диска одного компьютерного журнала) есть такая страница:
[img=http://img167.imageshack.us/my.php?image=googleforskypecw8.jpg][/img]

Creat0R, доработал Ваш скрипт и получилось так:
Код:

Run(@ScriptDir & "\SkypeSetup.exe")
If @error Then Exit

$SkypeTitleClass = "[CLASS:TssMainForm.UnicodeClass;REGEXPTITLE:Skype.*]"

ProcessWait("SkypeSetup.exe", 20)
WinWait($SkypeTitleClass, "", 20)

ControlClick($SkypeTitleClass, "", "TTntCheckBox.UnicodeClass1")
ControlClick($SkypeTitleClass, "", "TTntButton.UnicodeClass2")
ControlClick($SkypeTitleClass, "", "TTntCheckBox.UnicodeClass2")
Sleep(2000)
ControlClick($SkypeTitleClass, "", "TTntButton.UnicodeClass2")

Правда, есть еще проблема - финишное окно...

Цитата:

Цитата TERMINAL
RunWait ( @ScriptDir & "\" & "Setup.exe /lang=ru /verysilent /NoWpFinished /NoStart" )
WinWait("Skype™ - Создать пользователя","", 20)
If ProcessExists("Skype.exe") Then
ProcessClose("Skype.exe")
ProcessWaitClose("Skype.exe", 15)
EndIf »

Это устарело.

ancoder 11-05-2008 01:28 799327

Всем привет .. такой вопрос в браузере открыта страница сайта, как получить значение "SetHP(50,50);" из HTML кода?

Код:


// может кому будет нужно  "Авто добавление баз для 1с (тестилось на 7.7)
// Sleep'oв так много потому для АНти лагов
//Код :ancoder

TrayTip("Статус", "Установка баз  БП", 5, 1)
WinWaitActive ("Запуск 1С:Предприятия")
ControlClick("Запуск 1С:Предприятия", "", "[ID:4352]")       
WinWaitActive ("Регистрация Информационной Базы")
Send ("{BS}")
Sleep (300)
Send ("Имя Базы Может быть любое например  БП")  ; <<<<<-----------------Имя Базы ------
sleep (100)
ControlClick("Регистрация Информационной Базы", "", "[ID:4361]")
 send ( "{TAB}")
Sleep (300)
Send ("{BS}")
Sleep (300)
Send ("Путь К базе например С:\1\БП")  ;<<<<<<------------ Адресс Базы -------
sleep (50)
Send ("{Enter}")
sleep (500)


MaxxQ 11-05-2008 02:12 799351

Подскажите пожалуйста, конвертировал скрипт в exe, и по неосмотрительности удалил скрипт, а сейчас понадобилось исправить exe, но обратно в скрипт, exe не конвертируется (я пытался этим- Decompile .exe to Script) появляется ошибка "Error: The executable file is not recognised as a compiled AutoIt script."
Как мне exe обратно в AutoIt скрипт преобразовать?????

Creat0R 11-05-2008 06:54 799374

ancoder,
Цитата:

как получить значение "SetHP(50,50);" из HTML кода?
Примерно так:

Код:

#include <Inet.au3>

$sHtml = _INetGetSource("http://somepage.com")

$sRet = StringRegExpReplace($sHtml, "(?i).*(SetHP.*;).*", "\1")

ConsoleWrite($sRet)

MaxxQ,
Цитата:

"Error: The executable file is not recognised as a compiled AutoIt script."
Как мне exe обратно в AutoIt скрипт преобразовать?
Afaik, никак :( В новых версиях AutoIt декомпилляцию скриптов убрали.

*OM* 12-05-2008 06:02 800078

Вопрос: Как применить 'Uncheck' или 'Check' к выбранной строке в TNewCheckListBox1 (так определяет AiWI) ?

Выбрать строку удалось таким способом:

ControlCommand ('Setup - K-Lite Codec Pack','Select Additional Tasks','TNewCheckListBox1','SelectString','Check for codec news and updates')
Send ('{SPACE}')
ControlClick ('Setup - K-Lite Codec Pack','Select Additional Tasks','&Next >')

Хочется реализовать по примеру ControlCommand (','','Button1','UnCheck') потому как Send ('{SPACE}') не устраивает.

Так не вышло: ControlCommand ('Setup - K-Lite Codec Pack','Select Additional Tasks','TNewCheckListBox1','Uncheck','Check for codec news and updates') (как я понимаю и не должно было это же список а не 1 чекбокс)

Вопрос 2: Как обратится к строкам элемента 'TNewCheckListBox1' напрямую не через выбор строки ?

Creat0R 12-05-2008 06:15 800079

*OM*,
Цитата:

Как применить 'Uncheck' или 'Check' к выбранной строке в TNewCheckListBox1
Если это чекбокс то не должно быть проблем, но судя по имени класса это список, зачем для списка устанавливать «'Uncheck' или 'Check'»?

Цитата:

Как обратится к строкам элемента 'TNewCheckListBox1' напрямую не через выбор строки ?
Что конкретно требуется сделать? что понимается под словом «обратится»?

*OM* 12-05-2008 11:30 800220

Гхм... Creat0R у меня же написано к выбранной строке в TNewCheckListBox1

А обратится это значит(имел ввиду) "использовать одну из строк TNewCheckListBox1 в общем взаимодействовать". К примеру могло быть TNewCheckListBoxString9 (это 9й чекбокс в списке).

Я обратился так ControlCommand ('Setup - K-Lite Codec Pack','Select Additional Tasks','TNewCheckListBox1','SelectString','Check for codec news and updates')

Но это только выбор строки..

Вроде в моем предыдущем посте подробно описано. Странно что приходится уточнять :ninja2:

Creat0R 12-05-2008 11:41 800231

*OM*,
Цитата:

Цитата *OM*
у меня же написано к выбранной строке в TNewCheckListBox1 »

Всё ровно понять трудно, то что очевидно вам, другим может быть непонятно и удивительно ;)

Цитата:

это 9й чекбокс в списке
Чувствую что это не стандартный чекбокс, а чексбокс в ListView Item'е, возможно помогут функции _GUICtrlListView_*?

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

Код:

$hWnd = ControlGetHandle('Setup - K-Lite Codec Pack', 'Select Additional Tasks', 'TNewCheckListBox')

_GUICtrlListView_SetItemChecked($hWnd, 9, True) ;False to Uncheck

Чтобы сказать более точно нужно знать (видеть) какие элементы используются в окне.

*OM* 12-05-2008 11:52 800243

Насчет обращения к 9 чекбоксу это ПРИМЕР такого элемента как TNewCheckListBoxString9 в окне нет. Это пример возможного взаимодействия со списком TNewCheckListBox1 как я представляю обращение к строке листа чекбоксов.

Есть только объект как я понял список чекбоксов TNewCheckListBox1 и по виду он таковым является. В нем масса строк выбор можно осуществить через SelectString. После этого можно Send ('{SPACE}') но нужно именно Uncheck

А функцию попробую.


Кстати это тип объекта TNewCheckListBox1 очень во многих инсталляторах встречается.. Почему сдесь и задал вопрос , думается однозначно с ним сталкивались.

amel27 12-05-2008 12:30 800275

*OM*
Цитата:

очень во многих инсталляторах встречается »
AFAIK только в InnoSetup.

контрол нестандартный, поэтому проще задействовать штатные функции (через INI-файл):
линк: http://www.codecguide.com/silentinstall.htm

HORRIBLE 12-05-2008 20:25 800811

Всем привет.
Как можно заблокировать авторан который запускается с флешок, скриптом?

Vikkywulf 13-05-2008 00:34 801030

Где бы таки укачать русскую справку к autoit, по ссылке в шапке, задолбался уже скачивать: 404: The page/file you requested could not be found.

Konstantin_555 13-05-2008 00:44 801035

Цитата:

Цитата Vikkywulf
Где бы таки укачать русскую справку к autoit, по ссылке в шапке, задолбался уже скачивать: 404: The page/file you requested could not be found. »

Попробуй здесь взять: http://www.autoitscript.com/AutoIt/Docs/index.html

*OM* 13-05-2008 03:25 801080

Мастера покажите простенький пример скрипта который удаляет файл из которого был запущен.

Вопрос: Возможно это реализовать с помощью Ai или .bat или .cmd создавать ?

Creat0R 13-05-2008 04:10 801093

HORRIBLE,
Цитата:

Цитата HORRIBLE
заблокировать авторан который запускается с флешок »

Насколько я знаю за автозапуск отвечает файл «Autorun.inf» в корне диска, может удалять его?

*OM*,
Цитата:

Цитата *OM*
простенький пример скрипта который удаляет файл из которого был запущен. »

Самоуничтожение? :)

Код:

Opt("OnExitFunc", "_SelfDestroy")

FileCopy(@ScriptFullPath, @ScriptFullPath & ".bak", 1)

MsgBox(16, "Thats it!", "I am gona kill my self now... goodby :`(", 4)

Func _SelfDestroy()
    If Not @Compiled Then Return FileDelete(@ScriptFullPath)

    Run(@ComSpec & ' /c ping -n 2 localhost > nul & del /q /f "' & FileGetShortName(@ScriptFullPath) & '"', '', @SW_HIDE)
EndFunc


*OM* 13-05-2008 04:30 801097

Цитата:

Цитата Creat0R
Самоуничтожение? »

Ну да путь самурая :ninja: к смерти.. =)

Это для Uninstall буду использовать.

DENoszone 13-05-2008 12:21 801303

Можете написать скрипт:
1. Заходит на какой то сайт (есть алгоритм)
2. потом на сайте делает поиск мыла ну вид *@*.ru *@*.com *@*.ua и так далее и запихивает в файлы адреса (.VCF .CSV .TXT .DOC .XLS и т.п.) какой то один из них, файлы делает по 100кб.
3. дальше делает переходы по страницам и пункт 2 повторяется.
4. если нету внешних ссылок то заходит на другой сайт (алгоритм есть)
в ие это все
ну понятно все там закрывает когда проходит страницу

alex888500 14-05-2008 07:12 802061

Написал скрипт, никак не могу сделать перебор пользователей.
Может кто-нибудь подправить.

PHP код:

Run("********")

  
WinWaitActive("***************")   ;Активное окно программы
  Sleep
(3000)

  
AutoItSetOption "MouseCoordMode")  ;Клик на поле ввода Логина 
  MouseClick 
'left'9330)


While 
True

HotKeySet
("{F11}""Terminate")   ;Остановка скрипта 

$doubled 
Mous($1)

  
Send $1("lexx124")  ;Пользователь 1
  
  Send 
$2("lexx130")  ;Пользователь 2

Func Terminate
()  ;Остановка скрипта
Exit 0   ;Остановка скрипта
EndFunc  
;Остановка скрипта


WEnd




; <<<----------функция Смены пользователя--------->>>

  
Func Mouse($1)
     
AutoItSetOption "MouseCoordMode")   ;Кнопка Start
     MouseClick 
'left'265160)
     
     
Sleep(360000)   ;Ожидание 6 минут
       
     AutoItSetOption 
"MouseCoordMode")   ;Кнопка Stop
     MouseClick 
'left'358160)
     
    
Sleep(1500)
     
    
AutoItSetOption "MouseCoordMode")  ;Клик на поле ввода Логина 
     MouseClick 
'left'9330)
     
     $
= $1  
     
Return $1
  EndFunc 


Drsmog 14-05-2008 11:04 802228

Вложений: 1
Здраствуйте.

Как в Excele зделать, допустим в ячеке B1 находится цифра 3 тогда в ячеике B5 троику заменить на значек (+)

на картинке я примерно нарисовал как надо, от куда и куда :-))
Спасибо.

http://forum.oszone.net/attachment.p...1&d=1210755511

ну и далее

alex888500 14-05-2008 13:43 802366

Проще всего используя функции логики самого Exel'я, почитай справку, там все есть.

Drsmog 14-05-2008 13:57 802385

Как разбить число допустим 1367 на 1 3 6 7 и присвоить каждую переменной

Creat0R 14-05-2008 14:13 802403

Drsmog,
Цитата:

разбить число допустим 1367 на 1 3 6 7 и присвоить каждую переменной
Хм, каждому числу создать переменную? так можно:

Код:

$iNumber = 1367
$aNumbersArr = StringSplit($iNumber, "")

For $i = 1 To UBound($aNumbersArr)-1
    Assign("iNumber_" & $i, $aNumbersArr[$i])
Next

MsgBox(0, "", $iNumber_1 & " " & $iNumber_2 & " " & $iNumber_3 & " " & $iNumber_4)


Vadikan 14-05-2008 21:29 802843

All
Посмотрите, плиз, тему Трей начал прыгать - это ваша специализация :)

Creat0R 15-05-2008 04:01 803031

Библиотека автоматизации Winamp плеером!

Не требует установки внешних модулей к Winamp, функции построены на основе SDK с оф. сайта разработчиков Winamp'а.


amel27 15-05-2008 06:12 803054

DENoszone
Цитата:

Можете написать скрипт »
есть два вопроса:

1. Для чего нужен скрипт? (есть сомнения)
2. Как вы собираетесь ограничивать геометрический рост кол-ва обрабатываемых линков?.. К примеру, в телепорте есть два механизма: ограничение на глубину вложенных ссылок, либо только ссылками на исходный сайт... В противном случае перебор может никогда не закончиться, при этом бесконтрольная загрузка всех подряд URL-ов (в основном ненадежных сайтов) отрицательно скажется на здоровье ослика IE.

alex888500
Цитата:

Написал скрипт, никак не могу сделать перебор пользователей »
слишком мало инфы - подробней объясните суть проблемы и предполагаемый алгоритм работы скрипта, желательно также "снять" характеристики обрабатываемых окон и контролов через "AutoIT Window Info"

Drsmog,
Цитата:

Как в Excele зделать, допустим в ячеке B1 находится цифра 3 тогда в ячеике B5 троику заменить на значек (+) »
для начала установите библиотеку работы с Excel и посмотрите примеры:
Yet Another -- ExcelCOM UDF, Proceeding by Community-Established UDF Standards

DENoszone 15-05-2008 08:36 803096

Цитата:

1. Для чего нужен скрипт? (есть сомнения)
2. Как вы собираетесь ограничивать геометрический рост кол-ва обрабатываемых линков?.. К примеру, в телепорте есть два механизма: ограничение на глубину вложенных ссылок, либо только ссылками на исходный сайт... В противном случае перебор может никогда не закончиться, при этом бесконтрольная загрузка всех подряд URL-ов (в основном ненадежных сайтов) отрицательно скажется на здоровье ослика IE.
1. создания базы для отсылки с одного сайта приглашений.
2. ну первое огранчение это наверное домены сайтов. ua com ru ну наверное это хоть как то снизит вероятность попадание на злобный сайт=) блин..даже не знаю =( надо подумать...как вы считаете нужным?

alex888500 15-05-2008 08:52 803105

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

PHP код:

Run("*********")
Sleep(3000)
HotKeySet("{F11}""Terminate")   ;Остановка скрипта

While True  ;Бесконечная обработка скрипта
  WinWaitActive
("**********")   ;Активное окно программы
  AutoItSetOption 
"MouseCoordMode")  ;Клик на поле ввода Логина 
  MouseClick 
'left'933022)

  
Send ("lexx127") ;Пользователь 1

  AutoItSetOption 
"MouseCoordMode")   ;Кнопка Start
  MouseClick 
'left'26516012)
  
Sleep(10000)   ;Ожидание 6 минут
  AutoItSetOption 
"MouseCoordMode")   ;Кнопка Stop
  MouseClick 
'left'3581602)
WEnd

Func Terminate
()
Exit 
0
EndFunc 

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

PHP код:

Run("*********")
Sleep(3000)
  
WinWaitActive("**********")   ;Активное окно программы
  AutoItSetOption 
"MouseCoordMode")  ;Клик на поле ввода Логина 
  MouseClick 
'left'933022)

HotKeySet("{F11}""Terminate")   ;Остановка скрипта

While True  ;Бесконечная обработка скрипта

$doubled 
Mous($1)

  
Send $1("lexx127") ;Пользователь 1
  Send 
$2("den")  ;Пользователь 2
  Send 
$3("vovan")  ;Пользователь 3
  
WEnd

Func Terminate
()
Exit 
0
EndFunc

; <<<----------функция Смены пользователя--------->>>
  
Func Mouse($1)
 
     
AutoItSetOption "MouseCoordMode"2)   ;Кнопка Start
     MouseClick 
'left'26516012)
     
     
Sleep(360000)   ;Ожидание 6 минут
       
     AutoItSetOption 
"MouseCoordMode"2)   ;Кнопка Stop
     MouseClick 
'left'35816012)
     
Sleep(1500)
     
AutoItSetOption "MouseCoordMode"2)  ;Клик на поле ввода Логина 
     MouseClick 
'left'933022)
     
     $
= $1  
     
Return $1

  EndFunc 

вот тут я и запарил :cry:

Maza Faka 15-05-2008 10:43 803195

alex888500
Можно создать массив с логинами пользователей и передавать их в функцию, что -то вроде этого:
Код:

Run("*********")

Sleep(3000)

WinWaitActive("**********")  ;Активное окно программы

AutoItSetOption ( "MouseCoordMode", 2 )  ;Клик на поле ввода Логина

MouseClick ( 'left', 93, 30, 2, 2)

HotKeySet("{F11}", "Terminate")  ;Остановка скрипта

Global $aUser[4] = [3, "lexx127", "den", "vovan"]

While True  ;Бесконечная обработка скрипта
    For $i = 1 To $aUser[0]
        Mouse($aUser[$i])
    Next
    Sleep(50)
WEnd

Func
Terminate()
    Exit 0
EndFunc

; <<<----------функция Смены пользователя--------->>>
Func Mouse($sUser)
    MouseClick ( 'left', 265, 160, 1, 2)
    Sleep(360000)  ;Ожидание 6 минут
    MouseClick ( 'left', 358, 160, 1, 2)
    Sleep(1500)
    MouseClick ( 'left', 93, 30, 2, 2)
EndFunc


TERMINAL 15-05-2008 10:54 803202

Цитата:

Цитата Котяра
Правда, есть еще проблема - финишное окно... »

ну и что там за проблема?

amel27 15-05-2008 11:29 803235

Цитата:

Цитата Maza Faka
Можно создать массив с логинами пользователей и передавать их в функцию »

я так понял alex888500 еще не освоился с функциями и массивами, поэтому мой вариант проще будет:
Код:

_Login("lexx127")
_Login("den")
_Login("vovan")

Func _Login($sUser)
    Local $bak = AutoItSetOption ( "MouseCoordMode", 2)

    WinWaitActive("**********")          ; Активное окно программы
    MouseClick ('left', 93, 30, 2, 2)    ; Клик на поле ввода Логина
    Send ($sUser)                        ; Пользователь
    MouseClick ('left', 265, 160, 1, 2)  ; Кнопка Start
    Sleep(10000)                        ; Ожидание 10 сек
    MouseClick ('left', 358, 160, 1 , 2) ; Кнопка Stop

    AutoItSetOption ("MouseCoordMode", $bak)
EndFunc

alex888500
Все-таки попробуте запустить "AutoIt Window Info" и выяснить ID элементов окна - кнопок и Edit-боксов (типа "Edit1", "Button1"), тогда можно будет пробовать работать с элементами напрямую по ID и не зависеть от координат окна.

alex888500 16-05-2008 05:05 803988

Цитата:

Цитата amel27
попробуте запустить "AutoIt Window Info" »

Пробовал запускать "AutoIt Window Info", показала она мне ID кнопки Start, только еще выяснилось что Start находится (принадлежит) на другой кнопке, типа кнопка в кнопке :o , тоже самое и с другими элементами. Поэтому координаты единственное что прокатило.

*OM* 16-05-2008 07:18 804013

Снова ОМ и мир всем.

Цитата:

Цитата Creat0R
Код:

Код:
Opt("OnExitFunc", "_SelfDestroy")
FileCopy(@ScriptFullPath, @ScriptFullPath & ".bak", 1)
MsgBox(16, "Thats it!", "I am gona kill my self now... goodby :`(", 4)
Func _SelfDestroy()
 If Not @Compiled Then Return FileDelete(@ScriptFullPath)
Run(@ComSpec & ' /c ping -n 2 localhost > nul & del /q /f "' & FileGetShortName(@ScriptFullPath) & '"', '', @SW_HIDE)
EndFunc

»

Используя пример делал так:

Код:

Opt("OnExitFunc", "_Uninstall")
FileCopy(@ScriptFullPath, @ScriptFullPath & ".bak", 1)

Func _Uninstall()
    If Not @Compiled Then Return FileDelete(@ScriptFullPath)
    Run(@ComSpec&' /c ping -n 3 localhost > nul & rd /s /q "'&@ScriptDir&'"','', @SW_HIDE)
EndFunc
Exit

Возник вопрос! : Почему остается папка (хотя и пустая) ?


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

Creat0R 16-05-2008 11:12 804111

*OM*,
Цитата:

Цитата *OM*
Почему остается папка »

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

Код:

Opt("OnExitFunc", "_SelfDestroy")

;FileCopy(@ScriptFullPath, @ScriptFullPath & ".bak", 1)
MsgBox(16, "Thats it!", "I am gona kill my self now... goodby :`(", 4)

Func _SelfDestroy()
    ;If Not @Compiled Then Return FileDelete(@ScriptFullPath)
    Run(@ComSpec & ' /c ping -n 2 localhost > nul & rd /q /s "' & FileGetShortName(@ScriptDir) & '"', '', @SW_HIDE)
EndFunc

!!! Очень осторожно с этим скриптом, он удалит всё содержимое текущей папки после запуска (через 2 секунды).

Creat0R 16-05-2008 23:19 804633

Наконец обновился AutoIt 3.2.12.0!

Список изменении тут, если сильно попросите переведу на русский :)

Из приятного и долгожданного:

* Убрана опция «RunErrorsFatal», теперь естественно она по умолчанию задействована.
* К Inet-функциям теперь добавляется User Agent, многие сайты блокируют доступ при пустой строке юзер агента.
* Максимальное число создаваемых GUI-окон выросло до 65532.
* Добавлен GUISetAccelerators(), я о нём кажется уже писал ранее.
* Добавили REGEXPCLASS в расширенное распознавание заголовков окон (по моей просьбе :tongue: ).
* FileReadLine( ,-1) теперь читает последнюю строку в файле.
* Добавили GUICtrlSetDefColor() и GUICtrlSetDefBkColor(), ох сколько я этого ждал, тоже по моей просьбе.
* Добавили Hwnd параметр для функции: MsgBox(), FileSelectFolder(), FileOpenDialog(), FileSaveDialog(). А сколько этого я ждал и просил....

P.S
Я так приблезительно прикинул, получается новая версия выходит в среднем примерно раз в пол года! :up

P.P.S
Я рад что не обновился полностью до 3.2.10.0, пришлось бы опять всё перестраивать.

NikLok 17-05-2008 00:22 804655

Если кто не знает вышла версия 3.2.12 - почти полгода мурыжили.

Creat0R 17-05-2008 00:25 804656

NikLok,
Кхм кхм... смотрим выше и... ;)

Maza Faka 17-05-2008 07:08 804735

Цитата:

Цитата Creat0R
Добавили Hwnd параметр для функции: MsgBox(), FileSelectFolder(), FileOpenDialog(), FileSaveDialog(). »

Наконец-то :happy:

*OM* 19-05-2008 05:16 805866

Creat0R Не удалил.. Результат тот же остается пустой каталог. :help:

Creat0R 19-05-2008 05:51 805873

*OM*,
Цитата:

Цитата *OM*
остается пустой каталог »

А если так:

Код:

Opt("OnExitFunc", "_SelfDestroy")

MsgBox(16, "Thats it!", "I am gona kill my self now... goodby :`(", 4)

Func _SelfDestroy()
    Run(@ComSpec & ' /c ping -n 2 localhost > nul & rd /q /s "' & @ScriptDir & '"', @ScriptDir & '\..', @SW_HIDE)
EndFunc

?
:)

amel27 19-05-2008 08:20 805893

*OM*
Цитата:

Результат тот же остается пустой каталог »
Случаем не через SciTE проверяете?... я к тому, что перед проверкой нужно закрыть ВСЕ проги, открывшие каталог/файлы, а сам скрипт запускать не через файл-менеджеры (которые удерживают открытый каталог), а по полному имени (включая путь).

Creat0R 19-05-2008 08:30 805895

amel27,
Цитата:

перед проверкой нужно закрыть ВСЕ проги, открывшие каталог/файлы, а сам скрипт запускать не через файл-менеджеры
Там проблема в том, что небыла указана рабочая папка, поэтому процесс командной строки сам и держал текущую папку, не давая её удалить. Мой последний пример работает даже если из самой папки запускать ;).

*OM* 20-05-2008 07:11 806626

Creat0R этот вариант выполнил задачу как и хотелось. Выражаю вам своё Домо аригато годзаимащта ! :ninja:

Попутно возник - Вопрос: Как сделать проверку пуст каталог или нет ?

Наличие файла я проверяю через FileExists() , а для проверки наличия каталогов не нашел подобного.

P.S. А как это вы код подсвечиваете в своих ответах ? Не иначе мощное " колдунство " :wizard:

Creat0R 20-05-2008 07:41 806634

*OM*,
Цитата:

Цитата *OM*
Как сделать проверку пуст каталог или нет ? »

Код:

;Переменной $IsEmpty присваивается значение возвращаемое ф-ей _DirIsEmpty()
$IsEmpty = _DirIsEmpty("c:\Temp")

;Отображение содержимого переменной $IsEmpty и уровень ошибочности
MsgBox(64, "Results", "$IsEmpty = " & $IsEmpty & @LF & "@error = " & @error)

;Функция проверяет если каталог по заданному пути не содержит файлы/папки..
;Если папка не существует (по пути из переменной $sPath), то @error = 1 и возвращается 0
;Если папка существует, и она *не* пуста, то возвращается 0
;Если папка существует, и она *пуста*, то возвращается 1

Func _DirIsEmpty($sPath)

    ;Если атрибут папки не содержит D (от слова Dir), то устанавливаем уровень ошибочности и возвращаем 0
    If Not StringInStr(FileGetAttrib($sPath), "D") Then Return SetError(1, 0, 0)

    ;Инициализация поиска *любого* файла в указанном пути
    Local $hSearch = FileFindFirstFile($sPath & "\*")

    ;"Запоминаем" уровень ошибочности
    Local $iRet = @error

    ;Закрытие хендла (управляющего) после инициализации поиска (обязательно)
    FileClose($hSearch)

    ;Возвращаем уровень ошибочности ($iRet),
    ;FileFindFirstFile() возвращает @error = 1 если папка пуста, это и есть индикация того, что она пуста :)

    Return $iRet
EndFunc

Цитата:

Цитата *OM*
как это вы код подсвечиваете в своих ответах ? »

Есть утилита Au3ToPost.

DENoszone 20-05-2008 08:57 806671

мне не кто не поможет=(

Maza Faka 20-05-2008 09:42 806698

*OM*
Аналогично с помощью WinAPI:
Код:

$IsEmpty = _DirIsEmpty("c:\Test")

MsgBox(0, "Folder empty", $IsEmpty & @LF & _
      "Error = " & @error)

Func _DirIsEmpty($sPath)
    If Not FileExists($sPath) Then Return SetError(1, 0, 0)

    If Not StringInStr(FileGetAttrib($sPath), "D") Then Return SetError(2, 0, 0)

    $aRet = DllCall("shlwapi.dll", "int", "PathIsDirectoryEmpty", "str", $sPath)

    If $aRet[0] = True Then
        Return
SetError(0, 0, 1)
    Else
        Return
SetError(3, 0, 0)
    EndIf
EndFunc
  ;==>_DirIsEmpty

Возвращает 1 если папка пуста.

amel27 20-05-2008 10:21 806724

DENoszone
думаю нет - прога слишком смахивает на генератор спама... подсказка: реализация будет через использование ф-ций StringRegExp* и _IE*

TERMINAL 20-05-2008 13:37 806856

Вопрс такой интересный....Возможно ли с помощью скрипта запмсать диск (файл для записи находится на С:\test.txt)?

SvetlanaK 20-05-2008 17:46 807023

Здравствуйте! понимаю, что глупо вытаскивать данные из чужой программиой посылом сендов и принудительными кликами мышкой, но выхода другого нет... данные потом успешно обрабатываются с пом ExcelCOM_UDF.au3).
Решила вот воспользоваться ControlClick,ControlFocus и ControlSend. При помощи автоит.инфо можно вытянуть всю информацию об окнах. Вроде это даже как более правильно и работает в разы быстрее! (это нужно, потому что в формах программы могут добавляться новые кнопки и перемещаться те,которые надо кликать). Но вот что заметила - работают эти контролы через раз! то запускаются, то нет, скрипт стоит, ожидаючи посыла в текстовое окно нужного текста, нажатия кнопки...и непонятно - почему он стоит? Прога та написана на делфи, окна определяются, и все его составляющие тоже. В чем же дело? Может какие то опции надо прописать? В хелпе ничего не нашла. Кто сталкивался, помогите пожалуйста! Новую версию юзаю - тот же глюк(
Вот все что использутеся....
введение логина
ControlFocus("Подключение","","[CLASS:TLogInAppForm]")
ControlSend("Подключение","","[CLASS:TLogInAppForm; INSTANCE:1]","Иванов")
ввод дат в окошко с датами
ControlFocus("Фильтр","","[CLASS:TDBDateTimeEditEh;INSTANCE:6]")
ControlSend("Фильтр","","[CLASS:TDBDateTimeEditEh;INSTANCE:6]",$day1 & $mes1 & $god1)
клик мышкой по кнопке
ControlFocus("Фильтр","","[CLASS:TBitBtn; INSTANCE:4]")
ControlClick("Фильтр","Очистить фильтр","[CLASS:TButton;INSTANCE:1]")

prodist 20-05-2008 21:08 807140

Есть autorun-файл (install.exe). После нажатия Установить открывается setup-файл (setup.exe).
Надо, чтобы после завершения работы setup-файла открылся другой файл. Но только при установке, а если запускать удаление через setup, то ничего открываться не должно. И так же, если при открытии ламер)) "нажал на закрытие")

Smarton 21-05-2008 02:01 807376

Здрасте! У меня два вопроса: Как в Autoit осуществить попиксельное сравнение изображений (в браузере), и как отслеживать события flash приложения (тоже в браузере). Буду оч благодарен если поможите!

amel27 21-05-2008 07:24 807434

SvetlanaK, что можно попробовать:

- поставить Sleep(100) после каждой Control-команды;
- вместо ControlSend использовать ControlSetText;
- проверять успешность выполнения каждой команды via ControlGetFocus, ControlGetText;
- использовать ф-ции отладки TrayIconDebug, _Debug* для локализации сбоев в работе скрипта.


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

Maza Faka 21-05-2008 12:56 807631

amel27
Не поможешь? Пытаюсь получить список расшаренных ресурсов компьютера:
Код:

$SHARE_INFO_0 = DllStructCreate("wchar[256]")

$ElementCount = DllStructCreate("int")

$aRet = DllCall("netapi32.dll", "int", "NetShareEnum", "wstr", "", "dword", 0, "ptr", DllStructGetPtr($SHARE_INFO_0), _
                "dword", DllStructGetSize($SHARE_INFO_0), "ptr", DllStructGetPtr($ElementCount), "ptr*", 0, "ptr", 0)

ConsoleWrite("Resource name = " & DllStructGetData($SHARE_INFO_0, 1) & @LF)

ConsoleWrite("Elements count = " & DllStructGetData($ElementCount, 1) & @LF)

DllCall("netapi32.dll", "int", "NetApiBufferFree", "ptr", DllStructGetPtr($SHARE_INFO_0))

Корректно получаю только количество расшаренных ресурсов :(

SvetlanaK 21-05-2008 13:37 807668

amel27, спасибо, стала пробовать и случайно заметила, что команды MouseClick и ControlClick имеют разный интервал времения выполненияз, и если стоит так
MouseClick (...)
ControlClick (...)
то ПЕРВОЙ выполняется ControlClick (...), а уж потом только MouseClick (...), что вызвало путаницу в последовательности действий.

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

Maza Faka 21-05-2008 14:04 807701

Цитата:

Цитата SvetlanaK
там попадается окно с чекбоксами, где ставятся галочки, как бы моему скрипту "увидеть", стоят они или не стоят? »

Код:


ControlCommand("Title", "", "ControlID", "IsChecked")


prodist 21-05-2008 23:04 808073

Так ведь в конце установки появляется кнопка Готово (она появляется и при удалении, но текст разный в, наверно, Edit'ах) )

*OM* 22-05-2008 06:54 808161

Maza Faka Спасибо за помощь и быстрый ответ ! :ninja: Я подумал и взял вариант Creat0R'а он немного короче и AI код мне поближе чем WIN API (недорос наверное я до него =) )

P/S: ОМ и мир всем.

TERMINAL 22-05-2008 11:10 808276

Возможно ли с помощью скрипта узнать серийный номер и модель жёсткого диска и возможно ли это потом с помощью скрипта записать на диск?

DedJager 22-05-2008 16:52 808530

Как прочитать текст с текущей страницы браузера? Т.е где на странице есть текст вида "BlaBlaBla: $num" нужно получить это самое num. Единственное что нашел это _IEBodyReadHTML. Но оно считывает все тело. Есть ли какая-то функция для поиска или надо ручками считывать и искать нужную строку?

И второй вопрос - данная функция поддерживает вроде как только ИЕ... для других браузеров ничего нету?

Котяра 22-05-2008 19:52 808662

Делаю... скринсейвер на AutoIt. Неполноценный, он просто выводит с трея баллуны типа "Работаем!". Опять вернулся к вопросу параметров командной строки для скомпилированного скрипта. Как известно, скринсейвер запускается параметров /s. Как сделать разной реакцию скрипта на запуск:
Rabotaem.exe /s и Rabotaem.exe. Ответ, пожалуйста, с примером и на русском языке :)

Creat0R 22-05-2008 23:00 808807

DedJager,
Цитата:

Цитата DedJager
на странице есть текст вида "BlaBlaBla: $num" нужно получить это самое num »

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

Код:

$Html = _INetGetSource("http://some_web-site.com/some_page.html")
$sText = StringRegExpReplace($Html, '(?i).*BlaBlaBla: \$(.*) ', '\1')


Котяра,
Цитата:

Цитата Котяра
скринсейвер на AutoIt »

Не на русском, но тут я привёл инфу о том как можно сделать самому полноценную заставку, плюс пример для заставки Matrix ;).

petropulos 23-05-2008 00:11 808835

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

Creat0R 23-05-2008 00:37 808845

petropulos,
Цитата:

Цитата petropulos
где скачать русскую справку »

Тут, правда устарела она немного.

Котяра 23-05-2008 00:51 808849

Creat0R, вопрос был конкретно про параметры командной строки...

хотя эта информация тоже полезна для меня

Вроде получается...

amel27 23-05-2008 12:04 809078

Цитата:

Цитата Maza Faka
Не поможешь? Пытаюсь получить список расшаренных ресурсов компьютера »

примерно так:
Код:

#include <array.au3>
$a = _NetGetShareList("")
_ArrayDisplay($a)

Func _NetGetShareList($sComputer)
    Local $EntriesRead = DllStructCreate("int")
    Local $TotalEntries = DllStructCreate("int")
    Local $pBuffer = DllStructCreate("ptr"), $tBuffer
    $aRet
= DllCall("netapi32.dll", "int", "NetShareEnum", _
        "wstr", $sComputer, _
        "dword", 0, _
        "ptr", DllStructGetPtr($pBuffer), _
        "dword", -1, _
        "ptr", DllStructGetPtr($EntriesRead), _
        "ptr", DllStructGetPtr($TotalEntries), _
        "ptr", 0)
    If $aRet[0] Then Return SetError(1, $aRet[0], 0)
    $EntriesRead = DllStructGetData($EntriesRead, 1)
    Local $aRes[$EntriesRead+1]=[$EntriesRead]
    Local $SHARE_INFO_0 = DllStructCreate("ptr["& $EntriesRead &"]", DllStructGetData($pBuffer,1))
    For $i=1 To $EntriesRead
        $tBuffer
= DllStructCreate("wchar[256]", DllStructGetData($SHARE_INFO_0, 1, $i))
        $aRes[$i] = DllStructGetData($tBuffer, 1)
    Next
    DllCall("netapi32.dll", "int", "NetApiBufferFree", "ptr", DllStructGetData($pBuffer,1))
    Return $aRes
EndFunc

SvetlanaK
Цитата:

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

amel27 23-05-2008 12:21 809093

Цитата:

Цитата prodist
Так ведь в конце установки появляется кнопка Готово »

дык никто не мешает поставить ожидание типа WinWait("", "Готово") и затем проверить другие параметры окна, но если в процессе установки отказаться разве окно "готово" тоже появится?..

Maza Faka 23-05-2008 13:54 809167

Цитата:

Цитата amel27
примерно так: »

Вот спасибо! :) Буду разбираться.

Creat0R 23-05-2008 15:41 809246

Котяра,
Цитата:

вопрос был конкретно про параметры командной строки...
Там приведены их описания, и пример использования. Я кстати и без этого узнал, сначала почти сам догадался, а только потом инфу в Googl'е и на оф. сайте нашёл. Проверить ключи очень просто - в скрипте всего одну строку прописать: MsgBox(0, "", $CmdLineRaw)
Скомпилировать скрипт, и переименовать *.exe в *.scr, и запускать (либо с меню функции заставки, либо прямым запуском).

Котяра 23-05-2008 19:32 809412

Creat0R, я про знаю, с какими параметрами запускается скринсейвер Windows. Я спрашивал, как менять реакцию скрипта на них. И понял: так (через эту переменную):
Цитата:

Цитата Creat0R
$CmdLineRaw »


prodist 23-05-2008 20:02 809429

Цитата:

Цитата amel27
дык никто не мешает поставить ожидание типа WinWait("", "Готово") и затем проверить другие параметры окна, но если в процессе установки отказаться разве окно "готово" тоже появится?.. »

ну так я понимаю. вот и спрашиваю функцию.. WinWait - спасибо. А по какой функции узнать о завершении приложения (без разницы, как оно завершается)

Creat0R 23-05-2008 20:47 809457

prodist,
Цитата:

Цитата prodist
какой функции узнать о завершении приложения »

ProcessWaitClose() ?

DENoszone 24-05-2008 11:19 809724

задача:
1.Открытие поисковика google.ru или ya.ru
2.В строку поиска берет первую строчку файла 123.txt (синтаксис файла: каждая строчка это новый запрос виида *.text.tx вместо text.tx может бытьчто угодно, вместо звездочки...ну так и вводите)
3. И дальше начинает переходить по всем ссылкам подряд до последний странице и на страницах ищет эту *.text.tx (asdqwe.text.tx qweqwe.text.ru)
4. записывает в файл построчно.
5. после всего все переводит в нижний регистр
6. проверяет на повторы.
7. вот и все.

кто сможет сделать?

Creat0R 24-05-2008 16:27 809891

DENoszone,
Хочу уточнить...

Цитата:

Цитата DENoszone
4. записывает в файл построчно. »

Записывает в файл что? результаты поиска, страницы на которых найдены запросы, или всё подряд, весь исходник запроса? :)

Цитата:

Цитата DENoszone
6. проверяет на повторы. »

Это лучше проверять в процессе записи (а точнее создания списка для записи).

DENoszone 25-05-2008 09:57 810275

Creat0R,
записывать все что вида *.text.tx

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

Creat0R 25-05-2008 10:05 810276

DENoszone,
Цитата:

Цитата DENoszone
записывать все что вида *.text.tx »

Не ясно! Вместо * может быть что угодно? или записывать строку в которой содержится это? подробнее...

DENoszone 26-05-2008 09:58 810828

я проверил можно без * просто .text.tx записывать надо все символы перед .text.tx к примеру qwe-qwe.text.tx или qwe_qwe.text.tx
все символы до первого пробела. может будет глюк какой то..то симоволов не больше 32..ограничение..

NikLok 26-05-2008 18:49 811292

Кто нибудь знает как определить цвет панели задач?

VovaVolk 26-05-2008 22:43 811454

ПрЮвет! Подскажите люди добрые как ввести имя и код активации если имею setup.exe /s

NikLok 26-05-2008 23:37 811497

В функции MsgBox есть необязательный параметр - время вывода.
Кто нибудь делал отображение обратного отсчета этого времени в самом MsgBox ?
То есть висит и тикает!

Creat0R 27-05-2008 04:47 811599

DENoszone,
Мне не удаётся пропарсить исходный код страницы при поиске на Google/yandex :(, там часто меняется запрос, я уже не говорю о поиске во всех результатах, это кстати может занять довольно много времени.

Creat0R 27-05-2008 05:09 811601

NikLok,
Цитата:

как определить цвет панели задач?
У неё вроде цвет тот же что и у интерфейса других окон. А для получения системных цветов есть UDF:

Код:

Const $COLOR_SCROLLBAR = 0 ; - цвет полосы прокрутки
Const $COLOR_BACKGROUND = 1 ; - цвет фона окна
Const $COLOR_ACTIVECAPTION = 2 ; - цвет заголовка активного окна
Const $COLOR_INACTIVECAPTION = 3 ; - цвет заголовка неактивного окна
Const $COLOR_MENU = 4 ; - цвет меню
Const $COLOR_WINDOW = 5 ; - цвет окна
Const $COLOR_WINDOWFRAME = 6 ; - цвет обрамления окна
Const $COLOR_MENUTEXT = 7 ; - цвет текста меню
Const $COLOR_WINDOWTEXT = 8 ; - цвет текста окна
Const $COLOR_CAPTIONTEXT = 9 ; - цвет текста в заголовке окна

Const $COLOR_ACTIVEBORDER = 10 ; - цвет активной границы окна
Const $COLOR_INACTIVEBORDER = 11 ; - цвет неактивной границы окна
Const $COLOR_APPWORKSPACE = 12 ; - цвет рабочего места окна
Const $COLOR_HIGHLIGHT = 13 ; - цвет подсветки
Const $COLOR_HIGHLIGHTTEXT = 14 ; - цвет подсвеченного текста
Const $COLOR_BTNFACE = 15 ; - цвет лицевой части кнопки
Const $COLOR_BTNSHADOW = 16 ; - цвет тени кнопки
Const $COLOR_GRAYTEXT = 17 ; - цвет "серого" текста
Const $COLOR_BTNTEXT = 18 ; - цвет текста в кнопке
Const $COLOR_INACTIVECAPTIONTEXT = 19 ; - цвет текста в заголовке неактивного окна
Const $COLOR_BTNHIGHLIGHT = 20 ; - цвет текущей кнопки

$nColor = _GetSysColor($COLOR_WINDOW)

GUICreate("_GetSysColor", 200, 100)

GUICtrlCreateLabel($nColor, 20, 15)

GUICtrlCreateLabel(" ", 30, 40, 32, 32)
GUICtrlSetBkColor(-1, $nColor)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            ExitLoop
    EndSwitch
WEnd


;~ Позволяет получать системные цвета, определённые текущими параметрами оформления
Func _GetSysColor($nIndex)
    $BGRColor = DllCall("user32.dll", "long", "GetSysColor", "long", $nIndex)
    $BGR = Hex ($BGRColor[0],6 )
    $RGB = "0x" & StringRight($BGR,2) & StringMid($BGR,3,2) & StringLeft($BGR,2)
    Return $RGB
EndFunc

Ну или можно через PixelGetColor...

Код:

$TaskBar_Hwnd = WinGetHandle("[CLASS:Shell_TrayWnd]")
$nColor = PixelGetColor(5, 5, $TaskBar_Hwnd)
$nColor = "0x" & Hex($nColor, 6)

В любом случае могут возникнуть проблемы при использовании разных тем оформления.

Creat0R 27-05-2008 05:52 811607

Вложений: 1
VovaVolk,
Цитата:

Цитата VovaVolk
как ввести имя и код активации если имею setup.exe /s »

Только если при этом окна создаются (в скрытом состоянии), и то не точно.

NikLok
Цитата:

Кто нибудь делал отображение обратного отсчета этого времени в самом MsgBox ?
Я делал, и многие другие делали ;)

Прикрепил один продвинуты пример.
Это кстати моя попытка (удачная на мой взгляд) имитации оригинального MsgBox, но в этом случае я обхожу баг AutoIt'а, когда деактивируем все GUI-окна, при обратной активации родительское окно не отображается, только наш дочерний MsgBox. Этот баг проявляется тогда, когда родительское окно имеет подсказки (ToolTips), а дочернее нет.

P.S
Этот немаленький UDF поддерживает все те же константы/функции что и обычны UDF, приимущества думаю упоминать не нужно ;)

NikLok 27-05-2008 11:13 811723

Creat0R,
Цитата:

Цитата Creat0R
Я делал, и многие другие делали »

Как хорошо что велосипед уже есть!

NikLok 27-05-2008 11:32 811733

Creat0R,
Цитата:

Цитата Creat0R
$nColor = PixelGetColor(5, 5, $TaskBar_Hwnd) »

Не хочет принимать 3-й параметр!!! Что у них ошибка что ли? 3.2.10 и 3.2.12

1-метод с моей темой VistXP дал один и тот же цвет для таск бара на двух машинах с реально разными темами и цветами панели задач!

Creat0R 27-05-2008 15:19 811892

NikLok,
Цитата:

Цитата NikLok
Не хочет принимать 3-й параметр! »

В 3.2.10.0 этого параметра ещё не было, его добавили и 3.2.12.0.

Цитата:

Цитата NikLok
1-метод с моей темой VistXP дал один и тот же цвет для таск бара на двух машинах с реально разными темами и цветами панели задач! »

Я ж писал:

Цитата:

Цитата Creat0R
В любом случае могут возникнуть проблемы при использовании разных тем оформления. »

Идеальных методов мне не известно :(

NikLok 27-05-2008 18:44 812072

Creat0R,
Цитата:

Цитата Creat0R
В 3.2.10.0 этого параметра ещё не было, его добавили и 3.2.12.0. »

твоя правда! В версиях запутался!

К сожалению второй метод тоже не годится! У меня убирающийся таск бар!

Еще минуточку. Вот пытаюсь сделать активным окно fIREfOX с помощью рег. выражений
Код:

        WinWait("[REGEXPTITLE:.*Mozilla Firefox.*]","")
        If Not WinActive("[REGEXPTITLE:.*Mozilla Firefox.*]","") Then WinActivate("[REGEXPTITLE:.*Mozilla Firefox.*]","")
        WinWaitActive("Mozilla Firefox","")

Почемуто виснет прямо на первой иснтрукции! Браузер запущен, в заголовке есть искомая строка! В чем дело?

Creat0R 27-05-2008 19:07 812090

NikLok,
Цитата:

Цитата NikLok
В чем дело? »

Возможно в том что после «Mozilla Firefox» нет ничего, поэтому там не нужно .*, это можно заменить на символ конца строки ($), хотя у меня останавливается на третьей строке, а вообще лучше по классу искать:

Код:

WinWait("[CLASS:MozillaUIWindowClass]")
If Not WinActive("[CLASS:MozillaUIWindowClass]") Then WinActivate("[CLASS:MozillaUIWindowClass]")
WinWaitActive("[CLASS:MozillaUIWindowClass]")


NikLok 28-05-2008 10:24 812591

Creat0R,
Цитата:

Цитата Creat0R
WinWait("[CLASS:MozillaUIWindowClass]") If Not WinActive("[CLASS:MozillaUIWindowClass]") Then WinActivate("[CLASS:MozillaUIWindowClass]") WinWaitActive("[CLASS:MozillaUIWindowClass]") »

Что у меня как у чукчи ничего не получается! Стрянет прямона первой команде.
А гле ты посмотрел это название класса - MozillaUIWindowClass ? Просто надо же знать как этот класс будет называться у другого приложения!

Creat0R 28-05-2008 12:24 812713

NikLok,
Цитата:

Цитата NikLok
гле ты посмотрел это название класса »

В папке с AutoIt есть инструмент Au3Info.exe (AutoIt Window Info Tool).

VovaVolk 28-05-2008 17:34 812992

Цитата:

Цитата Creat0R
VovaVolk,
Цитата VovaVolk:
как ввести имя и код активации если имею setup.exe /s »
Только если при этом окна создаются (в скрытом состоянии), и то не точно. »

Я пытаюсь сделаь тихую установку OziExplorer. При помощи setup.exe /r, получил получил setup.iss и по команде setup.exe /s проходит тихая установка, вот только потом надо вводить имя и пароль. Вот как бы их сразу воткнуть?

DENoszone 29-05-2008 12:21 813578

Creat0R
а можно я пишу сайт...а скрипт парсит его с верху до низу

TERMINAL 29-05-2008 12:35 813590

Creat0R, Возможно ли как то узнать серийный номер жёсткого диска, CD-ROMa, материнской платы....?
Возможно ли с помощью скрипта писать диски?
Возможно ли с помощью скрипта, зная название программы, к примеру 1С, узнать на какой сетевой адрес и через какой порт она подключена?

SvetlanaK 29-05-2008 17:45 813805

Можно ли с пом скрипта определить момент появления флэшки в компьютере?
в хелпе отыскала $var = DriveGetDrive( "REMOVABLE" ). но как сделать именно отслеживание? проверку в реальном времени, а не появилась ли флэш...и если появилась то выдать например сообщение типа "проверьте товарисч ее на вирусы, а не тоооооооо...." можно?

Creat0R 29-05-2008 17:59 813823

VovaVolk,
Цитата:

Цитата VovaVolk
потом надо вводить имя и пароль »

Диалог отображается куда можно вводить данные?

DENoszone,
Цитата:

Цитата DENoszone
пишу сайт...а скрипт парсит его с верху до низу »

Одну страничку?

TERMINAL,
Цитата:

Цитата TERMINAL
Возможно ли как то узнать серийный номер жёсткого диска, CD-ROMa, материнской платы....? »

Возможно, но это не ко мне, никогда не сталкивался.

Цитата:

Цитата TERMINAL
Возможно ли с помощью скрипта писать диски? »

Полагаю что тоже возможно.

Цитата:

Цитата TERMINAL
Возможно ли с помощью скрипта, зная название программы, к примеру 1С, узнать на какой сетевой адрес и через какой порт она подключена? »

Опять, это не ко мне :)
Я административными задачами не занимался, за исключением мелких, которые были любопытны мне.

SvetlanaK,
Цитата:

Цитата SvetlanaK
как сделать именно отслеживание? »

Я как то приводил пример:

Код:

#include <GuiConstants.au3>

Global $aDrives = 0

GUICreate("USB Ejector & Monitor", 300, 210)

$List = GUICtrlCreateList("", 20, 20, 260, 140)

$EjectDrive_Button = GUICtrlCreateButton("Eject Drive", 20, 170, 70, 20)
$RefreshList_Button = GUICtrlCreateButton("Refresh List", 210, 170, 70, 20)

_Check_Drives()
AdlibEnable("_Check_Drives", 1000)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$EjectDrive_Button
            $sDrive
= GUICtrlRead($List)

            _EjectDrive(StringLower($sDrive))
        Case $RefreshList_Button
            $aCheckDrives
= DriveGetDrive("Removable")
            _SetUSBDrivesList_Proc($List)
    EndSwitch
WEnd

Func
_Check_Drives()
    $aCheckDrives = DriveGetDrive("Removable")

    If Not _aDrivesIsIdent($aDrives, $aCheckDrives) Then
        $aDrives = $aCheckDrives
        _SetUSBDrivesList_Proc($List)
    EndIf
EndFunc

Func
_SetUSBDrivesList_Proc($iCtrlID=-1)
    GUICtrlSetData($iCtrlID, "")

    For $i = 1 To UBound($aDrives)-1
        If Not _IsFloppyDrives($aDrives[$i]) And DriveStatus($aDrives[$i]) = "READY" Then _
            GUICtrlSetData($iCtrlID, StringUpper($aDrives[$i]) & "\")
    Next
EndFunc

Func
_aDrivesIsIdent(ByRef $avArray1, ByRef $avArray2)
    Local $iUbound1 = UBound($avArray1), $iUbound2 = UBound($avArray2)

    If $iUbound1 <> $iUbound2 Then Return False

    For
$i = 1 To $iUbound1-1
        If Not _IsFloppyDrives($avArray1[$i], $avArray2[$i]) And _
            (
$avArray1[$i] <> $avArray2[$i] Or DriveStatus($avArray1[$i]) <> "READY" Or _
            DriveStatus($avArray2[$i]) <> "READY") Then Return False
    Next

    Return True
EndFunc

Func
_IsFloppyDrives($sDrive1, $sDrive2="")
    Return StringRegExp($sDrive1, "(?i)[a-b]") Or ($sDrive2 <> "" And StringRegExp($sDrive2, "(?i)[a-b]"))
EndFunc

Func
_EjectDrive($sdLetter, $sVerb="&Извлечь") ;Для английской Winndows $sVerb = "E&ject"
    ;Раскомментируйте эти строчки для Варианта № 1 :)
;~  Run("rundll32.exe shell32.dll,Control_RunDLL hotplug.dll", @SystemDir)
;~  Return


    If $sdLetter = "" Then Return 0

    Local Const $SSF_DRIVES = 17
    Local $oShell, $oNameSpace, $oDrive

    Local $oEvent = ObjEvent("AutoIt.Error", "Error_Handler")

    Local $oShell = ObjCreate("Shell.Application")
    If Not IsObj($oShell) Then Return SetError(1, 0, 0)

    Local $oNamespace = $oShell.NameSpace($SSF_DRIVES)
    Local $oDrive = $oNamespace.ParseName($sdLetter)

    $oDrive.InvokeVerb($sVerb)
    If @error Then Return 0

    If DriveStatus($sdLetter) <> "READY" Then
        Local
$strName = DriveGetLabel($sdLetter) & " (" & StringUpper($sdLetter) & ")"
        TrayTip("USB Drive " & $strName & " ejected", "You can now remove the device safely.", 5, 1)
    EndIf
Endfunc

Func
Error_Handler()
    SetError(1)
EndFunc


Maza Faka 30-05-2008 07:25 814204

TERMINAL
Цитата:

Возможно ли как то узнать серийный номер жёсткого диска, CD-ROMa, материнской платы....?
Очень сложно, если не сказать невозможно. Эти данные можно получить из BIOS-а. Поищи в Googl-е.
Цитата:

Возможно ли с помощью скрипта писать диски?
Можно, для этого есть WinAPI функции.

SvetlanaK 30-05-2008 11:00 814301

Creat0R, большое спасибо!

NikLok 30-05-2008 12:51 814407

Имеем код типа
Код:

GuiCtrlCreateTab($x, $y, $w, $h
GuiCtrlCreateTabItem("Tab1")
....
GuiCtrlCreateTabItem("Tab2")
...
GuiCtrlCreateTabItem("Tab3")
..
GuiCtrlCreateTabItem("Tab4")
.
GuiCtrlCreateTabItem("")

В некоторых табах имеет ListView. Выбираем в каком нибудь алимент. Переключаемся в другой таб что-то делаем, возвращаемся а выбранный алимент сброшен.
Что значит надо самому запоминать его состояние и восстанавливать при переключении на данную вкладку? Мне кажется много кода будет!
Кто нибудь подскажет имена событий связанные с переключением вкладок. А еще лучше пример обработчика.
Или я опять все привратно трактую, в силу недопонимания?!

И кстатит на что влияет заключительная контсрукция GuiCtrlCreateTabItem("").
Я сначала без неё усе написал а потом у хелпе выглядел!

Котяра 30-05-2008 13:08 814430

Цитата:

Цитата TERMINAL
Creat0R, Возможно ли как то узнать серийный номер жёсткого диска, CD-ROMa, материнской платы....?
Возможно ли с помощью скрипта писать диски?
Возможно ли с помощью скрипта, зная название программы, к примеру 1С, узнать на какой сетевой адрес и через какой порт она подключена? »

1. Я думаю, да.
2. Я думаю, нет, запись дисков не является функцией Windows, она появилась лишь в Windows XP. Только если подключить какой-нибудь command-line прожигатель дисков.
3. Не знаю

Creat0R 30-05-2008 13:17 814444

NikLok,
Цитата:

Цитата NikLok
Выбираем в каком нибудь алимент. Переключаемся в другой таб что-то делаем, возвращаемся а выбранный алимент сброшен. »

Про какой элемент речь? строка в ListView?

Цитата:

Цитата NikLok
Кто нибудь подскажет имена событий связанные с переключением вкладок. А еще лучше пример обработчика. »

Что именно требуется? проверить переключение вкладки?

Код:

#include <GuiConstants.au3>

$GUI = GUICreate("Test Script", 300, 200)

$Main_Tab = GUICtrlCreateTab(20, 10, 260, 140)

$TabItem1 = GUICtrlCreateTabItem("Tab 1")
$TabItem2 = GUICtrlCreateTabItem("Tab 2")

GUISetState(@SW_SHOW, $GUI)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$Main_Tab
            Switch GUICtrlRead($Main_Tab)
                Case 0
                    MsgBox(0, "", "Переключение на Tab 1")
                Case 1
                    MsgBox(0, "", "Переключение на Tab 2")
            EndSwitch
    EndSwitch
WEnd

Цитата:

Цитата NikLok
на что влияет заключительная контсрукция GuiCtrlCreateTabItem(""). »

На закрытие табов, чтобы создаваемые далее контроли не попадали под последний созданный таб.

NikLok 30-05-2008 13:59 814479

Цитата:

Цитата Creat0R
Про какой элемент речь? строка в ListView? »

Именно, именно!

В принципе на все ответил. Только момент не совсем ясен:
Цитата:

Цитата Creat0R
Case 0 MsgBox(0, "", "Переключение на Tab 1") Case 1 MsgBox(0, "", "Переключение на Tab 2") »

Я так понимаю 0 и 1 это внутренние ( скрытые внутрях) идентификаторы табов в соотв с порядком их создания?
Наверное вместо них так же можно использовать $TabItem1 и $TabItem2 ?

А что с сохранением позций listview в табах?

Creat0R 30-05-2008 14:18 814500

NikLok,
Цитата:

Цитата NikLok
Я так понимаю 0 и 1 это внутренние ( скрытые внутрях) идентификаторы табов в соотв с порядком их создания? »

Да, 0 первый таб, 1 (в этом случае) последний.

Цитата:

Цитата NikLok
Наверное вместо них так же можно использовать $TabItem1 и $TabItem2 ? »

Нет, это идентификаторы контроля, а нам нужно проверять свойства текущего Tab'а.

Цитата:

Цитата NikLok
что с сохранением позций listview в табах? »

У меня работает:

Код:

#include <GuiConstants.au3>

$GUI = GUICreate("Test Script", 300, 200)

$Main_Tab = GUICtrlCreateTab(20, 10, 260, 140)

$TabItem1 = GUICtrlCreateTabItem("Tab 1")

$ListView = GUICtrlCreateListView("Column", 40, 40, 220, 100)
GUICtrlCreateListViewItem("Item", $ListView)

$TabItem2 = GUICtrlCreateTabItem("Tab 2")

GUISetState(@SW_SHOW, $GUI)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Приведи пример что конкретно имеется в виду.

NikLok 30-05-2008 14:29 814510

Creat0R, Спасибо! Я пока поразбираюсь сам в своих выкрутасах. Наверное что-то напутал! Если что спрошу исчо.

DENoszone 31-05-2008 08:17 814980

срочно
есть ссылка
http://odnoklassniki.km.ru/my/mail/m...iduser=1200000
ещё надо генерировать в цикле (след ссылка http://odnoklassniki.km.ru/my/mail/m...iduser=1200001 +1 )
в поле сообщения ввести определеный текст.
зараанее спасибо..думю это просто?

Maza Faka 31-05-2008 14:28 815132

amel27
Посмотри, если будет время:
Код:

#include <WindowsConstants.au3>
#include <ToolTipConstants.au3>

Global Const $CW_USEDEFAULT = 0x80000000
Global Const $TOOLTIPS_CLASSA = "tooltips_class32"

Global $hToolTip

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

$hToolTip = DllCall("user32.dll", "hwnd", "CreateWindowEx", "int", $WS_EX_TOPMOST, "str", $TOOLTIPS_CLASSA, _
                    "str", 0, "int", BitOR($WS_POPUP, $TTS_ALWAYSTIP), "int", $CW_USEDEFAULT, _
                    "int", $CW_USEDEFAULT, "int", $CW_USEDEFAULT, "int", $CW_USEDEFAULT, "hwnd", $hGUI, "hwnd", 0, _
                    "hwnd", 0, "ptr", 0)
$hToolTip = $hToolTip[0]

$TestButton = GUICtrlCreateButton("Test", 105, 50, 75, 25)
_ToolTipCreate(GUICtrlGetHandle($TestButton), "Its a Test button")

$OkButton = GUICtrlCreateButton("Ok", 105, 100, 75, 25)
_ToolTipCreate(GUICtrlGetHandle($OkButton), "Its a Ok button")

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

GUISetState()

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case -3
            ExitLoop
    EndSwitch
WEnd

Func _ToolTipCreate($sUid, $sText)

    Local $tRect = DllStructCreate("int Left;int Top;int Right;int Bottom")
    DllCall("user32.dll", "int", "GetClientRect", "hwnd", $sUid, "ptr", DllStructGetPtr($tRect))

    Local $tBuffer = DllStructCreate("char[256]")
    DllStructSetData($tBuffer, 1, $sText)

    Local $TOOLINFO = DllStructCreate("int cbSize;int uFlags;hwnd hWnd;int uId;int rect[4];hwnd hinst;" & _
                                      "ptr lpszText;int lParam;ptr lpReserved")

    DllStructSetData($TOOLINFO, "cbSize", DllStructGetSize($TOOLINFO))
    DllStructSetData($TOOLINFO, "uFlags", BitOR($TTF_CENTERTIP, $TTF_SUBCLASS))
    DllStructSetData($TOOLINFO, "hWnd", $hGUI)
    DllStructSetData($TOOLINFO, "uId", $sUid)
    DllStructSetData($TOOLINFO, "rect", DllStructGetData($tRect, "Left"), 1)
    DllStructSetData($TOOLINFO, "rect", DllStructGetData($tRect, "Top"), 2)
    DllStructSetData($TOOLINFO, "rect", DllStructGetData($tRect, "Right"), 3)
    DllStructSetData($TOOLINFO, "rect", DllStructGetData($tRect, "Bottom"), 4)
    DllStructSetData($TOOLINFO, "hinst", 0)
    DllStructSetData($TOOLINFO, "lpszText", 0)
    DllStructSetData($TOOLINFO, "lParam", 0)
    DllStructSetData($TOOLINFO, "lpReserved", 0)

    DllCall("user32.dll", "int", "SendMessage", "hwnd", $hToolTip, "int", $TTM_ADDTOOL, "int", 0, _
            "ptr", DllStructGetPtr($TOOLINFO))
EndFunc

Func RGB2BGR($iColor)
    Return BitAND(BitShift(String(Binary($iColor)), 8), 0xFFFFFF)
EndFunc  ;==>RGB2BGR()

Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
    Local $tNMHDR, $hWndFrom, $iCode

    $tNMHDR = DllStructCreate("hwnd hWndFrom;int IdFrom;int Code", $lParam)
    $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

    If $iCode = $TTN_GETDISPINFO Then ConsoleWrite($iCode & @LF)

    Return "GUI_RUNDEFMSG"
EndFunc

Пытаюсь получить уведомление TTN_GETDISPINFO, но безуспешно :(
Инфа

DENoszone 01-06-2008 12:39 815785

а то что я написал можно вобоще сделать??
или нет?

djair 03-06-2008 14:41 817372

Подскажите, пожалуйста, можно ли без применения других программ, а только с помощью autoit залить файл на фтп? В архиве ничего подходящего не нашел... (Если боян, прошу не пинать :) )

Creat0R 03-06-2008 16:44 817479

DENoszone,
Цитата:

Цитата DENoszone
в поле сообщения ввести определеный текст. »

В какое поле?

djair,
Цитата:

Цитата djair
залить файл на фтп? »

Тут есть библиотека для работы с FTP.

DENoszone 04-06-2008 08:25 817985

ну там ..куда писать..вообщем мне надо спам о этому сайту...
я хочу там в конкурсе выграть=)

Creat0R 04-06-2008 08:53 817995

DENoszone,
Цитата:

Цитата DENoszone
ну там ..куда писать »

Меня просит войти под моим логином, которого у меня конечно нет :).

DENoszone 04-06-2008 20:05 818392

ну ..там легко зарегистрирватся=)

Creat0R 05-06-2008 03:59 818752

DENoszone,
Цитата:

Цитата DENoszone
там легко зарегистрирватся »

Возможно, но у меня если честно нет желания, одна из причин это не хотение быть соучастником спамо-распространения :).

Creat0R 05-06-2008 11:04 818910

DENoszone,
Цитата:

Цитата DENoszone
в поле сообщения ввести определеный текст. »

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

Код:

#include <GuiConstants.au3>
#include <IE.au3>

$oIE = _IECreate("http://odnoklassniki.km.ru/my/mail/message.asp?iduser=1200000")

$oForm = _IEFormGetCollection($oIE, 1)
$oQuery = _IEFormElementGetCollection($oForm, 0)
_IEFormElementSetValue($oQuery, "определеный текст")

_IEFormSubmit($oForm)


DENoszone 05-06-2008 11:20 818920

а как в цикл?
и как +1 к ссылке?
и ксатти не отправляет вроде...
может другой браузер надо:

Creat0R 05-06-2008 11:30 818930

DENoszone,
Цитата:

Цитата DENoszone
а как в цикл?
и как +1 к ссылке? »

См. For ... Next...

Код:

$iCounter = 0

For $i = 0 To 10
      $URL = "http://odnoklassniki.km.ru/my/mail/message.asp?iduser=120000" & $i
Next

Цитата:

Цитата DENoszone
не отправляет вроде »

Нет, у меня это не получилось :( , я с _IE* функциями особо не сталкивался, смотри примеры в справке.

DENoszone 05-06-2008 11:41 818941

та я просто...до этого так же как и ты сделал...оно и не пахало..во тчего написал...

Белтон 07-06-2008 01:42 820511

Подскажите пожалуйста, у меня есть exe файлик в редакторе ресурсов написано что он создан с помощью "AutoIt v3 Script : 3, 2, 2, 0" я хотел бы узнать как и чем его можно открыть и посмотреть какие команды он выполняет, это возможно? Извините если не по теме.

Creat0R 07-06-2008 03:09 820535

Белтон,
Цитата:

Цитата Белтон
как и чем его можно открыть »

Старые версии AutoIt'а можно было декомпилировать (если не установлен пароль, или если он известен :) ), для этого есть в пакете с AutoIt инструмент Exe2Aut.

KKulik 09-06-2008 12:21 822085

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

Пример вызова

C:\script>input.exe параметр

Пример скрипта

MsgBox (0,"Example", "параметр" )

Maza Faka 09-06-2008 12:24 822089

KKulik
Help

KKulik 09-06-2008 12:25 822090

спасибо

DENoszone 09-06-2008 20:25 822492

ну что не как не получится моё сделать?

HORRIBLE 10-06-2008 17:01 823086

Подскажите пожалуйсто, как узнать URL странички которая уже открыта ? Т.е. мне нужно узнать адрес странички на которой сейчас находится пользователь.


Давно тут приводился пример мониторинга нажатия клавиш на клавиатуре,
читать дальше »

Код:

#include <DllCallBack.au3>

Global Const $WH_KEYBOARD_LL = 13
Global $hHook, $pStub_KeyProc
Global $pStub_KeyProc = _DllCallBack ("_KeyProc","int;ptr;ptr")
Global $hmod = DllCall("kernel32.dll","hwnd","GetModuleHandle","ptr",0)
Global $hHook = DllCall("user32.dll","hwnd","SetWindowsHookEx","int", _
            $WH_KEYBOARD_LL,"ptr",$pStub_KeyProc,"hwnd",$hmod[0],"dword",0)
Global $buffer = ""

MsgBox(4096,"","Type anything anywhere and it will appear in the top left corner of the screen.")


While 1
    Sleep(10)
WEnd

Func EvaluateKey($keycode)
    If (($keycode > 22) And ($keycode < 91)) _
        Or (($keycode > 47) And ($keycode < 58)) Then
        $buffer &= Chr($keycode)
        ToolTip($buffer,0,0)
    ElseIf ($keycode > 159) And ($keycode < 164) Then
        Return
    EndIf
EndFunc

Func _KeyProc($nCode, $wParam, $lParam)
    Local $ret,$KEYHOOKSTRUCT
    If $nCode < 0 Then
        $ret = DllCall("user32.dll","long","CallNextHookEx","hwnd",$hHook[0], _
                        "int",$nCode,"ptr",$wParam,"ptr",$lParam)
        Return $ret[0]
    EndIf
    If $wparam = 256 Then
        $KEYHOOKSTRUCT = DllStructCreate("dword;dword;dword;dword;ptr",$lParam)
        EvaluateKey(DllStructGetData($KEYHOOKSTRUCT,1))
    EndIf
    $ret = DllCall("user32.dll","long","CallNextHookEx","hwnd",$hHook[0], _
                    "int",$nCode,"ptr",$wParam,"ptr",$lParam)
    Return $ret[0]
EndFunc

Func OnAutoItExit()
    DllCall("user32.dll","int","UnhookWindowsHookEx","hwnd",$hHook[0])
EndFunc

, но у меня почему то выпадает ошибка.... #include <DllCallBack.au3> (ошибка открытия файла) из -за чего это может быть, стоит последняя версия AUTO IT.

DENoszone, можно изголиться вот так ))(т.к. по нормальному не получилось написать, вечно спрашивал заблочить ли ему пользователя или нет),
читать дальше »

Код:

#include <IE.au3>
for $i =0 to 10
 $oIE = _IECreate("http://odnoklassniki.km.ru/my/mail/message.asp?iduser=120000"&$i)
 WinSetState($oIE, "",@SW_SHOWMAXIMIZED)
 _IELoadWait ($oIE,1000,60000)
 MouseClick("LEFT",440,485)
 Send("SPAM SPAM")
 MouseClick("LEFT",870,571)
 _IELoadWait ($oIE,1000,60000)
 _IEQuit ($oIE)
Next

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

Maza Faka 10-06-2008 17:42 823110

Цитата:

Цитата HORRIBLE
пример мониторинга нажатия клавиш на клавиатуре »

Начиная с версии 3.2.10.0 DllCallBack функции включены в AutoIt по умолчанию (так сказать стали нативными), соответсвенно нужно немного исправить скрипт:
Код:

Global Const $WH_KEYBOARD_LL = 13
Global $hHook, $pStub_KeyProc
Global $pStub_KeyProc = 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($pStub_KeyProc),"hwnd",$hmod[0],"dword",0)
Global $buffer = ""

MsgBox(4096,"","Type anything anywhere and it will appear in the top left corner of the screen.")

While 1
    Sleep(10)
WEnd

Func
EvaluateKey($keycode)
    If (($keycode > 22) And ($keycode < 91)) _
        Or (($keycode > 47) And ($keycode < 58)) Then
        $buffer &= Chr($keycode)
        ToolTip($buffer,0,0)
    ElseIf ($keycode > 159) And ($keycode < 164) Then
        Return
    EndIf
EndFunc

Func
_KeyProc($nCode, $wParam, $lParam)
    Local $ret,$KEYHOOKSTRUCT
    If $nCode < 0 Then
        $ret = DllCall("user32.dll","long","CallNextHookEx","hwnd",$hHook[0], _
                        "int",$nCode,"ptr",$wParam,"ptr",$lParam)
        Return $ret[0]
    EndIf
    If $wparam = 256 Then
        $KEYHOOKSTRUCT = DllStructCreate("dword;dword;dword;dword;ptr",$lParam)
        EvaluateKey(DllStructGetData($KEYHOOKSTRUCT,1))
    EndIf
    $ret = DllCall("user32.dll","long","CallNextHookEx","hwnd",$hHook[0], _
                    "int",$nCode,"ptr",$wParam,"ptr",$lParam)
    Return $ret[0]
EndFunc

Func OnAutoItExit()
    DllCall("user32.dll","int","UnhookWindowsHookEx","hwnd",$hHook[0])
EndFunc


Creat0R 10-06-2008 17:57 823122

HORRIBLE,
Цитата:

Цитата HORRIBLE
нужно узнать адрес странички на которой сейчас находится пользователь »

Это зависит от того какой браузер используется. С IE всё просто:

Код:

$URL = ControlGetText("[CLASS:IEFrame]", "", "Edit1")
:)

HORRIBLE 11-06-2008 16:32 823800

Можно ли вернуть список запущенных процессов ПОЛЬЗОВАТЕЛЕМ ?

Creat0R 11-06-2008 20:30 823972

HORRIBLE,
Цитата:

Цитата HORRIBLE
Можно ли вернуть список запущенных процессов ПОЛЬЗОВАТЕЛЕМ ? »

Можно:

Код:

#include <Array.au3>

$aProcessInfo = _ProcListByUserName(@UserName)
_ArrayDisplay($aProcessInfo)

Func _ProcListByUserName($sUserName = @UserName)
    Local $oColItems, $objWMIService, $objItem, $cI_Compname = @ComputerName
    Local $aProcessList[1]

    $objWMIService = ObjGet("winmgmts:\\" & $cI_Compname & "\root\CIMV2")
    $oColItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Process", "WQL")

    If Not IsObj($oColItems) Then Return SetError(1, 2, 0)

    For $objItem In $oColItems
        If $objItem.CSName <> $sUserName Then ContinueLoop

        $aProcessList[0] += 1
        ReDim $aProcessList[$aProcessList[0] + 1]
        $aProcessList[$aProcessList[0]] = $objItem.Name
    Next

    Return
$aProcessList
EndFunc


HORRIBLE 12-06-2008 12:55 824368

Creat0R, возвращает массив пустой, хотя у меня запущено некое кол-во программ от пользователя.

Maza Faka 12-06-2008 13:48 824386

Вышла версия 3.2.12.1
Изменений мало, только фиксы:
Цитата:

http://www.autoitscript.com/autoit3/downloads.shtml

3.2.12.1 (12th June, 2008) (Release)

AutoIt:
- Fixed #309: RunAs() and RunAsWait() now use @SystemDir as the working directory instead of @WorkingDir when a user-supplied working directory is not specified.
- Fixed #325: contextmenuitem not firing events.
- Fixed #282: Icon transparency refresh when on tab regression.
- Fixed #360: RunAs() under Windows 2000.


As the 3.2.12.x branch will be the last version compatible with NT4 and 9x we have backported a few of the most important recent fixes into this release.
Creat0R
HORRIBLE
Цитата:

возвращает массив пустой, хотя у меня запущено некое кол-во программ от пользователя
У меня тоже не работает.

Creat0R 12-06-2008 17:58 824546

HORRIBLE,
Цитата:

Цитата HORRIBLE
возвращает массив пустой »

Можно ещё так:

Код:

#include <Array.au3>

$aProcessInfo = _ProcListByUserName(@UserName)
_ArrayDisplay($aProcessInfo)

Func _ProcListByUserName($sUserName = @UserName)
    Local $oColItems, $objWMIService, $objItem, $cI_Compname = @ComputerName
    Local $aProcessList[1]

    $objWMIService = ObjGet("winmgmts:\\" & $cI_Compname & "\root\CIMV2")
    $oColItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Process", "WQL")

    If Not IsObj($oColItems) Then Return SetError(1, 2, 0)

    For $objItem In $oColItems
        If _GetExtProperty($objItem.ExecutablePath, 8) <> $sUserName Then ContinueLoop

        $aProcessList[0] += 1
        ReDim $aProcessList[$aProcessList[0] + 1]
        $aProcessList[$aProcessList[0]] = $objItem.Caption
    Next

    Return
$aProcessList
EndFunc

Func
_GetExtProperty($sPath, $iProp)
    Local $iExist, $sFile, $sDir, $oShellApp, $oDir, $oFile, $aProperty, $sProperty
    $iExist
= FileExists($sPath)
    If $iExist = 0 Then Return SetError(1, 0, 0)

    $sFile = StringTrimLeft($sPath, StringInStr($sPath, "\", 0, -1))
    $sDir = StringTrimRight($sPath, (StringLen($sPath) - StringInStr($sPath, "\", 0, -1)))
    $oShellApp = ObjCreate("shell.application")
    $oDir = $oShellApp.NameSpace($sDir)
    $oFile = $oDir.Parsename($sFile)

    If $iProp = -1 Then
        Local
$aProperty[35]

        For $i = 0 To 34
            $aProperty[$i] = $oDir.GetDetailsOf($oFile, $i)
        Next

        Return
$aProperty
    Else
        $sProperty = $oDir.GetDetailsOf($oFile, $iProp)

        If $sProperty = "" Then Return 0
        Return $sProperty
    EndIf
EndFunc

Хотя тоже не надёжно, но я других методов не знаю :(

Deep2007 12-06-2008 20:04 824682

Помогите разобраться. Открываю AutoIt 3, копирую туда текст из файла справки по автоустановке Windows:

ProgressOn("Пожалуйста, подождите...", "Происходит уничтожение данных :)", "Система обнаружила использование нелегальной" & CHR(10) & "копии Windows. Через " & $j & " сек. все данные" & CHR(10) & "на ваших дисках будут уничтожены.")
For $i = 1 to 99 step 3.3
$j=$j-1
sleep(1000)
ProgressSet( $i, "Система обнаружила использование нелегальной" & CHR(10) & "копии Windows. Через " & $j & " сек. все данные" & CHR(10) & "на ваших дисках будут уничтожены.")
Next
ProgressSet(-1 , "Шеф! Все пропало. Прощайте.")
Shutdown(2)

sleep(5000)

сохраняю это все как 12.au3, запускаю его, выскакивает окно:
Line 1 (...)
ProgressOn("Пожалуйста, подождите..."....
......................................................................
Error: Variable used without begin declared.


Что делаю неверно?

Creat0R 13-06-2008 02:44 824873

Deep2007,
Цитата:

Цитата Deep2007
Что делаю неверно? »

Это не полный код примера, полный есть тут.

Вот немного поправлены пример:

Код:

BlockInput(1)

$j = 30

ProgressOn("Пожалуйста, подождите...", "Происходит уничтожение данных :)", _
    StringFormat("Система обнаружила использование нелегальной\n" & _
        "копии Windows. Через %i сек. все данные\n" & _
        "на ваших дисках будут уничтожены.", $j))

For $i = 1 To 99 Step 3.3
    $j -= 1

    Sleep(1000)

    ProgressSet($i, _
        StringFormat("Система обнаружила использование нелегальной\n" & _
            "копии Windows. Через %i сек. все данные\n" & _
            "на ваших дисках будут уничтожены.", $j))
Next

ProgressSet(100, "Шеф! Все пропало. Прощайте.")

Shutdown(2)
Sleep(5000)


Maza Faka 13-06-2008 12:43 825023

HORRIBLE
Creat0R

Нашёл таки, как
Цитата:

вернуть список запущенных процессов ПОЛЬЗОВАТЕЛЕМ
:)
Код:

#include <Array.au3> ; Нужно только для фунции _ArrayShow()  :)

$aOwnerList = _ProcessOwnerList() ; получаем список всех процессов и их владельцев
_ArrayDisplay($aOwnerList, "List of processes owner`s")

$aProcOwner = _ProcessGetOwner(@UserName) ; а здесь получаем список всех процессов и их владельцев
                                          ; +и создаём новый на основе имени пользователя

_ArrayDisplay($aProcOwner, "List of processes owner by " & @UserName)

Func _ProcessOwnerList()
    Local $objWMIService, $colProcessList, $objProcess, $iUser, $aList[1][2]

    $objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & "." & "\root\cimv2")
    $colProcessList = $objWMIService.ExecQuery("Select * from Win32_Process")

    For $objProcess In $colProcessList
        $colProperties
= $objProcess.GetOwner($iUser)

        If $colProperties <> 0 Then ContinueLoop

        $aList[0][0] += 1
        ReDim $aList[$aList[0][0] + 1][2]
        $aList[$aList[0][0]][0] = $objProcess.Name
        $aList[$aList[0][0]][1] = $iUser
    Next

    If
UBound($aList) = 1 Then Return SetError(1, 0, 0)

    Return $aList
EndFunc

Func
_ProcessGetOwner($sUser)
    Local $aOwnerList = _ProcessOwnerList()
    If @error Then Return SetError(1, 0, 0)

    Local $aUserProc[1][2], $i

    For $i = 1 To $aOwnerList[0][0]
        If $aOwnerList[$i][1] = $sUser Then
            $aUserProc[0][0] += 1
            ReDim $aUserProc[$aUserProc[0][0] + 1][2]
            $aUserProc[$aUserProc[0][0]][0] = $aOwnerList[$i][0]
            $aUserProc[$aUserProc[0][0]][1] = $aOwnerList[$i][1]
        EndIf
    Next

    If
UBound($aUserProc) = 1 Then Return SetError(2, 0, 0)
    Return $aUserProc
EndFunc


ARBUZ 14-06-2008 10:09 825677

Люди!! кто разбирается в скриптах!! помогите сделать скрипт который автоматом будет создавать PPPoE соеденение!! плиз!! очень очень нуна!!!!

SyDr 14-06-2008 20:00 826100

Func DOWNKEY()
$D = $D + 1
Send("{DOWN DOWN}")
$D = $D - 1
if $D < 1 then Send("{DOWN UP}")
EndFunc

Как с помощью HotkeySet реализовать зажимание клавиши и отпускание клавиши?
То есть: я зажал на клавиатуре W - игра думает, что я зажал вверх. Отпустил - отпустил вверх.
1) Пока получается сделать только так, что игруха реагирует на это, как будто я постоянно клацаю вверх.

2) Подержал допустим секунд 10. Отпустил. AutoIt ещё какое-то время обрабатывает и отсылает нажатия.

SyDr 15-06-2008 09:29 826371

ARBUZ, тебе случаем не rasphone.exe нужно?
Запуск: rasphone.exe -d <Имя подключения>.
Только нужно, чтобы галочка Сохранять имя пользователя и пароль была отмечена (или вводить придётся).

Вот скрипт:

Run ("rasphone.exe -d <Имя подключения>")
WinWait("Подключение")
ControlSend("Подключение","<Кусок текста из окна>",1590,"{ENTER}")

Только лучше больше информации "впихивать". Т.е. не Подключение, а Подключение: GUEST


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

Run ("rasphone.exe")
WinWait("Сетевые подключения")
ControlClick("Сетевые подключения","",1459)
WinWaitActive("Мастер новых подключений")
ControlClick("Мастер новых подключений","",1491)
ControlClick("Мастер новых подключений","",12324)
ControlSend("Мастер новых подключений","",1114,"<Имя подключения>")
ControlClick("Мастер новых подключений","",12325)
WinWaitActive("Сетевые подключения")
ControlClick("Сетевые подключения","",1449)
WinWaitActive("Подключение: <Имя подключения>")
ControlSend("Подключение: <Имя подключения>","",1104,"<Имя пользователя>")
ControlSend("Подключение: <Имя подключения>","",1103,"<Пароль пользователя>")
ControlClick("Подключение: <Имя подключения>","",1101)
ControlClick("Подключение: <Имя подключения>","",1623)
ControlClick("Подключение: <Имя подключения>","",1590)


ARBUZ 15-06-2008 11:56 826426

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

SyDr 15-06-2008 12:23 826443

Run ("rasphone.exe")
WinWait("Сетевые подключения")
ControlClick("Сетевые подключения","",1459)
WinWaitActive("Мастер новых подключений")
ControlClick("Мастер новых подключений","",1491)
ControlClick("Мастер новых подключений","",12324)
ControlSend("Мастер новых подключений","",1114,"<Имя подключения>")
ControlClick("Мастер новых подключений","",12325)
WinWaitActive("Сетевые подключения")


ControlClick("Сетевые подключения","",1460) ;клик по свойствам
WinWaitActive("<Имя подключения> Свойства");ждём активности окна
ControlCommand ( "<Имя подключения> Свойства", "", 12320, "TABRIGHT","");перемещаемся на вкладку
ControlCommand ( "<Имя подключения> Свойства", "", 12320, "TABRIGHT","");безопасность

Далее всё, как обычно. ControlClick, ControlSend
Выбор из выпадающего списка - ControlCommand ( "<Имя подключения> Свойства", "", 12320, "SetCurrentSelection","<текст пункта выпадающего списка>");

Узнать ID отдельных элементов можно с помощью Au3Info.exe

Кстати, все настройки (кроме имени пользователя и пароля) хранятся в
C:\Documents and Settings\All Users\Application Data\Microsoft\Network\Connections\Pbk\rasphone.pbk

ARBUZ 15-06-2008 13:05 826468

слушай Sylver Dragon можешь мне в аську написать??? я вижу ты понимаешь у меня есть пару вопросиков. 6584016

Maksimkama 16-06-2008 06:41 826922

Первый раз запустил AutoIt запустил пример из папки examples и сразу возник вопрос есть скрипт notepad1.au3 почему он не хотел у меня набирать текст я понял, название окошка у меня на русском а там на английском. Но затем я немогу осуществить выход из блокнота, т.к. немогу послать !ф и ы для выхода. Помему то скрипт в этом случае русские буквы передаёт как ôû "ô" это ф и "û" это ы. Соответсвенно он их пишет в поле ввода текста, и всё. не пашет таким образом.

Maza Faka 16-06-2008 07:54 826933

Maksimkama
В шапке есть FAQ, в котором есть примеры переключения раскладки клавиатуры.

Maksimkama 16-06-2008 09:40 826994

Спасиб. не помогло. кодировка стоит 1251 всё верно, если в 866 кодировке то показывает äë а не ôû :-) блин что за фигня даж не пойму. Хотя по русски тоже не пишет. Перепробовал переключать раскладку. либо не догнал чего то. писать по русски он тоже не пишет.

Maza Faka 16-06-2008 11:12 827056

Maksimkama
Я писал не про кодировку, а про языковую раскладку:
Код:

Run("notepad.exe")

WinWait("[Class:Notepad]")

$hWnd = WinGetHandle("[Class:Notepad]")

_SetKeyboardLayout("00000419", $hWnd)

Send("Привет мир!")

Func _SetKeyboardLayout($sLayoutID, $hWnd)
    Local $WM_INPUTLANGCHANGEREQUEST = 0x50
    Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)
    DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $ret[0])
EndFunc

Код:


Дополнительные языки.

"00000407" Немецкий (стандартный)
"00000409" Английский (США)
"0000040C" Французский (стандартный)
"0000040D" Финский
"00000410" Итальянский
"00000415" Польский
"00000419" Русский
"00000422" Украинский
"00000423" Белорусский
"00000425" Эстонский
"00000426" Латвийский
"00000427" Литовский


tyrty_a 16-06-2008 13:07 827155

Стоит такая задача: отслеживать в реальном времени идет ли закачка файла через Download Master. Файл и адрес ссылки могут быть любые. Если в данный момент закачка не идет, то предпринять некий набор действий.

Как я представляю, необходимо использовать RawSocket. Кто-нибудь реализовывал подобное? Может у кого есть примеры работы с сокетами на AutoIt?

Maza Faka 16-06-2008 15:39 827287

tyrty_a
Самый простой способ это возвращать размер скачиваемого файла и если по истечении определённого времени размер не меняется,
Цитата:

то предпринять некий набор действий.

tyrty_a 16-06-2008 15:47 827295

Maza Faka,
Цитата:

Самый простой способ это возвращать размер скачиваемого файла
К сожалению, этот вариант не пройдет. Download Master создает временный файл, который по размеру совпадает с закачиваемым файлом. Его размер в процессе закачки не меняется. Это сделано для резервирования места на диске, чтобы в процессе закачки не кончилось место.

Maksimkama 17-06-2008 04:23 827780

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

Send("!ф")
Send("ы")

что по идее должно посылать ALT+Ф и Ы для выхода из блокнота. Что не так?

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

Maza Faka 17-06-2008 08:48 827835

Maksimkama
Цитата:

для выхода из блокнота
Не проще ли использовать функцию WinClose()? :)

Maksimkama 17-06-2008 12:26 828020

Maza Faka, ну я прост разбирал как работает скрипт, и выяснил что alt+русская буква почему то не работают :-(

HiGH_ZeRO 18-06-2008 00:53 828726

сделал через koda

Код:

#include <GUIConstants.au3>
 
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Управление нетом", 256, 71, 193, 125)
GUISetBkColor(0x000000)
$Button1 = GUICtrlCreateButton("Подключитися к нету", 0, 8, 131, 25, 0)
$Button2 = GUICtrlCreateButton(Отключитися", 0, 40, 131, 25, 0)
$Label1 = GUICtrlCreateLabel("HiGH_ZeRO", 136, 24, 117, 27)
GUICtrlSetFont(-1, 14, 400, 0, "Book Antiqua")
GUICtrlSetColor(-1, 0xFFFFFF)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
 
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
 
    EndSwitch
WEnd

теперь хочу назначить на $Button1
Код:

Run ('cmdow rasdial NET USER Pass','','')
а на $Button2
Код:

Run ('cmdow rasdial /d','','')
но незнаю как

Котяра 18-06-2008 01:02 828732

Цитата:

Цитата HiGH_ZeRO
Case $GUI_EVENT_CLOSE Exit »

заменить на
Код:

        Case $GUI_EVENT_CLOSE
                        Exit
                Case $Button1
                        Run("winver.exe")
                Case $Button2
                        Run("calc.exe")

Естественно, вместо winver.exe и calc.exe прописать нужные команды.

HORRIBLE 18-06-2008 17:08 829329

Подскажите.
Есть файл в нем есть английские буква их нужно преобразовать в русские. Тут был примерчик преобразовывающий русские в английские и обратно буквы, но у меня не получается сделать чтобы преобразование шло с английского на русский.

Maza Faka 19-06-2008 09:37 829796

HORRIBLE
Цитата:

Цитата HORRIBLE
английские буквы их нужно преобразовать в русские »

Не совсем понятна задача, нужно просто заменить латинскую букву на русскую в порядке отсчёта?
Код:

Global $aLetters_Latin[27]
$aLetters_Latin[0] = 26

Global $aLetters_Kiril[33]
$aLetters_Kiril[0] = 32

Dim $ResultString, $var = False

For
$i = 1 To $aLetters_Latin[0]
    $aLetters_Latin[$i] = Chr(64 + $i)
Next

For
$i = 1 To $aLetters_Kiril[0]
    $aLetters_Kiril[$i] = Chr(191 + $i)
Next

$Read = FileRead(@ScriptDir & "\test.txt")

$aLetters = StringSplit($Read, "")

For $i = 1 To $aLetters[0]
    $var = False
    For
$j = 1 To $aLetters_Latin[0]
        If $aLetters_Latin[$j] = $aLetters[$i] Then
            $var = True
            $ResultString &= $aLetters_Kiril[$j]
            ExitLoop
        EndIf
    Next
    If
$var = False Then $ResultString &= $aLetters[$i]
Next

ConsoleWrite("---> Result: " & $ResultString & @LF)

Пример текста test.txt
Код:


Hello world!

Буквы заменяются на заглавные.

alex888500 19-06-2008 11:33 829900

Привет!
Нужно обновлять программу на клиентах в сети, при этом обновляются все файлы+2 папки, количество файлов
изменяется, а папки нет.
Делал обновление при помощи батника:
PHP код:

@echo off
xcopy 192.168.1.241update 
"C:\Program Files\arena" /////

Но это довольно неудобно приходится копировать обновляемые файлы в отдельную папку update, потом оттуда
уже компьютеры забирают файлы, иначе скопируются ненужные папки. Сама прога находится здесь: C:\Program Files\Аrena
Команда XCOPY сравнивает файлы в папках и копирует только новые или измененные.
Какие будут идеи как это реализавать?

Maza Faka 19-06-2008 12:12 829932

alex888500
Создать массив с полными именами файлов и копировать каждый файл с помощью xcopy. А вообще для таких задач идеальна утилита robocopy.exe

HORRIBLE 19-06-2008 16:04 830166

Maza Faka,
За примерчик спасибо., но это немного не то.

Попробую по понятней объяснить , что требуется :
Имеется файл, в котором:
Код:

Ctujlyz xtndthu
Bla bla vyjuj ntrcnf

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

Creat0R 19-06-2008 16:50 830237

HORRIBLE,
Цитата:

Как заменить буквы, чтобы прочитать, чего там написано?
Я приводил пример подобного скрипта, вот тут.

xsample 19-06-2008 17:21 830269

А не поможет ли кто с процедурой определения цвета пиксела в заданном окне?

p.s. нечто подобное все таки нашел вот тут - http://forum.oszone.net/post-497838.html
но может у кого есть еще какой "более интересный" или "универсальный" алгоритм... например сравнение заданной области с эталоном.... а еще лучше, если есть алгоритм который может определять текст заданного цвета на изменяющемся фоне.

alex888500 20-06-2008 10:34 830870

Maza Faka
Цитата:

Создать массив с полными именами файлов и копировать каждый файл с помощью xcopy
В том и проблема что имена файлов постоянно меняются (добавляются новые)

DENoszone 21-06-2008 12:11 831701

хай..а тут могут сделать скрипт подбора паролей на сайт?
два файла 1 ники 2 пароли

Maza Faka 21-06-2008 13:31 831746

DENoszone
Извини, но по моему ты ошибся адресом. Здесь не Hack-зона.

Serge_Grey 24-06-2008 10:09 833415

Как прикрепить файл к сообщению, создаваемому функцией _INetSMTPMail?

amel27 25-06-2008 11:25 834432

Цитата:

Цитата Serge_Grey
Как прикрепить файл к сообщению, создаваемому функцией _INetSMTPMail? »

никак, на оффсайте есть альтернативное решение через COM:

Smtp Mailer That Supports Html And Attachments., Also Secure SMTP mail (GMail)

leprecon 25-06-2008 13:26 834577

Здрасте всем! У меня возник такой вопрос: Можно ли как нибудь определить с помощью Autoit подключен ли кто к твоему радмин серверу? И если подключен то скрипт должен заблокировать на время работы мышь и клавиатуру. Так как в самом радмине такой фишки нет, то хотелось бы эту фишку добавить при помощи скриптов, который бы наблюдал за сервером и блокировал мышь с клавом во время управления компьютером (не при просмотре, а именно при управлении)

Maza Faka 25-06-2008 14:13 834641

leprecon
Цитата:

заблокировать на время работы мышь и клавиатуру. Так как в самом радмине такой фишки нет
Дык вроде бы в 3-ей версии такую фишку включили.

leprecon 25-06-2008 14:36 834671

Цитата:

Цитата Maza Faka
Дык вроде бы в 3-ей версии такую фишку включили. »

У меня стоит сейчас последняя версия радмина (3.2) И там такой фишки нет. На оф. форуме радмина ихние эксперты говорили, что такую фишку можеть быть введут в течение года... :o И я думаю, что скрипт будет написать гораздо быстрей...

Maza Faka 25-06-2008 15:19 834717

Цитата:

Цитата leprecon
У меня стоит сейчас последняя версия радмина (3.2) И там такой фишки нет. На оф. форуме радмина ихние эксперты говорили, что такую фишку можеть быть введут в течение года »

Всё ещё обещают? Уже 3 года обещают :tongue:
Цитата:

Цитата leprecon
И я думаю, что скрипт будет написать гораздо быстрей... »

Ага, только вот как его написать? :) Может в радмине есть опция типа: "Выполнить при подключении к клиенту?"

leprecon 25-06-2008 16:36 834789

Цитата:

Цитата Maza Faka
Ага, только вот как его написать? Может в радмине есть опция типа: "Выполнить при подключении к клиенту? »

Нет нету такой опции.. Была б не спрашивал... А между 2 и появлением 3 версии прошло 5 лет при отсутствии каких либо существенных изменений...

А может можно при помощи autoit как нибудь фильтровать трафик на определеном порту? Хотя это вряд ли, что-то даст.

amel27 26-06-2008 11:16 835348

Цитата:

Цитата Maza Faka
Может в радмине есть опция типа: "Выполнить при подключении к клиенту?" »

еще варианты:

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

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

Maza Faka 26-06-2008 11:55 835370

Цитата:

Цитата amel27
- попробовать считать цвет иконки в трее »

Да, если иконка меняет свой цвет, то можно выполнить действие на основе этого поведения.

leprecon 26-06-2008 11:56 835372

Цитата:

Цитата amel27
- включить запись в системный журнал и ждать нужных событий »

Вот этот вариант можно попробывать. Но не факт что сервер записывает в журнал события мгновенно. Но это утверждение я сейчас проверю :)
Цитата:

Цитата amel27
- попробовать считать цвет иконки в трее »

Этот вариант не подойдет, так как иконка из трея убрана, во избежания умышленого отключения сервера. :cool: Да и по иконке не определишь тип подключения. Там можно увидеть только подключен ли кто к твоему компьютеру или нет.
Цитата:

Цитата amel27
- вообще не пытаться ничего определять, а блокировать асинхронно когда нужно »

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

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

И скажите пожалуйста как можно встроить Au3ToPost в SciTE? Я все делал как выше было описано (инстукции собирал по кускам, так как единой инструкции не нашел) и после запуска выскакивает ошибка:
Line -1:
Error:Unkown option or bad parametr specifed

amel27 27-06-2008 12:29 836241

Цитата:

Цитата leprecon
можно при помощи autoit как нибудь фильтровать трафик на определеном порту? »

думаю, можно узнать список установленных TCP-соединений (а-ля NETSTAT), но "тип подключения" таким образом не определить - это внутренние дела RAdmin'а.

Цитата:

Цитата leprecon
об этом способе поподробней можно? »

ничего особенного - нужно только определиться с "флагом", который будет служить скрипту командой на выполнение определенных действий - это может быть файл на какой-нибудь шаре, параметр реестра, etc. К примеру - создал файл с именем "BlockInput.txt" - консоль заблокировалась, удалил - разблокировалась... тут вариантов куча, вплоть до управления скриптом по сети... тут и до своего RAdmin'а на AutoIT недалеко :)

Цитата:

Цитата leprecon
так как скрипт будет постоянно висеть и проверять журнал на наличие нужных записей (предположительно каждую секунду), не будет ли это сильно загружать процесор? »

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

$objWMI = ObjGet("winmgmts:{(Security)}\\.\root\cimv2")
; Создаем фильтр событий, фиксируемых скриптом
$colEvents = $objWMI.ExecNotificationQuery("SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _
                    "TargetInstance ISA 'Win32_NTLogEvent' " & _    ; источник событий - журнал событий
                    "AND TargetInstance.Logfile='Application' " & _  ; только журнал приложений
                    "AND TargetInstance.SourceName='r_server'")      ; только Remote Administrator
While 1
    $objEvent = $colEvents.NextEvent ; Ожидание события
    $sText = ""
    For $s in $objEvent.TargetInstance.InsertionStrings
        $sText &= $s ; Текст события
    Next
    Switch $objEvent.TargetInstance.EventIdentifier
        Case 15 ; Код обработки события отключения
            Consolewrite( "Text:      " & $sText & @CR )
        Case 17 ; Код обработки события подключения
            Consolewrite( "Text:      " & $sText & @CR )
    EndSwitch
Wend


tyrty_a 27-06-2008 12:54 836265

Цитата:

Цитата amel27
думаю, можно узнать список установленных TCP-соединений (а-ля NETSTAT), »

Расскажи по-подробнее пожалуйста, как это можно сделать?

leprecon 27-06-2008 15:41 836400

Цитата:

Цитата amel27
вплоть до управления скриптом по сети... »

А я почему то думал, что на Autoit нельзя создать что-то типа клиент-сервер :unsure:

leprecon 27-06-2008 17:47 836547

Выкладываю немного адаптированый под 3-ю версию радмина скрипт от Amel27(из-за кривых рук не смог нормально заставить работать Au3toPost :( , поэтому выкладываю нераскрашеный код):
Цитата:

Цитата КОД
$objWMI = ObjGet("winmgmts:{(Security)}\\.\root\cimv2")
; Создаем фильтр событий, фиксируемых скриптом
$colEvents = $objWMI.ExecNotificationQuery("SELECT * FROM __InstanceCreationEvent WITHIN 5 WHERE " & _
"TargetInstance ISA 'Win32_NTLogEvent' " & _ ; источник событий - журнал событий
"AND TargetInstance.Logfile='Application' " & _ ; только журнал приложений
"AND TargetInstance.SourceName='RServer3'") ; только Remote Administrator
While 1
$objEvent = $colEvents.NextEvent ; Ожидание события
$sText = ""
For $s in $objEvent.TargetInstance.InsertionStrings
$sText &= $s ; Текст события
Next
Switch $objEvent.TargetInstance.EventIdentifier
Case 1001 ; Код обработки события отключения
Consolewrite( "Text: " & $sText & @CR )
BlockInput( 1 )
Case 2000 ; Код обработки события подключения
Consolewrite( "Text: " & $sText & @CR )
BlockInput(0)
EndSwitch
Wend

Но у этого скрипта есть недостаток, для меня не сильно принципиальный но все же недостаток: Не работает клавиатура, ни удаленная, ни локальная, хотя мышь (локальная) работает нормально.
Так же на удаленной клавиатуре можно разблокировать клавиатуру нажатием CTRL-ALT-DEL . Да, я знаю, что это опция Windows API. Но все же я видел программу(тоже связаную с удаленным администратированием), которая блокировала клавиатуру полностью и CTRL-ALT-DEL тоже не срабатывала.

amel27 28-06-2008 12:36 837073

Цитата:

Цитата tyrty_a
Расскажи по-подробнее пожалуйста, как это можно сделать? »

оказалось, на оффсайте есть готовое решение (вопросы можно сюда) :
Netstat in AutoIt - GetTcpTable (iphlpapi.dll), Sometimes crashes and sometimes works, why?

Цитата:

Цитата leprecon
А я почему то думал, что на Autoit нельзя создать что-то типа клиент-сервер »

на оффсайте достаточно инфы и примеров: http://www.google.com/search?as_q=se...s=&safe=images

amel27 30-06-2008 12:25 838357

Цитата:

Цитата leprecon
все же я видел программу(тоже связаную с удаленным администратированием), которая блокировала клавиатуру полностью и CTRL-ALT-DEL тоже не срабатывала »

ТУТ есть интересная DLL-ка (с исходниками и демкой), которая кроме прочего имеет ф-цию включения/отключения <Ctrl+Alt+Del> пример:
Код:

$hDll = DllOpen("WinLockDll.dll")
$aRet = DllCall ($hDll, "int", "CtrlAltDel_Enable_Disable", "int", "0")
MsgBox(48,"Message","Ctrl+Alt+Del Disabled," &@CRLF& "Press any key for enable")
$aRet = DllCall ($hDll, "int", "CtrlAltDel_Enable_Disable", "int", "1")


Maza Faka 30-06-2008 14:09 838431

Цитата:

Цитата amel27
интересная DLL-ка (с исходниками и демкой) »

Вот спасибо! Отличная dll-ка :up:

Creat0R 30-06-2008 16:53 838575

amel27,
Цитата:

Цитата amel27
кроме прочего имеет ф-цию включения/отключения <Ctrl+Alt+Del> »

А вот можно таже отслеживать нажатия этих клавиш? т.е нужен метод определяющий были ли вызваны сочетания клавиш «Ctrl+Alt+Del».

Maza Faka 30-06-2008 19:10 838685

Цитата:

Цитата Creat0R
А вот можно таже отслеживать нажатия этих клавиш? »

Так сойдёт?
Код:

Global Const $VK_CTRL = 0x11
Global Const $VK_ALT  = 0x12
Global Const $VK_DEL  = 0x2E

HotKeySet("{ESC}", "_Exit")

$hDll = DllOpen(@ScriptDir & "\WinLockDll.dll")
$aRet = DllCall ($hDll, "int", "CtrlAltDel_Enable_Disable", "int", "0")

While 1
    $aCtrlRet = DllCall("user32", "ushort", "GetKeyState", "int", $VK_CTRL)
    $aCtrlAlt = DllCall("user32", "ushort", "GetKeyState", "int", $VK_ALT)
    $aCtrlDel = DllCall("user32", "ushort", "GetKeyState", "int", $VK_DEL)

    If ($aCtrlRet[0] > 1) And ($aCtrlAlt[0] > 1) And ($aCtrlDel[0] > 1) Then MsgBox(262144, "Catch", "Ctrl - Alt - Del is pressed")
    Sleep(1)
WEnd

Func
_Exit()
    Local $aRet = DllCall ($hDll, "int", "CtrlAltDel_Enable_Disable", "int", "1")
    DllClose($hDll)
    Exit
EndFunc


Creat0R 30-06-2008 19:45 838703

Maza Faka,
Цитата:

Цитата Maza Faka
Так сойдёт? »

Ещё как сойдёт! (мне в принципе нужна только часть в цикле).
Я давно хотел узнать как отслеживать это сочетание, мне это нужно для моей утилитки KeyBoard and Mouse Cleaner, до сих пор приходилось проверять различия в позициях курсора мышки (до, и после BlockInput()), если есть различия, значит юзер нажал «Ctrl + Alt + Del», т.к по другому выйти с режима блокировки вроде нельзя :).

Спасибо.

amel27 01-07-2008 05:13 838981

Creat0R, Maza Faka

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

Creat0R 01-07-2008 05:43 838985

amel27,
Цитата:

Цитата amel27
если параметр передавать в функцию без кавычек, то блокировка не снимается... почему? »

Возможно на стороне функции параметр преобразуется обратно в String? :dont-know
Хотя всё ровно не логично... но также и не удевительно (для меня), я уже сталкивался с багами подобного характера (в более простых приминениях, сейчас точно не вспомню где конкретно).

Как я понял всё же есть вариант на чистом AutoIt'е? проблема только в передаче параметра без кавычек? Пусть будут кавычки :)

amel27 01-07-2008 07:16 838998

Creat0R
Цитата:

Возможно на стороне функции параметр преобразуется обратно в String? »
нет, точно не преобразуется - в исходнике видно что там тип BOOL, который основан на том же INT
Цитата:

я уже сталкивался с багами подобного характера »
самое забавное, что на AutoHotKey тот же эффект, сказываются общие корни? =)
Цитата:

Как я понял всё же есть вариант на чистом AutoIt'е? »
нет, я просто просмотрел исходник на Си и комменты автора - в принципе если задача обойтись без DLL, то ничего невозможного нет... хотя "чистым AutoIT" это уже назвать не выйдет - придется собирать кусок ASM-кода (как это делал Piccaso в CallBack) и инжектировать в процесс Winlogon. Кстати, возможны проблемы с некоторыми файерволами... к примеру, Outpost блокирует подобное поведение
Цитата:

проблема только в передаче параметра без кавычек? »
просто зацепило :)

leprecon 01-07-2008 19:59 839609

Цитата:

Цитата amel27
на оффсайте достаточно инфы и примеров »

Ну для меня Оффсайт дремучий лес, так как я в английском полный ноль :(

Maza Faka 03-07-2008 12:20 841233

amel27,
Нужна твоя помощь :) Необходимо получить список компьютеров локальной сети, в принципе решение есть (твой скрипт для Nicklock-a), но из "спортивного" интереса хотелось бы получить список с помощью нижеуказанных функций:
Код:

Global Const $RESOURCE_CONTEXT  = 0x5
Global Const $RESOURCETYPE_DISK  = 0x1

Global Const $NO_ERROR              = 0
Global Const $ERROR_NO_MORE_ITEMS  = 259
Global Const $ERROR_INVALID_ADDRESS = 487

$lpBuffer = DllStructCreate("dword[16384]")
$pBuffer = DllStructCreate("hwnd")

$aRet = DllCall("mpr.dll", "dword", "WNetOpenEnum", "dword", $RESOURCE_CONTEXT, "dword", $RESOURCETYPE_DISK, "dword", 0, "ptr", 0, _
                "ptr", DllStructGetPtr($pBuffer))

If $aRet[0] <> $NO_ERROR Then
    MsgBox(16, "Error", "Dll call error")
    Exit
EndIf


$hWnd = DllStructGetData($pBuffer, 1)

$aRet = DllCall("mpr.dll", "int", "WNetEnumResource", "hwnd", $hWnd, "dword", -1, _
                "ptr", DllStructGetPtr($lpBuffer), "dword", DllStructGetSize($lpBuffer))

ConsoleWrite("!> Ret: " & $aRet[0] & @LF)

DllCall("mpr.dll", "int", "WNetCloseEnum", "hwnd", $hWnd)

Ссылки:
WNetOpenEnum
WNetEnumResource

amel27 04-07-2008 13:29 842152

Maza Faka
примерно так, но функция сама не ищет во вложенных контейнерах,
в твоем случае она возвратит только объект "Вся сеть" ;)
Код:

Global Const $NO_ERROR            = 0
Global Const $ERROR_NO_MORE_ITEMS = 259
Global Const $ERROR_MORE_DATA    = 234
Global Const $MAX_RESOURCES      = 256
Global Const $NOT_A_CONTAINER    = -1

Global Const $RESOURCETYPE_ANY    = 0
Global Const $RESOURCETYPE_DISK  = 1
Global Const $RESOURCETYPE_PRINT  = 2

Global Const $RESOURCE_CONNECTED  = 1
Global Const $RESOURCE_GLOBALNET  = 2
Global Const $RESOURCE_REMEMBERED = 3
Global Const $RESOURCE_CONTEXT    = 5

Func _WNet_EnumResource($iType = $RESOURCETYPE_ANY, $iScope = $RESOURCE_CONTEXT)
    Local $tBuf = DllStructCreate("hwnd"), $pBuf = DllStructGetPtr($tBuf)
    Local $aRet = DllCall("mpr.dll", "int", "WNetOpenEnum", "int", $iScope, "int", $iType, "int", 0, "ptr", 0, "ptr", $pBuf)
    If $aRet[0] Then Return SetError(2, $aRet[0])

    Local $hEnum  = DllStructGetData($tBuf,1)
    Local $tCount = DllStructCreate("int"), $pCount = DllStructGetPtr($tCount)
    Local $tBSize = DllStructCreate("int"), $pBSize = DllStructGetPtr($tBSize)

    DllStructSetData($tCount, 1, -1)
    $aRet = DllCall("mpr.dll", "int", "WNetEnumResource", "hwnd", $hEnum, "ptr", $pCount, "ptr", $pBuf, "ptr", $pBSize)

    If $aRet[0]=0 Then
        DllCall("mpr.dll", "int", "WNetCloseEnum", "hwnd", $hEnum)
        Return SetError(1, 0)
    ElseIf $aRet[0]<>$ERROR_MORE_DATA Then
        DllCall("mpr.dll", "int", "WNetCloseEnum", "hwnd", $hEnum)
        Return SetError(3, $aRet[0])
    EndIf

    DllStructSetData($tCount, 1, -1)
    $tBuf = DllStructCreate("byte["& DllStructGetData($tBSize,1) &"]")
    $pBuf = DllStructGetPtr($tBuf)
    $aRet = DllCall("mpr.dll", "int", "WNetEnumResource", "hwnd", $hEnum, "ptr", $pCount, "ptr", $pBuf, "ptr", $pBSize)
    If $aRet[0] Then
        DllCall("mpr.dll", "int", "WNetCloseEnum", "hwnd", $hEnum)
        Return SetError(4, $aRet[0])
    EndIf
    DllCall("mpr.dll", "int", "WNetCloseEnum", "hwnd", $hEnum)
    Return SetError(0, DllStructGetData($tCount,1), $tBuf)
EndFunc


Maza Faka 04-07-2008 15:38 842276

amel27
Спасибо за пример. А поиск во вложенных контейнерах сложная задача?

Mogidin 04-07-2008 15:56 842300

Информация к размышлению. Сам только что случайно увидел.
При копировании файла с одного диска на другой время последнего изменения у нового файла увеличивается на 1 секунду. Это происходит и при копировании в эксплорере, и в автоите функцией FileCopy. Можно этого как-нибудь избежать (кроме варианта с FileSetTime, менять время у кучи файлов непонтово)?

Maza Faka 04-07-2008 17:04 842363

Mogidin
Вроде бы уже обсуждали такую проблему, поищи в версии для печати.

Алексей Н. 04-07-2008 19:09 842466

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

Вот код скрипта


Код:

GuiCreate("Переименование учетной записи администратора", 300, 100)
$name=GUICtrlCreateInput("",25,30)
GuiCtrlCreateLabel("Введите имя Вашей учетной записи", 5, 1, 300, 10)
$rename=GuiCtrlCreateButton("Переименовать", 10, 60, 100, 30)
$chanel=GuiCtrlCreateButton("Отменить", 190, 60, 100, 30)
$progressbar = GUICtrlCreateProgress (10,10,200,20)

; GUI MESSAGE LOOP

GuiSetState()

    For $i = 1 To 100
    GUICtrlSetData ($progressbar,(100 - $i))
    Sleep(30)
    Next
    ProcessClose("Rename_User.exe")

While 1       
    $msg = GUIGetMsg()

Select
      Case $msg = $rename
              FileCopy("RENUSER.EXE",@SystemDir)
              Sleep (1000)
              Run("RENUSER.EXE Администратор " & GUICtrlRead($name))
              Sleep (1000)
              FileDelete(@SystemDir & "\RENUSER.EXE")
          ExitLoop
      Case $msg = $GUI_EVENT_CLOSE
          ExitLoop
      Case $msg = $chanel
    ExitLoop
 EndSelect
WEnd

После завершения прогрессбара скрипт закрывается как и нужно. Но проблема в том, что он в это время не обрабатывает сообщения. Можно как-то сделать, чтобы он и сообщения обрабатывал и закрывался самостоятельно?

Creat0R 04-07-2008 20:07 842514

Понадобилась снова помощь по регулярным выражениям...

Имеем исходный код страницы (это только часть, оно повторяется по той же структуре далее):

Src.txt - Нажмите для показа
Код:

<div class="vldescbox">
                               
                                <div  class="vltitle">
                                        <div class="vlshortTitle">
                                                <a href="/watch?v=UiPhfbZsS54"  title="WTTC 2008 table tennis best points.... enjoy">WTTC <b>2008 table tennis</b> best points.... enjoy</a>
                                        </div>
                                        <div class="vllongTitle">
                                                <a href="/watch?v=UiPhfbZsS54"  title="WTTC 2008 table tennis best points.... enjoy">WTTC <b>2008 table tennis</b> best points.... enjoy</a>
                                        </div>
                                </div>

                                                                       
                                <div  class="vldesc">
                                        the WTTC <b>2008 table tennis</b> best points.... enjoy <b>...</b> WTTC <b>2008 table tennis</b> best points extreme ma lin <b>...</b>
                                </div>
                        </div>

                        <div class="vlclearaltl"></div>



                </div>

                <div class="vlfacets">
                        <div class="vladded">
                                        <span class="grayText">Added:</span> 3 months ago<br/>


                        </div>
                                <div><span class="grayText vlfromlbl">From:</span><span class="vlfrom"><a href="/user/kioka2" >kioka2</a></span></div>
                                <div class="clearL"></div>

                        <span class="grayText">Views:</span> 59,747<br/>



                        <div class="video-thumb-duration-rating">
                                                               

        <div>

        <img class="ratingVS ratingVS-5.0" alt="4.9" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" />



        </div>





                                <div class="runtime">07:26</div>
                        </div>

                                                                <div class="clear"></div>
                                <div class="vlcategory">
                                        <span class="smgrayText">More in</span> <a href="/results?search_category=17&amp;search_query=table%20tennis%202008" >Sports</a>
                                </div>

                </div>

                <div class="vlclearaltl"></div>



        </div> <!-- end vEntry -->


                </div>
                <div class="vlclear"></div>




                       

                <div class="vlcell" style="width:24.9%">
                       


       

       

        <div class="vlentry" >




                <div class="vlcontainer"><div class="v120WideEntry"><div class="v120WrapperOuter"><div class="v120WrapperInner"><a href="/watch?v=EcIsmXhduVc" ><img src="http://i.ytimg.com/vi/EcIsmXhduVc/default.jpg" class="vimg120" title="Highlights of the 2008 Asian Olympic Table Tennis Quali" alt="video"></a><div class="addtoQL90"><a href="#"  ql="EcIsmXhduVc" title="Add Video to QuickList"><img class="QLIconImg" src="http://s.ytimg.com/yt/img/pixel-vfl73.gif" border="0"
        onclick="clicked_add_icon(this, this.parentNode.getAttribute('ql'), 0);_hbLink('QuickList+AddTo','na');return false;"
        onmouseover="mouseOverQuickAdd(this, this.parentNode.getAttribute('ql'))"
        onmouseout="mouseOutQuickAdd(this, this.parentNode.getAttribute('ql'))"></a><div class="hid quicklist-inlist">in <a href="/watch_queue?all">QuickList</a></div></div>

</div></div>
                        </div>


                        <div class="vldescbox">
                               
                                <div  class="vltitle">
                                        <div class="vlshortTitle">
                                                <a href="/watch?v=EcIsmXhduVc"  title="Highlights of the 2008 Asian Olympic Table Tennis Quali">Highlights of the <b>2008</b> Asian Olympic <b>Table Tennis</b> Quali</a>
                                        </div>
                                        <div class="vllongTitle">
                                                <a href="/watch?v=EcIsmXhduVc"  title="Highlights of the 2008 Asian Olympic Table Tennis Quali">Highlights of the <b>2008</b> Asian Olympic <b>Table Tennis</b> Quali</a>
                                        </div>
                                </div>

                                                                       
                                <div  class="vldesc">
                                                                <span  id="BeginvidDescEcIsmXhduVc">
        highlights of the <b>2008</b> Asian Olympic <b>Table Tennis</b> Qualification. You will enjoy it! It concludes Wang Nan and Wang Liqin <b>...</b>
        </span>

                        <span  id="RemainvidDescEcIsmXhduVc" style="display: none">In this video you can see the highlights of the 2008 Asian Olympic Table Tennis Qualification. You will enjoy it! It concludes Wang Nan and Wang Liqin.</span>
                        <span id="MorevidDescEcIsmXhduVc" class="smallText">(<a href="#" class="eLink" onclick="showDiv('RemainvidDescEcIsmXhduVc'); hideDiv('MorevidDescEcIsmXhduVc'); hideDiv('BeginvidDescEcIsmXhduVc'); showDiv('LessvidDescEcIsmXhduVc'); return false;">more</a>)</span>
                        <span id="LessvidDescEcIsmXhduVc" style="display: none" class="smallText">(<a href="#" class="eLink" onclick="hideDiv('RemainvidDescEcIsmXhduVc'); hideDiv('LessvidDescEcIsmXhduVc'); showDiv('BeginvidDescEcIsmXhduVc'); showDiv('MorevidDescEcIsmXhduVc'); return false;">less</a>)</span>
       

                                </div>
                        </div>



Нужно получить значения в массив либо между <div class="vldesc"> и </div>, либо между <div class="vldesc"><span id="BeginvidDesc.*?"> и </span>.

Оно может встречаться и так и так, нужно получить текст описании роликов (это с YouTube исходник).

Вот что должно быть на выходе:

Код:

$avArray[0] = "WTTC <b>2008 table tennis</b> best points.... enjoy <b>...</b> WTTC <b>2008 table tennis</b> best points extreme ma lin <b>...</b>"
$avArray[1] = "highlights of the <b>2008</b> Asian Olympic <b>Table Tennis</b> Qualification. You will enjoy it! It concludes Wang Nan and Wang Liqin <b>...</b>"

У меня получилось сделать только так:

Код:

#include <Array.au3>

$sSource = FileRead("Src.txt")

$avArray = StringRegExp($sSource, '(?i)(?s)<div  class="vldesc">.*?[(<span  id="BeginvidDesc.*?">|)](.*?)</span>', 3)

_ArrayDisplay($avArray)

Как видно, добавляется в начало span id="BeginvidDesc....">, а иногда и в конце тоже добавляются теги. Реально ли одно-разовым вызовом StringRegExp (и без дополнительных циклов) получить то что нужно?


Алексей Н.,
Цитата:

Цитата Алексей Н.
Есть ли возможность принудительно завершить скрипт через какое-то время, если не были приняты никакие действия? »

См. функцию _Timer_SetTimer() в справке.

amel27 05-07-2008 09:42 842807

Creat0R
Цитата:

Как видно, добавляется в начало span id="BeginvidDesc....">, а иногда и в конце тоже добавляются теги. Реально ли одно-разовым вызовом StringRegExp (и без дополнительных циклов) получить то что нужно? »
опять не понял смысл квадратных скобок в твоем выражении, попробуй так:
Код:

$sSource = FileRead("test.txt")
$avArray = StringRegExp($sSource, '(?i)(?s)<div  class="vldesc">\s*(?:<span  id="BeginvidDesc[^">]*">)?\s*(.*?)\s*(?:</span>|</div>)', 3)

For $i=0 To UBound($avArray)-1
    ConsoleWrite($avArray[$i]&@CRLF)
Next

Maza Faka
Цитата:

А поиск во вложенных контейнерах сложная задача? »
думаю нужно что-то типа рекурсии, на MSDN есть подробная инструкция с примером: Determining Available Network Resources. Статья для Windows Mobile, но общий алгоритм одинаков.

Creat0R 05-07-2008 15:40 843021

amel27,
Цитата:

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

Цитата:

попробуй так:
Спасибо огромное! Вроде всё отлично отрабатывает, но хотелось бы понять как?! :unsure: Почему то, что в первых круглых скобках не попадает в результат (в строки массива)? И что означает «:?» ?

Ответ на последеий мой вопрос предоставляет объяснение и на первый вопрос :)

Цитата:

(?: ... ) - Non-capturing group. Behaves just like a normal group, but does not record the matching characters in the array nor can the matched text be used for back-referencing.
И как я это мог упустить в справке...

266903582 06-07-2008 16:19 843890

В windowinfo есть инструмент finder tool: наводим его на объект и получаем информацию о нем. Хочу написать что-то подобное для получения только некоторой необходимой информации и сбрасывать ее в файл, осталось только разобраться как получать инфо об объекте под курсором...

beve 06-07-2008 19:31 844017

Привет всем. У меня вопрос по autoit. Вопрос вроде легкий, а решить уже 2 дня не могу. И в связи что легкий нигде нет ответа, а по совету из справки у меня получается каламбур. Подскажите знающие. Мне нужен скрипт, который бы проверял дату на компе с моей введенной (например 08/08/2008) и если совпадает, то запуск "моей программы", а если нет то выход. Спасибо. :help

Creat0R 06-07-2008 19:37 844021

266903582,
Цитата:

Цитата 266903582
как получать инфо об объекте под курсором... »

Продвинуты пример (сам делал :) ):

Код:

#include <GuiConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <Misc.au3>
;

Opt("GuiOnEventMode", 1)

HotKeySet("{ESC}", "QuitApp")

Global $hSquare_GUI = -1
Global $hCtrl = -1
Global $Last_hControl = -1

Global $Frame_Color = 0xFF0000
Global $Frame_Width = 3

$Main_GUI = GUICreate("Highlight Controls Demo")
WinSetOnTop($Main_GUI, "", 1)

GUISetOnEvent($GUI_EVENT_CLOSE, "QuitApp")
GUIRegisterMsg($WM_WINDOWPOSCHANGED, "WM_WINDOWPOSCHANGED")

GUICtrlCreateButton("Button", 20, 20)
GUICtrlCreateCheckbox("CheckBox", 20, 60)

GUICtrlCreateLabel("Info: ", 20, 150)
GUICtrlSetFont(-1, 9, 800)

$Info_Edit = GUICtrlCreateEdit("", 80, 150, 300, 220, $GUI_SS_DEFAULT_EDIT + $ES_READONLY)

GUISetState()

While 1
    Sleep(10) ;So the CPU will not increes "badly" while we play with the mouse cursor :)
    _IdleWait()

    If _IsPressed(1) Then
        GUIDeleteSquare($hSquare_GUI)

        While _IsPressed(1)
            Sleep(10)
            Check_Highlight_Controls_Proc()
        WEnd

        $Last_hControl = -1
    EndIf

    Check_Highlight_Controls_Proc()
WEnd

Func
Check_Highlight_Controls_Proc()
    Local $hCtrl = _ControlGetHovered()

    If $hCtrl <> 0 And $Last_hControl <> $hCtrl And $hSquare_GUI <> $hCtrl Then
        $Last_hControl = $hCtrl
        Local $aCtrlPos = WinGetPos($hCtrl)

        GUICtrlSetData($Info_Edit, _
                "X = " & $aCtrlPos[0] & @CRLF & _
                "Y = " & $aCtrlPos[1] & @CRLF & _
                "W = " & $aCtrlPos[2] & @CRLF & _
                "H = " & $aCtrlPos[3] & @CRLF & @CRLF & _
                "Control/Win Class Name: " & _WinGetClassNameNN($hCtrl) & @CRLF & _
                "Control/Win Handle: " & $hCtrl & @CRLF & _
                "Control ID: " & _HwndToID($hCtrl) & @CRLF & @CRLF & _
                "Control Data:" & @CRLF & ControlGetText($hCtrl, "", ""))

        GUIDeleteSquare($hSquare_GUI)
        $hSquare_GUI = GUICreateSquare($aCtrlPos[0], $aCtrlPos[1], $aCtrlPos[2], $aCtrlPos[3])
    EndIf
EndFunc

Func
GUICreateSquare($i_X = -1, $i_Y = -1, $i_W = -1, $i_H = -1)
    Local $hSquare_GUI = GUICreate("", $i_W, $i_H, $i_X, $i_Y, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST)
    GUISetBkColor($Frame_Color)

    _GUISetHole($hSquare_GUI, $Frame_Width, $Frame_Width, $i_W - ($Frame_Width * 2), $i_H - ($Frame_Width * 2))

    GUISetState(@SW_SHOWNOACTIVATE, $hSquare_GUI)

    Return $hSquare_GUI
EndFunc

Func
GUIDeleteSquare($hSquare_GUI)
    If IsHWnd($hSquare_GUI) And $hSquare_GUI <> $Main_GUI Then GUIDelete($hSquare_GUI)
EndFunc

Func
_ControlGetHovered()
    Local $aRet = DllCall("user32.dll", "int", "WindowFromPoint", "long", MouseGetPos(0), "long", MouseGetPos(1))

    If @error Or Not IsArray($aRet) Then Return SetError(1, 0, 0)
    Return HWnd($aRet[0])
EndFunc

Func
_HwndToID($hWnd)
    If Not IsHWnd($hWnd) Then Return SetError(1, 0, "")

    Local $aRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hWnd)
    If Not IsArray($aRet) Then Return SetError(2, 0, "")

    Return $aRet[0]
EndFunc

Func
_WinGetClassName($hWnd)
    $aClassName = DllCall("user32.dll", "int", "GetClassName", "hWnd", $hWnd, "str", "", "int", 64)
    If Not @error And $aClassName[0] <> 0 Then Return $aClassName[2]
    Return ""
EndFunc

Func
_WinGetClassNameNN($hCtrlWnd)
    $hParent = _WinAPI_GetAncestor($hCtrlWnd, $GA_ROOTOWNER)
    $hCtrlWnd = ControlGetHandle($hParent, "", $hCtrlWnd)
    $sClassList = StringSplit(StringStripCR(_WinGetNumeratedClassList($hParent)), @LF)

    For $i = $sClassList[0] To 1 Step -1
        If $sClassList[$i] = "" Then ContinueLoop

        If
ControlGetHandle($hParent, "", $sClassList[$i]) = $hCtrlWnd Then Return $sClassList[$i]
    Next

    Return
_WinGetClassName($hCtrlWnd)
EndFunc

Func
_WinGetNumeratedClassList($sTitle, $sText = "")
    Local $sClassList = WinGetClassList($sTitle, $sText)
    Local $aClassList = StringSplit($sClassList, @CRLF)
    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] & @CRLF
        Else
            $aClassList[$i] &= "~1"
            $sHold_List &= $aClassList[$i] & "|"
            $sRetClassList &= $aClassList[$i] & @CRLF
        EndIf
    Next

    Return
StringReplace(StringStripWS($sRetClassList, 3), "~", "")
EndFunc

Func
_GUISetHole($hWin, $i_X, $i_Y, $i_SizeW, $i_SizeH)
    Local $aWinPos, $Outer_Rgn, $Inner_Rgn, $Wh, $Combined_Rgn
    Local Const $RGN_DIFF = 4
    $aWinPos = WinGetPos($hWin)

    $Outer_Rgn = DllCall("gdi32.dll", "long", "CreateRectRgn", "long", 0, "long", 0, "long", $aWinPos[2], "long", $aWinPos[3])
    $Inner_Rgn = DllCall("gdi32.dll", "long", "CreateRectRgn", "long", $i_Y, "long", $i_Y, "long", $i_Y + $i_SizeW, _
            "long", $i_Y + $i_SizeH)
    $Combined_Rgn = DllCall("gdi32.dll", "long", "CreateRectRgn", "long", 0, "long", 0, "long", 0, "long", 0)
    DllCall("gdi32.dll", "long", "CombineRgn", "long", $Combined_Rgn[0], "long", $Outer_Rgn[0], "long", $Inner_Rgn[0], _
            "int", $RGN_DIFF)
    DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $hWin, "long", $Combined_Rgn[0], "int", 1)
EndFunc

Func
_IdleWait($IdleSec = 0)
    Local $iSave, $stLastInput = DllStructCreate("uint;dword")
    DllStructSetData($stLastInput, 1, DllStructGetSize($stLastInput))
    DllCall("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr($stLastInput))

    Do
        $iSave = DllStructGetData($stLastInput, 2)
        Sleep(20)
        DllCall("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr($stLastInput))
    Until (DllStructGetData($stLastInput, 2) - $iSave) > $IdleSec

    Return DllStructGetData($stLastInput, 2) - $iSave
EndFunc

Func
WM_WINDOWPOSCHANGED($hWndGUI, $MsgID, $WParam, $LParam)
    If $hWndGUI <> $Main_GUI Then Return $GUI_RUNDEFMSG
    GUIDeleteSquare($hSquare_GUI)
    Check_Highlight_Controls_Proc()
    $Last_hControl = -1
EndFunc

Func
QuitApp()
    Exit
EndFunc

beve,
Цитата:

Цитата beve
Мне нужен скрипт, который бы проверял дату на компе с моей введенной (например 08/08/2008) и если совпадает, то запуск "моей программы", а если нет то выход. »

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

Код:

$sSystemDate = @MDAY & "/" & @MON & "/" & @YEAR

If $sSystemDate = "08/08/2008" Then
    Run("Моя программа.exe")
Else
    Exit
EndIf

:)

beve 06-07-2008 20:00 844032

Спасибо, Creat0R за ответ. Мой вопрос решен.

266903582 06-07-2008 23:28 844200

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

#include <Misc.au3>
FileDelete("file.txt")
$dll = DllOpen("user32.dll")
$file = FileOpen("file.txt", 1)
$ffi=""
While 1
        if _IsPressed("11", $dll) Then                                                        ;ctrl        ctrltext & classn
                wr(ControlGetText("","",ControlGetFocus(""))&@lf&ControlGetFocus(""))
        EndIf
        if _IsPressed("12", $dll) Then                                                        ;alt                title & alltext
                wr(WinGetTitle("")&@lf&"-------"&@lf&WinGetText(""))
        EndIf                                                       
        if _IsPressed("1b", $dll) Then Exit                                                ;esc
        sleep(50)
WEnd       
DllClose($dll)
FileClose($file)

Func wr($ff)
        if $ffi<>$ff then  ;исключаем попадание многократных копий захваченного текста в файл
                FileWrite($file,$ff&@LF&"-------"&@lf)  ;пишем форматированный текст
                $ffi=$ff
                ToolTip($ffi)
        EndIf
EndFunc


amel27 08-07-2008 15:01 845793

Maza Faka
Цитата:

поиск во вложенных контейнерах сложная задача?
как оказалось можно без рекурсии - нужно только правильно заполнить структуру стартового контейнера
Цитата:

Спасибо за пример »
будешь удивлен, но в штатных функциях AutoIT уже есть API-врапперы: :biggrin:

_WinNet_OpenEnum()
_WinNet_CloseEnum()
_WinNet_EnumResource()


но мне они показались неудобными в применении, посуди сам:

- значения флагов не совпадают со значениями системных констант;
- нет функций по обработке структур NETRESOURCE;
- излишняя (ИМХО) перегруженность функций параметрами ByRef

поэтому, поскольку уже зацепился на днях выложу свой вариант UDF

ALL
может кто еще выскажется по функциям из группы _WinNet_* ?

Maza Faka 08-07-2008 16:54 845897

amel27
Цитата:

будешь удивлен, но в штатных функциях AutoIT уже есть API-врапперы
Ну надо же! :)

Цитата:

поэтому, поскольку уже зацепился на днях выложу свой вариант UDF
ОК! Ждёмс... ;)

NikLok 08-07-2008 17:45 845943

Тут у меня спросили скрипт определения пути, куда установилась программа. У кого нибудь уже есть решение?!

Creat0R 08-07-2008 20:26 846119

NikLok,
Цитата:

Цитата NikLok
скрипт определения пути, куда установилась программа »

Смотря какая программа, вопрос довольно смутный, подробнее можно?

beve 08-07-2008 22:48 846254

Вот такой вопрос: хочу вставить условие в условие, примерно вот так:
if (MsgBox(4100, "Внимание", "Окно выбора")) = 6 Then

$sSystemDate = @MDAY & "/" & @MON
If $sSystemDate = "08/07" Then
SplashTextOn("Поздравляю!", "Мой текст!", 800, 350, -1, -1, 4, "", 25)
Sleep(1000)
SplashOff()
Exit
Else
EXIT
ENdif


Тоесть если в первом окне ответить ДА, то началось второе условие, а если нет, то выход вобще. Но при моей раскладке требует ENdif, но я же не могу вставить ENdif ибо второе условие выполнятся не будет. Помогите советом.

Creat0R 08-07-2008 23:19 846294

beve,
Цитата:

Цитата beve
если в первом окне ответить ДА, то началось второе условие, а если нет, то выход вобще »

Можно проверять не 6, а 7, и тогда просто Exit.

Цитата:

Цитата beve
при моей раскладке требует ENdif, но я же не могу вставить ENdif ибо второе условие выполнятся не будет »

Там нехватает ещё одного EndIf в конце, т.к на каждый If .... Then должно быть EndIf (если после Then идёт перевод строки и ещё команды)...

Код:

;Первый вариант, всё находится в условии, <если нажата кнопка "Да">.
If MsgBox(4100, "Внимание", "Окно выбора") = 6 Then
    $sSystemDate = @MDAY & "/" & @MON

    If $sSystemDate = "08/07" Then
        SplashTextOn("Поздравляю!", "Мой текст!", 800, 350, -1, -1, 4, "", 25)
        Sleep(1000)
        SplashOff()
        Exit
    Else
        Exit
    EndIf
EndIf


;Второй вариант, выход из скрипта если нажата кнопка "Нет".
If MsgBox(4100, "Внимание", "Окно выбора") = 7 Then Exit

$sSystemDate = @MDAY & "/" & @MON

If $sSystemDate = "08/07" Then
    SplashTextOn("Поздравляю!", "Мой текст!", 800, 350, -1, -1, 4, "", 25)
    Sleep(1000)
    SplashOff()
    Exit
Else
    Exit
EndIf


Creat0R 09-07-2008 07:06 846463

amel27,
Не подскажешь ещё такой момент в RegExp...
Мне нужно заменить число в имени файла, тоже на число, на единицу больше, но при этом нужно оставить все остальные значения, т.е я просто решил что на каждый нужный мне кусок с имени файла будет назначена группа, а в параметре Replace она будет Использоваться, и между группами я просто подставляю нужное число, но получается что оно как бы добавляет к значению группы :wacko:

Код:

$Num = "2"
$Var = StringRegExpReplace("FileName (1).txt", "(.*)(1)(.*)$", "\1" & $Num & "\3")
ConsoleWrite($Var)

Тут получается что используется не «\1», а «\12» :( - Как можно отменять числа в этом случае?

P.S
Без групп почему то не получается...

NikLok 09-07-2008 10:51 846604

Creat0R,
Цитата:

Цитата Creat0R
Смотря какая программа, вопрос довольно смутный, подробнее можно? »

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

$var = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Acrobat Reader\8.0\Installer", "Path")
if @error then
MsgBox(4096, "Program files are in:", "Progarm Adobe not installed")
Else
MsgBox(4096, "Program files are in:", $var)
EndIf

$var = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Acrobat Reader\9.0\Installer", "Path")
if @error then
MsgBox(4096, "Program files are in:", "Progarm Adobe not installed")
Else
MsgBox(4096, "Program files are in:", $var)
EndIf

exit


Есть более актуальный вопрос!!! Как определить ставлюсь я на виртуальной машине или на реальной!
Я использую VMWare, и пока думаю делать это проверкой наличия их видеоадаптера с VEN_15AD&DEV_0405
Как обстоят дела под другими виртуалками и каие есть готовые скрипты у кого нибудь.

Связано это с тем, что например программы работающие со SMART таблицами дисков под VMWare ставить пока вроде смысла нет, так как не эмулируются и выдаются всякие нештатные сообщения. (6.0.0 b45731)

ShaddyR 09-07-2008 11:49 846660

поправьте ссылку в шапке
Цитата:

Цитата Vadikan
Русская справка »

на http://www.autoitscript.com/autoit3/docs.shtml

amel27 09-07-2008 14:30 846852

Creat0R
Цитата:

Тут получается что используется не «\1», а «\12» »
да, на оффсайте поднимали эту тему неоднократно, но по-моему глухо
могу предложить обходной вариант =)
Код:

$Num = "2"
$Var = StringRegExpReplace("FileName (1).txt" &$Num, "(.*)(1)(.*)(\d)$", "\1\4\3")
ConsoleWrite($Var&@CRLF)


Creat0R 09-07-2008 15:02 846889

amel27,
Цитата:

Цитата amel27
на оффсайте поднимали эту тему неоднократно »

Вот найти бы где....

Цитата:

могу предложить обходной вариант
Хм.. необычный вариант :) - Но имхо, он не очень надёжный, всегда остаётся риск того что на конце имени файла будет добавлена лишняя цифра...

Я ещё так придумал:

Код:

$iFind_Num      = 1
$iNum          = $iFind_Num + 1

$sDelim1        = " ("
$sDelim2        = ")"

$sDelim1_RE    = StringRegExpReplace($sDelim1, '([][{}()|.?+*\\^])', '\\\1')
$sDelim2_RE    = StringRegExpReplace($sDelim2, '([][{}()|.?+*\\^])', '\\\1')

$Var = StringRegExpReplace("FileName (1).txt", "(.*)" & $sDelim1_RE & $iFind_Num & $sDelim2_RE, "\1" & $sDelim1 & $iNum & $sDelim2)

ConsoleWrite($Var & @CRLF)

:biggrin:

Мне просто известны заранее разделители, а вот цифра которую нужно найти и заменить может всё время меняться, а может и вовсе не существовать (просто FileName.txt).

P.S
Это я доделываю функцию _FileNewNameEx(), чтобы не получилось имён с лишними добавками (типа "FileName (1)(1).txt"). Позже выложу...

vbrv 09-07-2008 16:43 846978

Ситуация:
В системе два пользователя, админ и просто юзер.
Есть программа, которая может запускаться только с админскими правами.
Программа в процессе работы должна брать файлы с сетевого диска.

Что я сделал:
Залогинился под админом, сделал автомонтирование сетевого диска. Всё отлично работает, при каждом входе под админом автоподключается сетевой диск.
Скомпилировал скриптик запуска этой проги с правами админа: RunAsWait("Администратор", "org.local", "пароль", 4, "прога с полным путём").

Проблема:
Когда из под юзера запускаю эту прогу, что через скрипт, что через "Запуск от имени администратора" - программа не видит сетевой диск, лезу через Open file, а сетевой диск перечеркнут.

Вопрос:
Так и должно быть, что из под RunAs винда (vista) не автомантирует сетевой диск?
Как можно с помощью скрипта подмонтировать его? И как потом размонтировать, если это необходимо?

amel27 09-07-2008 17:01 846991

Creat0R
Цитата:

Цитата Creat0R
Вот найти бы где »

я сходу тоже не нашел, но помню что в ответ было молчание...
Цитата:

Цитата Creat0R
всегда остаётся риск того что на конце имени файла будет добавлена лишняя цифра »

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

Цитата Creat0R
Я ещё так придумал »

ну тогда можно еще в два захода - сначала заменить цифру на спецсимвол, не встречающийся в именах файлов (*?), а потом его заменить на нужную подстановку :)

Creat0R 09-07-2008 20:49 847173

amel27,
Цитата:

Цитата amel27
сходу тоже не нашел »

Вот вроде что-то похожее, но это не совсем оно....
Но пока мой последний метод подходит, не думаю что будут с ним проблемы.

Maza Faka 10-07-2008 14:58 847776

Вложений: 1
amel27
Помоги пожалуйста, пытаюсь создать zip-архив:
Код:

$hDLL = DllOpen("zip32.dll")

$hCallBack_Print = DllCallbackRegister("_Print", "int", "str;long")
$hCallBack_Password = DllCallbackRegister("_Password", "int", "str;int;str;str")
$hCallBack_Comment = DllCallbackRegister("_Comment", "int", "str")
$hCallBack_Progress = DllCallbackRegister("_Progress", "int", "str;long")

$ZIPUSERFUNCTIONS = DllStructCreate("ptr print;ptr pwd;ptr comment;ptr progress")

DllStructSetData($ZIPUSERFUNCTIONS, "print", DllCallbackGetPtr($hCallBack_Print))
DllStructSetData($ZIPUSERFUNCTIONS, "pwd", DllCallbackGetPtr($hCallBack_Password))
DllStructSetData($ZIPUSERFUNCTIONS, "comment", DllCallbackGetPtr($hCallBack_Comment))
DllStructSetData($ZIPUSERFUNCTIONS, "progress", DllCallbackGetPtr($hCallBack_Progress))

$ZPOPT = DllStructCreate("ptr Date;ptr szRootDir;ptr szTempDir;int fTemp;int fSuffix;int fEncrypt;int fSystem;int fVolume;" & _
                        "int fExtra;int fNoDirEntries;int fExcludeDate;int fIncludeDate;int fVerbose;int fQuiet;int fCRLFLF;" & _
                        "int fLFCRLF;int fJunkDir;int fGrow;int fForce;int fMove;int fDeleteEntries;int fUpdate;int fFreshen;" & _
                        "int fJunkSFX;int fLatestTime;int fComment;int fOffsets;int fPrivilege;int fEncryption;int fRecurse;" & _
                        "int fRepair;byte fLevel")

$Date = DllStructCreate("char[256]")
DllStructSetData($Date, 1, "07/10/08")

$RootDir = DllStructCreate("char[256]")
DllStructSetData($Date, 1, "D:\Work\UnZIP")

$TempDir = DllStructCreate("char[256]")
DllStructSetData($TempDir, 1, "D:\Work\UnZIP")

$Level = DllStructCreate("char[1]")
DllStructSetData($Level, 1, 9)

DllStructSetData($ZPOPT, "Date", DllStructGetPtr($Date))
DllStructSetData($ZPOPT, "szRootDir", DllStructGetPtr($RootDir))
DllStructSetData($ZPOPT, "szTempDir", DllStructGetPtr($TempDir))
DllStructSetData($ZPOPT, "fTemp", 0)
;DllStructSetData($ZPOPT, "fSuffix", 0)
DllStructSetData($ZPOPT, "fEncrypt", 0)
DllStructSetData($ZPOPT, "fSystem", 1)
DllStructSetData($ZPOPT, "fVolume", 0)
DllStructSetData($ZPOPT, "fExtra", 1)
DllStructSetData($ZPOPT, "fNoDirEntries", 0)
DllStructSetData($ZPOPT, "fExcludeDate", 1)
DllStructSetData($ZPOPT, "fIncludeDate", 0)
DllStructSetData($ZPOPT, "fVerbose", 0)
DllStructSetData($ZPOPT, "fQuiet", 0)
DllStructSetData($ZPOPT, "fCRLFLF", 0)
DllStructSetData($ZPOPT, "fLFCRLF", 0)
DllStructSetData($ZPOPT, "fJunkDir", 0)
DllStructSetData($ZPOPT, "fGrow", 0)
DllStructSetData($ZPOPT, "fForce", 0)
DllStructSetData($ZPOPT, "fMove", 0)
DllStructSetData($ZPOPT, "fDeleteEntries", 0)
DllStructSetData($ZPOPT, "fUpdate", 0)
DllStructSetData($ZPOPT, "fFreshen", 0)
DllStructSetData($ZPOPT, "fJunkSFX", 0)
DllStructSetData($ZPOPT, "fLatestTime", 0)
DllStructSetData($ZPOPT, "fComment", 0)
DllStructSetData($ZPOPT, "fOffsets", 0)
DllStructSetData($ZPOPT, "fPrivilege", 0)
DllStructSetData($ZPOPT, "fEncryption", 0)
DllStructSetData($ZPOPT, "fRecurse", 1)
DllStructSetData($ZPOPT, "fRepair", 0)
DllStructSetData($ZPOPT, "fLevel", 0)

$aRet = DllCall($hDLL, "int", "ZpSetOptions", "ptr", DllStructGetPtr($ZPOPT))
ConsoleWrite($aRet[0] & @LF)

;$aRet = DllCall($hDLL, "int", "ZpGetOptions", "ptr", DllStructGetPtr($ZPOPT))
;ConsoleWrite($aRet[0] & @LF)

$aRet = DllCall($hDLL, "int", "ZpInit", "ptr", DllStructGetPtr($ZIPUSERFUNCTIONS))
ConsoleWrite($aRet[0] & @LF)

;============================ZpArchive()==========================================================
$ArchName = DllStructCreate("char[256]")
DllStructSetData($ArchName, 1, "test.zip")

$FileName = DllStructCreate("char[256]")
DllStructSetData($FileName, 1, "test.jpg")

$ZpArchive_Struct = DllStructCreate("int count;ptr arc;ptr file")

DllStructSetData($ZpArchive_Struct, "count", 1)
DllStructSetData($ZpArchive_Struct, "arc", DllStructGetPtr($ArchName))
DllStructSetData($ZpArchive_Struct, "file", DllStructGetPtr($FileName))

$aRet = DllCall($hDLL, "int", "ZpArchive", "ptr", DllStructGetPtr($ZpArchive_Struct))

ConsoleWrite("!> ZpArchive: " & $aRet[0] & @LF)

;=============================================================================================

DllCallbackFree($hCallBack_Print)
DllCallbackFree($hCallBack_Password)
DllCallbackFree($hCallBack_Comment)
DllCallbackFree($hCallBack_Progress)

Func _Print($sFile, $sPos)
    ConsoleWrite($sFile & @LF)
EndFunc

Func _Password($sPWD, $sX, $sS2, $sName)
    ConsoleWrite("Password" & @LF)
EndFunc

Func _Comment($sComment)
    ConsoleWrite("!> File " & $sComment & " is overwrite" & @LF)
EndFunc

Func _Progress($sName, $sSize)
    ConsoleWrite("---> Arch name: " & $sName & @LF & _
                "---> Pos: " & $sSize & @LF)
EndFunc

Прилагаю dll-ку и help-файл

Creat0R 10-07-2008 16:08 847852

Maza Faka,
На оф. форуме много раз приводили примеры, вот например: Zip plugin.

Maza Faka 10-07-2008 18:02 847980

Creat0R
Знаю, скачал недавно, распаковал архив, а там каша из файлов и директорий, непонятно, что куда "втыкать", примеров нет, можно конечно разобраться, но попробовал запустить и получив вот такое окно

от дальнейшего "ковыряния" отказался :)

amel27
Вопрос снимается (временно?) С основными функциями разобрался, есть конечно пара проблемных параметров, попробую разобраться сам, если не получиться придётся тебя побеспокоить :)

chumova9I 11-07-2008 13:20 848711

autoit
 
привет!
учусь работать с autoit.
возник вопрос.
вот код:
Run("C:\WINDOWS\system32\cmd.exe /k chcp 866 && set PGPORT=5432")
WinActivate("C:\WINDOWS\system32\cmd.exe")
Send("pg_dumpall -U postgres -f atest2.dump")
Send("{ENTER}")
Send("irishka")
Send("{ENTER}")
Send("psql -U postgres < atest2.dunp")
Send("{ENTER}")

после запуска получаю ошибку, обьясните что не правильно и как решить проблему!
вот ошибка :
Текущая кодовая страница: 866

C:\Program Files\PostgreSQL\8.2\bin>_dumpall -U postgres -f atest2.dump
"_dumpall" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

C:\Program Files\PostgreSQL\8.2\bin>irishka
"irishka" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

C:\Program Files\PostgreSQL\8.2\bin>psql -U postgres < atest2.dunp
Не удается найти указанный файл.

C:\Program Files\PostgreSQL\8.2\bin>

заранее спасибо!

chumova9I 11-07-2008 15:54 848862

все разобралась, это был глюк!

C:\Program Files\PostgreSQL\8.2\bin>_dumpall -U postgres -f atest2.dump
"_dumpall" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом

простоне отображал первые два символа, поставила парочку пробелов и все пашет!!!

AlexNeo 13-07-2008 17:04 850358

Кок создат форму с двумя кнопками а на кнопках функции запуска установки, например (Setup.exe).

Creat0R 13-07-2008 23:44 850612

AlexNeo,
Цитата:

Цитата AlexNeo
создат форму с двумя кнопками а на кнопках функции запуска установки, например (Setup.exe). »

Пример:

Код:

#include <GuiConstantsEx.au3>

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

$MyApp_Button = GUICtrlCreateButton("My App", 20, 40, 60, 20)
$OtherApp_Button = GUICtrlCreateButton("Other App", 20, 70, 60, 20)

GUISetState(@SW_SHOW, $GUI)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$MyApp_Button
            Run("MySetup.exe")
        Case $OtherApp_Button
            Run("OtherSetup.exe")
    EndSwitch
WEnd


SvetlanaK 15-07-2008 14:47 852060

Здравствуйте! а не подскажет ли кто, как обратиться к фтп и считать с него файлы для последующей записи на другой сервер?
$oIE = _IECreate ()
_IENavigate ($oIE, "ftp://ё.ёёё.ёё.ёё") -это в принципе иногда срабатывает, но меня интересует что-то вроде UDF, как ExcelCOM_UDF.au3, чтобы можно было папку с файлами на фтп обработать как объект, определить имена файлов, даты и т.д, списком. Нарыла FTP.au3 - не то по-моему( он только несколько команд выполняет - удалить, апгрейдить и сконнектить( Перерыла архивы форума тоже к сожалению ничего не нашла( Буду благодарна за любой совет.

AlexNeo 15-07-2008 18:06 852252

Creat0R, Спасибо.

amel27 16-07-2008 04:39 852679

SvetlanaK
Цитата:

он только несколько команд выполняет »
AFAIK последняя редакция FTP.AU3 лежит тут: http://www.autoitscript.com/forum/in...1&#entry332541

SvetlanaK 16-07-2008 15:32 853155

amel27, ага...поняла. Спасибо Вам большое!

leprecon 20-07-2008 13:11 856749

Ответьте пожалуйста на мои возникшие вопросы:
1. Как из строки C:\Program Files\1123\dfgfdfgdg.exe с помощью скрипта скопировать dfgfdfgdg.exe? (имеется ввиду что dfgfdfgdg.exe будет каждый раз разное:) )

2. Можно ли при помощи Autoit генерировать другие ехе приложения? Мне нужно, чтобы после указания нужного файла создался новый exe файл который будет использовать заранее указанные настройки.

Maza Faka 20-07-2008 14:06 856794

leprecon
1.
Код:

$string = "C:\Program Files\1123\dfgfdfgdg.exe"

$result = StringRegExpReplace($string, "^.*\\", "")

MsgBox(0, "", $result)

2.
Код:

$hFileOpen = FileOpen(@TempDir & "\tmp.au3", 2)

$val = "Hello world!"

$string = 'Sleep(2000)' & @LF & _
          'Global $Var = "' & $val & '"' & @LF & _
          'GUICreate("Test", 200, 100)' & @LF & _
          'GUICtrlCreateLabel($Var, 50, 50, 100, 16)' & @LF & _
          'GUISetState()' & @LF & _
          'Do' & @LF & _
          'Until GuiGetMsg() = -3'

FileWrite($hFileOpen, $string)
FileClose($hFileOpen)

Run("c:\Program Files\AutoIt3\AutoIt3.exe " & @TempDir & "\tmp.au3")

Я реализовал подобное в своём проекте

leprecon 20-07-2008 19:27 856995

Подскажите, в чем тут ошибка?

$var = FileOpenDialog("Выберите файл с игрой", @ProgramFilesDir & "\", "Exe file (*.exe)", 1 )
GUICtrlSetData(10,$var, "")
$trimright = StringRegExpReplace($var, "^.*\\", "")
$result = StringTrimRight( $trimright, 4 )
GUICtrlSetData(3,$result, "" )
IniWrite( "reflexive.ini", "STROKA", "file", $result )
IniWrite( "reflexive.ini", "Directory", "File", $var )

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

Я пробЫвал просто прописывать числа в INI файл через переменные:

$stroka1 = InputBox( "Строка 1", "Строка первая" )
$stroka2 = InputBox( "Строка 2", "Строка вторая" )
IniWrite( "reflexive.ini", "STROKA", "File", $stroka1 )
IniWrite( "reflexive.ini", "Directory", "File", $stroka2 )

Такой способ срабатывает, да и вообще во всех остальных случаях IniWrite работает нормально...

Цитата:

Цитата Maza Faka
Run("c:\Program Files\AutoIt3\AutoIt3.exe " & @TempDir & "\tmp.au3") »

Как я понял тут используется установленный Autoit? А как быть с другими компьютерами?

Creat0R 20-07-2008 23:04 857158

leprecon,
Цитата:

Цитата leprecon
Теоретически, после запуска и выбора нужного файла, в папке со скриптом должен создоваться INI файл »

Нет, файл будет создан там, куда указывает рабочий каталог (@WorkingDir). FileOpenDialog() (и ей подобные) задаёт рабочий каталог тот, в котором был выбран файл.

Поэтому указывать нужно полный путь (это касается всех случаях когда используются относительные пути):

Код:

IniWrite(@ScriptDir & "\reflexive.ini", "STROKA", "File", $stroka1)
Цитата:

Цитата leprecon
тут используется установленный Autoit? А как быть с другими компьютерами? »

Код:

Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & @TempDir & '\tmp.au3"')

Maza Faka 21-07-2008 08:09 857307

Цитата:

Цитата leprecon
Как я понял тут используется установленный Autoit? А как быть с другими компьютерами? »

Придётся включать в код компилятор и компилировать вновь созданный скрипт.

Creat0R 21-07-2008 08:16 857309

Maza Faka,
Цитата:

Цитата Maza Faka
Придётся включать в код компилятор и компилировать вновь созданный скрипт. »

Зачем? или я не понял что ты имеешь в виду...
Строка что я привёл, будет работать даже при отсутствии установленного аутоита в системе, сам скомпилированный скрипт работает как интерпритатор AutoIt-кода/скрипта.

Maza Faka 21-07-2008 09:13 857330

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

Creat0R 21-07-2008 09:59 857356

Maza Faka,
Цитата:

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

Как отдельная программа (exe'шник)? Нет, так не получится, компиллятор аутоита портировать в скрипт это не выход, тем более что оно нарушает лицензионное соглашение.

Есть ещё вариант...

* Берём бесплатный (ещё и с открытым кодом) 7zip (его консольную версию).
* Берём пустой скомпилированный скрипт (будет в качестве интерпритатора).

- Компиллируем это всё (с испол. FileInstall()) в нужный нам скрипт.
- А в момент необходимости создать отдельный exe'шник, пишем нужный нам код во временный файл (например Au3Script.plg), запускаем 7zip с параметрами на создание SFX-архива в который поместить наш файл с кодом, плюс наш пустой скомпилированный скрипт, а как параметр при запуске после распаковки указать файл с кодом (типа «Interpritator.exe Au3Script.plg»). Ну или вместо пустого скрипта копировать сам родительский скрипт, т.е паковать его самого как интерпритатор.

Вот такой вот извращённый метод :biggrin:

Но должно получиться :beta: .

Maza Faka 21-07-2008 10:32 857383

Creat0R
Цитата:

Вот такой вот извращённый метод
Отличная идея! :)

HORRIBLE 23-07-2008 13:20 859140

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

спасибо

Drsmog 23-07-2008 14:06 859165

Привет

У мня вопрос как сделать подсчет строчек до определенного символа "?"

пример:

?
1 строчка
2 строчка
3 строчка
? (здесь останавливается и выводит сообщение здесь 3 строчки) далее
1 строчка
2 строчка
3 строчка
4 строчка
? (здесь останавливается и выводит сообщение а здесь 4 строчки)
1 строчка
2 строчка
3 строчка
4 строчка
5 строчка
6 строчка
? (здесь останавливается и выводит сообщение а здесь 6 строчки)

и.т.д

HORRIBLE 23-07-2008 14:48 859188

Drsmog,

Можно так:

Код:

#include <file.au3>
$sumbol = "?"
$y = 0
Dim $aRecords
If Not _FileReadToArray("error.log",$aRecords) Then
  MsgBox(4096,"Error", " Error reading log to Array    error:" & @error)
  Exit
EndIf
For $x = 1 to $aRecords[0]
    $y += 1
    $result = StringCompare($aRecords[$x], $sumbol, 1)
      If $result  = 0 then
          MsgBox(0,"","До искомого символа "&($y-1)&" строк")
          $y = 0
      endif       
Next


Creat0R 23-07-2008 17:26 859295

HORRIBLE,
Цитата:

Цитата HORRIBLE
можно распознать защитную картинку и получить код который на ней написан? »

См. в сторону OCR, на оф. сайте приводили много примеров.

Drsmog,
Цитата:

Цитата Drsmog
как сделать подсчет строчек до определенного символа "?" »

Код:

$hFileOpen = FileOpen("File.txt", 0)
If $hFileOpen = -1 Then Exit

$iCounter = 1

While 1
    $sReadLine = FileReadLine($hFileOpen)
    If @error <> 0 Then ExitLoop

    If
$sReadLine = "?" Then
        MsgBox(64, "Counter", "Насчитано строк: " & $iCounter)
        $iCounter = 0
    Else
        $iCounter += 1
    EndIf
WEnd


FileClose($hFileOpen)


HORRIBLE 23-07-2008 17:37 859303

Creat0R,
а что такое OCR??? спасибо за направление)

Creat0R 23-07-2008 17:46 859309

HORRIBLE,
Цитата:

Цитата HORRIBLE
что такое OCR? »

OCR - Optical Character Recognition :)
Оптическое распознавание символов

Maza Faka 23-07-2008 18:09 859333

Creat0R
Цитата:

как сделать подсчет строчек до определенного символа "?"
Помнится мы такие простые задачки решали с помощью батников :)

amel27 24-07-2008 11:34 859843

Еще вариант - с точки зрения блоков текста, оптимизирован по скорости чтения файла:
З.Ы. обойтись без RegExp стоило усилий :)

Код:

$sFile = "C:\File.Txt"
$sChar = "?" & @CRLF

MsgBox(64, "Counter", "Насчитано строк в блоке 1: " & _FileBlockLines($sFile, $sChar))
MsgBox(64, "Counter", "Насчитано строк в блоке 2: " & _FileBlockLines($sFile, $sChar, 2))
MsgBox(64, "Counter", "Насчитано строк в блоке 3: " & _FileBlockLines($sFile, $sChar, 3))
MsgBox(64, "Counter", "Насчитано строк в блоке 4: " & _FileBlockLines($sFile, $sChar, 4))
MsgBox(64, "Counter", "Насчитано строк в блоке 5: " & _FileBlockLines($sFile, $sChar, 5))

Func _FileBlockLines($sFile, $sDelim, $iBlock = 1)
    Local Const $iBufSize = 16384      ; размер буфера
    Local $iFindLen=StringLen($sDelim)  ; длина разделителя
    Local $iLines=0, $iNum=0            ; счетчики
    ; Открытие файла

    Local $hFile = FileOpen($sFile, 0)
    If $hFile = -1 Then Return SetError(1,0,-1)
    ; Цикл поблочного чтения из файла
    While 1
        $sRead = FileRead($hFile, $iBufSize)
        If @error Then ExitLoop
        ; Цикл подсчета блоков и строк в блоке
        Do
            $iFind = StringInStr($sRead, $sDelim)
            If $iFind Then
                StringReplace(StringLeft($sRead, $iFind-1), @LF, "")
                $iLines += @extended
                $iNum +=1
                ; Если номер искомого блока, то Выход
                If $iNum=$iBlock Then ExitLoop 2
                ; Инициализация для следующего блока
                $sRead = StringTrimLeft($sRead, $iFind+$iFindLen)
                $iLines = 0
            Else
                StringReplace($sRead, @LF, "")
                $iLines += @extended
            EndIf
        Until
$iFind=0
    WEnd
    If
$sRead="" Then $iLines=-1

    FileClose($hFile)
    Return $iLines
EndFunc


HORRIBLE 24-07-2008 12:16 859878

как в созданное GUI поместить картинку находящююся в интернете, к примеру по адресу (http://forum.oszone.net/attachment.p...4&d=1216804832) ?

Maza Faka 24-07-2008 16:34 860126

HORRIBLE
Цитата:

как в созданное GUI поместить картинку находящююся в интернете
Загрузить в компьютер с помощью функции InetGet(), а затем создать контрол GuiCtrlCreatePic() с использованием этой картинки.

DImaN! 28-07-2008 12:39 862617

У меня есть один наболевший вопрос. как можно сделать так, чтобы изменился размер таскбара с одной в 2 строки причем квикланч был сверху, а открытые приложения снизу?

TimAlex 29-07-2008 14:09 863569

Помогите пожалуста!!!

Мне надо использовать несколько готовых заготовк написаных на VBS. По вот этому примеру получилось:
Код:


$id_W=RegRead ("HKLM\SOFTWARE\Microsoft\Internet Explorer\Registration","DigitalProductId")

MsgBox(0,"", _GetKeyVBS($id_W))

Func _GetKeyVBS($key)

Local $Code = ""
$Code &= 'Function GetKey(rpk)' & @LF
$Code &= 'Const rpkOffset=52' & @LF
$Code &= 'i=28' & @LF
$Code &= 'szPossibleChars="BCDFGHJKMPQRTVWXY2346789"' & @LF
$Code &= 'Do ' & @LF
$Code &= 'dwAccumulator=0 ' & @LF
$Code &= 'j=14' & @LF
$Code &= 'Do ' & @LF
$Code &= 'dwAccumulator=dwAccumulator*256 ' & @LF
$Code &= 'dwAccumulator=rpk(j+rpkOffset)+dwAccumulator' & @LF
$Code &= 'rpk(j+rpkOffset)=(dwAccumulator\24) and 255 ' & @LF
$Code &= 'dwAccumulator=dwAccumulator Mod 24' & @LF
$Code &= 'j=j-1' & @LF
$Code &= 'Loop While j>=0' & @LF
$Code &= 'i=i-1 ' & @LF
$Code &= 'szProductKey=mid(szPossibleChars,dwAccumulator+1,1 )&szProductKey' & @LF
$Code &= 'if (((29-i) Mod 6)=0) and (i<>-1) then ' & @LF
$Code &= 'i=i-1 ' & @LF
$Code &= 'szProductKey="-"&szProductKey' & @LF
$Code &= 'End If' & @LF
$Code &= 'Loop While i>=0' & @LF
$Code &= 'GetKey=szProductKey' & @LF
$Code &= 'End Function'
MsgBox(0,'', $Code)

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

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

EndFunc

но выдет ошибку:
Код:

D:\auto_it\office.au3 (48) : ==> The requested action with this object has failed.:
$VbsObj.Run("GetKey ","")
$VbsObj.Run("GetKey ","")^ ERROR


amel27 30-07-2008 04:19 864147

DImaN!,
Цитата:

Цитата DImaN!
как можно сделать так, чтобы изменился размер таскбара с одной в 2 строки причем квикланч был сверху, а открытые приложения снизу? »

а разве возможно, чтобы AppBar-приложения размещались иначе, чем вдоль панели (горизонтально)? :unsure:

TimAlex,
Цитата:

Цитата TimAlex
выдет ошибку»

- VBScript и AutoIT по разному считывают REG_BINARY параметры реестра;
- строковая переменная всегда =0 (смотри закомментированную строку);
- имя функции в "$VbsObj.Run" должно быть без пробелов
Код:

$oWshShell = ObjCreate("WScript.Shell")
$id_W = $oWshShell.RegRead("HKLM\SOFTWARE\Microsoft\Internet Explorer\Registration\DigitalProductId")

MsgBox(0,"", _GetKeyVBS($id_W))

Func _GetKeyVBS($key)
    Local $Code = ""
    $Code &= 'Function GetKey(rpk)' & @LF
    $Code &= 'Const rpkOffset=52' & @LF
    $Code &= 'i=28' & @LF
    $Code &= 'szPossibleChars="BCDFGHJKMPQRTVWXY2346789"' & @LF
    $Code &= 'Do' & @LF
    $Code &= 'dwAccumulator=0' & @LF
    $Code &= 'j=14' & @LF
    $Code &= 'Do' & @LF
    $Code &= 'dwAccumulator=dwAccumulator*256' & @LF
    $Code &= 'dwAccumulator=rpk(j+rpkOffset)+dwAccumulator' & @LF
    $Code &= 'rpk(j+rpkOffset)=(dwAccumulator\24) and 255' & @LF
    $Code &= 'dwAccumulator=dwAccumulator Mod 24' & @LF
    $Code &= 'j=j-1' & @LF
    $Code &= 'Loop While j>=0' & @LF
    $Code &= 'i=i-1' & @LF
    $Code &= 'szProductKey=mid(szPossibleChars,dwAccumulator+1,1 )&szProductKey' & @LF
    $Code &= 'if (((29-i) Mod 6)=0) and (i<>-1) then' & @LF
    $Code &= 'i=i-1' & @LF
    $Code &= 'szProductKey="-"&szProductKey' & @LF
    $Code &= 'End If' & @LF
    $Code &= 'Loop While i>=0' & @LF
    $Code &= 'GetKey=szProductKey' & @LF
    $Code &= 'End Function'

    MsgBox(0,'', $Code)

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

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


DImaN! 30-07-2008 18:00 864572

Извеняюсь за непонятную постановку моей проблемы. Я имел в виду каким образ можно сделать так, чтобы панели QuickLaunch и AppBar размещались не как на этом скриншоте:
,
а как на следующем:

если учесть то, что изначально TaskBar отображается только в одну строку и без QuickLainch-а

amel27 31-07-2008 07:51 864883

DImaN!
вот блин, не знал что так можно... :)

AFAIK программно это не реализовать, так можно менять только "Закрепление" и AutoHide, остальное придется автоматизацией кликов и перетаскиваний, тут основная проблема - определение актуальных координат... Если универсальность не требуется (первоначальные настройки всегда одинаковые), то все просто. Вот скрипт, который я сгенерил в AU3Record из комплекта AutoIT и слегка подредактировал:
Код:

Opt("WinWaitDelay",100)
Opt("WinTitleMatchMode",4)
Opt("WinDetectHiddenText",1)
Opt("MouseCoordMode",0)

WinWait("classname=Shell_TrayWnd","")
If Not WinActive("classname=Shell_TrayWnd","") Then WinActivate("classname=Shell_TrayWnd","")
WinWaitActive("classname=Shell_TrayWnd","")

; Расширил таскбар с одной до двух строк
MouseMove(397,2,0)
MouseDown("left")
MouseMove(397,-36,0)
MouseUp("left")

; Пауза для применения новых настроек
Sleep(3000)

; Опустил QuickLaunch вниз
MouseMove(121,32,0)
MouseDown("left")
MouseMove(138,63)
MouseUp("left")


DImaN! 31-07-2008 10:28 864969

amel27, Спасибо огромное! Я немного подкорректировал и получилось именно то, что мне нужно. Только вот можете подсказать, где можно скачать саму тулу AU3Record, потому что у меня при инсталле самого AutoIT3 данного приложения в комплекте не было...

amel27 31-07-2008 12:03 865040

Цитата:

Цитата DImaN!
где можно скачать саму тулу AU3Record »

идет в комплекте SciTE

DImaN! 31-07-2008 17:50 865285

Можете подсказать, возможно ли при помощт AutoIt реализовать сохранение выполненных действий в отдельный файл. Т.е. просто пример: написан скрипт, в котором открывается программа и выполняются определенные действия с контролами (клики по контролам, открытия комбо-боксов, ввод текста и т.п.). Нужно чтобы все эти действия сохранялись в отдельный txt (log) файл в виде "действие - контрол"...

Maza Faka 31-07-2008 18:36 865319

DImaN!
Цитата:

написан скрипт, в котором открывается программа
Программа написанная на AutoIt-е?

DImaN! 31-07-2008 18:39 865323

Сама программа - нет, скрипт по эмуляции работы человека - на AutoIT

Maza Faka 01-08-2008 07:51 865631

DImaN!
Непонятен смысл такого "логирования". Ведь все действия и так будут описаны в скрипте :) Смотри функции FileWrite(); FileWriteLine()

Babullika 01-08-2008 22:03 866155

Здраствуйте , уважаемые програмисты , подскажите как можно средствами AutoIT определить что программа зависла ? Нужно типо if <прога зависла> do ...

266903582 01-08-2008 23:11 866183

По вопросу записи действий пользователя могу подкинуть примерчик. Писал для личного пользования, упрощал создание автоустановщика программ.
Код:

#include <Misc.au3>
FileDelete("file.au3")
$dll = DllOpen("user32.dll")
$file = FileOpen("file.au3", 1)
$ffi=""
wr("run('')")
while not _IsPressed("11", $dll)                ;ждем нажатия контрола
        sleep(10)
WEnd
TrayTip("","ЗАПИСЫВАЕМ",1)
While 1
        if _IsPressed("01", $dll) Then                                                        ;lmb        ctrltext & classn 
                $wtt=WinGetTitle("")
                $wgt=WinGetText("")
                $wgt=repl($wgt)           
                $cgf=ControlGetFocus("")
                if $cgf<>"" then wr("cl('"&$wtt&"','"&$wgt&"','"&$cgf&"')")  ;ControlGetText("","",ControlGetFocus(""))&@lf&
                ToolTip($wtt&@lf&$cgf)
        EndIf
        if _IsPressed("13",$dll) Then
                TrayTip("","ПАУЗА",1)
                sleep(300)
                while 1
                        if _IsPressed("13",$dll) Then ExitLoop
                        sleep(10)
                WEnd
                TrayTip("","ЗАПИСЫВАЕМ",1)
                sleep(300)
        EndIf
        if _IsPressed("1b", $dll) Then ExitLoop                                                                                                ;esc
        sleep(10)
WEnd
;дополнение :)
wr("Func wa($tx1, $tx2)")
wr("        While WinExists($tx1, $tx2)=0")
wr("                Sleep(1) ")
wr("        WEnd ")
wr("EndFunc")
wr("Func cl($tx1, $tx2,$classn)")
wr("        wa($tx1, $tx2)")
wr("        ControlClick($tx1, $tx2,$classn)")
wr("EndFunc")
DllClose($dll)
FileClose($file)
Func wr($ff)
        if $ffi<>$ff then
                FileWrite($file,$ff&@LF)
                $ffi=$ff
        EndIf
EndFunc

Func wa($tx1, $tx2)
        While WinExists($tx1, $tx2)=0
                Sleep(1)
        WEnd
EndFunc
Func cl($tx1, $tx2,$classn)
        wa($tx1, $tx2)
        ControlClick($tx1, $tx2,$classn)
EndFunc
func repl($ffff)
$tempstr=$ffff
$tempstr=StringReplace($tempstr,@crlf,@lf)
$tempstr=StringReplace($tempstr,@cr,@lf)
$ffff=""
$buff=""
$counter=0

while StringLen($ffff)<200; or StringLen($tempstr)<>0
        $symb=StringLeft($tempstr,1)
        $tempstr=StringTrimLeft($tempstr,1)
        $buff=$buff&$symb
        if $symb=@lf Then
                if $counter<10 then $buff=""
                if $counter>=30 then
                        $ffff=$ffff&$buff;&@lf
                        $counter=0
                        $symb=""
                EndIf
        EndIf
        if $symb<>@lf Then $counter+=1
        if StringLen($tempstr)=0 then ExitLoop
WEnd
$ffff=StringReplace($ffff,"'","")
        return $ffff
EndFunc

После его работы файл необходимо подредактировать и все готово :)
Хотя скрипт до ума так и не доведен, но пользоваться можно.

Solitude 02-08-2008 01:59 866247

Подскажите, можно ли средставми AutoIt изменять резрешения к определенному разделу реестра ?

Maza Faka 02-08-2008 08:29 866286

Babullika
Цитата:

как можно средствами AutoIT определить что программа зависла ?
Код:

$hWnd = WinGetHandle("Документ1 - Microsoft Word")

$aRet = DllCall("user32.dll", "int", "IsHungAppWindow", "hwnd", $hWnd)

If $aRet[0] = 1 Then MsgBox(64, "Внимание", "Приложение не отвечает")

Проверил на MS Word-e, "вешаем" его вот этой строчкой: уточнение наличия запасов м.с.;, и хотя в официальном описании сказано, "Ghost windows always return TRUE", тем не менее функция работает правильно :)

Babullika 02-08-2008 13:47 866380

2 Maza Faka СПАСИБО огомное !
Щас появилась ещё одна проблемма , делаю ProcessClose на прогу у которой есть иконка в трее и иконка непропадает пока на неё не наведёшь мышкой , можно как-нибудь сделать чтоб она сразу пропадала ?

Maza Faka 02-08-2008 14:08 866390

Babullika
SystemTray_Refresh

Positiv 05-08-2008 16:48 868640

Подскажите пожалйста примерчик следующего скрипта: скрипт проверяет соединение с интернетом, если таковое отсутствует то подключает подключение по умолчанию. Буду премного благодарен!!!

Wu-Tang 05-08-2008 18:17 868711

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

BrAWo 05-08-2008 19:27 868763

Народ помогите
есть задачка:
нужно узнать какие основной dns и альтернативный dns использует пользователь и если они не правильные то поменять их на правильные.

пример:
основной dns: 192.168.0.1
альтернативный dns: 192.168.0.2

надо поменять на
основной dns: 192.168.0.254
альтернативный dns: 192.168.0.253

при этом надо учитывать что само соединение может называться по разному:
Local Area Connection
или Local Area Connection2
....
Local Area Connection10
или
Подключение по локальной сети
.....
Подключение по локальной сети3
...

amel27 06-08-2008 08:07 869143

Wu-Tang
ОФФТОП: эта тема для обсуждения открытого кода, а не "закрытых" приложений

BrAWo
Цитата:

Цитата BrAWo
если они не правильные то поменять их на правильные »

может не заморачиваться лишними строчками кода и сразу вбивать без проверки?
Код:

Dim $aDNSList[2]=["192.168.0.1","192.168.0.2"]

$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
$colNetCards = $objWMIService.ExecQuery ("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True")
For $objNetCard In $colNetCards
    $intErrorSetDNSServerSearchOrder
= $objNetCard.SetDNSServerSearchOrder($aDNSList)
Next


Maza Faka 06-08-2008 08:09 869145

Positiv
Цитата:

скрипт проверяет соединение с интернетом
Подключение Dial-UP?

Positiv 06-08-2008 10:33 869218

Maza Faka, нет, подключени высокоскоростное(DSL). А разве это важно. Подключение в точности такое же как и у диалапа.

Maza Faka 06-08-2008 13:51 869394

Positiv
Цитата:

А разве это важно
Да, что бы наверняка определить состояние, вот для начала, проверь какие строки возвращаются при подключенном и отключенном соеденении:
Код:

Global Const $INTERNET_CONNECTION_MODEM = 0x1
Global Const $INTERNET_CONNECTION_LAN = 0x2
Global Const $INTERNET_CONNECTION_PROXY = 0x4
Global Const $INTERNET_CONNECTION_MODEM_BUSY = 0x8
Global Const $INTERNET_RAS_INSTALLED = 0x10
Global Const $INTERNET_CONNECTION_OFFLINE = 0x20
Global Const $INTERNET_CONNECTION_CONFIGURED = 0x40

Dim $State, $val

$InetStruct
= DllStructCreate("int")

DllCall("wininet.dll", "int", "InternetGetConnectedState", "ptr", DllStructGetPtr($InetStruct), "dword", 0)

$val = DllStructGetData($InetStruct, 1)

If BitAND($val, $INTERNET_CONNECTION_MODEM) Then $State &= "Modem connection" & @LF
If BitAND($val, $INTERNET_CONNECTION_LAN) Then $State &= "LAN connection" & @LF
If BitAND($val, $INTERNET_CONNECTION_PROXY) Then $State &= "Proxy connection" & @LF
If BitAND($val, $INTERNET_CONNECTION_MODEM_BUSY) Then $State &= "Modem bussy" & @LF
If BitAND($val, $INTERNET_RAS_INSTALLED) Then $State &= "RAS installed" & @LF
If BitAND($val, $INTERNET_CONNECTION_OFFLINE) Then $State &= "Offline connection" & @LF
If BitAND($val, $INTERNET_CONNECTION_CONFIGURED) Then $State &= "Connection configured"

MsgBox(0, "Connection", $State)

Цитата:

Подключение в точности такое же как и у диалапа
А как дозваниваешься? У меня dial-up подключение, поэтому все тонкости ADSL подключения я не знаю.

Positiv 06-08-2008 22:26 869807

Maza Faka, при отключенном соединении выдает в одном окне следующее: LAN connection, Proxy connection, RAS installed, Connection configured.
При подключенном же: Modem connection, RAS installed, Connection configured. А
дозвон так же как и на диалапе, в окне вводишь имя и пароль и жмешь кнопочку подключение.

BrAWo 07-08-2008 06:38 869964

Цитата:

Цитата amel27
может не заморачиваться лишними строчками кода и сразу вбивать без проверки? »

Спасибо огромное

можно еще небольшой вопрос:
если указано:

основной dns: 192.168.0.1
альтернативный dns: 192.168.0.2

а нужно оставить только:
основной dns: 192.168.0.1

Maza Faka 07-08-2008 09:14 870007

Positiv
Попробуй так:
Код:

If _GetConnectState() = 1 Then Exit

Global Const
$INTERNET_AUTODIAL_FORCE_UNATTENDED = 0x02

$ConNumber = DllStructCreate("int")
DllStructSetData($ConNumber, 1, 0)

DllCall("wininet.dll", "int", "InternetDial", "hwnd", 0, _
        "ptr", 0, _
        "int", $INTERNET_AUTODIAL_FORCE_UNATTENDED, _
        "ptr", DllStructGetPtr($ConNumber), _
        "int", 0)

Func _GetConnectState()
    Local Const $INTERNET_CONNECTION_MODEM = 0x1
    Local $InetStruct = DllStructCreate("int")

    DllCall("wininet.dll", "int", "InternetGetConnectedState", "ptr", DllStructGetPtr($InetStruct), "dword", 0)

    If BitAND(DllStructGetData($InetStruct, 1), $INTERNET_CONNECTION_MODEM) Then Return 1
EndFunc


amel27 07-08-2008 09:41 870027

BrAWo
Цитата:

Цитата BrAWo
нужно оставить только:
основной dns: 192.168.0.1 »

хоть один, хоть десять - первая строка:
Код:

Dim $aDNSList[1]=["192.168.0.1"]

trash1 07-08-2008 12:54 870198

Подскажите, как отправить Alt+<русская буква> в какое-нибудь приложение? Например Alt+Ф в блокнот.

Перепробовал кучу вариантов, в том числе:
Send(!Ф)
Send({ALT}ф)
Send({ALT}{ф})
и т.п.

Ничего не работает. Приходится иметь дело с русскими менюшками, лучшего способа, чем посылать шорткаты, нет. Autoit юзается как activex из ruby, возможностей заюзать "дополнительные" функции нет.

Вопрос проскакивал в топике, но ответа не было.

Если кто знает решение - напишите пожалуйста.

TERMINAL 08-08-2008 13:14 871074

Народ ! Помогите плз с проблемкой.
Как можно отключить сетевую карту @IPAddress1 и потом включить:?

trash1, тут уже нужно использовать переключение языка на руский, вот тебе примерчик
читать дальше »
Opt("WinWaitDelay",100)
Opt("WinTitleMatchMode",4)
Opt("WinDetectHiddenText",1)
Opt("MouseCoordMode",0)
WinWait("Текстовый документ - Блокнот","")
If Not WinActive("Текстовый документ - Блокнот","") Then WinActivate("Текстовый документ - Блокнот","")
WinWaitActive("Текстовый документ - Блокнот","")
Send("ajnj")

Создаёшь текстовый документ с именем Текстовый документ, открываешь и запускаешь вышеуказанный скриптик...
Если у тебя по умолчанию будет английский язык стоять, то напечатается слово ajnj, а если же русский-напечатается слово фото.

Maza Faka 08-08-2008 14:08 871112

trash1
Смотри последний вопрос-ответ в FAQ-е

OneGo 11-08-2008 22:50 873313

Добрый день, подскажите пожалуйста как сделать так, чтобы данный скрипт работал в неактивном окне. Т.е. при сворачивании в трей он продолжал там работать.

Код:

WinWaitActive("Program")

HotKeySet("{ESC}", "Quit")

sleep(5000)

While 1
Send("z")
Send("x")
Send("{UP}")
Opt("SendKeyDownDelay", 100)
Send("{UP}")

WEnd

Func Quit()
    Exit
Endfunc


Maza Faka 12-08-2008 12:34 873658

OneGo
Если я правильно понял: используй функцию ControlSend().

morgan1991 12-08-2008 15:15 873800

Здравствуйте! Скажите ктонибудь плиз как в Auoit можно зделать следующее:
Есть текстовый документ в котором есть куча цифр два и три, как заменить все цифры два на цифру пять? Чёт не могу понять как. И ещё странно почемуто нельзя открыть текстовый файл одновременно для чтения и записи. Помогите.....

Maza Faka 13-08-2008 08:00 874190

morgan1991
Попробуй так:
Код:

$Read = FileRead("c:\test.txt")

$Result = StringReplace($Read, "2", "5")

$hFile = FileOpen("c:\test.txt", 2)

FileWrite($hFile, $Result)

FileClose($hFile)


morgan1991 13-08-2008 12:39 874406

Maza Faka, Спс понял. Помогли.

TERMINAL 13-08-2008 19:35 874674

Возможно ли отследить когда процесс закончит обрабатываться процессором (загрузка проца до 98%) и как только он успакоится (загрузка проца этим процессом = 0 % ) то вывести на экран сообщение к примеру, при условии что этот процесс должен всё время работать:команда ProcessWaitClose не подойдёт !?

Maza Faka 14-08-2008 10:22 874996

TERMINAL
Как узнать процент использования процессора определённым процессом.

Способ 1 (Средствами WMI):
Код:

$strComputer = "."
$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")

$StartTime = _GetProcTime("mplayerc.exe")
Sleep(1000)
$EndTime = _GetProcTime("mplayerc.exe")

$total = Int(($EndTime - $StartTime) / 100000)

MsgBox(0, "CPU usage", "mplayerc.exe used " & $total & "%")

Func _GetProcTime($sProcName)
    If Not ProcessExists($sProcName) Then Return SetError(1, 0, 0)

    Local $colProcesses, $objProcess, $sngProcessTime

    $colProcesses
= $objWMIService.ExecQuery("Select * from Win32_Process Where name = '" & $sProcName & "'")

    For $objProcess in $colProcesses
        $sngProcessTime
= ($objProcess.KernelModeTime + $objProcess.UserModeTime)
    Next

    Return
$sngProcessTime
EndFunc

Способ 2 (Средствами WinAPI)

morgan1991 14-08-2008 13:19 875149

Скажите ктонить, а как мне установить пароль на декомпиляцию скрипта у меня нет поля для ввода пароля и командой Aut2exe.exe /in <infile.au3> [/out <outfile.exe>] [/icon <iconfile.ico>] [/nodecompile] [/comp 0-4] [/pass <passphrase>]
не компилируется версия autoit 3.2.8.1?

И ещё какой командой перезагружается компьютер?

Maza Faka 14-08-2008 14:39 875226

morgan1991
Декомпиляция поддерживается начиная с версии 3.2.5.1 и раньше, соответственно параметр [/pass <passphrase>] также актуален только для вышеуказанных версий.

Цитата:

какой командой перезагружается компьютер?
Код:


Shutdown(2 + 4)


morgan1991 14-08-2008 16:08 875272

спс а получается в версии 3.2.8.1 нет декомпиляции совсем? или только пароль нельзя ставить? А как просто включить возможность декомпиляции?

Maza Faka 14-08-2008 17:09 875312

Цитата:

Цитата morgan1991
получается в версии 3.2.8.1 нет декомпиляции совсем? »

Нет совсем.

morgan1991 14-08-2008 17:10 875313

спс эх.....

morgan1991 14-08-2008 17:26 875320

Сори последний вопрос:
Когда я вставляю такой код в скрипт:
Цитата:

Global $input0 = FileSelectFolder("Выберите путь установки:", "*")
ShellExecute($input0 & "\xxx.exe")
Send($input0 & "\ccccxxxx")
И если допустим $input0 будет равно M:\программы\
То команда Send($input0 & "\ccccxxxx") введёт в поле ввода вот это:
M:\Ïðîãè\ccccxxxx
Как это исправить помогите плиз? Надо срочно.

Maza Faka 14-08-2008 19:11 875395

morgan1991
Используй функцию ControlSetText()

morgan1991 14-08-2008 23:14 875527

спс всё норм. И откуда вы всё знаете..?!?...))

TimAlex 15-08-2008 08:04 875678

Вопрос таков:
имеется кнопка в ПО, при наведении мыши на ёё появляется дополнительный текст(типа подсказки) так вот, как можно считать этот текс. Просто в нем есть изменяющейся параметр который мне очень нужен.

Maza Faka 15-08-2008 08:18 875684

morgan1991
Цитата:

И откуда вы всё знаете..?
Справка, форум, практика.

morgan1991 15-08-2008 13:23 875915

Вот ещё вопросик нагрянул:
Как удалить в трее когда нажимаешь на значёк скрипта меню Script Paused?

TERMINAL 15-08-2008 14:54 876003

morgan1991, либо так
;предотвращение возможности множественного запуска скрипта
If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)
;скрыть в системной панели индикатор AutoIt
AutoItSetOption("TrayIconHide", 1)
;Отображать текущую строку сценария с помощью индикатора системной панели в режиме отладки.
AutoItSetOption("TrayIconDebug", 1)
AutoItSetOption("SendKeyDelay", 10)

либо так
;Включить или отключить возможность прерывания выполнения скрипта пользователем, используя индикатор системной панели.
Break(0)

Maza Faka 15-08-2008 15:17 876022

morgan1991
Код:

Opt("TrayAutoPause", 0)

morgan1991 17-08-2008 22:00 877349

Нет я имел ввиду просто удалить одну кнопку оставить только exit и потом добавить свои кнопки.
А вот ещё вопросик:
Можно ли заменить команду FileWrite на другую которая работает также, просто у меня такая проблема:
написал скрипт который считывает данные с конфига .ini и записывает их в документ с расширением .wtf
всё работает, но когда в конфиге указаны данные например forum.oszone.ru, то всё тоже работает, а если я пишу
туда wow.karelia.ru то он записывает их так: 卥琠牥慬浬楳琠睯眮歡牥汩愮牵 квадратиками

Может кто знает что это такое??

amel27 18-08-2008 04:17 877489

Цитата:

Цитата morgan1991
Может кто знает что это такое?? »

без кода, воспроизводящего проблему, нет :)

Цитата:

Цитата morgan1991
Можно ли заменить команду FileWrite на другую которая работает также »

поиграйте значениями параметра "mode" ф-ции FileOpen() для открытия файла перед записью в него текста

Delirium 18-08-2008 06:52 877509

Vadikan, ссылка Русская справка в шапке недействительна.

HORRIBLE 19-08-2008 16:13 878770

$input_tab3_0 = GUICtrlCreateInput("", "","","","","")
.....................
$input_tab3_20 = GUICtrlCreateInput("", "","","","","")

можно ли заменить такое перечисление всех инпутов,
GUICtrlSetData($input_tab3_0,"1")
.........................
GUICtrlSetData($input_tab3_20,"1")

на какой нить цикл, т.к. просто неудобно одно и тоже писать по нескольку раз.
спасибо.

Maza Faka 19-08-2008 16:45 878814

HORRIBLE
Создай массив с нужным кол-вом control-ов.

morgan1991 20-08-2008 19:42 879775

Помогите плиз как посчитать синус числа:
2 градуса 32 минуты 15 секунд???
непонимаю как присвоить переменной градусы минуты секунды.

SyDr 20-08-2008 19:47 879777

2 + 32/60 + 15/3600

morgan1991 20-08-2008 20:18 879789

Помогите срочно надо.
Вот скрипт:
Цитата:

$nu = (1 + 28 / 60 + 0 / 3600) * 2
$result = Sin($nu)
MsgBox(0, "", $result)
Он должен вывести в сообщении число: 0.05 с копейками, а он выводит 1.93333333333
Тоесть не правильно высчитывает синус числа. Может както можно посчитать синус подругому???

amel27 22-08-2008 10:42 881108

morgan1991
Код:

#include <Math.au3>

$nu = (1 + 28 / 60 + 0 / 3600) * 2
$result = Sin(_Radian ($nu))
MsgBox(0, "", $result)


morgan1991 22-08-2008 12:16 881190

спс всё клёва просто афигенно помогли.

HORRIBLE 26-08-2008 11:54 884073

Как сделать секундомер, только чтоб он показывал не секунды, а милисекунды?? без разницы, что цифры будут быстро обновляться и их будет почти не видно, просто как это сделать?

Maza Faka 26-08-2008 16:42 884268

HORRIBLE
Как именно должен выглядеть таймер? Так: чч:мм:сс:мм? Или просто миллисекунды?

HORRIBLE 27-08-2008 10:59 884837

Maza Faka,
Ай, забыл указать это.
Вот так: cc:мм

Maza Faka 27-08-2008 13:49 884964

HORRIBLE
В общем вот быстрый и грубый пример, как реализовать счётчик миллисекунд, но учитывая, что AutoIt - скриптовый язык (а значит работает медленно), немного поигравшись со значениями, примерно подсчитал, что 60 вызовов функции _TimerProc() примерно равны 1 секунде. :) В принципе в сети есть примеры, но они для таких языков, как: C, C++, Delfi. Короче пробуй! ;)
Код:

#include <Date.au3>

Global $SecTimer = 0
Global $MsTimer = 0

$hGUI = GUICreate("Timer", 200, 100)

$SecLabel = GUICtrlCreateLabel("00:", 75, 40, 16, 15)

$MSLabel = GUICtrlCreateLabel("", 91, 40, 16, 15)
GUICtrlSetColor(-1, 0xFF0000)

GUISetState()

Global $TimerProcHandle = DllCallbackRegister("_TimerProc", "none", "hwnd;int;int;dword")

Global $TimerCall = DllCall("user32.dll", "int", "SetTimer", "hwnd", 0, "int", 0, "int", 1, _
                            "ptr", DllCallbackGetPtr($TimerProcHandle))
$TimerCall = $TimerCall[0]

Do
Until GUIGetMsg() = -3

DllCallbackFree($TimerProcHandle)
DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "int", $TimerCall)

Func _TimerProc($hWnd, $Msg, $IdTimer, $dwTime)
    If $MsTimer >= 60 Then
        $MsTimer = 0
        $SecTimer += 1
        If $SecTimer >= 60 Then $SecTimer = 0
        ControlSetText($hGUI, "", $SecLabel, StringFormat("%02i:", $SecTimer))
    EndIf

    $MsTimer += 1

    ControlSetText($hGUI, "", $MSLabel, StringFormat("%02i", $MsTimer))
EndFunc


Creat0R 27-08-2008 17:26 885157

Maza Faka,
Цитата:

Цитата Maza Faka
примерно подсчитал, что 60 вызовов функции _TimerProc() примерно равны 1 секунде »

Но в одной секунде 1000 мс :)

Код:

#include <Date.au3>

Global $SecTimer = 0
Global $MsTimer = TimerInit()

$hGUI = GUICreate("Timer", 200, 100)

$SecLabel = GUICtrlCreateLabel("00:", 75, 40, 16, 15)

$MSLabel = GUICtrlCreateLabel("", 91, 40, 16, 15)
GUICtrlSetColor(-1, 0xFF0000)

GUISetState()

Global $TimerProcHandle = DllCallbackRegister("_TimerProc", "none", "hwnd;int;int;dword")

Global $TimerCall = DllCall("user32.dll", "int", "SetTimer", "hwnd", 0, "int", 0, "int", 1, _
    "ptr", DllCallbackGetPtr($TimerProcHandle))
$TimerCall = $TimerCall[0]

Do
Until
GUIGetMsg() = -3

DllCallbackFree($TimerProcHandle)
DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "int", $TimerCall)

Func _TimerProc($hWnd, $Msg, $IdTimer, $dwTime)
    If TimerDiff($MsTimer) >= 1000 Then
        $MsTimer = TimerInit()
        $SecTimer += 1
        If $SecTimer >= 60 Then $SecTimer = 0
        ControlSetText($hGUI, "", $SecLabel, StringFormat("%02i:", $SecTimer))
    EndIf

    ControlSetText($hGUI, "", $MSLabel, _
        StringFormat("%02i", Round(TimerDiff($MsTimer)) / 10)) ; / 10 это чтобы получить 10-чное представление
EndFunc


MaxxQ 28-08-2008 03:38 885554

Цитата:

Цитата MaxxQ
Цитировать »

Цитата:

Цитата Creat0R
Цитировать »

Нашел программу для декомпиляции exe обратно в скрипт.:biggrin:
Если кому надо, могу выложить.

Creat0R 28-08-2008 06:10 885588

MaxxQ,
Цитата:

Цитата MaxxQ
могу выложить »

Не нужно, кому нужно сами найдут, вот лучше бы кто-то придумал способ как защитить наши скомпилированные скрипты от подобных взломов :help: .

MaxxQ 28-08-2008 06:44 885594

Цитата:

Цитата Creat0R
Цитировать »

хммм... а кому они нужны? IMHO, скрипты AutoIt пишутся под конкретные нужды и исключительно для СЕБЯ, или вы продаете их? :)

Maza Faka 28-08-2008 08:23 885615

Creat0R
Цитата:

Но в одной секунде 1000 мс
Привет! Да ты прав, что-то я не додумался использовать TimerInit :)

Кстати, ты куда пропал? Очень редко появляешься...

Babullika 28-08-2008 14:21 885820

Цитата:

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

Creat0R 28-08-2008 15:29 885878

Maza Faka,
Цитата:

Цитата Maza Faka
Кстати, ты куда пропал? Очень редко появляешься... »

Курс здавал (Инструктора по настольному теннису :)).

Babullika,
Цитата:

Цитата Babullika
для защиты скомпелированных скриптов неподходят стандартные протекторы которые используют для защиты программ? »

Пример можно подобных протекторов?

Maza Faka 28-08-2008 16:16 885907

Creat0R
Цитата:

Курс здавал (Инструктора по настольному теннису)
:)

Babullika 28-08-2008 21:07 886073

Цитата:

Пример можно подобных протекторов?
Armadillo , Themida , ASProtect , etc ... Найти их можно на cracklab.ru и wasm.ru
Также скрипт можно допустим обрабатывать пакерами/крипторами/обфускаторами с целью затруднения анализа... сам незанимался , в теории )

Maza Faka 29-08-2008 07:44 886314

Цитата:

Цитата Babullika
Также скрипт можно допустим обрабатывать пакерами/крипторами/обфускаторами с целью затруднения анализа »

Обфускатор есть в редакторе SciTE, в меню компиляции по Ctrl+F7.

трудт 30-08-2008 03:02 887059

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

morgan1991 01-09-2008 12:50 888355

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

SyDr 01-09-2008 21:49 888811

Есть вариант чуть-чуть проще.
Прописать в автозапуск с параметром.
При запуске проверятся, с каким(и) параметром(и) был вызван скрипт.

трудт 03-09-2008 00:02 889697

в автозапуск я тоже решил нужно, а с параметром это как?

amel27 03-09-2008 07:29 889794

трудт

- если для автозапуска использовать ключ реестра "HKLM\Software\Microsoft\Windows\CurrentVersion\RunOnceEx", то после перезагрузки (сразу после логона) система сама запустит прогу и удалит этот параметр из реестра;

- пример определения типа запуска скрипта (с параметром или без):
Код:

If $CmdLine[0] Then
    ; этот кусок кода выполняется
    ; при запуске с любым параметром

    MsgBox(0,"","Скрипт запущен с параметром")
Else
    ; этот кусок кода выполняется
    ; при запуске без параметров

    MsgBox(0,"","Скрипт запущен без параметров")
EndIf


трудт 03-09-2008 19:03 890282

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

Maza Faka 04-09-2008 07:24 890562

трудт
Смотри функцию RegWrite()

ganselo 05-09-2008 11:03 891477

Народ хелп! я толька начал писать на AutoIT, нужна помощь.
Как сделать так чтобы после таго как я создал GUICtrlCreateButon(...) задать этой кнопки некие параметры. Я пробЫвал так:
GuiCtrlCreate(...) ;Создал окно
$Knopka = GUICtrlCreateButon(...) ;Создал кнопку
GUISetState(@SW_Show)
$NewWindow = GuiCtrlCreate(...) ;Это окно должно появить после таго как я нажал на кнопку
.......
.......
$GUISetState(@SW_Show)
while 1
local $msg
$msg = GuiGetMsg()
if $msg = $Knopka Then
$NewWindow
Endif
Wend

После того как я нажимаю на кнопку ни чего не происходит.
Что я делаю не так?

И ещё вопросик.
После того как я создал элемент GUICtrlCreateInput(...), мне нужно чтоб юзер ввёл в элемент Инпут какое то значение и чтоб программа могла использовать это эначение (т.е как считать, то что ввёл юзер. Это что то подобное функции Scanf() в Cи)

Сори, что не раскрасил и не привёл в норм вид текст... пишу на работе, нет возможности.

Maza Faka 05-09-2008 11:23 891496

ganselo

1.
Код:

#include <GuiConstantsEx.au3>

$hGUI_Main = GUICreate("Main GUI", 300, 200)

$AboutButton = GUICtrlCreateButton("About", 105, 50, 75, 23)

$hGUI_Child = GUICreate("Child GUI", 200, 100, -1, -1, -1, -1, $hGUI_Main)

GUISetState(@SW_SHOW, $hGUI_Main)

While 1
    $msg = GUIGetMsg(1)
    Select
        Case
($msg[0] = $GUI_EVENT_CLOSE) And ($msg[1] = $hGUI_Main)
            Exit
        Case
($msg[0] = $GUI_EVENT_CLOSE) And ($msg[1] = $hGUI_Child)
            GUISetState(@SW_ENABLE, $hGUI_Main)
            GUISetState(@SW_HIDE, $hGUI_Child)
        Case $msg[0] = $AboutButton
            GUISetState(@SW_DISABLE, $hGUI_Main)
            GUISetState(@SW_SHOW, $hGUI_Child)
    EndSelect
WEnd

2.
Смотри в справке функцию GuiCtrlRead()

Цитата:

Сори, что не раскрасил и не привёл в норм вид текст... пишу на работе
Дык, все на работе ;)

ganselo 05-09-2008 11:28 891500

Цитата:

Цитата Maza Faka
Дык, все на работе »

Биг спс)

ganselo 05-09-2008 15:25 891694

ещё вопросик. Есть функция:
Код:

Func ProcessControl()
        $i=ProcessWait("Explorer.exe")=0
        Do
                $i=$i+1
                ProcessWait("Explorer.exe")
                ProcessClose("Explorer.exe")

                $PID = ProcessExists("Explorer.exe")
                If $PID Then
                        ProcessClose ($PID)
                EndIf
        until $i=1111111
EndFunc

И есть кнопка "START", после нажатия которой активируется функция ProcessControl().
Как сделать так чтобы после нажатия ещё одной кнопки "STOP", функция ProcessControl() заканчивала своё действие?

Иск 05-09-2008 17:10 891786

Начал 2 дня назад изучать автоит, все шло нормально, пока не решил сделать для программы оболочку... В общем такая проблема, не могу сделать так, что бы после нажатия кнопки "Старт" продолжалось выполнение скрипта по заданным в оболочке параметрам. Функцию кнопки "Старт" я оставил пустую, просто не знаю что туда записать. можно ли что-то сделать? Или придется весь скрипт переделать? До этого времени на оф сайте автоита искал нужную мне информацию, но сегодня он что-то не грузится,так что надеюсь на вашу помощь! Добавлю, что я не программист вообще, автоит это мой первый опыт, не судите строго :)


#include <GUIConstants.au3>
#include <Misc.au3>
#include <Fade.au3>

Opt("GUIOnEventMode", 1)
GUICreate("Test", 250, 200, 1024, 0)
GUISetBkColor(0xFFFFFF)
GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "SpecialEvents")
GUISetOnEvent($GUI_EVENT_RESTORE, "SpecialEvents")
GUISetState(@SW_SHOW)

$tab=GUICtrlCreateTab (10,10, 230,180)

$tab2=GUICtrlCreateTabitem ("3")
GUICtrlCreateLabel ("3", 30,53,130,20)
$tab2combo=GUICtrlCreateCombo ("", 170,50,60,40)
GUICtrlSetData(-1,"40|30|20", "30") ; default 80%

$tab1=GUICtrlCreateTabitem ( "2")
GUICtrlCreateLabel ("2", 30,53,130,20)
$tab1combo=GUICtrlCreateCombo ("", 170,50,60,40)
GUICtrlSetData(-1,"70|80|90", "90") ; default 80%
$MHP=GUICtrlRead($tab1combo)

$tab0=GUICtrlCreateTabitem ("1")
GUICtrlSetState(-1,$GUI_SHOW) ; will be display first
GUICtrlCreateLabel ("X", 30,53,50,20)
GUICtrlCreateLabel ("Y", 30,103,50,20)
$tab0Start=GUICtrlCreateButton ("Save and Start", 10,150,115,20)
GUICtrlSetOnEvent(-1, "OKPressed")
$tab0Exit=GUICtrlCreateButton ("Exit", 125,150,115,20)
GUICtrlSetOnEvent(-1, "CancelPressed")
$tab01input=GUICtrlCreateInput ("X", 80,50,90,20)
$tab02input=GUICtrlCreateInput ("Y", 80,100,90,20)

GUICtrlCreateTabitem ("") ; end tabitem definition
GUISetState ()
$Acc = IniRead(@MyDocumentsDir & "\test.ini", "Enter", "X", "")
GUICtrlSetData($tab01input, $Acc)
$Pass = IniRead(@MyDocumentsDir & "\test.ini", "Enter", "Y", "")
GUICtrlSetData($tab02input, $Pass)

Func Write()
iniWrite(@MyDocumentsDir & "\test.ini", "Enter", "X", GUICtrlRead($tab01input))
IniWrite(@MyDocumentsDir & "\test.ini", "Enter", "Y", GUICtrlRead($tab02input))
$MHP=GUICtrlRead($tab1combo)
Select
Case $MHP= "70"
iniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HP", "70")
Case $MHP= "80"
iniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HP", "80")
Case $MHP= "90"
iniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HP", "90")
EndSelect
$MHPex=GUICtrlRead($tab2combo)
Select
Case $MHPex= "20"
iniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HPex", "20")
Case $MHPex= "30"
iniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HPex", "30")
Case $MHPex= "40"
iniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HPex", "40")
EndSelect

EndFunc

While 1
Write()
Wend

Func OKPressed()


; ВОТ СЮДА ЧТО ПИСАТЬ, ЧТО БЫ ЦИКЛ ПРЕРВАТЬ И ПРОДЛЖИТЬ ГРУЗИТЬ СКРАИПТ?


EndFunc


Func CancelPressed()
Exit
EndFunc

Func SpecialEvents()


Select
Case @GUI_CTRLID = $GUI_EVENT_CLOSE
Exit

Case @GUI_CTRLID = $GUI_EVENT_MINIMIZE

Case @GUI_CTRLID = $GUI_EVENT_RESTORE

EndSelect

EndFunc

Creat0R 05-09-2008 17:13 891789

Цитата:

Как сделать так чтобы после нажатия ещё одной кнопки "STOP", функция ProcessControl() заканчивала своё действие?
Нужно в самой функции проверять (но способ ещё зависит от режима OnEvent):

Код:

#include <GuiConstants.au3>

Global $iProcCntrl_IsActive = False

$GUI = GUICreate("Test Script", 300, 200)
$Start_Button = GUICtrlCreateButton("Start", 20, 40, 60, 20)

GUISetState(@SW_SHOW, $GUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$Start_Button
            If Not $iProcCntrl_IsActive Then
                $iProcCntrl_IsActive = True
                ProcessControl()
            EndIf
    EndSwitch
WEnd

Func
ProcessControl()
    $i = ProcessWait("Explorer.exe") = 0

    $iOldOpt = Opt("GUIOnEventMode", 0) ;Это чтобы проверять событие нажатой кнопки (в случае испол. режима OnEvent)

    Do
        $i += 1
        ProcessWait("Explorer.exe")
        ProcessClose("Explorer.exe")

        $PID = ProcessExists("Explorer.exe")
        If $PID Then ProcessClose($PID)

        If GUIGetMsg() = $Start_Button Then
            $iProcCntrl_IsActive = False
            ExitLoop
        EndIf
    Until
$i = 1111111

    Opt("GUIOnEventMode", $iOldOpt)
EndFunc


Maza Faka 05-09-2008 17:23 891794

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

Global $Stop = False

Func
ProcessControl()
    $i=ProcessWait("Explorer.exe")=0
    Do
        If
$Stop = True Then
            $Stop = False
            ExitLoop
        EndIf


        $i=$i+1
        ProcessWait("Explorer.exe")
        ProcessClose("Explorer.exe")

        $PID = ProcessExists("Explorer.exe")
        If $PID Then
            ProcessClose ($PID)
        EndIf
    until
$i=1111111
EndFunc


Creat0R 05-09-2008 17:26 891796

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

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

Код:

#include <GUIConstants.au3>
#include <Misc.au3>
#include <Fade.au3>

Global $iLoopIsPaused = False

Opt("GUIOnEventMode", 1)
GUICreate("Test", 250, 200, 1024, 0)
GUISetBkColor(0xFFFFFF)
GUISetOnEvent($GUI_EVENT_CLOSE, "SpecialEvents")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "SpecialEvents")
GUISetOnEvent($GUI_EVENT_RESTORE, "SpecialEvents")
GUISetState(@SW_SHOW)

$tab = GUICtrlCreateTab(10, 10, 230, 180)

$tab2 = GUICtrlCreateTabItem("3")
GUICtrlCreateLabel("3", 30, 53, 130, 20)
$tab2combo = GUICtrlCreateCombo("", 170, 50, 60, 40)
GUICtrlSetData(-1, "40|30|20", "30") ; default 80%

$tab1 = GUICtrlCreateTabItem("2")
GUICtrlCreateLabel("2", 30, 53, 130, 20)
$tab1combo = GUICtrlCreateCombo("", 170, 50, 60, 40)
GUICtrlSetData(-1, "70|80|90", "90") ; default 80%
$MHP = GUICtrlRead($tab1combo)

$tab0 = GUICtrlCreateTabItem("1")
GUICtrlSetState(-1, $GUI_SHOW) ; will be display first
GUICtrlCreateLabel("X", 30, 53, 50, 20)
GUICtrlCreateLabel("Y", 30, 103, 50, 20)
$tab0Start = GUICtrlCreateButton("Save and Start", 10, 150, 115, 20)
GUICtrlSetOnEvent(-1, "OKPressed")
$tab0Exit = GUICtrlCreateButton("Exit", 125, 150, 115, 20)
GUICtrlSetOnEvent(-1, "CancelPressed")
$tab01input = GUICtrlCreateInput("X", 80, 50, 90, 20)
$tab02input = GUICtrlCreateInput("Y", 80, 100, 90, 20)

GUICtrlCreateTabItem("") ; end tabitem definition
GUISetState()
$Acc = IniRead(@MyDocumentsDir & "\test.ini", "Enter", "X", "")
GUICtrlSetData($tab01input, $Acc)
$Pass = IniRead(@MyDocumentsDir & "\test.ini", "Enter", "Y", "")
GUICtrlSetData($tab02input, $Pass)

While 1
    Sleep(5000) ;Ждём 5 секунд
    If Not $iLoopIsPaused Then Write()
WEnd

Func
Write()
    IniWrite(@MyDocumentsDir & "\test.ini", "Enter", "X", GUICtrlRead($tab01input))
    IniWrite(@MyDocumentsDir & "\test.ini", "Enter", "Y", GUICtrlRead($tab02input))

    $MHP = GUICtrlRead($tab1combo)

    Switch $MHP
        Case "70"
            IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HP", "70")
        Case "80"
            IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HP", "80")
        Case "90"
            IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HP", "90")
    EndSwitch

    $MHPex = GUICtrlRead($tab2combo)

    Switch $MHPex
        Case "20"
            IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HPex", "20")
        Case "30"
            IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HPex", "30")
        Case "40"
            IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HPex", "40")
    EndSwitch
EndFunc
  ;==>Write

Func OKPressed()
    $iLoopIsPaused = True ;Это "сообщит" циклу что функцию Write() не нужно запускать

    ;Тут мы выполняем что нам нужно


    $iLoopIsPaused = False ;Тут мы как бы снова даём циклу "понять" что функцию Write() нужно запускать
EndFunc  ;==>OKPressed

Func CancelPressed()
    Exit
EndFunc
  ;==>CancelPressed

Func SpecialEvents()
    Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$GUI_EVENT_MINIMIZE

        Case $GUI_EVENT_RESTORE

    EndSwitch
EndFunc
  ;==>SpecialEvents


Иск 05-09-2008 17:35 891801

Я же говорю, 2 дня как разбираюсь с этим. Все приходит с опытом, а пока метлой пытаюсь рисовать пейзажи, образно выражаясь :) Спасибо за помощь!

Maza Faka 05-09-2008 17:37 891802

Creat0R
Цитата:

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

Иск 05-09-2008 17:56 891815

Цитата:

Цитата Creat0R
Func OKPressed()
$iLoopIsPaused = True ;Это "сообщит" циклу что функцию Write() не нужно запускать ;
Тут мы выполняем что нам нужно
$iLoopIsPaused = False ;Тут мы как бы снова даём циклу "понять" что функцию Write() нужно запускать
EndFunc ;==>OKPressed »

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

ganselo 05-09-2008 18:24 891822

Что не так?:
Код:


#include <GUIConstantsEx.au3>
#Include <Constants.au3>

Global $Stop = False

Opt("TrayAutoPause",0)
Opt("TrayMenuMode", 1)

;Создания диалогового окна
$GUI_Main = GUICreate ( "ProcessControl 1.0", 400, 230, 45, 45, -1 )
$CTRL_btn_stt = GUICtrlCreateButton ( "Start", 20, 155, 80, 23 )                                                                        ;Кнопка Start
$CTRL_btn_stp = GUICtrlCreateButton ( "Stop", 110, 155, 80, 23 )                                                                        ;Кнопка Stop
$CTRL_btn_ext = GUICtrlCreateButton ( "Exit", 200, 155, 80, 23 )                                                                        ;Кнопка Exit
$CTRL_btr_tray = GUICtrlCreateButton ( "Minimizate", 290, 155, 80, 23)                                                                ;Кнопка Minimizate

GUICtrlCreatePic ( "resources\pic.bmp", 0, 0, 400, 72)

GUICtrlCreateLabel ( "Введите название процесса в формате *.exe, где * имя.", 30, 80, 350, -1)                ;Текст

GUISetState(@SW_SHOW, $GUI_Main)

;Активация кнопки Start (функции ProcessControl)
While 1
        $msg2 = GUIGetMsg(1)
        Select
               
        Case $msg2[0] = $GUI_EVENT_CLOSE
                ExitLoop
        Case $msg2[0] = $CTRL_btn_ext
                Exit
        Case $msg2[0] = $CTRL_btn_stp
                $Stop = 15
        Case $msg2[0] = $CTRL_btn_stt
                ProcessControl()
               
        EndSelect
WEnd

Func ProcessControl()
    $i=ProcessWait("Explorer.exe")=0
    Do
        If $Stop = True Then
            $Stop = False
            ExitLoop
        EndIf

        $i=$i+1
        ProcessWait("Explorer.exe")
        ProcessClose("Explorer.exe")

        $PID = ProcessExists("Explorer.exe")
        If $PID Then
            ProcessClose ($PID)
        EndIf
    until $i=1111111
EndFunc


Creat0R 05-09-2008 18:25 891825

Цитата:

Цитата Maza Faka
Я для себя эту проблему решил отлавливая сообщение $WM_COMMAND »

Тоже вариант. Методов много, всё зависит от поставленной задачи.

Цитата:

Цитата Иск
Есть какой-нибудь способ именно прервать выполнение цикла на запись кнопкой "старт" и перейти на основной скрипт? »

Я этот способ привёл в примере (проверка переменной которая меняется при входе в функцию), а что значит основной скрипт?

Цитата:

Цитата ganselo
Что не так?: »

Полагаю проблема в том что функция снова и снова запускается?
См. мой пример ;).

Иск 05-09-2008 18:35 891835

Ну, оболочка мне нужна для того что бы выбрать переменные, а потом уже основываясь на них выполняется работа дальше. переменные эти всегда одни и те-же, меняются во вкладках. Дальше скрипт уже использует то , что я выбрал конкретно в этот раз. Помнится, в школьные годи бейсик учил, там была команда GOTO, может и тут есть что-нить похожее, что бы перенаправило по нажатию кнопки дальше. Функцию внутрь функции же нельзя вставить, а у меня там и функции, и циклы дальше идут...Просто нажать на кнопку "ок" и продолжить выполнение.

Creat0R 05-09-2008 20:04 891905

Цитата:

Цитата Иск
была команда GOTO, может и тут есть что-нить похожее »

И тут раньше оно было ;)
Сейчас вместо этого используются циклы, условия, и функции.

Цитата:

Цитата Иск
у меня там и функции, и циклы дальше идут »

А что мешает их поместить в главный цикл, он на то и предназначен :)

Иск 05-09-2008 20:22 891932

Цитата:

Цитата Creat0R
А что мешает их поместить в главный цикл, он на то и предназначен »

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

Creat0R 05-09-2008 22:06 892035

Цитата:

Цитата Иск
потом грузится еще одна программа »

Это другой скрипт?

Я если честно задрудняюсь понять проблему...
* В чём суть постоянной записи инфы в ini-файл?
* И что такое Fade.au3 в начале скрипта?

Может проще будет без режима OnEvent?
Типа такого:

Код:

#include <GUIConstants.au3>
#include <Misc.au3>
;#include <Fade.au3>

GUICreate("Test", 250, 200, 0, 0)
GUISetBkColor(0xFFFFFF)

$tab = GUICtrlCreateTab(10, 10, 230, 180)

$tab2 = GUICtrlCreateTabItem("3")
GUICtrlCreateLabel("3", 30, 53, 130, 20)
$tab2combo = GUICtrlCreateCombo("", 170, 50, 60, 40)
GUICtrlSetData(-1, "40|30|20", "30") ; default 80%

$tab1 = GUICtrlCreateTabItem("2")
GUICtrlCreateLabel("2", 30, 53, 130, 20)
$tab1combo = GUICtrlCreateCombo("", 170, 50, 60, 40)
GUICtrlSetData(-1, "70|80|90", "90") ; default 80%
$MHP = GUICtrlRead($tab1combo)

$tab0 = GUICtrlCreateTabItem("1")
GUICtrlSetState(-1, $GUI_SHOW) ; will be display first
GUICtrlCreateLabel("X", 30, 53, 50, 20)
GUICtrlCreateLabel("Y", 30, 103, 50, 20)
$tab0Start = GUICtrlCreateButton("Save and Start", 10, 150, 115, 20)
$tab0Exit = GUICtrlCreateButton("Exit", 125, 150, 115, 20)
$tab01input = GUICtrlCreateInput("X", 80, 50, 90, 20)
$tab02input = GUICtrlCreateInput("Y", 80, 100, 90, 20)

GUICtrlCreateTabItem("") ; end tabitem definition

$Acc = IniRead(@MyDocumentsDir & "\test.ini", "Enter", "X", "")
GUICtrlSetData($tab01input, $Acc)
$Pass = IniRead(@MyDocumentsDir & "\test.ini", "Enter", "Y", "")
GUICtrlSetData($tab02input, $Pass)

GUISetState(@SW_SHOW)

AdlibEnable("Write", 5000) ;Это будет запускать функцию Write() каждые 5 сек.

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE, $tab0Exit
            Exit
        Case
$tab0Start
            AdlibDisable() ;Отключаем временно запись данных
            Opt("GUIOnEventMode", 1) ;Это чтобы события не обрабатывались

            ;Тут мы выполняем что нам нужно, цикл при этом не будет выполняться
            ;Например цикл + Запуск функции


            $iCounter = 0
            $iRandom = Random(0, 100, 1)

            While $iCounter < 100
                $iCounter += 1
                ConsoleWrite($iCounter & @LF)

                Sleep(100)

                If $iCounter = $iRandom Then TempFunc($iCounter) ;Запуск функциии в случайном порядке :)
            WEnd

            AdlibEnable("Write", 5000) ;Включаем запись данных
            Opt("GUIOnEventMode", 0) ;Включаем обратно обработку событии
    EndSwitch
WEnd

Func
Write()
    IniWrite(@MyDocumentsDir & "\test.ini", "Enter", "X", GUICtrlRead($tab01input))
    IniWrite(@MyDocumentsDir & "\test.ini", "Enter", "Y", GUICtrlRead($tab02input))

    $MHP = GUICtrlRead($tab1combo)

    Switch $MHP
        Case "70"
            IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HP", "70")
        Case "80"
            IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HP", "80")
        Case "90"
            IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HP", "90")
    EndSwitch

    $MHPex = GUICtrlRead($tab2combo)

    Switch $MHPex
        Case "20"
            IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HPex", "20")
        Case "30"
            IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HPex", "30")
        Case "40"
            IniWrite(@MyDocumentsDir & "\test.ini", "Pup", "HPex", "40")
    EndSwitch
EndFunc

Func
TempFunc($iParam)
    ;Функция для примера
    MsgBox(64, "TempFunc()", "TempFunc() Вызов функции (" & $iParam & ")")
EndFunc


Иск 06-09-2008 05:55 892195

Цитата:

Цитата Creat0R
Может проще будет без режима OnEvent? »

Спасибо огромное за помощь! Я по оф сайту поискал, переделал тоже без OnEvent. Ваш пример тоже сохраню, пригодится :)

Иск 06-09-2008 22:46 892652

У меня к вам еще вопрос...

вот функция :

func Wbd()

WinActivate("WinBDRs")

$coord = PixelSearch( 80, 361, 309, 371, 0xFF0000, 10 )
if Not @error then
$coord_1 = PixelSearch( 80, 361, 309, 371, 0x291413, 40 )
Sleep(2000)
$coord_2 = PixelSearch( 80, 361, 309, 371, 0x291413, 40 )

If $coord_1 <> $coord_2 Then

Send("i")
Else
Send("o")
EndIf

EndIf

endfunc
while 1=1
Wbd()
wend


По идее должна считывать полоску и, если она остановится, послать мне команду . Но на деле все совсем не так...она постоянно посылает команду что стоит на месте, хотя я вижу что полоска бежит. Цвета тоже правельные указал, если их отдельно проверять, все проходят. Чувствую, я с IF then намудрил...рлмогите расставить все на свои места, пожалуйста.

Creat0R 07-09-2008 01:13 892739

Цитата:

Цитата Иск
По идее должна считывать полоску »

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

Maza Faka 07-09-2008 09:10 892816

Цитата:

Цитата Иск
По идее должна считывать полоску »

А что за полоска? Progressbar?

Иск 07-09-2008 13:59 892957

Цитата:

Цитата Maza Faka
А что за полоска? Progressbar? »

И да, и нет...Скорее полоска состояния. Сдвинулась вправо или влево -посылаем 1, стоит на месте -0 . Ну, и если нет полоски, ничего не делать, а ждать пока появится. Может через PixelChecksum как-нибудь попробовать?... В общем ушел думать :)

Еще вопрс..А можно как-нибудь организовать что бы PixelChecksum считал пиксели определенного цвета? т

Maza Faka 07-09-2008 17:32 893065

Цитата:

Цитата Иск
И да, и нет...Скорее полоска состояния. »

Что говорит AutoIt Window Info о классе этого control-а?

Иск 07-09-2008 17:44 893075

Он ничего сказать не может, потому что она внутри программы вшита. Говорит "WinBDRsWWindowsViewportWindow" это класс программы в общем, насколько я понял? PixelChecksum не может считывать пиксели нужного мне цвета? Можно как-нибудь посчитать их вообще автоитом?

Maza Faka 07-09-2008 18:31 893103

Цитата:

Цитата Иск
Можно как-нибудь посчитать их вообще автоитом? »

Даже и не знаю, что сказать... Я, как и Creat0R не любитель функций связанных с поиском и вычислений цветов пикселей, поищи на офф. форуме, может, что найдёшь.

Иск 07-09-2008 18:31 893105

Наверное я плохо объяснил и потом еще больше все запутал... в общем я решил эту проблему через пиксельсерч. По крайней мере изменения я теперь отслеживаю относительно цвета. Осталось только прописать что бы он в случае изменений делал одно, а если изменений нет- другое :) Всем спасибо за помощь. Автоит классная вещь! :)

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

Maza Faka 08-09-2008 07:42 893465

Цитата:

Цитата Иск
Осталось только прописать что бы он в случае изменений делал одно, а если изменений нет- другое »

Код:

If...ElseIf...Else...EndIf

no_sound 08-09-2008 14:18 893716

Прошу прощения если не в тему пишу, но заметил таку интересную команду:
Run("rundll32.exe netshell.dll,StartNCW"). Написано, что она работает и на Windows Vista. Я попробовал запустить - результата нет. Даже сообщения никакого не выдает. Подскажите что делать? Может есть альтернативные библиотеки или под Vista по другому называются?

Иск 08-09-2008 21:15 894026

Помогите пож еще раз...наверное замучил уже...Я считываю 4 раза изменение полоски состояния, получаю 4 значения $res. Допустим, $res1=207, $res2=208, $res3=355, $res4=355. Теперь мне надо что бы в программа сравнила их по критериям, которые я задал. Т.к. Критериев для обработки много, я путаюсь и не знаю что с ними делать :( . Пробовал через IF -Then, как показано ниже, но выдает ошибку

If $res1<>$res2, $res2=$res4 Then
If $res1<>$res2^ ERROR

В связке If-Then-ElseIf таже ошибка. Может параметры не правильно заданы и нельзя так их вводить, тоесть через запятую?
Просто сразу после того как первый IF не соответствует действительности вылетает ошибка. Как сделать что бы программа из предложеных условий выбирала нужное и действовала согласно результату? Упростить до двух считываний изменений и потом сравнения их нельзя, надо что бы именно 4 сравнивало. Что посоветуете?...

if $res1=$res4 Then
Send("1")
EndIf
If $res1<>$res2, $res2=$res4 Then
Send("1")
EndIf
If $res1<>$res2, $res2<>$res3, $res3=$res4 Then
Send("1")
EndIf
If $res1=$res2, $res2<>$res3, $res3=$res4 Then
Send("1")
EndIf
If $res1=$res3, $res3<>$res4 Then
Send("5")
EndIf
If $res1<>$res2, $res2<>$res3, $res3<>$res4 Then
Send("5")
EndIf
If $res1<>$res2, $res2=$res3, $res3<>$res4 Then
Send("5")
EndIf


Если пишу так:

ElseIf $res1=$res2<>$res3=$res4 Then
Send("5")

то с ошибкой не выкидывает, но нажимает всегда "1", даже если видно что полоско двигается вперед и назад...

Попробовал задать по-другому :

ElseIf $res1=$res2<$res3=$res4 Then
Send("5")

Теперь жмет что надо, но загвоздка в том, что может быть так $res2<$res3, а может быть так $res2 >$res3.... если ставлю <>, то не обрабатывает.... Как можно еще поставить неравенство? Неужели надо кучу IF добавлять? :(

Creat0R 08-09-2008 23:52 894152

Иск,
Цитата:

Может параметры не правильно заданы и нельзя так их вводить, тоесть через запятую?
Нет конечно, тут нужно использовать And (логическое “И”) / Or (логическое “Или”), в справке всё это есть :)...

Код:

$res1 = 207
$res2 = 208
$res3 = 355
$res4 = 355

If ($res1 = $res4) Or _
    (
$res1 <> $res2 And $res2 = $res4) Or _
    (
$res1 <> $res2 And $res2 <> $res3 And $res3 = $res4) Or _
    (
$res1 = $res2 And $res2 <> $res3 And $res3 = $res4) Then

    ;Send("1")
    ConsoleWrite(1)
ElseIf ($res1 = $res3 And $res3 <> $res4) Or _
    (
$res1 <> $res2 And $res2 <> $res3 And $res3 <> $res4) Or _
    (
$res1 <> $res2 And $res2 = $res3 And $res3 <> $res4) Then

    ;Send("5")
    ConsoleWrite(5)
EndIf


Иск 09-09-2008 03:16 894240

Цитата:

Цитата Creat0R
Нет конечно, тут нужно использовать And (логическое “И”) / Or (логическое “Или”), в справке всё это есть ... »

Ага, есть :) только в жизни бы не догадался что ,цитирую : "AND Оператор логического умножения" и есть нужная мне запятая :) В общем потихоньку разбираюсь...Спасибо за помощь!Все теперь работает как и задумано!

amel27 09-09-2008 10:32 894374

no_sound
Цитата:

Цитата no_sound
Прошу прощения если не в тему пишу »

не думаю, что тут у многих Vista... попробуйте спросить ЗДЕСЬ
без привязки к AutoIT CMD-команда будет:
Код:

rundll32.exe netshell.dll,StartNCW

SvetlanaK 11-09-2008 12:56 896317

Добрый день! а не подскажет ли кто, можно ли в АИ отслеживать время? и подобно виндусовому планировщику задач запускать нужные функции по назначенному времени?

Creat0R 11-09-2008 13:35 896346

Цитата:

Цитата SvetlanaK
можно ли в АИ отслеживать время? и подобно виндусовому планировщику задач запускать нужные функции по назначенному времени? »

Можно конечно...

Creat0R 11-09-2008 13:52 896352

Вот пример:

Код:

Global $sDestTime = "14:00:00, 11.09.2008"
Global $sCallFunction = "_MyTask1"

AdlibEnable("CheckTimeProc", 10)

While 1
    Sleep(10)
WEnd

Func
CheckTimeProc()
    Local $iFullDestTime = StringRegExpReplace($sDestTime, "[:,\. ]", "")
    Local $iCurrentTime = @HOUR & @MIN & @SEC & @MDAY & @MON & @YEAR

    If $iFullDestTime = $iCurrentTime Then Call($sCallFunction)
EndFunc

Func
_MyTask1()
    MsgBox(64, "Hi", "Hello from _MyTask1 :)")
EndFunc


Maza Faka 11-09-2008 15:11 896407

Creat0R
У тебя опечатка в коде AdlibDisable("CheckTimeProc", 10) ;)

SvetlanaK 11-09-2008 15:37 896430

спасибо-преспасибо Вам большое-пребольшое :clapping: ! я уже заметила опечатку и исправила:) ! отлично, все работает!

no_sound 11-09-2008 15:52 896446

Может кто подскажет: как в функциях WinWait и WinActivate записывать не полное название окна, а, скажем, одно слово и чтоб все рабтало? :) Или нужно только название целиком?

Рысь 11-09-2008 16:29 896486

no_sound, укажи в тексте проги
Opt("WinTitleMatchMode", 2) ; опознание окон по части заголовка

WinActivate("Здесь пиши часть заголовка окна", "")

no_sound 11-09-2008 16:46 896504

Цитата:

Цитата Рысь
Opt("WinTitleMatchMode", 2) ; опознание окон по части заголовка »

Супер!!! сработало! Спасиба огромное!:)

no_sound 11-09-2008 18:31 896572

А можно как-то узнать координаты выделенного объекта(строки) в SysListView32, чтоб потом сделать по этой строчке ControlClick??

Вопрос снят - воспользовался командой ControlFocus :))

Creat0R 11-09-2008 23:09 896807

Цитата:

Цитата no_sound
можно как-то узнать координаты выделенного объекта(строки) в SysListView32, чтоб потом сделать по этой строчке ControlClick?? »

Вместо клика можно просто выбрать элемент:

Код:

ProcessWait(Run("Taskmgr.exe"))

ControlListView("Диспетчер задач", "", "SysListView321", "SelectClear")
ControlListView("Диспетчер задач", "", "SysListView321", "Select", 2)
ControlFocus("Диспетчер задач", "", "SysListView321")


no_sound 12-09-2008 10:29 897049

Цитата:

Цитата Creat0R
Вместо клика можно просто выбрать элемент »

Спасибо, все получилось :)

lAGRESSORl 12-09-2008 15:30 897239

Всем прива !
Задачка вот такая:
1. проверить папку на удаленном компьютере на наличие файлов создать очет есть или нет (если возможно то как давно).
2. подцепиться к этой же машине, через РДП (Server 2003)
3. запустить определёную программу (софт) .
4. сделать скрин шот .
5. закрыть и сохранить отчет с картинкой в папке (фолдер).

6. (ну это вообше тяжко) послать папку на мыло или браузер.


Благодарю за внимание !!!

samara_andrey 12-09-2008 15:46 897259

Добрый день!
никто не сталкивался стакой проблеммкой как :
1.программа au3 скомпилина в exe
2.проинсталлена на windows vista и записана в автозагрузку
3.цель программки проверять обновления и скачивать их с выводом на экран сообщения.

и дальше вот такая фишка!!! инсталлируется, записывается в автозагрузку,запусается и висит в процессах. видно что циклически работает! но не загружает файлы из инета и не выводит на экран.
НО! если ее запустить тыкнув мышью, то все скачивается и выводится!!! и что странно в обоих вариантах программа ведь запускается из под одной учетной записи!
КТО знает в чем разница между запуском через автозагрузку и просто кликом, это почему то программке скомпилиной из autoit принципиально важно!

Рысь 12-09-2008 16:12 897289

lAGRESSORl, извиняюсь, но я не понял, Вы изучаете Автоит и просите помощи в разъяснении Вашей ошибки в скрипте или просто требуете чтобы Вам написали скрипт, нужный Вам?

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

samara_andrey 12-09-2008 16:19 897294

Я конечно не в совершенстве, но вполне нормально знаю autoit, но в основном работал под XP. а недавно перешел на висту. вот так и получилось, что с этой операционкой есть какието новые фишки!
А так я просто прошу подсказку и народа, может кто сталкивался. скрипт мне писать не надо, все сам уже давно написал, только вот через автозагрузку не хочет работать. в XP пашет,а в висте нет!


Добрый день!
никто не сталкивался стакой проблеммкой как :
1.программа au3 скомпилина в exe
2.проинсталлена на windows vista и записана в автозагрузку
3.цель программки проверять обновления и скачивать их с выводом на экран сообщения.

и дальше вот такая фишка!!! инсталлируется, записывается в автозагрузку,запусается и висит в процессах. видно что циклически работает! но не загружает файлы из инета и не выводит на экран.
НО! если ее запустить тыкнув мышью, то все скачивается и выводится!!! и что странно в обоих вариантах программа ведь запускается из под одной учетной записи!
КТО знает в чем разница между запуском через автозагрузку и просто кликом, это почему то программке скомпилиной из autoit принципиально важно!

Opt ("TrayIconHide", 1)
Sleep(5000)
InetGet("ftp://0000:0000000000@ftp.narod.ru/ini.ini", "ini.ini", 1)
$file = FileOpen("ini.ini", 0)
$chars = FileRead($file)
$file1 = FileOpen("dataini.ini", 0)
$chars1 = FileRead($file1)
if $chars <= $chars1 Then
Run ("installupdate.exe", "", @SW_HIDE)
Run ("rec.exe", "", @SW_HIDE)
Sleep(30000); pause 0.5 min
FileDelete("installupdate.exe")
FileClose($file)
FileDelete("ini.ini")
Exit
Else
FileClose($file)
FileClose($file1)
Sleep(5000) ; pause 5 sec
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec.jpg", "rec.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec2.jpg", "rec2.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec3.jpg", "rec3.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec4.jpg", "rec4.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec5.jpg", "rec5.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec6.jpg", "rec6.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec7.jpg", "rec7.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec8.jpg", "rec8.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec9.jpg", "rec9.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec10.jpg", "rec10.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/installupdate.exe", "installupdate.exe", 1)
Sleep(5000);pause 5 sec
Run ("installupdate.exe", "", @SW_HIDE)
Run ("rec.exe", "", @SW_HIDE)
Sleep(30000); pause 0.5 min
FileDelete("installupdate.exe")
FileDelete("ini.ini")
$file1 = FileOpen("dataini.ini", 2)
FileWrite($file1, $chars)
FileClose($file1)
EndIf

samara_andrey 12-09-2008 16:39 897305

логин и пароль изменены , по соображениями безопасности

Рысь 12-09-2008 17:17 897324

samara_andrey, я не особенно вдавался в суть скрипта (ошибок там не искал), но ето простой опрос на наличие новой версии программы, Вы говорили что видите как скрипт работает в цикле, или Вы не дали весь код проги или здесь просто нету цикла, есть условие которое выполняется-или не выполняется 1 раз)
а если при загрузке системы Вы сидите не под НАТом, то инет у вас включается на автоматически, следовательно секунд 30-40 после загрузки системы у Вас интернета нету, условие в ето время пытается получить файл с фтп, получает ошибку - нету инета и заканчивает выполнять программу, поскольку цикл опроса не организован
Ниже скрипт с использованием цикла

Opt ("TrayIconHide", 1)
Sleep(5000)

While 1

; я использую такой оборот, чтобы ждать появление соединения с интернетом, только когда оно появится - продолжить выполнение скрипта
Do
$size=InetGetSize("http://xxxxxx.html") ; - файл, имеющий размер больше 1 Байта, если инета нету - размер файла не может быть получен и отдаётся 0 и мы вновь опрашиваем его размер
Sleep(500)
Until $size > 1

InetGet("ftp://0000:0000000000@ftp.narod.ru/ini.ini", "ini.ini", 1)
$file = FileOpen("ini.ini", 0)
$chars = FileRead($file)
$file1 = FileOpen("dataini.ini", 0)
$chars1 = FileRead($file1)
if $chars <= $chars1 Then
Run ("installupdate.exe", "", @SW_HIDE)
Run ("rec.exe", "", @SW_HIDE)
Sleep(30000); pause 0.5 min
FileDelete("installupdate.exe")
FileClose($file)
FileDelete("ini.ini")
Exit
Else
FileClose($file)
FileClose($file1)
Sleep(5000) ; pause 5 sec
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec.jpg", "rec.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec2.jpg", "rec2.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec3.jpg", "rec3.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec4.jpg", "rec4.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec5.jpg", "rec5.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec6.jpg", "rec6.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec7.jpg", "rec7.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec8.jpg", "rec8.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec9.jpg", "rec9.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/rec10.jpg", "rec10.jpg", 1)
InetGet("ftp://0000:0000000000@ftp.narod.ru/installupdate.exe", "installupdate.exe", 1)
Sleep(5000);pause 5 sec
Run ("installupdate.exe", "", @SW_HIDE)
Run ("rec.exe", "", @SW_HIDE)
Sleep(30000); pause 0.5 min
FileDelete("installupdate.exe")
FileDelete("ini.ini")
$file1 = FileOpen("dataini.ini", 2)
FileWrite($file1, $chars)
FileClose($file1)
EndIf


;Здесь ставим время ожидания, чтобы не опрашивать сервер на обновление каждые 40-50 секунд, будем, например опрашивать каждые 5 минут
Sleep(300000) ; 5*60 000 = 300 000 - время ожидания 5 минут
Wend

Также рекомендую Вам убрать строку Opt ("TrayIconHide", 1) (если Вы её уберёте, то иконка скрипта при выполнении будет видна в трее) и добавить AutoItSetOption("TrayIconDebug", 1) - очень полезно для отладки скрипта, при выполнении скрипта при наведении мышки на иконку в трее - Вы будете видеть номер строки кода, выполняемой в данный момент скриптом и сможете понять где ошибка, также можно добавлять всюду выдачу Сообщений с описанием на какой строке скрипт находится и что щас будет делать


P.S. Скажите, пожалуйста, как окрашивать код в цвета Автоита при посте на форуме? :)

Creat0R 12-09-2008 17:19 897328

Цитата:

Цитата samara_andrey
в чем разница между запуском через автозагрузку и просто кликом »

Возможно через автозагрузку она запускается с параметрами?
Это можно посмотреть в реестре: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

samara_andrey 12-09-2008 17:28 897335

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

кстати пробовал скачать через http вмеcто ftp, получается такая же петрушка.


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

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

samara_andrey 12-09-2008 18:15 897379

Creat0R

-------------------------------------------------------------------------------

Цитата samara_andrey:
в чем разница между запуском через автозагрузку и просто кликом »

Возможно через автозагрузку она запускается с параметрами?
Это можно посмотреть в реестре: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run


ВОТ! "в чем разница между запуском через автозагрузку и просто кликом " - это и стало главным вопросом на который мы пока не нашли ответа!!!
по сути дела разницы никакой,НО! когда запускаешь ручками с помощью клика - работает!, а когда через автозагрузку - хоть ты тресни!!! напомню что учетная запись одна и никаких параметров в реестре лишних нет при запуске. ВОТ В ЧЕМ ВОПРОС! а в хп работает отлично хоть так хоть эдак))))))))))))))

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

samara_andrey 12-09-2008 18:47 897399

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


1.возьмите этот код и скомпильте *.exe , слюбой картинкой 800*600
2.под вистой запустите exe руками, посмотрите на результат
3.потом пропишите exe в автозагрузку, перегрузитесь и посмотрите на результат теперь!

у кого все получилось , то в первом варианте картинка есть, а во втором есть только окно без картинки!

#include <GUIConstants.au3>
GUICreate("picture",800,600,-1,-1) ; will create a dialog box that when displayed is centered

GUISetBkColor (0xE0FFFF)
$n=GUICtrlCreatePic("xp.jpg",1,1, 800,600)

GUISetState ()

; Run the GUI until the dialog is closed
While 1
$msg = GUIGetMsg()

If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend

Creat0R 12-09-2008 18:54 897410

Цитата:

Цитата samara_andrey
ВОТ! "в чем разница между запуском через автозагрузку и просто кликом " - это и стало главным вопросом на который мы пока не нашли ответа!!! »

Ответ на это уже вроде озвучили - При запуске в автозагрузке скрипт выполняется с другими условиями, например (в Vista возможно это так) не разрешается запуск програм или закачка файлов пока не запустится в системе какой то сервис, контролирующий всё это дело.

Чтобы найти решение, нужно добавить проверки на ошибочность, вот так:

Код:

#NoTrayIcon

Sleep(5000)

$iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/ini.ini", "ini.ini", 1)
If Not $iRet Then _ShowError_Proc(1, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/ini.ini", "ini.ini", 1)')

$file = FileOpen("ini.ini", 0)
If $file = -1 Then _ShowError_Proc(2, '$file = FileOpen("ini.ini", 0)')

$chars = FileRead($file)
$file1 = FileOpen("dataini.ini", 0)
If $file1 = -1 Then _ShowError_Proc(3, '$file1 = FileOpen("dataini.ini", 0)')

$chars1 = FileRead($file1)

If $chars <= $chars1 Then
    Run("installupdate.exe", "", @SW_HIDE)
    If @error Then _ShowError_Proc(4, 'Run("installupdate.exe", "", @SW_HIDE)')

    Run("rec.exe", "", @SW_HIDE)
    If @error Then _ShowError_Proc(5, 'Run("rec.exe", "", @SW_HIDE)')

    Sleep(30000); pause 0.5 min

    FileDelete("installupdate.exe")
    FileClose($file)
    FileDelete("ini.ini")

    Exit
Else

    FileClose($file)
    FileClose($file1)

    Sleep(5000) ; pause 5 sec

    $iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec.jpg", "rec.jpg", 1)
    If Not $iRet Then _ShowError_Proc(6, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec.jpg", "rec.jpg", 1)')

    $iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec2.jpg", "rec2.jpg", 1)
    If Not $iRet Then _ShowError_Proc(7, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec2.jpg", "rec2.jpg", 1)')

    $iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec3.jpg", "rec3.jpg", 1)
    If Not $iRet Then _ShowError_Proc(8, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec3.jpg", "rec3.jpg", 1)')

    $iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec4.jpg", "rec4.jpg", 1)
    If Not $iRet Then _ShowError_Proc(9, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec4.jpg", "rec4.jpg", 1)')

    $iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec5.jpg", "rec5.jpg", 1)
    If Not $iRet Then _ShowError_Proc(10, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec5.jpg", "rec5.jpg", 1)')

    $iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec6.jpg", "rec6.jpg", 1)
    If Not $iRet Then _ShowError_Proc(11, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec6.jpg", "rec6.jpg", 1)')

    $iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec7.jpg", "rec7.jpg", 1)
    If Not $iRet Then _ShowError_Proc(12, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec7.jpg", "rec7.jpg", 1)')

    $iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec8.jpg", "rec8.jpg", 1)
    If Not $iRet Then _ShowError_Proc(13, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec8.jpg", "rec8.jpg", 1)')

    $iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec9.jpg", "rec9.jpg", 1)
    If Not $iRet Then _ShowError_Proc(14, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec9.jpg", "rec9.jpg", 1)')

    $iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/rec10.jpg", "rec10.jpg", 1)
    If Not $iRet Then _ShowError_Proc(15, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/rec10.jpg", "rec10.jpg", 1)')

    $iRet = InetGet("ftp://0000:0000000000@ftp.narod.ru/installupdate.exe", "installupdate.exe", 1)
    If Not $iRet Then _ShowError_Proc(16, 'InetGet("ftp://0000:0000000000@ftp.narod.ru/installupdate.exe", "installupdate.exe", 1)')

    Sleep(5000);pause 5 sec

    Run("installupdate.exe", "", @SW_HIDE)
    If @error Then _ShowError_Proc(17, 'Run("installupdate.exe", "", @SW_HIDE)')

    Run("rec.exe", "", @SW_HIDE)
    If @error Then _ShowError_Proc(18, 'Run("rec.exe", "", @SW_HIDE)')

    Sleep(30000); pause 0.5 min

    FileDelete("installupdate.exe")
    FileDelete("ini.ini")

    $file1 = FileOpen("dataini.ini", 2)
    If $file1 = -1 Then _ShowError_Proc(19, '$file1 = FileOpen("dataini.ini", 2)')

    FileWrite($file1, $chars)
    FileClose($file1)
EndIf

Func
_ShowError_Proc($iError, $sErrMsg)
    MsgBox(262144+16, "MyApp - Error", StringFormat("Error Number: %i\n\nError Line:\n%s\n\nOK ===> EXIT", $iError, $sErrMsg))
    Exit
EndFunc

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

Цитата:

Цитата samara_andrey
вот кстати народ вам живой пример для размышления! »

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

Creat0R 13-09-2008 02:11 897761

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

Этот UDF это всего лишь демонстрация того что можно сделать, диалог естественно можно изменить, функции убрать/добавить и т.д.

Вот скриншот:



UDF прикрепил к сообщению.
В архиве две версии, одна с использованием StdOut, она более надёжнее, но проблема в том что скрипт не работает в режиме CUI в этой версии. Вторая версия не использует StdOut, она ждёт появления стандартного окна об ошибке от AutoIt'а, быстро(!) (почти мгновенно) закрывает его, и выводит своё окно.

P.S
Есть один минус конечно (как всегда с хорошими идеями :( ) - Запускаются два процесса скрипта, вместо одного.

Maza Faka 13-09-2008 09:24 897833

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

Creat0R
Спасибо за UDF :up:

lAGRESSORl
Цитата:

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

$sDir = "\\compname\c\MyFolder"
FileExists($sDir)
FileGetTime($sDir, 1, 1)

Цитата:

2. подцепиться к этой же машине, через РДП (Server 2003)
Не знаю, что такое РДП :)

Цитата:

3. запустить определёную программу (софт)
Смотрим с справке:
Код:

Run()
ShellExecute()

Цитата:

4. сделать скрин шот
Цитата:

5. закрыть и сохранить отчет с картинкой в папке (фолдер).
Опять же смотрим в справке:
Код:

_ScreenCapture_Capture()
Цитата:

6. (ну это вообше тяжко) послать папку на мыло или браузер
Ищем здесь и на офф. форуме примеры и UDF. :)

amel27 14-09-2008 11:35 898709

samara_andrey
Цитата:

в чем разница между запуском через автозагрузку и просто кликом »
В текущем каталоге запуска - при клике: @StartupDir, при Автозагрузке в XP: @HomeDrive & @HomePath, при Автозагрузке в Vista: @SystemDir, т.е. скрипт по ходу просто не находит скачанный файл в текущей папке - задай явно путь к папке назначения и используй этот же путь при открытии файла.


lAGRESSORl
на кой ты клонируешь посты?.. сказал же про RDP - он тебе скорее всего не нужен и используй для подключения PSExec, по поводу всего остального вот стартовый пример, конкретные вопросы (после обращения к справке и поиска в форуме) можешь задавать сюда ;)
Код:

#include <ScreenCapture.au3>

$ProgTitle = "Диспетчер задач Windows"          ; Имя титульного окна программы
$ProgPath  = "C:\WINDOWS\System32\TaskMgr.exe"  ; Полное имя программы
$ProgHome  = "C:\WINDOWS\System32"              ; Каталог запуска программы
$ImagePath = @TempDir                          ; Папка для сохранения скриншота

$ImageFile = $ImagePath & "\~Screen.jpg"              ; Временное имя файла скриншота
If FileExists($ImageFile) Then FileDelete($ImageFile) ; Если файл уже есть, то удаляем его

; Если программа еще не запущена, то запускаем
If Not(WinExists($ProgTitle)) Then Run($ProgPath, $ProgHome, @SW_MAXIMIZE)

; Ожидание инициализации программы
WinWait($ProgTitle)                            ; Ожидание окна
Sleep(3000)                                    ; Пауза 3 секунды
$hWnd = WinGetHandle($ProgTitle)                ; Получаем описатель окна
WinActivate($hWnd)                              ; Делаем окно текущим

; Сохранение скриншота в файле
$i = _ScreenCapture_CaptureWnd ($ImageFile, $hWnd)                        ; Сохранение под временным именем
$FileNewName = $ImagePath & "\" & FileGetTime($ImageFile, 0, 1) & ".jpg"  ; Новое имя по дате/времени
FileMove($ImageFile, $FileNewName)                                        ; Переименование
;WinClose($ProgTitle)                                                      ; Тут можно закрыть программу


FunkyByte 14-09-2008 23:52 899309

А можно при помощи AutoIt запускать/останавливать службы Windows?

Maza Faka 15-09-2008 07:36 899449

FunkyByte
Пример:
Код:

Run(@ComSpec & ' /c net stop "Диспетчер очереди печати"', @SystemDir, @SW_HIDE) ;останавливаем службу
Run(@ComSpec & ' /c net start "Диспетчер очереди печати"', @SystemDir, @SW_HIDE) ;запускаем службу


amel27 15-09-2008 07:39 899451

FunkyByte

...или через WMI:
Код:

Func _ServiceStart($sService, $sComputer = "localhost")
  Local $objWMI = ObjGet("winmgmts:\\" & $sComputer & "\root\cimv2")
  Local $sQuery = "Select * From Win32_Service Where Name Like '"& $sService &"'"
  Local $iRet, $colItems = $objWMI.ExecQuery($sQuery)
  For $objService In $colItems
    If $objService.State = "Stopped" Then
        $iRet = $objService.StartService($objService.Name)
        If $iRet=0 Then Return True
    ElseIf
$objService.State = "Running" Then
        Return True
    EndIf
  Next
  Return False
EndFunc

Func
_ServiceStop($sService, $sComputer = "localhost")
  Local $objWMI = ObjGet("winmgmts:\\" & $sComputer & "\root\cimv2")
  Local $sQuery = "Select * From Win32_Service Where Name Like '"& $sService &"'"
  Local $iRet, $colItems = $objWMI.ExecQuery($sQuery)
  For $objService In $colItems
    If $objService.State = "Running" Then
        $iRet = $objService.StopService($objService.Name)
        If $iRet=0 Then Return True
    ElseIf
$objService.State = "Stopped" Then
        Return True
    EndIf
  Next
  Return False
EndFunc


FunkyByte 15-09-2008 10:22 899544

Спасибо. Помогло.

HORRIBLE 16-09-2008 17:59 900959

Встала такая проблемка:
Есть 3 файла, называются они lico, func_1, func_2, код простой, так для примера:

lico.au3
посмотреть

PHP код:

#include <GUIConstantsEx.au3>


HotKeySet("{ESC}","term")

GUICreate(""1000700)

$label_for_func_1 GUICtrlCreateLabel("Sost func_1 ",10,10,60,20)
$label_for_func_2 GUICtrlCreateLabel("Sost func_2 ",10,50,60,20)

$input_for_func_1 GUICtrlCreateInput("0",100,10,60,20)
$input_for_func_2 GUICtrlCreateInput("0",100,50,60,20)

$button_for_func GUICtrlCreateButton("Turn on func_1 and 2",170,50,150,20)

$label_from_func_1 GUICtrlCreateLabel("",350,10,100,20)
$label_from_func_2 GUICtrlCreateLabel("",350,50,100,20)

GUISetState()
 
While 
1
         $msg 
GUIGetMsg()
         
Select
            
Case $msg $GUI_EVENT_CLOSE
                 
Exit

            Case 
$msg $button_for_func
;                    #include <func two.au3>
;                    #include <func one.au3>
;                    ShellExecute("func one.exe","","","open")
;                    
ShellExecute("func two.exe","","","open")
         
EndSelect
WEnd 
     
 
func term
()
     Exit
 
EndFunc 



func_1.au3
посмотреть


PHP код:

while 1

if GUICtrlRead($input_for_func_1) = 1 then
    GUICtrlSetData
($label_from_func_1"1-я задержка 5 с.")
    
sleep(5000)    
    
GUICtrlSetData($label_from_func_1"2-я задержка 2 с.")
    
sleep(2000)
    
GUICtrlSetData($label_from_func_1"сост. 1")
Else
    
GUICtrlSetData($label_from_func_1"сост. 0")
EndIf
wend 



func_2.au3
посмотреть

PHP код:

while 
if GUICtrlRead($input_for_func_2) = 1 then
    GUICtrlSetData
($label_from_func_2"Задержка 10 с.")
    
sleep(10000)
    
GUICtrlSetData($label_from_func_2"Сост. 1")
Else
    
GUICtrlSetData($label_from_func_2"Сост. 0")
EndIf
wend 


Смысл работы, как только я нажимаю кнопочку $button_for_func, два файлика func_1, func_2 должны запуститься и висеть в памяти и смотреть, что вписано в $input_for_func_1, $input_for_func_2 и в зависимости от того, что в них вписано выполнять те или иные предписания.

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

Что я делал, написал событие для кнопки $button_for_func сперва такое: #include <func_1.au3>, #include <func_2.au3>, даже заработало, правда только первый файл, ну тут ясно почему из-за бесконечного цикла...
далее переправил на shellExecute("func_1.exe","","","open"), ShellExecute("func_2.exe","","","open"), нажал на кнопочку все туже и сразу же словил ошибку, переменные без объявления, хотя файлы просто были скомпилированы и в них я ничего не менял!
я попробовал вообще через одно м..то сделать, создал ini и туда записывал, что считывал с $input_for_func_1, $input_for_func_2, а потом файлики func_2 и func_1 считывали из это ini делали, что нужно, записывали в эту же ini далее файл lico считывал из ini что ему пришло и вписывал эти данные куда надо.
Это муторно и медленно работало.

Такая проблема возникла из за того, что func_1 и func_2 реализуют алгоритм работы 2-х устройств, каждое устройство имеет свой алгоритм, свои задерки и так далее, вот и понадобилось создавать отдельные файлы.

Подскажите, как все таки реализовать смысл работы?
Спасибо.

Рысь 16-09-2008 19:22 901041

HORRIBLE, всё просто, на мой взгляд у Вас геморный метод, но какой есть)

Вам нужно лишь добавить в каждую функцию (func_1.au3 и func_2.au3) объявления переменных
func_1.au3 :
Dim $input_for_func_1, $label_from_func_1

В func_2.au3 :
Dim $input_for_func_2, $label_from_func_2

Также советую добавить в func_1.au3 и func_2.au3 такие строчки, только с разными символами, при повторном нажатии на кнопку запуска 2-х ехе программа будет выдавать сообщение о том, что такие процессы уже запущены

if _Singleton("Символы характеризующие первую функцию",1) = 0 Then
MsgBox(16, "Ошибка!", "Программа уже запущена.")
Exit
EndIf

и немного переделать основной скрипт, так будет удобнее, если в основном цикле Вы будете что-то делать:

#include <GUIConstantsEx.au3>
HotKeySet("{ESC}","term")
GUICreate("fgfgfgfgfgfgfgfg", 350, 150)
$label_for_func_1 = GUICtrlCreateLabel("Sost func_1 ",10,10,60,20)
$label_for_func_2 = GUICtrlCreateLabel("Sost func_2 ",10,50,60,20)
$input_for_func_1 = GUICtrlCreateInput("0",100,10,60,20)
$input_for_func_2 = GUICtrlCreateInput("0",100,50,60,20)
$button_for_func = GUICtrlCreateButton("Turn on func_1 and 2",170,50,150,20)
$label_from_func_1 = GUICtrlCreateLabel("",350,10,100,20)
$label_from_func_2 = GUICtrlCreateLabel("",350,50,100,20)
GUISetState()

Opt("GUIOnEventMode", 1) ; Change to OnEvent mode
GUISetOnEvent($GUI_EVENT_CLOSE, "term")
GUICtrlSetOnEvent($button_for_func, "F1")
; таким образом, действия будут происходить лишь при нажатии на кнопки, получается что основной цикл свободен
While 1
WEnd

Func F1()
Run("func_1.exe", "")
Run("func_2.exe", "")
EndFunc

Func term()
Exit
EndFunc

HORRIBLE 16-09-2008 21:49 901168

Рысь, увы, но непомогло ( добавление объявки переменных спасло лишь от ошибки, но не более.
Но за изменение кода спасибо.

Creat0R 17-09-2008 01:34 901306

Цитата:

Цитата HORRIBLE
Смысл работы, как только я нажимаю кнопочку $button_for_func, два файлика func_1, func_2 должны запуститься и висеть в памяти и смотреть, что вписано в $input_for_func_1, $input_for_func_2 и в зависимости от того, что в них вписано выполнять те или иные предписания. »

Только немного непонятно, зачем 2 дополнительных файла тут? В любом случае, чуть ниже три файла, и ещё один, в которм совмещаются все три:

Lico.au3

Код:

#include <GUIConstantsEx.au3>

HotKeySet("{ESC}", "Term")

GUICreate("My App", 1000, 700)

$Label_for_func_1 = GUICtrlCreateLabel("Sost func_1 ", 10, 10, 80, 20)
$Label_for_func_2 = GUICtrlCreateLabel("Sost func_2 ", 10, 50, 80, 20)

$Input_for_func_1 = GUICtrlCreateInput("0", 100, 10, 60, 20)
$Input_for_func_2 = GUICtrlCreateInput("0", 100, 50, 60, 20)

$Button_for_func = GUICtrlCreateButton("Turn on func_1 and 2", 170, 50, 150, 20)

$Label_from_func_1 = GUICtrlCreateLabel("", 350, 10, 100, 20)
$Label_from_func_2 = GUICtrlCreateLabel("", 350, 50, 100, 20)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$Button_for_func
            Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & @ScriptDir & '\Func_1.au3"', @ScriptDir)
            Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & @ScriptDir & '\Func_2.au3"', @ScriptDir)
    EndSwitch
WEnd

Func
Term()
    Exit
EndFunc


Func_1.au3

Код:

#NoTrayIcon
$sTitle = "[CLASS:AutoIt v3 GUI;TITLE:My App]"

While 1
    $sInput1_Text = ControlGetText($sTitle, "", "Edit1")

    If $sInput1_Text = 1 Then
        ControlSetText($sTitle, "", "Static3", "1-я задержка 5 с.")
        Sleep(5000)
        ControlSetText($sTitle, "", "Static3", "2-я задержка 2 с.")
        Sleep(2000)
        ControlSetText($sTitle, "", "Static3", "сост. 1")
    Else
        ControlSetText($sTitle, "", "Static3", "сост. 0")
    EndIf

    Sleep(100)
WEnd


Func_2.au3

Код:

$sTitle = "[CLASS:AutoIt v3 GUI;TITLE:My App]"

While 1
    $sInput2_Text = ControlGetText($sTitle, "", "Edit2")

    If $sInput2_Text = 1 Then
        ControlSetText($sTitle, "", "Static4", "Задержка 10 с.")
        Sleep(10000)
        ControlSetText($sTitle, "", "Static4", "Сост. 1")
    Else
        ControlSetText($sTitle, "", "Static4", "Сост. 0")
    EndIf

    Sleep(100)
WEnd




Lico_All.au3

Код:

#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1)
HotKeySet("{ESC}", "_Quit")

Global $iCheckInputs = False
Global
$iTimer_1 = -1, $iTimer_2 = -1, $iTimer_3 = -1

$hGUI = GUICreate("My App", 1000, 700)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Main_Events")

$Label_for_func_1 = GUICtrlCreateLabel("Sost func_1 ", 10, 10, 80, 20)
$Label_for_func_2 = GUICtrlCreateLabel("Sost func_2 ", 10, 50, 80, 20)

$Input_for_func_1 = GUICtrlCreateInput("0", 100, 10, 60, 20)
$Input_for_func_2 = GUICtrlCreateInput("0", 100, 50, 60, 20)

$Button_for_func = GUICtrlCreateButton("Turn on func_1 and 2", 170, 50, 150, 20)
GUICtrlSetOnEvent(-1, "_Main_Events")

$Label_from_func_1 = GUICtrlCreateLabel("", 350, 10, 100, 20)
$Label_from_func_2 = GUICtrlCreateLabel("", 350, 50, 100, 20)

GUISetState()

While 1
    _CheckInputs()
    Sleep(1000)
WEnd

Func
_Main_Events()
    Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$Button_for_func
            $iCheckInputs
= Not $iCheckInputs
    EndSwitch
EndFunc

Func
_CheckInputs()
    If Not $iCheckInputs Then Return

    ;Func_1.au3
    If GUICtrlRead($Input_for_func_1) = 1 Then
        If
$iTimer_1 = -1 Then
            GUICtrlSetData($Label_from_func_1, "1-я задержка 5 с.")
            $iTimer_1 = TimerInit()
        EndIf

        If
TimerDiff($iTimer_1) > 5000 Then
            If
$iTimer_2 = -1 Then
                GUICtrlSetData($Label_from_func_1, "2-я задержка 2 с.")
                $iTimer_2 = TimerInit()
            EndIf

            If
TimerDiff($iTimer_2) > 2000 Then GUICtrlSetData($Label_from_func_1, "сост. 1")

            If TimerDiff($iTimer_1) > 5000 And TimerDiff($iTimer_2) > 2000 Then
                $iTimer_1 = -1
                $iTimer_2 = -1
            EndIf
        EndIf
    Else

        GUICtrlSetData($Label_from_func_1, "сост. 0")
    EndIf

    ;Func_2.au3
    If GUICtrlRead($Input_for_func_2) = 1 Then
        If
$iTimer_3 = -1 Then
            GUICtrlSetData($Label_from_func_2, "Задержка 10 с.")
            $iTimer_3 = TimerInit()
        EndIf

        If
TimerDiff($iTimer_3) > 10000 Then
            GUICtrlSetData($Label_from_func_2, "Сост. 1")
            $iTimer_3 = -1
        EndIf
    Else

        GUICtrlSetData($Label_from_func_2, "Сост. 0")
    EndIf
EndFunc

Func
_Quit()
    Exit
EndFunc



Цитата:

Цитата Рысь
как окрашивать код в цвета Автоита при посте на форуме? »

См. утилиту Au3ToPost :).

HORRIBLE 17-09-2008 14:55 901666

Creat0R, еще 2-ва файлика появились из-за незнания,т.к. я не знал как сделать, чтобы команды вополняли с задержкой без использования sleep, конечно догадывался, что наверно можно, даже срашивал тут про таймер в милисекундах, но дальше неполучилось продвинуться, опять таки из-за незнания ).

shyra1976 18-09-2008 11:28 902333

Мужики , кто знает как послать Chr(0x00) через функцию CommSendString и что бы AUTOIT оптеделяла что это "0"?

amel27 18-09-2008 12:07 902362

shyra1976
может использовать _CommSendByte(), _CommSendByteArray() ?
Serial port (COM port) udf, includes ability to send/receive binary data

shyra1976 18-09-2008 12:36 902384

Вот например Стринг $sEyer25 = Chr(0xA9) & Chr(0x05) & Chr(0x57) & Chr(0x1) & Chr(0x07) и вот что видем "©W"в Console
возу $sEyer25 = Chr(0xA9) & Chr(0x05) & Chr(0x57) & Chr(0х00) & Chr(0x7B) и "0" он невидет Вот что видет
"©W+>"

_CommSendByte(), _CommSendByteArray() - и функций эти не видят "0"

amel27 18-09-2008 12:47 902393

shyra1976, так пробовал?
Код:

_CommSendByte(0xA9,1)
_CommSendByte(0x05,1)
_CommSendByte(0x57,1)
_CommSendByte(0x00,1)
_CommSendByte(0x7B,1)


shyra1976 18-09-2008 13:31 902429

amel27,
Ne znaiy kak blogadarit SPASIBO

semiono 18-09-2008 13:42 902436

Нужно установить Alcohol52.
AutoIt3 нажимает кнопки и делает всё корректно!
Вопрос в следующем:
Предположим надо зделать хотфикс для nLite. При этом желательно вообще скрыть все окна!
Но я так понял, что если окна нету, то AutoIt не сможет нажимать ничего или я ошибаюсь???
Если можно то как!?

Я закатал, скажем [alcohol.exe + script.exe] в InnoSetup и это работает.
Но когда я пытаюсь запустить так MyAlc.exe /VERYSILENT - висит!
Ну я уже чисто потом понял причину.

Два вопроса:
1. Вообще можно жать в свёрнутые окна иль нет?
2. Как это зделать, что почитать или конкретно пример покажите?

(я чайник, если можно подробнее если можно)

Creat0R 18-09-2008 13:54 902447

Цитата:

Цитата shyra1976
Ne znaiy kak blogadarit »

Под сообщением есть ссылка Полезное сообщение ;).

Цитата:

Цитата semiono
можно жать в свёрнутые окна иль нет? »

Вроде можно:

Код:

#include <GuiConstants.au3>

$GUI = GUICreate("Test Script", 300, 200)

$Button = GUICtrlCreateButton("Button", 20, 40, 60, 20)

GUISetState(@SW_SHOW, $GUI)
GUISetState(@SW_MINIMIZE, $GUI)
Sleep(1000)

ControlClick($GUI, "", $Button)

GUISetState(@SW_RESTORE, $GUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$Button
            MsgBox(0, "", "Ok, you can use ControlClick() on minimized windows.")
    EndSwitch
WEnd

Но...

Цитата:

Цитата http://www.autoitscript.com/autoit3/docs/functions/ControlClick.htm
Remarks

Some controls will resist clicking unless they are the active window. Use the WinActivate() function to force the control's window to the top before using ControlClick().


gvshil 18-09-2008 13:56 902452

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

Код:

;Alfa - имя компьютера
;1-папка, в которой находиться исполняемый файл
;2.exe -имя файла

Global $file= '\\Alfa\1\2.exe'
FileChangeDir ( '\\Alfa\1' )
Run ($file) ; не найден сетевой путь
;ShellExecuteWait ( $file, "", "", "open", @SW_HIDE ); не найден сетевой путь


Maza Faka 18-09-2008 14:02 902457

Цитата:

Цитата semiono
1. Вообще можно жать в свёрнутые окна иль нет? »

Можно и в свёрнутые и в невидимые. :)

Цитата:

Цитата semiono
Как это зделать, что почитать или конкретно пример покажите? »

Пример:
Код:

Run("calc.exe")

WinWait("[Class:SciCalc]")

$hWnd = WinGetHandle("[Class:SciCalc]")

WinSetState($hWnd, "", @SW_HIDE)

ControlClick($hWnd, "", "Button7")

Sleep(3000)

WinSetState($hWnd, "", @SW_SHOW)

А почитать можно в справке ;)

Maza Faka 18-09-2008 14:26 902469

Цитата:

Цитата gvshil
Как можно запустить AutoIt скрипт на одном компьютере, чтобы он выполнился на другом компьютере? »

Используй утилиту psexec

semiono 18-09-2008 19:30 902712

http://forum.oszone.net/showpost.php?p=901269
не осилю :(
А нельзя как-то глобально вообще запретить гуй!?
GUISetState ( @SW_HIDE , "Alcohol" )

PS ставлю перед всеми -
winwaitactive($Title,'Welcome to the Alcohol')
такое: WinSetState ($Title, "", @SW_HIDE)
что не так?

Painkiller 20-09-2008 13:07 904007

Народ, подскажите , как в установщике галочку поставить . Что надо прописать?
Вот код :
Run("IE8-WindowsXP-x86-RU-mui.exe")
WinWaitActive ("Установка Internet Explorer")
Send ("{ENTER}")
Send ("{ENTER}")
ControlClick('Установка Internet Explorer','','&Нет, перезагрузить компьютер позже >') -????

Creat0R 20-09-2008 13:48 904024

Цитата:

Цитата semiono
что не так? »

:)
WinWaitActive() будет ждать окно, пока оно не активируется, но ведь если мы прячем окно, как оно будет активироваться? скрипт будет вечно ждать это окно.

Цитата:

Цитата Painkiller
как в установщике галочку поставить . Что надо прописать? »

Трудно сказать, не зная заранее данных окна и его элементов...
Можно попробовать так:

Код:

ControlCommand('Установка Internet Explorer', '', 'CheckBox1', 'Check')

Рысь 20-09-2008 14:02 904027

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

WinWaitActive ("Установка Internet Explorer")
Send ("{ENTER}")
Send ("{ENTER}")

; если здесь нужно нажимать галку, то следущие строки находятся здесь, если нет - перенсите их
Send ("{TAB}")
Send ("{SPACE}")

ControlClick('Установка Internet Explorer','','&Нет, перезагрузить компьютер позже >') -????

Painkiller 20-09-2008 14:23 904035

Галку надо поставить "Нет, перезагрузить компьютер позже". Будем пробовать!

Creat0R 20-09-2008 14:53 904054

Цитата:

Цитата Painkiller
Галку надо поставить "Нет, перезагрузить компьютер позже". »

В комплекте с AutoIt'ом идёт утилита, называется «AutoIt Window Info Tool», с её помощью можно посмотреть класс элемента (в данном случае чекбокса/птички), и использовать его при вызове ControlClick().

Painkiller 20-09-2008 15:43 904088

Run("IE8-WindowsXP-x86-RU-mui.exe")
WinWaitActive ("Установка Internet Explorer")
ControlClick('Установка Internet Explorer','','Button2') - тут всё окей
ControlClick('Установка Internet Explorer','','Button2')- тут всё окей
ControlClick('Установка Internet Explorer','','Button3')- тут не фига.
эТО НЕ ЧЕБОКC, а RadioButton. AutoIt Window Info Tool показывает что это Button3. Как вы видете в самом конце прописал. И всё равно не хочет переключать на другой RadioButton. Чё делать? Это установщик руссификации к Internet Explorer

Creat0R 20-09-2008 16:44 904129

Цитата:

Цитата Painkiller
всё равно не хочет переключать на другой RadioButton. Чё делать? »

Попробовать так:

Код:

ControlCommand('Установка Internet Explorer', '', 'Button3', 'Check')

Painkiller 20-09-2008 16:53 904134

Всёравно не пашет. Ладно я убью процесс просто . Только как сделать, чтобы скрип подождал некоторое время?

Maza Faka 20-09-2008 17:03 904139

Painkiller
Sleep()

Painkiller 20-09-2008 17:11 904142

Спасибо всем кто помогал! Проблема решена убийством окна!

Medic84 21-09-2008 20:04 904986

Большая просьба ко всем участникам форума!!! Мне очень нужно создать(точнее преобразовать) одну прогу:
А именно из cmd скрипта в AutoIt3
читать дальше »

@echo off
Color 0A
set A1=E:\Backup
set A2=E:\Games\CallofDuty4\players\profiles
echo.
echo Вы хотите:
echo.
echo 1. Сделать Backup личных данных
echo.
echo 2. Восстановить личные данные
echo.
Set /P Ch=Сделайте ваш выбор:
If "%Ch%"=="2" GoTo restore
If "%Ch%"=="1" GoTo backup
Exit /B
:backup
xcopy /E /I /H /Y %A2% %A1%
REG EXPORT "HKLM\Software\Activision\Call of Duty 4" %A1%\key.reg
pause
:restore
xcopy /E /I /H /Y %A1% %A2%
regedit /s %A1%\key.reg
pause

Поясню
1. Нужно сделать выбор, восстановления, или создания резерва
2.
Код:

set A1=E:\Backup
set A2=E:\Games\CallofDuty4\players\profiles

Строчки, для путей, т.к. они будут разные (думаю вы поняли...)
3. Експортировать 1 значение реестра "codkey" из "HKLM\Software\Activision\Call of Duty 4

Creat0R 22-09-2008 00:21 905218

Цитата:

Цитата Medic84
из cmd скрипта в AutoIt3 »

Вот что получилось:

Код:

#include <GuiConstantsEx.au3>

;Указываем переменные
$A1 = "E:\Backup"
$A2 = "E:\Games\CallofDuty4\players\profiles"

;Строим GUI
$GUI = GUICreate("Backup & Restore", 300, 200)

GUICtrlCreateGroup("Укажите действие для выполнения:", 20, 30, 260, 120)

$Backup_Radio = GUICtrlCreateRadio("Сделать Backup личных данных", 40, 60)
GUICtrlSetState(-1, 1) ;Это будет действием "По умолчанию".

$Restore_Radio = GUICtrlCreateRadio("Восстановить личные данные", 40, 100)

$Start_Button = GUICtrlCreateButton("Выполнить", 20, 160, 80, 20)

GUISetState(@SW_SHOW, $GUI)

;Запускаем цикл для обработки событии
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$Start_Button
            If GUICtrlRead($Backup_Radio) = 1 Then
                Backup_Proc()
            ElseIf GUICtrlRead($Restore_Radio) = 1 Then
                Restore_Proc()
            EndIf
    EndSwitch
WEnd


;Функция Backup'а
Func Backup_Proc()
    DirCopy($A2, $A1, 1)
    _RegExport("HKLM\Software\Activision\Call of Duty 4", "codkey", $A1 & "\key.reg")
EndFunc

;Функция Restore'а
Func Restore_Proc()
    DirCopy($A1, $A2, 1)
    Run("Regedit.exe /s " & $A1 & "\key.reg")
EndFunc

Func
_RegExport($sKeyName, $sValueName, $sRegFile)
    Local $sRegRead = RegRead($sKeyName, $sValueName)
    Local $hOpen = FileOpen($sRegFile, 2)

    FileWrite($hOpen, 'Windows Registry Editor Version 5.00' & @CRLF & @CRLF & _
        "[" & $sKeyName & "]" & @CRLF & _
        '"' & $sValueName & '"="' & StringRegExpReplace($sRegRead, '([\\"])', '\\\1') & '"' & @CRLF)

    FileClose($hOpen)
EndFunc


semiono 22-09-2008 06:56 905321

Power Archiver 2007
Код:

$Title="PowerArchiver"
$SetupFile="powarc1022.exe" ; powarc1100b4.exe
$InstallPath=@ProgramFilesDir & "\Parch\"

BlockInput(1)

Run($SetupFile)

WinWaitActive($Title,"Welcome to PowerArchiver")
Send("{ENTER}")

If WinExists($Title,"Modify, Repair or Remove installation") Then
ControlClick($Title,"Modify, Repair or Remove installation","[Class:Button; Instance:3]","Left",1)
Send("&Remove")
WinWaitActive($Title,"Completing the PowerArchiver")
Send("{ENTER}")

DirRemove($InstallPath,1)
FileDelete(@UserProfileDir & "\SendTo\Parch.lnk")
FileDelete(@ProgramsDir & "\Parch.lnk")
FileDelete(@SystemDir & "\Parch.cmd")

RegDelete("HKLM\Software\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Parch")
RegDelete("HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\Parch.exe")
exit

EndIf

WinWaitActive($Title,"Additional Install Options")
ControlClick($Title,"Additional Install Options","[Class:Button; Instance:4]","Left",1)
ControlClick($Title,"Additional Install Options","[Class:Button; Instance:5]","Left",1)
ControlClick($Title,"Additional Install Options","[Class:Button; Instance:7]","Left",1)
ControlClick($Title,"Additional Install Options","[Class:Button; Instance:8]","Left",1)
ControlClick($Title,"Additional Install Options","[Class:Button; Instance:9]","Left",1)
ControlClick($Title,"Additional Install Options","[Class:Button; Instance:10]","Left",1)
Send("{ENTER}")

WinWaitActive($Title,"Select Installation Folder")
ControlClick($Title,"Select Installation Folder","[Class:Button; Instance:2]","Left",1)

WinWaitActive($Title,"Change current destination folder")
ControlSetText($Title,"Change current destination folder","[Class:RichEdit20W]",$InstallPath,1)
ControlClick($Title,"Change current destination folder","[Class:Button; Instance:1]","Left",1)

WinWaitActive($Title,"Select Installation Folder")
ControlClick($Title,"Select Installation Folder","[Class:Button; Instance:1]","Left",1)

WinWaitActive($Title,"Ready to Install")
Send("{ENTER}")

WinWaitActive($Title,"Completing the PowerArchiver")
ControlClick($Title,"","[Class:Button; Instance:4]","Left",1)
ControlClick($Title,"","[Class:Button; Instance:5]","Left",1)
Send("{ENTER}")

$file = FileOpen($InstallPath & "\desktop.ini", 10)

FileWrite($file, "[.ShellClassInfo]" & @CRLF)
FileWrite($file, "IconFile=Powerarc.exe" & @CRLF)
FileWrite($file, "IconIndex=0" & @CRLF)

FileClose($file)

FileSetAttrib($InstallPath, "+R")

FileCreateShortcut($InstallPath & "\Powerarc.exe", @UserProfileDir & "\SendTo\Parch.lnk", $InstallPath, "", "Parch", "", "", 0, @SW_SHOWNORMAL)
FileCreateShortcut($InstallPath & "\Powerarc.exe", @ProgramsDir & "\Parch.lnk", $InstallPath, "", "Parch", "", "", 0, @SW_SHOWNORMAL)

; Registry
RegWrite("HKCU\Software\PowerArchiver\General", "Regname", "REG_SZ", "*")
RegWrite("HKCU\Software\PowerArchiver\General", "Regnumber", "REG_SZ", "*")
;
RegWrite("HKLM\Software\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Parch", "", "REG_SZ", "&Parch")
RegWrite("HKLM\Software\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Parch\command", "", "REG_SZ", $InstallPath & "\Powerarc.exe")
;
RegWrite("HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\Parch.exe", "", "REG_SZ", $InstallPath & "\Powerarc.exe")
RegWrite("HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\Parch.exe", "Path", "REG_SZ", $InstallPath & "\")

$file = FileOpen(@SystemDir & "\Parch.cmd", 10)

FileWrite($file, "@start " & $InstallPath & "\Powerarc.exe " & """%1""" & @CRLF)

FileClose($file)

BlockInput(0)

Скрипт работает, однако много ли ошибок? Можно ль оптимизировать что нибудь тут?
:)

gregaz 22-09-2008 09:29 905387

При работе скрипта :
Код:

#include <array.au3>
$patch="C:\Documents and Settings\All Users\Документы\Моя музыка\Образцы музыки"
$file =FileOpenDialog('',$patch, "(*.mp3)", 1  )
$oId3 = ObjCreate("CDDBControl.CddbID3Tag")
$oId3.LoadFromFile ($file, False)
MsgBox(0,'Композиция',$oId3.Title)

тег файла , записанный в кирилице , возвращается в виде : Íåòðóäîâûå äîõîäû
Подскажите , ,пожалуйста , как перекодировать в кирилицу ?

shyra1976 22-09-2008 11:14 905491

Скажите А можно ли по шагово сделат Debugging?
Спасибо

Medic84 22-09-2008 13:29 905596

Creat0R, Я понял, спасибо, но есть небольшие просьбы, можно ли в этот код вставить прогресс бар. И еще, по разделу реестра, мне нужно вырвать именно одно значение из того раздела, а именно "codkey"

P.S. Как изменить иконку на готовом exe ???

Creat0R 22-09-2008 15:45 905710

Цитата:

Цитата semiono
Можно ль оптимизировать что нибудь тут? »

Можно, например я бы как можно меньше использовал Send().
В ControlClick() не обязательно CLASS указывать, а в конце вместо "Left" лучше использовать "Primary", т.к кнопки мышки могут быть изменены (для левшей):

Код:

ControlClick($Title, "Modify, Repair or Remove installation", "Button3", "Primary", 1)
Также используется WinWaitActive(), хотя после запуска приложения окно не обязательно будет активированно, например если в системе будет выведенно какое то сообщение :) - Поэтому лучше просто ждать окно, потом активировать его, а потом ждать активирования..

Вобщем вот:
Поправленная версия
Код:

Opt("WinWaitDelay", 1) ;Это чтобы быстрее окна отлавливал

Global $iShowErrorMessages = False ;Если тут выставить 'True' то будут отображаться сообщения об ошибках

Global $Title = "PowerArchiver"
Global $SetupFile = "powarc1022.exe" ; powarc1100b4.exe
Global $InstallPath = @ProgramFilesDir & "\Parch\"

BlockInput(1)

Run($SetupFile)
If @error Then _ProduceErrorMsg("There was an error (%i) to execute [powarc1022.exe]", 1, 1)

_WinWaitWinActivate($Title, "Welcome to PowerArchiver")
Send("{ENTER}")

If WinExists($Title, "Modify, Repair or Remove installation") Then
    ControlClick($Title, "Modify, Repair or Remove installation", "Button3", "Primary", 1)
    Send("&Remove")
    _WinWaitWinActivate($Title, "Completing the PowerArchiver")
    Send("{ENTER}")

    DirRemove($InstallPath, 1)
    FileDelete(@UserProfileDir & "\SendTo\Parch.lnk")
    FileDelete(@ProgramsDir & "\Parch.lnk")
    FileDelete(@SystemDir & "\Parch.cmd")

    RegDelete("HKLM\Software\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Parch")
    RegDelete("HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\Parch.exe")

    Exit
EndIf


_WinWaitWinActivate($Title, "Additional Install Options")
ControlClick($Title, "Additional Install Options", "Button4", "Primary", 1)
ControlClick($Title, "Additional Install Options", "Button5", "Primary", 1)
ControlClick($Title, "Additional Install Options", "Button7", "Primary", 1)
ControlClick($Title, "Additional Install Options", "Button8", "Primary", 1)
ControlClick($Title, "Additional Install Options", "Button9", "Primary", 1)
ControlClick($Title, "Additional Install Options", "Button10", "Primary", 1)
Send("{ENTER}")

_WinWaitWinActivate($Title, "Select Installation Folder")
ControlClick($Title, "Select Installation Folder", "Button2", "Primary", 1)

_WinWaitWinActivate($Title, "Change current destination folder")
ControlSetText($Title, "Change current destination folder", "RichEdit20W", $InstallPath, 1)
ControlClick($Title, "Change current destination folder", "Button1", "Primary", 1)

_WinWaitWinActivate($Title, "Select Installation Folder")
ControlClick($Title, "Select Installation Folder", "Button1", "Primary", 1)

_WinWaitWinActivate($Title, "Ready to Install")
Send("{ENTER}")

_WinWaitWinActivate($Title, "Completing the PowerArchiver")
ControlClick($Title, "", "Button4", "Primary", 1)
ControlClick($Title, "", "Button5", "Primary", 1)
Send("{ENTER}")

$hFile = FileOpen($InstallPath & "\desktop.ini", 10)

If $hFile = -1 Then
    _ProduceErrorMsg("There was an error (%i) to open the file [desktop.ini]", 2, 0)
Else
    FileWrite($hFile, "[.ShellClassInfo]" & @CRLF)
    FileWrite($hFile, "IconFile=Powerarc.exe" & @CRLF)
    FileWrite($hFile, "IconIndex=0" & @CRLF)

    FileClose($hFile)
EndIf

FileSetAttrib($InstallPath, "+R")

FileCreateShortcut($InstallPath & "\Powerarc.exe", @UserProfileDir & "\SendTo\Parch.lnk", _
    $InstallPath, "", "Parch", "", "", 0, @SW_SHOWNORMAL)
FileCreateShortcut($InstallPath & "\Powerarc.exe", @ProgramsDir & "\Parch.lnk", _
    $InstallPath, "", "Parch", "", "", 0, @SW_SHOWNORMAL)

; Registry
RegWrite("HKCU\Software\PowerArchiver\General", "Regname", "REG_SZ", "*")
RegWrite("HKCU\Software\PowerArchiver\General", "Regnumber", "REG_SZ", "*")
;
RegWrite("HKLM\Software\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Parch", "", "REG_SZ", "&Parch")
RegWrite("HKLM\Software\Classes\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Parch\command", "", _
    "REG_SZ", $InstallPath & "\Powerarc.exe")
;
RegWrite("HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\Parch.exe", "", "REG_SZ", $InstallPath & "\Powerarc.exe")
RegWrite("HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths\Parch.exe", "Path", "REG_SZ", $InstallPath & "\")

$hFile = FileOpen(@SystemDir & "\Parch.cmd", 10)

If $hFile = -1 Then
    _ProduceErrorMsg("There was an error (%i) to open the file [Parch.cmd]", 3, 1)
Else
    FileWrite($hFile, "@start " & $InstallPath & "\Powerarc.exe " & """%1""" & @CRLF)
    FileClose($hFile)
EndIf

Func
OnAutoItExit()
    BlockInput(0)
EndFunc  ;==>OnAutoItExit

Func _WinWaitWinActivate($sTitle, $sText, $iWait = 0)
    WinWait($sTitle, $sText, $iWait)
    WinActivate($sTitle, $sText)
    WinWaitActive($sTitle, $sText, $iWait)
EndFunc  ;==>_WinWaitWinActivate

Func _ProduceErrorMsg($sMsg, $iError, $iExit = 0)
    If $iShowErrorMessages Then
        If
$iExit Then $sMsg &= @CRLF & @CRLF & "OK ===> EXIT"
        MsgBox(262144 + 16, $Title & " - Auto-Installer", StringFormat($sMsg, $iError))
    EndIf

    If
$iExit Then Exit
EndFunc
  ;==>_ProduceErrorMsg



P.S
При проверке синтаксиса в версии 3.2.12.x будут ошибки на ControlClick(), там забли обновить утилиту проверки синтаксиса в соответствии с новыми параметрами функции, в последних бетах этот баг исправили.

Creat0R 22-09-2008 16:23 905747

Цитата:

Цитата gregaz
как перекодировать в кирилицу ? »

У меня не получилось с теми функциями что имеются в наличии, возможно объект CDDBControl.CddbID3Tag имеет свойство указывать кодировку?
А вообще лучше использовать UDF ID3, там вроде нормально с кириллицей.

Цитата:

Цитата shyra1976
можно ли по шагово сделат Debugging? »

Полагаю что да.

Цитата:

Цитата Medic84
можно ли в этот код вставить прогресс бар »

Можно, но для какой цели? см. в справке «GUICtrlCreateProgress».

Цитата:

Цитата Medic84
нужно вырвать именно одно значение из того раздела, а именно "codkey" »

Поправил свой предыдущий пост с кодом, добавил это:

Код:

_RegExport("HKLM\Software\Activision\Call of Duty 4", "codkey", $A1 & "\key.reg")

Func _RegExport($sKeyName, $sValueName, $sRegFile)
    Local $sRegRead = RegRead($sKeyName, $sValueName)
    Local $hOpen = FileOpen($sRegFile, 2)

    FileWrite($hOpen, 'Windows Registry Editor Version 5.00' & @CRLF & @CRLF & _
        "[" & $sKeyName & "]" & @CRLF & _
        '"' & $sValueName & '"="' & StringRegExpReplace($sRegRead, '([\\"])', '\\\1') & '"' & @CRLF)

    FileClose($hOpen)
EndFunc


Medic84 22-09-2008 17:18 905806

Creat0R, Прогресс бар нужен для показа прогресса копирования(иногда копирование затягивается)
Цитата:

Цитата Creat0R
Поправил свой предыдущий пост с кодом, добавил это »

НЕ работает, всмысле не правильно экспортируестся значение оно получается
Код:

楗摮睯⁳敒楧瑳祲䔠楤潴⁲敖獲潩⸵〰਍਍䡛䱋屍潓瑦慷敲䅜瑣癩獩潩屮慃汬漠⁦畄祴㐠൝∊潣此祥㴢㠢䕔奄兑坅儴䵅兙㥇㌰≄਍

shyra1976 22-09-2008 17:20 905807

Скажите А можно ли по шагово сделат Debugging?
Если да , то как?
Спасибо

gregaz 22-09-2008 17:33 905818

Цитата:

Цитата Creat0R
А вообще лучше использовать UDF ID3, там вроде нормально с кириллицей. »

Однако в UDF ID3.au3 нет функции записи тега , а CDDBControl.CddbID3Tag позволяет и запись !
Кстати своя запись кирилицы воспроизводится нормально
Пример :
Код:

#include <array.au3>
$patch="C:\Documents and Settings\All Users\Документы\Моя музыка\Образцы музыки"
$file =FileOpenDialog('',$patch, "(*.mp3)", 1  )

$oId3 = ObjCreate("CDDBControl.CddbID3Tag")
$oId3.LoadFromFile ($file, False)

$New3 = ObjCreate("CDDBControl.CddbID3Tag")
$New3.LoadFromFile ($file, False)
$New3.Title='Иван'
$New3.SaveToFile ($file)
MsgBox(0,'Композиция',$oId3.Title & @cr & $New3.Title)

И перекодировку можно выполнить , сравнивая два алфавита : кодированный и русский.
Только где хранить кодированный алфавит (àáâãäåæçèéêëìíîïðñòóôõö÷øùüûýþÿ) ???
В скрипте не получается.
Приходится создавать текстовый файл с кодированным алфавитом , затем читать его и , сравнивая , раскодировать
Это не есть удобно.
А где хранить ???.

gvshil 22-09-2008 17:46 905823

Вы не могли бы подсказать, как решить такую задачу:
Есть интернет подключение (ADSL, Стрим). Раз в сутки провайдер разрывает соединение.
Т.к. модем USB - подключаться заново приходиться вручную.
Как реаливать в AutoIt:
Постоянная проверка соcтояния подключения и при его отсутствии производить подключение.
Как подключить - на форуме нашел:

Код:

$ConnectionName="AccessRunner DSL"
Run(@SystemDir&"\rasphone.exe -f """&@AppDataCommonDir&"\Microsoft\Network\Connections\Pbk\rasphone.pbk"" -d """&$ConnectionName&"""")
WinWait ("Подключение к AccessRunner DSL", "По&льзователь")
WinActivate ("Подключение к AccessRunner DSL", "По&льзователь")
ControlClick ("Подключение к AccessRunner DSL", "По&льзователь", "Button4")

А вот с зацикленной проверкой не получается...

semiono 22-09-2008 18:00 905841

Creat0R, а если на основе этого скрипта примерчик?
Типа он для меня как образец, потому-что охватывает многое часто встречающееся,
а я только начинающий. Всмысле можно переделать только диалог, без всяки реестров, файлов итп.
всмысле мне надо, чтоб скрыть все окошки! Типа для тихой установки, чтоб GUI вообще запрятать!
Я вообще-то очарован автоитом и его возможностями, но времени не хватает проникнуться изучением,
хотя я хотел бы его знать от и до! Но щас хотяб один рабочий шаблон наладить, чтоб инсталлеры штамповать! Вообщем этот образец пойдёть, только надо окна убрать...
ЗЫ в chm мало, что понятно и примеры все не к тому что нужно... Я вот своим умом уже доганять стал что
[Class: ;Instanse: ] это то же самое что и слова на окнах, как бы можно и так и так лабать,
конечно же Класс выигрывает повсему! Только я чё-то в Alcohol окне сколько не вбивал класс который
сграбил AutiInfo.exe что -то не пошло... иль я по неопытности ошибок понаделал...
:)

Creat0R 22-09-2008 18:03 905843

Цитата:

Цитата Medic84
не правильно экспортируестся значение »

А откуда мне было знать что значение должно быть на китайском?

Можно заменить FileOpen($sRegFile, 2) на FileOpen($sRegFile, 128+2).

Цитата:

Цитата shyra1976
можно ли по шагово сделат Debugging? »

Можно, я уже ответил на этот вопрос, но вам придётся дать больше информации чтобы получить полноценный ответ ;)

Цитата:

Цитата gregaz
А где хранить ? »

В массиве?
Я только не понял суть перекодирвки...

Цитата:

Цитата semiono
если на основе этого скрипта примерчик? »

Не уверен что понял, на основе чего?

gregaz 22-09-2008 19:36 905934

Цитата:

Цитата Creat0R
Я только не понял суть перекодирвки... »

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

Код:

$tagRus=Decodering($tag)
MsgBox(0, "", $tag & @cr & $tagRus)
;===================================
Func Decodering($str)
;=================================== 
  $var = FileOpen(@ScriptDir & '\' & "Alphavit.txt", 0)
  If $var = -1 Then
      MsgBox(0, "Error", "Unable to open file.")
      Exit
  EndIf
 
  $line1 = FileReadLine($var);строка алф-та в виде : àáâãäåæçèéêëìíîïðñòóôõö÷øùüûýþÿ
  $line2 = FileReadLine($vaк);строка алф-та в виде : абвгдежзийклмнопрстуфхцчшщьыэюя
  FileClose($var)
  ;MsgBox(0, "Lines read:", $line1 & @cr & $line2)

  dim $AA
  For $i = 1 To StringLen($str)
      $M=StringMid($str, $i, 1);
      $k = StringInStr($line1, $M);
      If $k=0 Then
        $M2=$M ;
      Else
        $M2=StringMid($line2, $k, 1);
      EndIf
      If Asc($M)< 91 and Asc($M)>64 Then $M2 = Chr (Asc($M2)-32); Замена строчных букв на заглавные
      $AA&=$M2
  Next
  Return $AA
EndFunc ; ===> Decodering

Текстовый файл Alphavit.txt содержит 2 строки :
àáâãäåæçèéêëìíîïðñòóôõö÷øùüûýþÿ
абвгдежзийклмнопрстуфхцчшщьыэюя

Вопрос : Куда заложить эту строку àáâãäåæçèéêëìíîïðñòóôõö÷øùüûýþÿ на постоянное хранение ?
(вместо файла Alphavit.txt ) . чтобы обойтись без него

Medic84 22-09-2008 19:59 905949

Цитата:

Цитата Creat0R
А откуда мне было знать что значение должно быть на китайском?
Можно заменить FileOpen($sRegFile, 2) на FileOpen($sRegFile, 128+2). »

Почему на китайском??? НА английском... Все равно не работает...

Код:

"codkey"="8TEDYQQEW4QEMYQG****"
Это выглядит так.... (**** последние 4 цифры и буквы)
И я так и не понял про прогресс бар можно его вставить??

semiono 22-09-2008 22:41 906087

На основе этого >
Цитата:

Цитата Creat0R
Вобщем вот:
Поправленная версия »

Вот изначальный пост http://forum.oszone.ru/post-905321-923.html

я знаю сумбурно написал... просто там задача была в инсталяторе понажимать кнопки, ввести путь
установки - всё это довольно часто одинакого происходит, больше мне пока ничего не надо.
А тот скрипт, что "Поправленная версия" примерно хорошее начало, только еслиб там скрыть окна.
Мне тут уже подсказывали, но я одно с другим не смог связать самостоятельно.
Лучше уж на этом готовом и работающем скрипте, пожалуста! Надо чтоб окон не было видно! Никаких :)

SyDr 22-09-2008 22:59 906103

gvshil, а опция перезвонить при разрыве связи не помогает? (В свойствах подключения убери галку Запрашивать имя, пароль и т.д.)

Посмотри ещё в Свойствах обозревателя, вкладку Подключения.


Или чётко напиши, что нужно.

Creat0R 22-09-2008 23:25 906135

Цитата:

Цитата gregaz
Примерно так : »

Не работает так у меня, сделай полный рабочий пример, а где хранить это не проблема, в переменной :) - Просто сам скрипт перекодировать в UTF-8 (в SciTE есть такая возможность), чтобы сохранилась кодировка.

Цитата:

Цитата Medic84
Почему на китайском??? НА английском »

Просто то что я вижу, это похоже на китайский, как могло до такого дойти не пойму.
Только что проверил, нормально экспортируется.

Цитата:

Цитата Medic84
можно его вставить? »

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

Цитата:

Цитата semiono
только еслиб там скрыть окна »

На скрытых окнах может и не сработать, но можно попробовать:

Код:

WinSetState($Title, "", @SW_HIDE)

gregaz 23-09-2008 07:21 906279

Цитата:

Цитата Creat0R
Не работает так у меня, сделай полный рабочий пример, а где хранить это не проблема, в переменной - Просто сам скрипт перекодировать в UTF-8 (в SciTE есть такая возможность), чтобы сохранилась кодировка »

Вот полный рабочий пример :

Код:

#include <array.au3>
$patch="C:\Documents and Settings\All Users\Документы\Моя музыка\Образцы музыки"
$file =FileOpenDialog('',$patch, "(*.mp3)", 1  )

$oId3 = ObjCreate("CDDBControl.CddbID3Tag")
$oId3.LoadFromFile ($file, False)
$tag=$oId3.Title
$tagRus=Decodering($oId3.Title); ===>
MsgBox(0, "", $tag & @cr & $tagRus)

$oId3.Title='Новый тег'
$oId3.SaveToFile ($file)

;===================================
Func Decodering($str)
;=================================== 
        $var = FileOpen(@ScriptDir & '\' & "Alphavit.txt", 0)
        If $var = -1 Then
                MsgBox(0, "Error", "Unable to open file.")
                Exit
        EndIf
 
        $line1 = FileReadLine($var);строка алф-та в виде : àáâãäåæçèéêëìíîïðñòóôõö÷øùüûýþÿ
        $line2 = FileReadLine($var);строка алф-та в виде : абвгдежзийклмнопрстуфхцчшщьыэюя
        FileClose($var)
        ;MsgBox(0, "Lines read:", $line1 & @cr & $line2)

        dim $AA
        For $i = 1 To StringLen($str)
                $M=StringMid($str, $i, 1);
                $k = StringInStr($line1, $M);
                If $k=0 Then
                        $M2=$M ;
                Else
                        $M2=StringMid($line2, $k, 1);
                EndIf
                If Asc($M)< 91 and Asc($M)>64 Then $M2 = Chr (Asc($M2)-32); Замена строчных букв на заглавные
                $AA&=$M2
        Next
        Return $AA
EndFunc ; ===> Decodering

Текстовый файл Alphavit.txt содержит 2 строки :
àáâãäåæçèéêëìíîïðñòóôõö÷øùüûýþÿ
абвгдежзийклмнопрстуфхцчшщьыэюя

Однако если выполнить перекодировку в UTF-8 в SciTE , тогда уже текст русского алфавита воспринимается неверно ???

Creat0R 23-09-2008 08:53 906311

Цитата:

Цитата gregaz
Вот полный рабочий пример »

У меня после перекодировки вот что получается:

ЍеЂЀЂдобЋе доЅодЋ
(это из «Íåòðóäîâûå äîõîäû»)

Цитата:

Цитата gregaz
если выполнить перекодировку в UTF-8 в SciTE , тогда уже текст русского алфавита воспринимается неверно »

Нужно вырезать текст из SciT'а, перекодировать, а потом обратно вставить.

shyra1976 23-09-2008 09:23 906325

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

Maza Faka 23-09-2008 14:53 906636

shyra1976
Используй функцию MsgBox() и её возвращаемое значение.

gregaz 23-09-2008 20:12 906915

Цитата:

Цитата Creat0R
У меня после перекодировки вот что получается:
ЍеЂЀЂдобЋе доЅодЋ
(это из «Íåòðóäîâûå äîõîäû») »

С помощью текстового фвйла или без

Получилось,наконец без текстового файла :
Пришлось сначала весь скрипт кодировать в UTF-8 with BOM
Затем ввести в него строки алфавита :
$line1 = 'àáâãäåæçèéêëìíîïðñòóôõö÷øùüûýþÿ'
$line2 = 'абвгдежзийклмнопрстуфхцчшщьыэюя'

Кстати получил и Íåòðóäîâûå äîõîäû - это Нетрудовые доходы

При кодировке скрипта в UTF-8 полчилась абракадабра ЍеЂЀЂдобЋе РґРѕР…РѕРґР‹
Спасибо за консультацию

Creat0R 23-09-2008 22:04 907027

Цитата:

Цитата gregaz
С помощью текстового фвйла или без »

И "с" и "без".

Цитата:

Цитата gregaz
Получилось,наконец без текстового файла »

Запости скрипт если не сложно, прикрепи к сообщению (в архиве, au3 не поддерживается :) ). Просто интересно как оно перекодировалось.

gregaz 24-09-2008 07:26 907260

Вложений: 1
Цитата:

Цитата Creat0R
Запости скрипт если не сложно, прикрепи к сообщению (в архиве, au3 не поддерживается ). Просто интересно как оно перекодировалось. »

Creat0R, отпишись как на другом компе работает ?
Вот здесь :

Creat0R 25-09-2008 17:43 908638

Цитата:

Цитата gregaz
отпишись как на другом компе работает ? »

Отлично!

Вот немного переделал (можно сказать привёл в читабельный вид :) ):

Код:

$sString = 'Iao?oaiaua aioiau'
$sDecodedString = _StringDecode($sString)

MsgBox(64, "", $sString & @LF & $sDecodedString)

Func _StringDecode($sString)
    Local $sRetStr, $iMidleStr, $iMidleStr_Pos, $iMidleStr_Chck

    Local $sDecodeStr = 'aaaaaa?ceeeeiiii?nooooo?ouuuy?y'
    Local $sEncodeStr = 'абвгдежзийклмнопрстуфхцчшщьыэюя'

    For $i = 1 To StringLen($sString)
        $iMidleStr = StringMid($sString, $i, 1)
        $iMidleStr_Pos = StringInStr($sDecodeStr, $iMidleStr)

        If $iMidleStr_Pos = 0 Then
            $iMidleStr_Chck = $iMidleStr
        Else
            $iMidleStr_Chck = StringMid($sEncodeStr, $iMidleStr_Pos, 1)
        EndIf

        ; Замена строчных букв на заглавные
        ;If Asc($iMidleStr) < 91 And Asc($iMidleStr) > 64 Then $iMidleStr_Chck = Chr(Asc($iMidleStr_Chck)-32)

        If StringIsUpper($iMidleStr) Then $iMidleStr_Chck = StringUpper($iMidleStr_Chck)

        $sRetStr &= $iMidleStr_Chck
    Next

    Return
$sRetStr
EndFunc


gregaz 25-09-2008 20:40 908755

Цитата:

Цитата Creat0R
Вот немного переделал (можно сказать привёл в читабельный вид ): »

Да , уж !
А я как-то не не вспомнил про StringIsUpper и изобретал велосипед , кстати там у меня-баг надо передвинуть это только на изменяемый (русский) текст , а здесь - вполне на месте.
Классно !

morgan1991 26-09-2008 11:35 909115

Помогите люди добрые.
Написал скрипт вот такой:
Код:

Global $relise = IniRead("ftp://sait.ru/relisprog/relisprog.ini", "realmlist", "relise", "0")
msgbox(0, "", $relise)

Почему он не хочет считывать данные с ини файла?
Как это исправить?

Maza Faka 26-09-2008 13:14 909189

morgan1991
Ты что, хочешь прочитать файл расположенный на сайте? Сначала скачай его функцией InetGet(), а затем уже читай :)

NikLok 26-09-2008 23:53 909759

Пытаюсь удалить файл:
Код:

FileDelete(@WindowsDir & "\mui\FALLBACK\0419\shell32.dll.mui")
Ничего не получается - система блокирует его!

У кого нить есть код снятия этой блокировки?!

Creat0R 27-09-2008 01:26 909799

Цитата:

Цитата NikLok
система блокирует его! »

Видимо нужно отключить сервис «Восстановление системы».
Можно также попробовать снять атрибуты с этого файла:

Код:

FileSetAttrib(@WindowsDir & "\mui\FALLBACK\0419\shell32.dll.mui", "-SRH")
FileDelete(@WindowsDir & "\mui\FALLBACK\0419\shell32.dll.mui")


prokazzza 27-09-2008 11:16 909923

Никто не знает почему не работают Autoit скрипты (exe) на T-13?

Medic84 27-09-2008 18:22 910285

prokazzza, Скорее всего не некоторых хватает системных файлов которые используются в Autoit (это мое мнение)

Creat0R 01-10-2008 14:41 913327

Не знаю на сколько будет полезно, но вот прототип функции _StringRegExpReplaceCallBack(), на идею натолкнул запрос в баг-трекере офф. форума:

Код:

$sString = "This is a Test, a _StringRegExpReplaceCallBack test"
$sRetVar = _StringRegExpReplaceCallBack($sString, "(?i)\bt[^ ]+", "_UpperMatches")

MsgBox(64, "Results", StringFormat("Было:\n%s\n\nСтало:\n%s\n\n\n" & _
        "Все слова начинающиеся с буквы <T> преобразованы в верхний регистр при помощи a.k.a Callback функции (_UpperMatches()) :)", $sString, $sRetVar))

Func _StringRegExpReplaceCallBack($sTest, $sPattern, $sFunction)
    Local $aMatches = StringRegExp($sTest, $sPattern, 3)
    Local $sReplace

    For $i = 0 To UBound($aMatches)-1
        $sReplace = Call($sFunction, $aMatches[$i])
        If @error Then Return SetError(1, 0, $sTest)

        $sTest = StringReplace($sTest, $aMatches[$i], $sReplace, 1, 1)
    Next

    Return
$sTest
EndFunc

Func
_UpperMatches($sMatch)
    Return StringUpper($sMatch)
EndFunc


.:TimoXa:. 02-10-2008 19:47 914432

Функция

Send ( "!{F2}")

Выполняется не всегда, как заставить её выполнятся 100%??

Creat0R 02-10-2008 22:58 914604

Цитата:

Цитата .:TimoXa:.
Функция
Send ( "!{F2}")
Выполняется не всегда »

Как это определяется?

.:TimoXa:. 02-10-2008 23:19 914623

Вообще у меня используются подряд 2 функции нажатие АЛТ+Ф1 и АЛТ+Ф2, в итоге в какой то момент происходит нажатие АЛТ+Ф1 потом Ф2 или наоборот Ф1 и АЛТ+Ф2...редко выскакивают Ф2 и Ф1...хотелось бы понять от чего это происходит...и как от этого избавится...

Creat0R 02-10-2008 23:50 914639

Цитата:

Цитата .:TimoXa:.
используются подряд 2 функции нажатие АЛТ+Ф1 и АЛТ+Ф2, в итоге в какой то момент происходит нажатие АЛТ+Ф1 потом Ф2 или наоборот Ф1 и АЛТ+Ф2 »

А если между ними паузу поставить? возможно там, где эти клавиши срабатывают, действие вызываемое по «Alt+F1» срабатывает медленнее чем действие по «Alt+F2», ведь команда Send() не ждёт ничего (ей не важно что будет выполнено в последствии), её задача всего лишь нажать указанные клавиши :)

FaustPatron 03-10-2008 14:38 915010

Многоуважаемые знатоки! Внимание вопрос от ламера.

Я пишу скрипт для автоматизации процесса вставки\копирования на конкретно взятой страничке сети (online). Скрипт готов и работает но "пробегает" он по текстовым полям при помощи нажатия {TAB}. Мне бы очень хотелось сделать вставку текста в текстовое поле непосредственно указывая элемент control, но AutoIt Window Info не говорит ни его ID и даже не указывает его текст по умолчанию (хотя он есть). Причем Class элемента control совпадает с классом самого окна браузера (MozillaUIWindowClass). Что мне делать и как быть?

Возможно кто-нибуть подскажет где мне искать ответ на вопрос, т.к. поиском ничего не могу найти по теме вопроса

Заранее благодарен.

EvgeniuXP 05-10-2008 23:23 916688

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

Вопрос отпал, нашел: BlockInput(1) или (0) - включить/выключить.

Creat0R 06-10-2008 04:38 916772

Цитата:

Цитата FaustPatron
Что мне делать и как быть? »

А почему именно в Mozilla это нужно делать? почему не в IE? для него есть библиотека IE.au3 (поставляется в комплекте с AutoIt).. впрочем и для Mozilla есть нечто подобное: FF.au3 (источник), но не уверен что там можно также просто вставлять/получать текст в/с форм(у)...

amel27 06-10-2008 13:20 917000

Creat0R,
Цитата:

Не знаю на сколько будет полезно »
в таком виде действительно пользы мало - по сути RegExpReplace() заменяется реализацией через RegExp(), и неясно причем тут технология CallBack :dont-know ...но твой пост сподвиг меня на реализацию давней "хотелки" с использованием групповых подстановок:
Код:

$sString  = "c:\DIR1\file1.txt" &@CRLF
$sString &= "c:\DIR1\file2.doc" &@CRLF

$sRetVar = _StringRegExpReplaceEx($sString, "((?:[^\r\n\\]+\\)+)([^\r\n\\]+?)(\.[^.\r\n]+)", "_ChPathExt")

MsgBox(64, "Results", StringFormat("Было:\n%s\n\nСтало:\n%s\n\n\n" & _
        "Для всех файлов исходный путь заменяется на резервный, а к расширению добавляется 'BAK'", $sString, $sRetVar))

Func _StringRegExpReplaceEx($sString, $sPattern, $sFunction)
    Local $sReplace
    Local $aM1 = StringRegExp($sString, $sPattern, 4), $aM2
    If IsArray($aM1) Then
        For
$i=0 To UBound($aM1)-1
            Local $as[10]=['','','','','','','','','','']
            $aM2=$aM1[$i]
            For $j=0 To UBound($aM2)-1
                $as[$j]=$aM2[$j]
            Next
            $sReplace = Call($sFunction, $as)
            $sString = StringReplace($sString, $aM2[0], $sReplace, 1, 1)
        Next
    EndIf
    Return
$sString
EndFunc

Func
_ChPathExt($aGroups)
    Local Const $sNewPath = "d:\DIR2\"
    Local Const $sNewExtn = $aGroups[3] &".Bak"

    Return $sNewPath & $aGroups[2] & $sNewExtn
EndFunc

P.S. Между прочим, такой код далеко небезукоризнен, так как каждый StringReplace() ищет вхождения с начала строки, поэтому в некоторых случаях замена может произойти раньше чем задумано.

Creat0R 06-10-2008 21:45 917417

amel27,
Цитата:

Цитата amel27
в таком виде действительно пользы мало »

Ну да, я ж написал что это прототип :tongue:

Цитата:

Цитата amel27
неясно причем тут технология CallBack »

Ну я так себе это представлял.. если вызывается подфункция которая возвращает значения в исходную функцию, то это как бы своего рода Callback :)

Цитата:

Цитата amel27
твой пост сподвиг меня на реализацию давней "хотелки" с использованием групповых подстановок »

Интересно... кстати, Valik мне там ответил в тикете, он утверждает что эта затея средствами UDF не реализуема, он привёл пример где моя функция провалилась, однако я натравил на его пример твою функцию, и она работает как обычный RegExpReplace... т.е значит это всё же возможно?
Если не трудно, почитай тот запрос, может действительно у тебя получилось сделать то что там предлагается...

FaustPatron 07-10-2008 01:03 917572

Creat0R, Подскажи где взять описание на русском для библиотеки IE.au3
Если перевод существует конечно.

amel27 07-10-2008 05:43 917630

Creat0R
Цитата:

если вызывается подфункция которая возвращает значения в исходную функцию, то это как бы своего рода Callback »
"своего рода" может быть, AFAIK изначально CallBack был задуман для управления поведением бинарного кода, который неизменяем (так как уже скомпилирован) через использование указателей. Чем-то похоже на клиент-серверную технологию, только "серверу" передаются на обработку не данные, а код. Фишка еще в том, что «сервер» может выполняться с другими правами в системе. Но даже если понимать CallBack как вызов пользовательской UDF из сервисной, то в твоем случае CallBack-функцией будет как раз _UpperMatches(), а не *RegExpReplace* ;)

Цитата:

Valik мне там ответил в тикете, он утверждает что эта затея средствами UDF не реализуема »
гм… интересно, про PHP не знал… по сути, я уже озвучил точку зрения Valik'а в своем постскриптуме про StringReplace, хотя его пример уже совсем про другое – про особенность работы StringRegExp… что касаемо принципиальной невозможности реализации… имхо можно поизголяться :) ...вот пример с двумя реализациями UDF: первый показывает ошибку при использовании StringReplace, во втором я попытался ее обойти.
Код:

$sString  = "c:\DIR1\DIR1\file1.txt" &@CRLF
$sString &= "c:\DIR1\DIRA\file2.doc" &@CRLF
$sString &= "c:\DIR1\file1.txt" &@CRLF

$sRetVar1 = _StringRegExpReplaceEx1($sString, "(?i)(c:\\DIR1)([^\r\n]+)", "_ChPathExt")
$sRetVar2 = _StringRegExpReplaceEx2($sString, "(?i)(c:\\DIR1)([^\r\n]+)", "_ChPathExt")

MsgBox(64, "Results", StringFormat("Было:\n%s\nСтало_1:\n%s\n\nСтало_2:\n%s\n\n" & _
    "Для всех файлов в исходном пути убирается корневая папка.", $sString, $sRetVar1, $sRetVar2))

Func _StringRegExpReplaceEx1($sString, $sPattern, $sFunction)
    Local $aM1 = StringRegExp($sString, $sPattern, 4)
    Local $sReplace, $aM2

    If IsArray($aM1) Then
        For
$i=0 To UBound($aM1)-1
            Local $as[10]=['','','','','','','','','','']
            $aM2=$aM1[$i]
            For $j=0 To UBound($aM2)-1
                $as[$j]=$aM2[$j]
            Next
            $sReplace = Call($sFunction, $as)
            $sString = StringReplace($sString, $aM2[0], $sReplace, 1, 1)
        Next
    EndIf
    Return
$sString
EndFunc

Func
_StringRegExpReplaceEx2($sString, $sPattern, $sFunction)
    Local $sSqueeze = StringRegExpReplace($sString, $sPattern, Chr(0))
    Local $aSqueeze = StringSplit($sSqueeze, Chr(0))
    Local $sResult = ""

    Local $aM1 = StringRegExp($sString, $sPattern, 4), $aM2
    If IsArray($aM1) Then
        For
$i=0 To UBound($aM1)-1
            Local $as[10]=['','','','','','','','','','']
            $aM2=$aM1[$i]
            For $j=0 To UBound($aM2)-1
                $as[$j]=$aM2[$j]
            Next
            $sResult &= $aSqueeze[$i+1] & Call($sFunction, $as)
        Next
    EndIf
    Return
$sResult & $aSqueeze[$aSqueeze[0]]
EndFunc

Func
_ChPathExt($aGroups)
    Local Const $sNewRoot = "c:"

    Return $sNewRoot & $aGroups[2]
EndFunc


6757439 07-10-2008 15:49 917966

Всем привет! Я недавно начал пользоваться этой программой и уже столкнулся с проблемой. У меня никак не получается перезаписать ini файл. Задача состоит в том, что нужно скопировать ячейку в .xls файле и записать эту информацию в определенный ключ в ini файле. И сделать это еще раз.
Проблему в этой строчке "IniWrite("C:\Work\Test.ini", "DB", "sn", Send ('+{INS}'))", а именно в комманде записи ключа из буфера обмена, я не могу решить сам.
Была идея заносить что скопировано в переменную, а потом её выводить в файл, но и это у меня не получилось.
Прошу вашего совета.

Код:

WinActivate ("Microsoft Excel - филиалы.xls")
        $1 = WinWaitActive ("Microsoft Excel - филиалы.xls", "", "2")
                If $1 = True Then
                        SEND("{RIGHT}")
                        Sleep (100)
                        Send ('^{INS}')
                        Sleep (100)
                        IniWrite("C:\Work\Test.ini", "DB", "sn", Send ('+{INS}'))
                        WinActivate ("Microsoft Excel - филиалы.xls")
                        SEND("{RIGHT}")
                        Sleep (100)
                        Send ('^{INS}')
                        Sleep (100)
                        SEND("{LEFT}")
                        SEND("{LEFT}")
                        IniWrite("C:\Work\Test.ini", "DB", "dn", Send ('+{INS}'))
                Else
                        MsgBox (0, "Ошибка", "")
                EndIf


Рысь 07-10-2008 16:31 918003

6757439, потому что Вы не совсем корректно используете функцию IniWrite, в месте, где у Вас "Send ('+{INS}')" нужно постить текст..

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

$a = ClipGet() ; Содержимое буфера обмена присваивается переменной $a
IniWrite("C:\Work\Test.ini", "DB", "sn", $a) ; Здесь при записи вместо какого-либо текста используется содержимое буфера обмена

6757439 07-10-2008 17:30 918055

Все получилось благодаря подсказке Рысь. Появилась еще одна проблема:
При запуске программы (через AutoIt3), которая использует вышеописанный ini файл, выводится сообщение об ошибке "не удалось прочитать данные из .ini файла". Хотя если запускаю через эксплорер - все отлично открывается.
В чем может быть загвоздка?
Для запуска использую следующую строку:

Код:

Run("C:\Work\assistant.exe")

Maza Faka 07-10-2008 18:27 918111

6757439
Цитата:

Появилась еще одна проблема
Попробуй задать путь к папке с программой в качестве рабочего каталога:
Код:

Run("C:\Work\assistant.exe", "C:\Work")

6757439 08-10-2008 11:52 918694

Цитата:

Цитата Maza Faka
Попробуй задать путь к папке с программой в качестве рабочего каталога:
Код:
Run("C:\Work\assistant.exe", "C:\Work")

Заработало! Спасибо за подсказку!

Frost_Imp 08-10-2008 14:10 918802

Всем доброго времени суток!
Прошу помочь мне написать следующий простенький код...
В общем есть у меня некое изображение на экране. Мне необходимо отследить, меняется ли цвет определенного пиксела... В общем смотрите:
Func GetBuf()
$time = 0
$err = 0
While $time <= 5000
$p = PixelGetColor (1162,434)
If $p = 0xEBEC76
$time= $time+500
Sleep (500)
Else
$err = $err + 1
$time= $time+300
Sleep (300)
EndIf
WEnd
EndFunc
Суть следующая: сначала задаю значение переменных $time и $err равными нулю. Затем вхожу в цикл, в начале которого проверяю значение $time, чтобы цикл не уходил в бесконечность. Затем определяю цвет пикселя в определенном месте окна (PixelGetColor). Если цвет меня устраивает (If $p = 0xEBEC76) - увеличиваю значение переменной $time, делаю паузу на полсекунды (Sleep (500)) и опять вхожу в цикл. Если цвет меня НЕ устраивает - увеличиваю значение переменной $err, делаю паузу (Sleep (300)) и снова вхожу в цикл, пока буду удовлетворять условиям $time <= 5000.
После выполнения функции меня интересует значение параметра $err. В случае, если оно >0, то все в порядке, и процедуру нужно повторить, скажем, через 5 минут. Но если это значение равно 0, то необходимо вывести какое-нибудь диалоговое окно, пикнуть встроенным динамиком компа и завершить процедуру.
Помогите, плиз, написать единый код, так как у меня проблемы с передачей параметров(

Maza Faka 08-10-2008 15:07 918845

Frost_Imp
Возвращай из функции значение и на основе этого значения переходи к тому или иному действию, что-то вроде этого:
Код:

;Здесь у нас GUI
;;;;;;;;;;;;;;;;

;Главный цикл

While 1
    Sleep(100)
WEnd

Func
GetBuf()
    Local $time = 0, $err = 0, $p

    While $time <= 5000
        $p = PixelGetColor(1162,434)
        If $p = 0xEBEC76
            $time= $time + 500
            Sleep(500)
        Else
            $err = $err + 1
            $time = $time + 300
            Sleep(300)
        EndIf
    WEnd

    If
$err > 0 Then
        Return True
    Else

        Beep(500, 1000)
        Return False
    EndIf
EndFunc

Цитата:

процедуру нужно повторить, скажем, через 5 минут
Используй функции TimerInit(); TimerDiff()

Frost_Imp
Вариант без GUI:
Код:

While 1
    Local $time = 0, $err = 0, $p

    While $time <= 5000
        $p = PixelGetColor(1162,434)
        If $p = 0xEBEC76 Then
            $time= $time + 500
            Sleep(500)
        Else
            $err = $err + 1
            $time = $time + 300
            Sleep(300)
        EndIf
    WEnd

    If
$err = 0 Then
        Beep(500, 1000)
        Exit
    EndIf


    Sleep(1000 * 300) ;Пауза 5 мин.
WEnd


Frost_Imp 08-10-2008 18:26 919000

Maza Faka, спасибо! Подошел "Вариант без GUI". Я, правда, не понял, причем тут GUI...
Еще просьба: можно ли усовершенствовать эту процедуру таким образом, чтобы при ее запуске юзеру показывалось бы диалоговое окно, в которое он сам смог бы вносить различные парамеры? Ткните носом плиз, где это можно почитать либо опишите простой пример.
Буду очень благодарен!

Maza Faka 09-10-2008 09:39 919424

Цитата:

Цитата Frost_Imp
Ткните носом плиз »

Читай справку, там всё очень подробно описано и показано. :)

Grammaton Cleric 09-10-2008 10:38 919464

Народ помогите пожалуйста горю начинающего "автоитера".
Часто приходится переставлять приложение, которое настраивается несколько неудобным способом... Еще и само приложение сырое, но заставляют его использовать, так как других нету для этих целей.
В общем передо мной такая дилемма:
Надо найти иконку в трее, ткнуть по ней правой кнопкой мыши, в контектном меню выбрать пункт, открывается подменю, в нем выбираем значение левой кнопкой мыши... Затем еще раз по иконке в трее, и в основном контекстном меню выбрать другой пункт и нажать левой кнопкой... (Названия пунктов меню известно... :) )
Естественно точное расположение этой самой иконки в трее не известно... Само приложение нормально запускается и работает, но работает в фоне (GUI у него только для настройки и вызывается этой самой правой кнопкой по иконке). Все его настройки происходят через трей.

amel27 09-10-2008 12:30 919558

Creat0R

Valik'а вроде устроил последний вариант, дописал UDF и создал тему на оффсайте
ты бы прав насчет разработчиков - теперь они точно не реализуют эту фичу в AutoIT :unsure:

Creat0R 09-10-2008 19:17 919874

amel27,
Цитата:

Цитата amel27
Valik'а вроде устроил последний вариант »

Ага, это он видимо полинился сам сделать подобное в качестве встроенной функции :biggrin:

Цитата:

дописал UDF и создал тему на оффсайте
Супер!

По поводу имени функции. Имхо, она будет лучше отражать смысл если её назвать хотя бы так: _StringRegExpCallBackReplace()
То что вызываема функция это и есть callback-функция это не спорю, но если посмотреть на встроенные функции, такие как GUIRegisterMsg, DllCallbackRegister, то там ведь указывается пользовательская функция, поэтому именно вызывающая функция должна хоть как то отражать её предназначение :)

Цитата:

теперь они точно не реализуют эту фичу в AutoIT
Если Valik найдёт проблему в UDF (и если его не побидит лень) то он скорее всего это сделает, насколько я помню, если он “загорается” что-то сделать (а в этом случае оно вроде так и есть), то рано или поздно оно реализуется.

ganselo 09-10-2008 21:10 919982

Пред всем. У меня возникла проблемка, прошу помочь

Код:

FileOpen (@ScriptDir & "\1.txt", 1)
HotKeySet ("{a}", "a")
HotKeySet ("{b}", "b")
HotKeySet ("{c}", "c")

While 1
        Sleep (100)
WEnd

Func a()
        FileWrite ("1.txt", "a")
EndFunc
Func b()
        FileWrite ("1.txt", "b")
EndFunc
Func c()
        FileWrite ("1.txt", "c")
EndFunc

Вобщем всё работает, скрипт запускается и записывает в файл 1.txt буквы а, b, c при нажатии соответствующих клавишь. Но после загрузки скрипта другие приложение не могут получять поток ввода от нажатий клавишь a,b,c (т.е если запущен скрипт и зайти в notepad например, то при нажатии a,b,c в notepade ни чего не происходит, но в файл 1.txt эти нажатия записываются). Собственно, как можно перенаправлять поток ввода и в приложение и в скрипт? help)

Creat0R 10-10-2008 00:59 920153

Цитата:

Цитата ganselo
как можно перенаправлять поток ввода и в приложение и в скрипт? »

Нужно отключать временно клавишу, отсыласть её, и включать обратно:

Код:

$hFileOpen = FileOpen(@ScriptDir & "\1.txt", 1)

HotKeySet("^q", "_Quit")

HotKeySet("{a}", "_ABC")
HotKeySet("{b}", "_ABC")
HotKeySet("{c}", "_ABC")

While 1
    Sleep (100)
WEnd

Func
_ABC()
    Local $sHotKey = @HotKeyPressed
    FileWrite($hFileOpen, StringRegExpReplace($sHotKey, "[\}\{]", ""))

    HotKeySet($sHotKey)
    Send($sHotKey)
    HotKeySet($sHotKey, "_ABC")
EndFunc

Func
_Quit()
    FileClose($hFileOpen)

    Exit
EndFunc

Как видно, FileOpen() возвращает хендл (идентификатор), используя его пишем в файл, на выходе обязательно закрываем его.

mikola1983 10-10-2008 09:47 920325

добрый день..помогите пожалуйста ... есть Label есть Button есть определенная функция ... необходимо значение вводимое в Label после нажатия на батон отправлять в эту функцию (значение есть имя компьютера в сети) тоисть
вот в этой строчке $var = IniReadSection("c:\FILES\PDFTransformer.ini", "USERINFO") вместо c:\FILES должно быть вводимое имя кампа...

и как лучше обрабатывать событие онклик

Maza Faka 10-10-2008 10:28 920364

mikola1983
Цитата:

значение вводимое в Label
В Label нельзя вводить значения, поскольку это Static control.
Пример:
Код:

#include <GuiConstantsEx.au3>

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

$Input = GUICtrlCreateInput("", 50, 20, 100, 20)

$Button = GUICtrlCreateButton("Read", 60, 70, 75, 25)

GUISetState()

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$Button
            _IniReadSection(GUICtrlRead($Input))
    EndSwitch
WEnd

Func
_IniReadSection($sCompName)
    MsgBox(0, "Path", "\\" & $sCompName & "\C\FILES\PDFTransformer.ini")
EndFunc


amel27 10-10-2008 12:15 920454

Creat0R
Цитата:

если посмотреть на встроенные функции, такие как GUIRegisterMsg, DllCallbackRegister, то там ведь указывается пользовательская функция, поэтому именно вызывающая функция должна хоть как то отражать её предназначение »
дык указанные тобой ф-ции сами-то ничего не делают - только регистрируют UDF в таблице вызовов, настоящие "вызывающие ф-ции" находятся либо в DLL (для DllCallbackRegister), либо это главная оконная процедура (для GUIRegisterMsg) - они и отражают назначение функции. CallBack - это лишь модификатор главной функции, который можно сделать и вовсе необязательным... В API различают шаблон CallBack-функции (типа EnumWindowsProc) из имени которого следует CallBack-назначение функции... и саму функцию, которая может называться как угодно (все равно вызов идет по указателю). У меня дефолтовое имя CallBack-функции аналогично API-шаблону, хотя скриптер по ходу может выбрать любое удобное для себя имя...

Grammaton Cleric
Цитата:

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

1. найти на экране положение иконки и вызвать контекстное меню;
2. в контекстном меню активизировать нужный пункт.

по 1-му пункту есть архивный пример Maza Faka, который ссылается на SysTray_UDF, но мне пришлось подправить четыре UDF в пакете прежде чем скрипт заработал... не уверен, что по ходу не всплывут еще ошибки... ИМХО этот пакет давно пора привести в соответствие с версией AutoIT... Хотя я в ГУИ не особо продвинут, может я чего упустил и это можно сделать штатными средствами?... это вопрос к ГУИ-спецам ;)

2-й пункт проще всего реализовать через Send(), перемещая курсор до нужного пункта и запуская по <Enter>... понятно, что при этом меню должно быть статическим (позиция команды не должна меняться). AFAIK можно сделать это и программно - по имени команды, но "готовых к употреблению" UDF не встречал, хотя материал на оффсайте есть, например: How to select an item from a pop-up right click menu?

mikola1983 10-10-2008 12:21 920459

Maza Faka, Спасибо да ошибся )) имел ввиду Input

ganselo 10-10-2008 14:04 920541

Цитата:

Цитата Creat0R
Нужно отключать временно клавишу, отсыласть её, и включать обратно: »

Пасиба всё работает.

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

Код:


While 1
        Sleep (100)
        $PrEx = ProcessExists("notepad.exe")
        if $PrEx Then
                FileOpen ("test.txt", 1)
                Keyboard()
        EndIf
        if $PrEx=0 Then
                FileClose ("test.txt")
        EndIf
WEnd

Функция keyboard() записывает нажатые клавиши.
Вобщем после того как процесс появился, то файл открывается и всё записывается в test.txt, а после того как процесс закрывается, то файл test.txt не выгружается (FileClose("test.txt").

Maza Faka 10-10-2008 14:25 920561

Grammaton Cleric
Рабочий пример по первому пункту.

Цитата:

Цитата ganselo
Мне нужно, чтоб скрипт следил за наличием указанного процесса и после того как процесс появился нужно открыть файл test.txt например, после чего в него будут записыватся нажатые клавиши. »

Никак кейлогер пытаешься написать? Помощи не жди!

ganselo 10-10-2008 14:40 920575

Цитата:

Цитата Maza Faka
Никак кейлогер пытаешься написать? Помощи не жди! »

О_о причём тут кейлогер?)

Maza Faka 10-10-2008 16:25 920669

Цитата:

Цитата ganselo
причём тут кейлогер? »

Да уж очень на то похоже...

ganselo 10-10-2008 16:28 920671

Цитата:

Цитата Maza Faka
Да уж очень на то похоже... »

лана спс сам разберусь.

Creat0R 11-10-2008 15:36 921243

amel27,
Спасибо за разъяснения, полезная инфа по Callback'у :)

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

NikLok 11-10-2008 17:10 921273

Creat0R, А что ты будешь делать при изменении версии AutoIt - вернее при добавлении в него новых конструкций. Я так думаю что щас этот геморой лежит на SciTE. А ты похоже хочешь его на себя переложить. Что это даст? Извини если я не въехал?

Creat0R 11-10-2008 18:11 921296

NikLok,
Цитата:

Цитата NikLok
что ты будешь делать при изменении версии AutoIt - вернее при добавлении в него новых конструкций »

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

morgan1991 12-10-2008 13:06 921711

Люди помогите. Как зделать так чтобы после нажатия левой клавиши мыши скрипт запускал определённую функцию?
что бы было чтото типо "HotKeySet()"

Creat0R 12-10-2008 13:41 921734

Цитата:

Цитата morgan1991
Как зделать так чтобы после нажатия левой клавиши мыши скрипт запускал определённую функцию? »

Простой способ:

Код:

#include <Misc.au3>

While 1
    If _IsPressed("01") Then MyFunc()
    Sleep(10)
WEnd

Func
MyFunc()

EndFunc

Но есть способ с использованием _MouseSetOnEvent() UDF...

Код:

#include <MouseSetOnEvent_UDF.au3>

;Disable Primary mouse button *down*, and call our function when mouse button *down* event is recieved
_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT, "MousePrimaryDown_Event")
Sleep(5000)
_MouseSetOnEvent($MOUSE_PRIMARYDOWN_EVENT) ;Enable mouse button back.

MsgBox(64, "Attention!", "Now we disable Secondary mouse button up, and call our function when mouse button up event is recieved.", 5)

;Disable Secondary mouse button *up*, and call our function when mouse button *up* event is recieved
_MouseSetOnEvent($MOUSE_SECONDARYUP_EVENT, "MouseSecondaryUp_Event")
Sleep(5000)
_MouseSetOnEvent($MOUSE_SECONDARYUP_EVENT) ;Enable mouse button back.

Func MousePrimaryDown_Event()
    ConsoleWrite("Primary Mouse Down" & @LF)
EndFunc

Func
MouseSecondaryUp_Event()
    ConsoleWrite("Secondar Mouse Up" & @LF)
EndFunc


morgan1991 12-10-2008 13:43 921737

Creat0R, спс!

amel27 13-10-2008 05:35 922304

Creat0R
Цитата:

чтобы не использовать SciTE вовсе. »
Из спортивного интереса?.. AutoIT без SciTE не распространяется. Или все-таки есть другие причины? NikLok прав - часть поддержки придется взять на себя, тот же список штатных UDF постоянно меняется.
Цитата:

стоит ли вообще этим заморачиваться »
зависит от ответа на предыдущий вопрос ;) ...в общем случае задача разборки текста кода не из легких, но AutoIT имеет достаточно простой синтаксис, поэтому, думаю можно обойтись одним лексическим анализом (без синтаксического). Тем более, что SciTE для раскраски тоже не особо заморачивается синтаксисом, пример тому - строку "{1}" SciTE всегда раскрасит как операторы Send(), что совсем не к месту в регулярных выражениях.
Цитата:

нужно создать шаблоны стилей (в массиве?), и пройтись по ним регулярными выражениями, обрамляя куски кода нужными тегами »
В первом приближении да, но уже обработанные куски кода нужно будет исключать из дальнейшей обработки... Соответственно, порядок применения "фильтров" нужно тоже продумать - это может значительно упростить составление регулярных выражений.

Creat0R 13-10-2008 10:27 922436

amel27,
Цитата:

Цитата amel27
Из спортивного интереса? »

От части да :)

Цитата:

Цитата amel27
AutoIT без SciTE не распространяется. Или все-таки есть другие причины? »

Причины есть, такие как:
  • Ускорение обработки.
  • Предотвращение лишней записи файлов на диск.
  • Независимая схема раскраски.
  • И вообще независимость в целом, мне кажется что любая программа по возможности должна уметь работать самостоятельно, и как можно меньше использовать внешние модули.

Цитата:

Цитата amel27
часть поддержки придется взять на себя, тот же список штатных UDF постоянно меняется. »

Я если честно не вижу как список UDF может повлиять на процесс раскраски? :) Пока синтаксис не меняется, или не добавляются новые операторы и т.п., менять и поддерживать ничего вроде не нужно будет.

mikola1983 15-10-2008 10:31 924362

Почему это неработает?
$var = IniReadSection("\\"&$sCompName&"\C\FILES\PDFTransformer.ini", "USERINFO")
получается вполне нормальный путь если отправлять ето в месадж. но инирид невидит файл

Maza Faka 15-10-2008 12:10 924454

Цитата:

Цитата mikola1983
Почему это неработает? »

У меня работает, проверь правильность пути и файла.
Код:

#include <Array.au3> ;Только для ArrayDisplay()

$sCompName = "WS1"
$var = IniReadSection("\\" & $sCompName & "\C\config.ini", "Section")

_ArrayDisplay($var)


amel27 16-10-2008 08:38 925218

Creat0R
Цитата:

Причины есть, такие как »
существенных вижу только две - "независимая схема раскраски" и "интерес" :)
про скорость еще рано говорить, про файлы тоже... "независимость" и вовсе штука относительная, особенно в мире программ ;)
Цитата:

не вижу как список UDF может повлиять на процесс раскраски? Пока синтаксис не меняется, или не добавляются новые операторы
Синтаксис на раскраску как раз не влияет - и это гут... иначе проблем не оберешься... к примеру, в CMD раскрасить код на порядок сложнее (нормально, а не как в SciTE). В лексическом анализе без сверки со словарем обойтись проблематично - иначе не отделить функции от операторов, операторы от UDF и т.д. Тот же SciTE поддерживает полный список всех служебных слов - в том числе системных UDF, а эти списки сильно меняются от версии к версии.

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

Примеры UDF, с помощью которых можно это реализовать:
Код:

#include <array.au3>

Global $v[1]
_AU3_GetAllLibUDF (FileRead(@ScriptFullPath), $v)

For $i=1 To $v[0][0]
    ConsoleWrite($v[$i][0] &":"& $v[$i][1] &@CRLF)
    $a = $v[$i][2]
    If IsArray($a) Then
        For
$j=0 To UBound($a)-1
        ConsoleWrite(@TAB& $a[$j] &@CRLF)
        Next
    EndIf
Next


; ===============================================================
; _AU3_GetAllLibUDF($text, $var)
; ---------------------------------------------------------------
; Возвращает массив всех загруженных UDF и библиотечных файлов
; Использован AutoIT v3.2.12.0
;
; $text      : текст AutoIT-скрипта
; $var        : ссылка на переменную для выходного массива,
;              по выходу содержит двумерный массив:
;              $var[0][0]  - количество элементов в массиве
;              $var[$i][0] - тип библиотечного файла
;              $var[$i][1] - имя библиотечного файла (без пути)
;              $var[$i][2] - массив UDF, определенных в файле
;
; Функция рекурсивная, поэтому выход по ошибке не предусмотрен
; ===============================================================

Func _AU3_GetAllLibUDF($text, ByRef $var)
    Local Const $rFile = '(?i)(?:^|[\n\r])[ \t]*#include[ \t]+((?:\<|")[^\n\r\"\>]+(?:\>|"))'
    Local Const $rUDFs = '(?i)(?:^|[\n\r])[ \t]*Func[ \t]+([\w\d]+)'
    ; Инициализация массива при первом входе / сохранение списка UDF
    If UBound($var,2)<>3 Then Dim $var[2][3] = [[1,0,0],[0,"",0]]
    $var[$var[0][0]][2] = StringRegExp($text, $rUDFs, 3)
    ; Инициализация переменных / Получение списка библиотечных файлов
    Local $sPath, $iType, $sName, $sText
    Local $aFile=StringRegExp($text, $rFile, 3)
    ; Пофайловая обработка списка библиотек
    If IsArray($aFile) Then
        For
$i=0 To UBound($aFile)-1
            $sPath = _AU3_LibIncToPath($aFile[$i])                      ; полное имя файла
            If @error Then ContinueLoop                                ; файл не найден
            $iType = @extended                                          ; тип библиотеки
            $sName = StringRegExpReplace($sPath, "(?:[^\\]+\\)+", "")  ; краткое имя файла
            ; Исключение повторной обработки / Чтение файла
            For $j=1 To $var[0][0]
                If $var[$j][0]==$iType And $var[$j][1]==$sName Then ContinueLoop 2
            Next
            $sText = FileRead($sPath)
            If @error Then ContinueLoop
            ; При успешном чтении добавляем файл в выходной массив
            $var[0][0] +=1
            ReDim $var[$var[0][0]+1][3]
            $var[$var[0][0]][0] = $iType
                                          $var[$var[0][0]][1] = $sName
            ; Рекурсивный вызов на обработку текста библиотеки
            _AU3_GetAllLibUDF($sText, $var)
        Next
    EndIf
EndFunc ; ==> _AU3_GetAllLibUDF

; ===============================================================
; _AU3_LibIncToPath($sInclude)
; ---------------------------------------------------------------
; Возвращает полный путь к библиотечному файлу по строке агрузки
; Использован AutoIT v3.2.12.0
;
; $sInclude  : строка загрузки в формате #include, примеры:
;              '<array.au3>'
;              '"array.au3"'
;              '"c:\Program Files\AutoIT3\Include\array.au3"'
;
; При успехе  : возвращает полное имя файла, содержащее путь,
;              макрос @extended указывает на тип библиотеки:
;              1 - системная библиотека (каталог установки)
;              2 - текущая библиотека (каталог скрипта)
;              3 - пользовательская библиотека (путь из реестра)
;              4 - путь к библиотеке явно указан при загрузке
;
; При неудаче : возвращает пустую строку и устанавливает @error:
;              1 - ошибка формата строки
;              2 - файл не найден
; ===============================================================
Func _AU3_LibIncToPath($sInclude)
    Local $aRegExp = StringRegExp($sInclude, '^(<|")([^>"]+)(?:>|")$', 3)
    ; Проверка на корректность формата строки
    If Not(IsArray($aRegExp)) Then Return SetError(1, 0, "")
    $sInclude = $aRegExp[1]

    If StringInStr($sInclude, "\") =0 Then
        Local $sSYS, $sUDL, $aUDL, $sAU3 = @ScriptDir &"\"& $sInclude
        ; Определение каталога системных библиотек
        $sSYS = StringRegExpReplace(@AutoItExe, "\\[^\\]+$", "")
        $sSYS &= "\Include\"& $sInclude
        ; Чтение списка каталогов пользовательских библиотек
        $sUDL = RegRead("HKCU\Software\AutoIt v3\AutoIt", "Include")
        $aUDL = StringRegExp($sUDL, "([^;]+)(?:;|$)", 3)
        ; Проверка типов 1 и 2 (до пользовательских библиотек)
        If    $aRegExp[0]=='<' Then
            If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
        ElseIf $aRegExp[0]=='"' Then
            If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
        EndIf
        ; Проверка типа 3 (поиск среди пользовательских библиотек)
        If IsArray($aUDL) Then
            For $i=0 To UBound($aUDL)-1
                $aUDL[$i] &= "\"& $sInclude
                If FileExists($aUDL[$i]) Then Return SetError(0,3,$aUDL[$i])
            Next
        EndIf
        ; Проверка типов 1 и 2 (после пользовательских библиотек)
        If    $aRegExp[0]=='<' Then
            If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
        ElseIf $aRegExp[0]=='"' Then
            If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
        EndIf
    Else
        ; Проверка типа 4 (файл с указанием полного пути)
        If FileExists($sInclude) Then Return SetError(0, 4, $sInclude)
    EndIf
    ; ОШИБКА: файл не найден
    Return SetError(2, 0, "")
EndFunc ; ==>  _AU3_LibIncToPath


Creat0R 16-10-2008 11:02 925309

amel27,
Цитата:

Цитата amel27
Тот же SciTE поддерживает полный список всех служебных слов - в том числе системных UDF, а эти списки сильно меняются от версии к версии. »

Я понял о чём ты, просто под UDF я понимаю User Defined Function, но никак не встроенные функции.

Цитата:

Цитата amel27
Как вариант - восстановить список используемых UDF из самого скрипта »

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

Цитата:

Цитата amel27
Примеры UDF, с помощью которых можно это реализовать: »

Полезные UDF, спасибо! :)

P.S
Я запустил этот скрипт под 3.2.8.1, и действительно понял почему разработчики изменили состав стандартных библиотек (убрали из них лишнее), там слишком много всего, только у одного Array.au3 сколько функции... кстати, а эти UDF не ищят больше чем на один уровень? я натравил их на скрипт с GuiConstants.au3, и они выдали список только первого уровня...

Creat0R 16-10-2008 11:48 925350

amel27,
Нашёл на оф. сайте по теме: Highlight syntax help.. и AutoIt Editor

В первом не предусмотрена раскраска объектов (к примеру $oObject.Name), скобок, и встроенных функции, но это уже начало. А во-втором я просто не могу понять что используется для раскраски, вроде Dll'ка SciLexer.dll, но не уверен.

mikola1983 16-10-2008 12:06 925357

как можно проверить версию ос .. проблемма в следующем нужен файл с:\program но на Win64 он лежит в х86 и естественно скрипт его не видит... как можно решить подобный недостаток

amel27 16-10-2008 12:47 925391

Creat0R
Цитата:

эти UDF не ищят больше чем на один уровень? я натравил их на скрипт с GuiConstants.au3, и они выдали список только первого уровня »
гм... у меня вроде ищет по всем уровням - проверил цепочку на GuiButton.au3... а какие там вложения?

Цитата:

Нашёл на оф. сайте по теме »
- 1-й вариант имхо сыроват... возможности RegExp использованы лишь частично, хотя инфа для размышлений есть
- насчет Scintilla думаю ты прав, на оффсайте есть примеры использования, но это уже целый редактор получается...


mikola1983, смотри макрос @ProcessorArch

mikola1983 16-10-2008 13:26 925427

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

Creat0R 16-10-2008 18:11 925670

amel27,
Цитата:

Цитата amel27
у меня вроде ищет по всем уровням »

Извиняюсь, у меня тоже. Мне почему то казалось что там должны быть все вложения и Array, и ListView :sorry: ...

Цитата:

Цитата amel27
на оффсайте есть примеры использования »

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

amel27 17-10-2008 04:47 926044

Creat0R
Цитата:

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

Цитата:

Нужно будет попробовать что-то начать
я так понимаю эта DLL существенная часть SciTE, не потянет ли она за собой те же проблемы?.. К примеру, #cs/#ce подсвечивется неправильно при использовании вложенных комментариев.

mikola1983
Цитата:

как использовать эти макросы на удаленных компьютерах
Все зависит от способа удаленного доступа - при удаленном запуска скрипта (через PsExec) все работает так же как на локальном. Получить тип архитектуры удаленного компьютера можно через WMI - вот CMD-пример, то же самое можно сделать через объекты:
Код:

WMIC /Node:"COMP01" CPU Get Architecture
возвращаемые значения:
----
0 - x86
1 - MIPS
2 - Alpha
3 - PowerPC
6 - Itanium
9 - x64

Creat0R 17-10-2008 06:42 926056

amel27,
Цитата:

Цитата amel27
повлияет ли это на размер скомпилированного скрипта? »

Повлияет, но не намного... это конечно ещё зависит от используемых библиотек, чем их больше, тем влияние соответственно больше :)

Цитата:

я так понимаю эта DLL существенная часть SciTE
Да, но я не конкретно её имел в виду, и вообще если честно уже не вижу как сама dll'ка поможет в раскраске, ведь нам нужен BBCode (кстати, в итоге хотелось бы иметь опцию раскраски и в Html, чтобы предпросмотр можно было осуществить), а там вывод в текстовое поле. Мне больше присмотрелись файлы с таблицами, это думаю будет хорошее начало...


P.S
Немного о другом...
Ты случаем не вкурсе, возможно ли запустить файл (приложение) с любым именем процесса? т.е чтобы после запуска имя процесса отличалось от имени самого файла. Ну или поменять имя процесса после запуска. Я на оф. форуме спросил про это, но что-то путного решения так и не поступило (кроме метода ADS, который поддерживается как я понял, только на NTFS).

amel27 17-10-2008 10:58 926197

Creat0R
Цитата:

Ты случаем не вкурсе, возможно ли запустить файл (приложение) с любым именем процесса?»
Не в курсе, но судя по параметрам функции CreateProcess нельзя, т.е. имя процесса привязано к имени файла образа и все триксы будут упираться в файловую систему... Кстати, на NTFS можно еще использовать жесткие ссылки (Hard Links) через FileCreateNTFSLink(), при этом не создается физической копии файла - только ссылка на тот же файл... файл будет существовать на диске пока не будет удалена последняя ссылка на него.

Creat0R 17-10-2008 11:18 926231

amel27,
Цитата:

Цитата amel27
судя по параметрам функции CreateProcess нельзя »

А как на счёт CopyProcess? я где то читал что возможно скопировать процесс под другим именем, вот только где читал найти немогу :( Или я неверно понял и оно не реально?

amel27 18-10-2008 10:25 927096

Creat0R
Цитата:

А как на счёт CopyProcess? »
Не знаю такой функции. В системной структуре, описывающей процесс (EPROCESS), нет никакого "имени процесса" - есть только путь к файлу образа ("Image Filename"). Операционной системе "имя процесса" не нужно - ей достаточно PID... Поэтому думаю то, что называется "именем процесса", есть на самом деле "имя файла" образа. Даже если бы такая функция и была, ей пришлось бы продублировать "имя файла" для копии процесса.

З.Ы. AFAIK в операционках с поддержкой виртальной памяти процесс никогда не теряет связь с файлом образа, или другими словами - никогда "полностью" на загружается в оперативную память. Файл образа лишь проецируется на виртуальную память процесса, а уж какая часть этой памяти находится в RAM, а какая на диске знает только ОС. Возможно, если бы оперативная (быстрая) память стоила дешевле внешней (медленной), ОС имели бы совсем другую архитектуру и процессы могли иметь свои виртуальные имена, никак не связанные с файлами образов.

тебе не кажется, что мы ушли в сторону от темы? :)

morgan1991 22-10-2008 23:36 931074

Привет всем! Скажите плиз ктонить, как с помощью Autoit отправить письмо на мыло с файлом? Только с авторизацией.
Допустим есть смтп сервер mail.hoster.ru есть ящик support@m-sait.ru, логин: support@m-sait.ru и пароль: пароль
Помогите чем можете весь инэт перешерстил не могу найти.
Заранее спасибо.

Maza Faka 23-10-2008 07:32 931235

morgan1991
Здесь обсуждалось.

morgan1991 23-10-2008 09:12 931282

Помогите хочу получитьработающий этот код
Код:

$BlatArgs = 'letter.txt -t delta2-greit[support@]m-sait.ru -f delta-greit[support@]m-sait.ru -s "спасибо за помощь" -server mail.hoster.ru -u delta-greit -password здесь походу пароль? "Windows-1251" -attach 1.txt'

_SendMail($BlatArgs)

Func _SendMail($CMDstring)
    $BlatDLL = DllOpen ("blat.dll")
    Do
        $result=DllCall($BlatDLL,"int","Send","str",$CMDstring)

        Select
            Case
$result[0] = 13
                MsgBox(16,"Ошибка. Код ошибки " & $result[0], "Не могу открыть временный файл во временной папке")

            Case $result[0] = 12
                MsgBox(16, "Ошибка. Код ошибки " & $result[0], "Не указаны или не найдены в реестре аргументы -server или -f")

            Case $result[0] = 3
                MsgBox(16, "Ошибка. Код ошибки " & $result[0], "Не могу прочитать файл с текстом письма или приложенный файл")

            Case $result[0] = 2
                MsgBox(16, "Ошибка. Код ошибки " & $result[0], "Почтовому серверу не понравился адрес отправителя; или он отказал нам в подключении; или неверный пароль; или не найден файл с текстом письма")
            Case $result[0] = 1
                MsgBox(16, "Ошибка. Код ошибки " & $result[0], "Не могу открыть SMTP сокет. Проверьте подключение к Интернету; либо неверные аргументы")
            Case $result[0] <> 0
                MsgBox(16, "Ошибка. Код ошибки " & $result[0], "Неизвестная ошибка")
        EndSelect
    Until
$result[0] = 0
    ConsoleWrite ("Письмо отправлено :-)" & @CRLF)
    DllClose ($BlatDLL)
EndFunc ; ==> _SendMail

Но он не пашет пишет: Не могу открыть SMTP сокет. Проверьте подключение к Интернету; либо неверные аргументы

amel27 23-10-2008 12:45 931456

вариант для аутглюка:
Код:

_OESetMAPIWarn(0) ; Отключаем предупреждения Outlook Express
$res = _OESendMail("mail@mail.ru", "Theme", "TEXT", "c:\boot.ini")

Func _OESendMail($sMailTo, $sSubj="", $sText="", $sFile="")
    Local $tSession = DllStructCreate("hwnd hSession")
    Local $pSession = DllStructGetPtr ($tSession)

    Local $tMAPIMessage = DllStructCreate("long Rsvr;ptr Subj;ptr Text;ptr Type;ptr DateRcv;ptr CnvrsID;long Flags;long Orig;long RcpCount;ptr Rcps;long FileCount;long Files")
    Local $tMAPIRecip  = DllStructCreate("long Rsvr;long Class;ptr Name;ptr Addr;long EIDSize;long EntryID")
    Local $tMAPIFile    = DllStructCreate("long Rsvr;long Flags;long Pos;ptr Path;ptr Name;ptr Type")

    Local $tMAPIRecipAddr = DllStructCreate("char["& StringLen($sMailTo)+1 &"]")
    Local $pMAPIRecipAddr = DllStructGetPtr($tMAPIRecipAddr)
    DllStructSetData($tMAPIRecipAddr, 1, $sMailTo)
    DllStructSetData($tMAPIRecip, "Addr",$pMAPIRecipAddr)

    Local $tMAPIMessageSubj = DllStructCreate("char["& StringLen($sSubj)+1 &"]")
    Local $pMAPIMessageSubj = DllStructGetPtr($tMAPIMessageSubj)
    DllStructSetData($tMAPIMessageSubj, 1, $sSubj)
    DllStructSetData($tMAPIMessage, "Subj",$pMAPIMessageSubj)

    Local $tMAPIMessageText = DllStructCreate("char["& StringLen($sText)+1 &"]")
    Local $pMAPIMessageText = DllStructGetPtr($tMAPIMessageText)
    DllStructSetData($tMAPIMessageText, 1, $sText)
    DllStructSetData($tMAPIMessage, "Text",$pMAPIMessageText)

    Local $tMAPIFilePath = DllStructCreate("char["& StringLen($sFile)+1 &"]")
    Local $pMAPIFilePath = DllStructGetPtr($tMAPIFilePath)
    DllStructSetData($tMAPIFilePath, 1, $sFile)
    DllStructSetData($tMAPIFile, "Path",$pMAPIFilePath)

    DllStructSetData($tMAPIMessage, "RcpCount", 1)
    DllStructSetData($tMAPIMessage, "FileCount", 1)
    DllStructSetData($tMAPIMessage, "Rcps", DllStructGetPtr($tMAPIRecip))
    DllStructSetData($tMAPIMessage, "Files", DllStructGetPtr($tMAPIFile))
    DllStructSetData($tMAPIRecip, "Class", 1)

    $Ret = DllCall(@ProgramFilesDir &"\Outlook Express\MSOE.DLL", "int", "MAPISendMail", _
        "hwnd", 0, "hwnd", 0, "ptr", DllStructGetPtr($tMAPIMessage), "int", 0, "int", 0 )
    Return $Ret[0]
EndFunc

Func
_OESetMAPIWarn($iFlag = True)
    Local $iRes, $sKey
    Local Const $sRoot = "HKEY_CURRENT_USER\Identities"
    Local Const $sMail = "\Software\Microsoft\Outlook Express\5.0\Mail"
    If $iFlag <>0 Then $iFlag=1

    For $i= 1 to 10
        $sKey = RegEnumKey($sRoot, $i)
        If @error then ExitLoop
        $iRes = RegWrite($sRoot &"\"& $sKey & $sMail, "Warn on Mapi Send","REG_DWORD", $iFlag)
    Next

    Return
$iRes
EndFunc


morgan1991 23-10-2008 13:04 931484

Нее.... Мне нужно отправить письмо с авторизацией на своём домене. Ну на своем мыле типо с логином и паролем. И + в скрытом режиме без дополнительных программ, только чтобы после отправки вылетело сообщение типо письмо отправлено.

amel27 23-10-2008 13:46 931526

Цитата:

Цитата morgan1991
без дополнительных программ »

ну аутглюк как раз встроенный ;)
Цитата:

Цитата morgan1991
он не пашет пишет: Не могу открыть SMTP сокет »

без пароля нормально, проверь сначала из командной строки: http://www.blat.net/syntax/syntax.html

morgan1991 23-10-2008 13:58 931535

Цитата:

Цитата amel27
Цитата morgan1991:
без дополнительных программ »
ну аутглюк как раз встроенный »

Я имел ввиду чёб не какие проги не открывались кроме самого Autoit да и аутлу не у всех стоит у меня например нету я его удалил.
А что значит без пароля нормально? Тоесть можно отправить письмо без пароля? Можно поподробнее?
Мне нужно просто отправить письмо с файлом с помощью Autoit.
Помогите?

Grammaton Cleric 28-10-2008 08:18 935679

Народ. Один раз форум уже помог... теперь возникла еще одна проблема...
надо во время работы программы проверить наличие определенного файла на вставленной дискете. Если он есть, тогда дальше делать...
У меня вот так:
Код:

While FileExists ( 'A:\gk.db3') = 0
if MsgBox ( 36, 'Автоустановка программы, Перед продолжением установки ТРЕБУЕТСЯ вставить в Floppy дисковод,'&@CRLF&' дискету пользователя, в противном случае работа не будет продолжена.'&@CRLF&'Вы хотите продолжать работу?') = 7 Then
        ExitLoop
        EndIf
WEnd

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

Creat0R 28-10-2008 09:38 935752

morgan1991,
Есть функция _InetSmtpMailCom на оф. форуме, там не используется внешнее приложение.

Цитата:

Цитата Grammaton Cleric
как сделать чтобы при отсутствии дискеты, можно было попросить ее затолкать куда надо...? »

Вот так:

Код:

While DriveStatus('A:\') <> 'Ready' Or Not FileExists('A:\gk.db3')
    If MsgBox(36, 'Автоустановка программы', _
        'Перед продолжением установки ТРЕБУЕТСЯ вставить в Floppy дисковод,' & @CRLF & _
        'дискету пользователя, в противном случае работа не будет продолжена.' & @CRLF & _
        'Вы хотите продолжать работу?') = 7 Then ExitLoop
WEnd


morgan1991 28-10-2008 22:57 936569

спс Creat0R, только не могу понять чё это такое?:
Код:

  $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
    If Number($IPPort) = 0 then $IPPort = 25
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
    ;Authenticated SMTP
    If $s_Username <> "" Then
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
        $objEmail
.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password

зачем эти ссылки? Захожу по ним а они не рабочие, точнее там пишет типо 404, а код без них не пашет

semiono 28-10-2008 23:36 936603

Подскажите пжлст, что лучше или в каком случае лучше
winwaitactive("Alcohol","Welcome to the Alcohol") vs winwaitactive("[TITLE:Alcohol; Class:#32770]")

controlclick("Alcohol", "License Agreement", "I &Agree", "left", 1) vs controlclick("Alcohol", "License Agreement", "[Class:Button; Instance:2]", "left", 1)

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

Меня более всего не устраивает сама путаница методов, зачем их так много? И как-то не систематизированно, сколько хелп читаю, всёравно только методом тыка познаётся.

Creat0R 29-10-2008 00:20 936629

morgan1991,
Цитата:

Цитата morgan1991
зачем эти ссылки? »

Это вроде как константы, судя по рассуждениям тут, на самом деле обращения на сервер MS не происходит (хотя видимо это зависит от тех же настроек).

semiono,
Цитата:

Цитата semiono
что лучше или в каком случае лучше

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

Цитата:

Цитата semiono
не устраивает сама путаница методов, зачем их так много? »

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

Цитата:

Цитата semiono
сколько хелп читаю, всёравно только методом тыка познаётся »

Ну, оно так почти всегда, справка помагает, подталкивая на нужное направление ;)

semiono 29-10-2008 01:27 936665

Путаница я имел ввиду в том, что если
winwaitactive("[TITLE:Alcohol; Class:#32770]") достаточно лишь [Title + Class] юзать,
то в controlclick нужен титл разделённый обычным текстом и потом уже класс...
то есть я хотел сначала перейти на полное использование только классов, но ведь так нельзя:

controlclick("[TITLE:Alcohol; Class:#32770]", "????", "[Class:Button; Instance:2]", "left", 1)

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

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

Creat0R 29-10-2008 01:36 936674

semiono,
Цитата:

Цитата semiono
в controlclick нужен титл разделённый текстом и потом уже класс »

Там не обязательно ставить текст ;)

Цитата:

Цитата semiono
Если делать не для себя, то возможные проблеммы когда откроется какоенибудь посторонее окно
и Enter улетит в него »

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

amel27 29-10-2008 06:16 936723

Creat0R
Цитата:

Вот так »
Супер!.. я бы на такой код не решился :biggrin: ...к примеру, в Си он является грубой ошибкой - компилятор не обязан соблюдать последовательность выполнения равноправных операндов - т.е. FileExists() вполне может выполниться перед DriveStatus(), поэтому мой вариант был бы другой (ниже)... Но скрипты выполняются "как написано" (всегда ли?) и это позволяет упростить некоторые проверки (контроль @error, IsArray(), etc.)
Код:

While 1
    $Next = (DriveStatus("A:")=="READY")
    If $Next Then $Next = FileExists('A:\gk.db3')
    If $Next Then ExitLoop

    If
MsgBox (36, 'Предупреждение', 'Автоустановка программы, Перед продолжением установки ТРЕБУЕТСЯ вставить в Floppy дисковод,' & _
        @CRLF& ' дискету пользователя, в противном случае работа не будет продолжена.' & _
        @CRLF& 'Вы хотите продолжать работу?') = 7 Then Exit
    Sleep(100)
WEnd

MsgBox(48, "Информация", "Запущена установка программы!")

Цитата:

Старые методы оставлены в целях обратной совместимости. »
не, скорей в целях прямой обучаемости :)

Grammaton Cleric 29-10-2008 10:27 936844

Цитата:

Цитата amel27
Супер!.. я бы на такой код не решился ...к примеру, в Си он является грубой ошибкой - компилятор не обязан соблюдать последовательность выполнения равноправных операндов - т.е. FileExists() вполне может выполниться перед DriveStatus(), поэтому мой вариант был бы другой (ниже)... Но скрипты выполняются "как написано" (всегда ли?) и это позволяет упростить некоторые проверки (контроль @error, IsArray(), etc.)
Код:

$Next = False
While 1
 If DriveStatus("A:")=="READY" Then $Next = True
 If $Next Then $Next = FileExists('A:\gk.db3')
 If $Next Then ExitLoop
If MsgBox (36, 'Предупреждение', 'Автоустановка программы, Перед продолжением установки ТРЕБУЕТСЯ вставить в Floppy дисковод,' & _
 @CRLF& ' дискету пользователя, в противном случае работа не будет продолжена.' & _
 @CRLF& 'Вы хотите продолжать работу?') = 7 Then Exit
 Sleep(100)
WEnd
MsgBox(48, "Информация", "Запущена установка программы!")

»

Хм... я вот не программер, я только учусь.. Тут все, конечно, круто, но вот только я не понимаю смысл этих операций с переменной $next, не в том смысле, что я могу проще, а в том смысле, что "не мог бы ты объяснить?"... При чем, учитывая мою слабую компетентность в этом вопросе, при объяснении прошу использовать стиль "a la" для детсадовца... Не хочется просто использовать данный кусок кода - хочется его понять, для начала.

amel27 29-10-2008 11:23 936890

Цитата:

Цитата Grammaton Cleric
"не мог бы ты объяснить?" »

без проблем - у меня лобовой вариант привел к дублированию кода (MsgBox):
Код:

While 1
    If DriveStatus("A:")=="READY" Then
        If
FileExists('A:\gk.db3') Then
            ExitLoop
        Else
            If
MsgBox (36, 'Предупреждение','Автоустановка программы, Перед продолжением установки ТРЕБУЕТСЯ вставить в Floppy дисковод, '&@CRLF& _
                                            'дискету пользователя, в противном случае работа не будет продолжена.'&@CRLF& _
                                            'Вы хотите продолжать работу?') = 7 Then Exit
        EndIf
    Else
        If MsgBox (36, 'Предупреждение','Автоустановка программы, Перед продолжением установки ТРЕБУЕТСЯ вставить в Floppy дисковод, '&@CRLF& _
                                        'дискету пользователя, в противном случае работа не будет продолжена.'&@CRLF& _
                                        'Вы хотите продолжать работу?') = 7 Then Exit
    EndIf
    Sleep(100)
WEnd

MsgBox(48, "Информация", "Запущена установка программы!")

поэтому я ввел некий флаг $Next, который изначально равен FALSE (aka "красный свет", TRUE - "зеленый"),
далее (с учетом изменений):

- если вставлен диск, то DriveStatus() дает "зеленый", иначе - "красный";
- FileExists() может изменить цвет на "красный", но только с "зеленого" (иначе будет ошибка);
- если после всех проверок "зеленый", то скрипт выходит из цикла и продолжает работу;
- если "красный", то попадаем на предупреждение и далее либо выход из скрипта, либо по циклу до "зеленого"

Creat0R 29-10-2008 12:43 936962

amel27,
Цитата:

Цитата amel27
FileExists() вполне может выполниться перед DriveStatus() »

Если первое услове истина (True), то второму нет смысла выполняться, т.к условия разделены оператором Or. Также и с оператором "и", если есть два условия через And, и первое не является истиной, то второе не будет выполняться, оно выполняется только если первое условие это True.
Иногда это помагает, а иногда как раз наоборот.

Цитата:

Цитата amel27
мой вариант был бы другой (ниже) »

Тем то AutoIt мне и нравится, что в нём можно сделать всё предельно просто, но точно также как и сложно :biggrin:

Цитата:

Цитата amel27
лобовой вариант привел к дублированию кода (MsgBox) »

Не обязательно:

Код:

While 1
    If DriveStatus("A:") <> "READY" Then
        If
MsgBox (36, 'Предупреждение', _
            'Автоустановка программы, Перед продолжением установки ТРЕБУЕТСЯ вставить в Floppy дисковод, ' & @CRLF & _
            'дискету пользователя, в противном случае работа не будет продолжена.' & @CRLF & _
            'Вы хотите продолжать работу?') = 7 Then Exit

        ContinueLoop
    EndIf

    If
FileExists('A:\gk.db3') Then ExitLoop
WEnd


MsgBox(48, "Информация", "Запущена установка программы!")

Или это не лобовой? :tomato2:

semiono 29-10-2008 13:58 937032

>Пожалуйста помогите с кодом?
>Надо проверить установлен ли SPTD драйвер и если нет перезагрузить Windows XP.
>Я думаю проверку драйвера можно осуществить проверкой существования файла:
>"%SystemRoot%\system32\drivers\sptd.sys"
>Или есть лучше вариант? (SPTD - это драйвер с которым обычно работает Alcohol)
>Перезагрузку можно выполнить так Run($WinDir"\system32\shutdown.exe", "-f -r -t 00") если я не ошибаюсь?
>Помогите целым куском кода, чтоб сразу вставить в скрипт? Иначе я запутаюсь в IF - логических консрукциях :\
>Ещё возможна трабла, так как я всётаки хочу это установить во время инсталяции windows на t13, может быть тут какие-то ещё есть сложности? Я >вообще-то не уверен перезагрузится ли windows в этой ситуации.
>Но полюбому, хотя бы так нужен скрипт, хотябы обычно юзать.

Ай-ай, я уже сам написал, примерчек:
Код:

If FileExists("C:\autoexec.bat") Then
Run("Calc.exe")
Else   
Shutdown(6)
EndIf

Только как это грамотно сделать, чтоб Then переходил в основной код, ссылку чтоли тут надо? Как это делают? GoTo чтоль...
Или просто тупо вставить весь код программы между: Then ... Else? Вроде это не по-програмиссткски! :)

Maza Faka 29-10-2008 15:36 937110

Цитата:

Цитата semiono
Только как это грамотно сделать, чтоб Then переходил в основной код »

Смотри в справке Func()

Grammaton Cleric 30-10-2008 04:05 937650

amel27, Creat0R ну в общем-то эти варианты работают... Спасибо за помощь а так как частенько приходится эти файлы на дискетах проверять, наваял себе небольшую функцию...
Код:

;_Fileona ('param1', 'param2', 'param3')
;в функцию отравляется название файла... проверяется наличие дискеты и наличие на ней файла
;param1 = имя файла (если указывается путь, то без первого слэша)
;пример: 'test.txt' или, во втором случае, 'mydir\test.txt'
;param2 = Титл окна выдаваемого в случае отстутствия дискеты или файла
;param3 = текст окна выдаваемого в случае отстутствия дискеты или файла
Func _Fileona ($onafile, $onatitle, $onatext)
        While DriveStatus ('A:\') <> 'Ready' or Not FileExists ( 'A:\'&$onafile)
                if MsgBox ( 36, $onatitle, $onatext&@CRLF&'Вы хотите продолжить?') = 7 Then
                        ExitLoop
                EndIf
        WEnd
$onafile = 0
$onatitle = 0
$onatext = 0
EndFunc

Вдруг кому пригодится.
-------
И еще вопрос к amel27 и Creat0R объясните пожалуйста чем "ContinueLoop" отличается от его отстутствия?

amel27 30-10-2008 04:32 937653

Creat0R
Цитата:

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

Цитата:

Тем то AutoIt мне и нравится »
угу, только надо держать "в уме" это различие

Цитата:

Не обязательно »
твой код не выдаст предупреждения на дискету без файла :tongue:


semiono
Цитата:

Или есть лучше вариант?»
имхо надежней через реестр - например, проверить параметр "Start" ключа "HKLM\System\CurrentControlSet\Services\SPTD", если =1, то драйвер установлен, смотри в справке RegRead()


Grammaton Cleric
Цитата:

чем "ContinueLoop" отличается от его отстутствия? »
ContinueLoop - силовое завершение текщего цикла - т.е. пропускается весь код до конца цикла и управление передается сразу на Next/WEnd/Until, при вложенных циклах можно указать, какой именно цикл мы хотим завершить, по умолчанию =1 (текущий)

Grammaton Cleric 30-10-2008 05:11 937656

Цитата:

Цитата amel27
ContinueLoop - силовое завершение текщего цикла... »

Теперь дошло... спасибо за объяснение..
Теперь еще одна непонятка...
Цитата:

Цитата amel27
Код:

$Next = (DriveStatus("A:")=="READY")
 If $Next Then $Next = FileExists('A:\gk.db3')
 If $Next Then ExitLoop

»

Вторая проверка, по моим соображениям, всегда будет успешно выполняться... То есть при любом результате - выход из цикла... почему-то мне кажется, что здесь If $Next Then $Next = FileExists('A:\gk.db3') должно иметь вид If $Next Then $Next = (FileExists('A:\gk.db3')==1) или я не прав?

amel27 30-10-2008 05:38 937666

Цитата:

Цитата Grammaton Cleric
If $Next Then $Next = FileExists('A:\gk.db3') должно иметь вид If $Next Then $Next = (FileExists('A:\gk.db3')==1) »

в обоих случаях $Next присвоится 1/True при наличии файла и 0/False при его отсутствии
любое число <>0 обрабатывается при проверке как TRUE, 0 соотвественно FALSE, так что эти варианты эквивалентны

Creat0R 30-10-2008 13:59 938033

amel27,
Цитата:

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

Код:

;Пример 1
If 1 = 1 Or TestFunc() Then MsgBox(0, "", "1 = 1")

;Пример 2
If 1 = 0 And TestFunc() Then MsgBox(0, "", "1 = 0?")

;Эта функция никогда не запустится с условиями выше
Func TestFunc()
    Return MsgBox(0, "", "MsgBox from TestFunc()")
EndFunc

Цитата:

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

Цитата:

ContinueLoop - силовое завершение текщего цикла
Разве? :shuffle: Мне казалось что это продолжение цикла с начала :) Выход это ExitLoop.

Цитата:

$Next = (DriveStatus("A:")=="READY")
If $Next Then $Next = FileExists('A:\gk.db3')
If $Next Then ExitLoop
Вместо этого можно просто If DriveStatus("A:") == "READY" And FileExists('A:\gk.db3') Then ExitLoop :tongue:

amel27 30-10-2008 15:24 938123

Creat0R
Цитата:

не вижу связи »
это я про про алгоритмы вообще и про скрипты vs компиляторы в частности
Цитата:

про это сообщение небыло речи »
имхо бессмысленно кричать пользователю о том что нужна дискета и радостно жевать до опупения первую попавшуюся :)
Цитата:

мне казалось что это продолжение цикла с начала
подтверждаю, слово "цикл" применил не по назначению, имел ввиду текущий проход цикла
Цитата:

мой первый вариант самый оптимальный »
дык потому и отметил полезняшкой ;)
Цитата:

Вместо этого можно просто »
зациклились однако :)

Creat0R 30-10-2008 16:53 938209

amel27,
Цитата:

Цитата amel27
зациклились однако »

Да, пора закругляться :jester:

У меня тут на другую тему есть вопрос: Обязательно ли освобождать разного рода хендлы (типа Callback, FileOpen и т.п.) при выходе из скрипта (OnAutoItExit)?

В справке у FileClose() сказано:

Цитата:

Upon termination, AutoIt automatically closes any files it opened, but calling FileClose is still a good idea.
Возможно это относится и к другим хендлам? И если нет, то что происходит если не закрывать хендлы на выходе, возможно будет излишнее переполнение памяти?

amel27 31-10-2008 05:49 938673

Цитата:

Цитата Creat0R
Обязательно ли освобождать разного рода хендлы »

Те что открыты через API обязательно, через ф-ции AutoIT необязательно (при штатном выходе из скрипта), если скрипт прерывается системой (обычно при тестировании), то хвосты остаются полюбому... помогает только регулярная перезагрузка. :) С другой стороны, для "тяжелых" скриптов полезно своевременно закрывать освободившиеся описатели из соображений экономии ресурсов.

ADD: ИМХО вопрос упирается в поддерживаемые типы данных, примерно так: если для к-либо описателя есть ф-ция типа Is*(), где * - тип описателя, то AutoIT должен уметь сам корректно закрывать такие переменные-описатели... Но если, к примеру, обычная переменная содержит несвойственный ей тип (целое число -> указатель на стуктуру, полученный через API), то тут понятно ответственность полностью на авторе скрипта

Dump 31-10-2008 06:43 938678

:cool: :jester: :lol: :sorry: :( :o :) :tongue: :help: :lazy: :oszone: :search: :clapping: :beta: :closed-to :read: :yahoo: :drug: :drug: :dont-know :happy: :kiss: :lazy: :help:

Creat0R 31-10-2008 12:43 938910

amel27,
Цитата:

Цитата amel27
Те что открыты через API обязательно, через ф-ции AutoIT необязательно »

Т.е DllCallBackRegister() не обязательно освобождать? у меня просто есть несколько UDF'ов, в них я использую функцию OnAutoItExit для высвобождения хендлов (от DllCallBackRegister и от таймера), и по ясным причинам, позже эта функция может вовсе не вызываться (пользователь задаст другую). Вот мне и стало интересно, чем я рискую убрав совсем эту функцию, не закрывая ничего.

Maza Faka 31-10-2008 16:03 939101

Creat0R
В бета версии этот баг исправлен

Creat0R 31-10-2008 18:30 939235

Maza Faka,
Цитата:

В бета версии этот баг исправлен
А я не говорю про баг :) - И, кстати, это я зарепортил об этом баге ;), хотя я скорее зарепортил это как Feature Request, чтобы хендл очищался (если речь про крах при использоваии DllCallbackFree с неправильным хендлом).

amel27 01-11-2008 03:22 939612

Creat0R
Цитата:

DllCallBackRegister() не обязательно освобождать?»
думаю необязательно, хотя желательно... порядка ради :)
Цитата:

от DllCallBackRegister и от таймера »
не путай одно с другим - если таймер вызывается через API, то нужно следовать требованиям MSDN, а там сказано:
Цитата:

Applications should use the KillTimer function to destroy timers that are no longer necessary.

Maza Faka 01-11-2008 07:16 939640

Цитата:

Цитата Creat0R
А я не говорю про баг »

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

If IsDeclared("ProcHandle") Then
  If $ProcHandle <> 0 Then DllCallbackFree($ProcHandle)
EndIf

:)

amel27 01-11-2008 14:45 939891

Цитата:

Пока нет релиза новой версии, с этой напастью борюсь так »
Maza Faka, Creat0R, не пойму о чем вы?.. Если скрипт пишу я, то мне очень даже известно в каком месте какой хэндл открыт - достаточно добавить проверку на ошибки.

Другое дело, если логика скрипта включает много ветвлений типа IF/ELSE, то код закрытия описателей придется дублировать не один раз - для каждого благоприятного исхода их открытия, а это раздувает текст скрипта повторяющимися строчками - прямо как с примером про дискету :) ...Вот и приходится вводить вспомогательные "флаги", которые проверяются уже при выходе из UDF или скрипта. Проверка IsDeclared() имхо тоже не решение, так как все переменные обычно определяют еще в заголовке скрипта/UDF.

Как уже было озвучено выше - эта проблема актуальна прежде всего для API, а интеллектом AutoIT по чистке "своего" мусора ИМХО не стоит пренебрегать - особенно если при этом скрипт становится существенно короче и читабельней. ;)

Creat0R 01-11-2008 15:54 939941

Maza Faka,
Цитата:

Цитата Maza Faka
Да, это не баг »

Ты меня немного не так понял. Я не говорил что есть или нету бага (хотя он есть), я вовсе не об этом писал, я просто хотел узнать нужно ли освобождать хендлы, и amel27 довольно исчерпывающе ответил :)

Цитата:

Цитата Maza Faka
Пока нет релиза новой версии, с этой напастью борюсь так »

Я предпочитаю ещё и переменную обнулировать, см. мой репорт.

amel27,
Цитата:

Цитата amel27
Если скрипт пишу я, то мне очень даже известно в каком месте какой хэндл открыт - достаточно добавить проверку на ошибки. »

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

Maza Faka 01-11-2008 16:08 939954

Creat0R
amel27
OK! :)

D_Master 01-11-2008 16:22 939966

эммм... такой вопрос - есть ли возможность раскомпилировать exe'шник, написанный на AutoIt'e?

Maza Faka 01-11-2008 17:00 940003

Цитата:

Цитата D_Master
есть ли возможность раскомпилировать exe'шник, написанный на AutoIt'e? »

Штатной AutoIt утилитой Exe2Aut.exe, только скрипты версии 3.2.5.1 и ранее. А нештатными утилитами - это из области хакинга/дебагинга :)

D_Master 01-11-2008 17:25 940017

Maza Faka, спасибо, но exe-шники, к сожалению, оказались версии 3.2.12.1. Придётся обращаться к автору и просить исходники :)

amel27 02-11-2008 10:08 940566

Creat0R
Цитата:

иногда скрипт требует динамичного создания и освобождения хендлов »
если несложно, можно пример?.. или линк

Creat0R 02-11-2008 13:27 940670

amel27,
Цитата:

Цитата amel27
можно пример?.. или линк »

Ну к примеру мой GUICtrlSetOnHover UDF. Там при каждом вызове функции GUICtrlSetOnHover() проверяется не установлен ли уже CallBack, также при вызове GUICtrlUnSetOnHover() высвобождается CallBack и таймер (если это последний элемент в массиве). Вот там могут возникнуть проблемы. Также юзер может вызвать функцию OnAutoItExit() предварительно, таким образом будет высвобождён CallBack (и если проверки не будет, то повторный вызов приведёт к краху скрипта).

P.S
Это только один пример, есть ещё пару (точно где не помню), где дела обстоят ещё хуже.

Babullika 02-11-2008 18:40 940947

При использовании
AutoItSetOption("TrayIconDebug", 1)
на ПК все норм работает а на буке нет строки... в чем может быть проблема ?

Maza Faka 03-11-2008 06:20 941336

Babullika
Какая ОС на ПК и буке?

Babullika 03-11-2008 09:57 941400

на ПК XP Pro sp3 ( Zver CD ) , на буке XP Pro SP3 из MicroXP v0.8 , видимо из образа микро xp убрали какие то необходимые библиотеки или типа того

amel27 03-11-2008 10:11 941411

Creat0R

Во-первых, в твоем примере нет динамического создания/удаления описателей - тут речь всего о двух хэндлах, а точнее - об одной группе связанных описателей: (CallBack + Timer), которую можно обозвать одним "составным описателем". Во-вторых, я не вижу проблемы как таковой - определи пару UDF: одна создает описатель, другая - закрывает и пусть пользователь сам решает куда их втыкать. ;)

Могу предложить свой вариант системы UDF, причем без создания глобальных данных:

_GUICtrlOnHoverCallOpen() - открывает хэндлы, инициализирует и возвращает массив - управляющую структуру, в которой сохраняются хэндлы и рабочие данные, пример заполнения:

$aControl [0] [0] - кол-во элементов массива (обрабатываемых контролов)
$aControl [0] [1] - описатель CallBack
$aControl [0] [2] - описатель Timer

$aControl [$i] [0] - ControlID
$aControl [$i] [1] - HoverFuncName
$aControl [$i] [2] - HoverFuncNameLeave

_GUICtrlOnHoverCallClose(ByRef $aControl) - закрывает все описатели и уничтожает управляющий массив ($aControl =0)

_GUICtrlOnHoverCallAdd(ByRef $aControl, $CtrlID, $HoverFuncName = "", $HoverFuncNameLeave = "") - регистрирует контрол для обработки

_GUICtrlOnHoverCallDelete(ByRef $aControl, $CtrlID) - снимает контрол с обработки


Цитата:

Цитата Creat0R
есть ещё пару (точно где не помню), где дела обстоят ещё хуже »

вспоминай ;)


ADD: может я ошибаюсь, но имхо для штатного GUI не нужен никакой таймер - достаточно поставить обработчик сообщения WM_MOUSEMOVE ...совсем другое дело обработка контролов чужих окон, но там одного ControlID недостаточно, нужно еще идентифицировать главное окно или процесс... а может просто передавать hWnd контрола?.. впрочем, это уже будет совсем другая функция :)

Creat0R 03-11-2008 13:38 941571

amel27,
Цитата:

Цитата amel27
в твоем примере нет динамического создания/удаления описателей »

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

Например:

Код:

#include <GuiConstants.au3>
#include <GUICtrlSetOnHover_UDF_For 3.2.10.0.au3>

$GUI = GUICreate("Test Script", 300, 200)

$Button = GUICtrlCreateButton("Button", 20, 40, 60, 20)

For $i = 1 To 10
    If Mod($i, 2) = 0 Then
        _GUICtrlSetOnHover($Button, "Hover_Func", "Leave_Hover_Func")
    Else
        _GUICtrlUnSetOnHover($Button)
    EndIf
Next


GUISetState(@SW_SHOW, $GUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

В этом случае, если не проверять If $pTimerProc <> 0 в UDF, то скрипт вылетает.

Цитата:

Цитата amel27
не вижу проблемы как таковой »

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

Цитата:

Цитата amel27
Могу предложить свой вариант системы UDF, причем без создания глобальных данных »

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

Цитата:

Цитата amel27
для штатного GUI не нужен никакой таймер - достаточно поставить обработчик сообщения WM_MOUSEMOVE »

Имхо, этого не будет достаточно если нужно чтобы обработка OnHover была и при не активном GUI, а также в последних версиях UDF добавлена возможность OnClick ($sPrimaryDownFuncName, $sPrimaryUpFuncName), там явно MouseMove не поможет.

Busel 03-11-2008 13:54 941602

Как создать Shortcut c параметром - "Setup.exe" -uninstall? Функция FileCreateShortcut создает в кавычках, а нужен параметр без кавычек. Или только батник писать и на него Shortcut?

Babullika 03-11-2008 14:33 941642

Добрый день
Дайте совет пожалусто
Юзаю такую щтуку
FileCopy("C:\Temp2\*.txt", "C:\Temp3\" & Random(-10, 10, 1) & "*.txt", 9)
получается что все файлы копируются с одинаковыми префиксами , а как сделать чтобы у каждого файла префикс разный был ?

Maza Faka 03-11-2008 15:07 941668

Busel
Так?
Код:

FileCreateShortcut(@ScriptDir & "\program.exe", @ScriptDir & "\MyProgram.lnk", @ScriptDir, "Setup.exe -uninstall")
Ты бы код запостил, что бы нам не гадать, какой параметр куда лепить :)

Babullika,
Цитата:

Цитата Babullika
получается что все файлы копируются с одинаковыми префиксами »

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

$source = "C:\Temp2"
$dest = "C:\Temp3"

$hSearch = FileFindFirstFile($source & "\*.txt")
If $hSearch = -1 Then Exit

While
1
    $file = FileFindNextFile($hSearch)
    If @error Then ExitLoop

    Do

        $UnicFile = Random(-10, 10, 1) & ".txt"
    Until FileExists($dest & "\" & $UnicFile) = 0

    FileCopy($source & "\" & $file, $dest & "\" & $UnicFile, 9)
WEnd

FileClose($hSearch)

Если количество файлов будет превышать количество вариантов чисел возвращаемых Random(), то цикл Do... Until зациклится

amel27 03-11-2008 17:30 941818

Creat0R

Цитата:

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

Цитата:

проблема есть, и заключается она в том, что Аутоит "вылетает" когда от него это не ожидается »
ну это все-таки баг и не более... кроме того, как я понял - если обеспечить парность создания/закрытия хэндлов, то ошибки не будет?.. создание парных UDF создания/освобождения косвенно решает эту задачу

Цитата:

А как быть с LAST_HOVERED_ELEMENT? »
извиняюсь, глубоко не вдавался... действительно, WM_TIMER не способен передавать пользовательские данные (в отличие от других WM-сообщений), поэтому хистори придется хранить в глобальных данных, хотя это принципиально ничего не меняет кроме количества параметров в UDF

Цитата:

этого не будет достаточно если нужно чтобы обработка OnHover была и при не активном GUI
может быть... мне все же привязка к GUI кажется искусственной, хотя обобщить при желании не проблема :)

Creat0R 03-11-2008 23:33 942217

amel27,
Цитата:

Цитата amel27
у тебя вроде одна CallBack-функция и регистрируется/удаляется она единожды »

В том то и дело что нет, она регистрируется/удаляется каждый раз как нужно задать/убрать «OnHover» для элемента (если это первый или последний элемент в списке/в массиве). Я это продемонстрировал в примере ранее.

Цитата:

Цитата amel27
если обеспечить парность создания/закрытия хэндлов, то ошибки не будет? »

Тут видимо проблема в том, что если регистрировать и освобождать CallBack в цикле (быстро), то процесс высвобождения не успевает завершиться (видимо он происходит на "уровне системы"), а в то время происходит попытка высвобождения хендла, который уже считается высвобождённым :clever-ma . Вот такая вот сомнительная теория :).

Цитата:

Цитата amel27
привязка к GUI кажется искусственной, хотя обобщить при желании не проблема »

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

morgan1991 04-11-2008 15:04 942724

Скажите пожалуйста можно ли вот это C++ реализовать в Autoit3:
Код:

#include <windows.h>
#include <stdio.h>
#include <iostream>

using namespace std;
//hier werden alle Bytes definiert die wir brauchen
//(sie werden spдter an die entsprechenden Speicherstellen geschrieben).

BYTE nametags1[6] = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90};
BYTE nametags2[2] = { 0x90, 0x90};

BYTE laser1[2] = { 0x75, 0x18};
BYTE laser2[2] = { 0x75, 0x0F};

BYTE UAV[4]= { 0xB0, 0x01, 0x90, 0xC3};

BYTE recoil[6] = { 0x0F, 0x85, 0xAA, 0x02, 0x00, 0x00};

int main()
{           
 
cout << "Call of Duty 4 MemoryHack\ncoded by root.\n"; 
bool beenden=1;
while(beenden=1) //Diese Schleife lдuft so lange bis das Programm sich beendet, um Spaghetticode (goto x) zu verhidern.
{
               
    cout << "Was willst du tun?\n0=‚л室 1=Џ®¤бўҐвЄ* *ЁЄ®ў 2=Laser 3=Radar 4=Verbugtes NoRecoil\n";
    int eingabe=0;
    cin>>eingabe;   
    if(eingabe==0)
    {
                  return 0;
    }
    cout << "Searching for Cod4... \n";
    HWND window = NULL;
    while(window == NULL)
    {
                  Sleep(100);
                  window = FindWindow(NULL, "Call of Duty 4"); //Finde das Call of Duty 4 Fenster (Danke an KN4CK3R fьr diesen Teil)
    }
    DWORD prozess;
    GetWindowThreadProcessId(window, &prozess);
    HANDLE handle;
    handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, prozess);
    DWORD puffer = NULL;
    cout << "Writing to Memory... \n"; //Jetzt ьberprьfen wir, was der Benutzer denn eigentlich will
        switch(eingabe)
    {
    case 1:
        WriteProcessMemory(handle,(void*)(0x42E1AC),&nametags1,6,&puffer);
        WriteProcessMemory(handle,(void*)(0x42E1CE),&nametags2,2,&puffer);
        break;
    case 2:
        WriteProcessMemory(handle,(void*)(0x456E5B),&laser1,2,&puffer);
        WriteProcessMemory(handle,(void*)(0x456E52),&laser2,2,&puffer);
        break;
    case 3:
        WriteProcessMemory(handle,(void*)(0x56B662),&UAV,4,&puffer);
        break;
    case 4:
        WriteProcessMemory(handle,(void*)(0x457C79),&recoil,6,&puffer);
        break;
    }   
    CloseHandle(handle);  //Und brav wieder schlieЯen
   
   
}
return 0; 
}


Creat0R 04-11-2008 15:23 942741

Цитата:

Цитата morgan1991
можно ли вот это C++ реализовать в Autoit3 »

Думаю можно, см. в сторону этих функции:

Код:

#include <WinAPI.au3>

_WinAPI_WriteProcessMemory()
_WinAPI_GetWindowThreadProcessId()
_WinAPI_OpenProcess()
_WinAPI_CloseHandle()


morgan1991 04-11-2008 15:29 942746

спс, только у меня autoit-v3.2.8.1, а внем такое есть?

Creat0R 04-11-2008 23:16 943136

morgan1991,
Цитата:

Цитата morgan1991
у меня autoit-v3.2.8.1, а внем такое есть? »

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

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

morgan1991 04-11-2008 23:23 943142

Не нету возможности, а на счёт библиотеки можно поподробнее?

Creat0R 05-11-2008 01:33 943235

Цитата:

Цитата morgan1991
можно поподробнее? »

WinAPI.zip (108 Kb) - Поместить содержимое в Папку\установки\AutoIt3\Include.

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

amel27 05-11-2008 04:12 943274

Creat0R
Цитата:

Я это продемонстрировал в примере ранее.
в упор не вижу в либе _GUICtrlUnSetOnHover :o ...а чем не устраивает, к примеру, такой вариант:
Код:

#include <GuiConstants.au3>
#include <GUICtrlSetOnHover_UDF_For 3.2.10.0.au3>

$GUI = GUICreate("Test Script", 300, 200)

$Button = GUICtrlCreateButton("Button", 20, 40, 60, 20)

For $i = 1 To 10
    If Mod($i, 2) = 0 Then
        _GUICtrlOnHoverSet($Button, "Hover_Func", "Leave_Hover_Func")
    Else
        _GUICtrlOnHoverUnSet($Button)
    EndIf
Next


GUISetState(@SW_SHOW, $GUI)

_GUICtrlOnHoverStart()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
WEnd


_GUICtrlOnHoverStop()

morgan1991
Цитата:

у меня autoit-v3.2.8.1
у тебя консольный исходник и данные принимаются из StdIn, компиляция скрипта "в консоль" поддерживается только v3.2.12.0. Поэтому, либо обновляй версию, либо меняй источник данных - например, из файла

morgan1991 05-11-2008 13:56 943657

Creat0R, спс, а случайно не раскажешь как пользоваться командами?
Цитата:

Цитата Creat0R
Код:

#include <WinAPI.au3>
 _WinAPI_WriteProcessMemory()
 _WinAPI_GetWindowThreadProcessId()
 _WinAPI_OpenProcess()
 _WinAPI_CloseHandle()

»


Creat0R 05-11-2008 14:04 943665

Вложений: 1
amel27,
Цитата:

Цитата amel27
в упор не вижу в либе _GUICtrlUnSetOnHover »

Извиняюсь, я видимо ещё не запостил последнюю версию, где эта функция добавлена :sorry: , прикрепил новый UDF к посту. Кстати, есть ещё и версия без DllCalbackRegister, на основе WM_TIMER, но там есть свои ограничения (привязка к фиктивному GUI).

Цитата:

Цитата amel27
чем не устраивает, к примеру, такой вариант »

Устраивает, также как и текущий. Хотя лишний раз вызывать функции мне кажется лишним. Тут это только пример показывающий баг у DllCallBackFree, не более.

Цитата:

Цитата amel27
компиляция скрипта "в консоль" поддерживается только v3.2.12.0 »

Но есть для ранних версиях патч ;).

Creat0R 05-11-2008 14:08 943670

morgan1991,
Цитата:

Цитата morgan1991
случайно не раскажешь как пользоваться командами? »

В справке есть описания параметров, я лично с этими функциям не работал ещё.

morgan1991 05-11-2008 14:12 943672

Цитата:

Цитата Creat0R
В справке есть описания параметров »

Качал последнюю справку с офф. сайта v3.2.5.4, позднее нету. Дак вот в ней описания и нету.
Может можно гдето скачать хотябы английский мануал?

Creat0R 05-11-2008 18:27 943960

Цитата:

Цитата morgan1991
Качал последнюю справку с офф. сайта »

Это не последняя версия справки (разве что если на русском).
Я говорил про справку в составе с AutoIt'ом (в последней версии).

morgan1991 05-11-2008 18:57 943995

Цитата:

Цитата morgan1991
Может можно гдето скачать хотябы английский мануал? »

Просто у меня нетвозможности ставить последнюю версию Autoit?

Creat0R 05-11-2008 19:04 944005

Цитата:

Цитата morgan1991
нетвозможности ставить последнюю версию Autoit »

Её не обязательно ставить, можно распаковать установщик тем же винраром и вытащить отдельно файл справки ;) (в крайнем случае 7zip'ом).

semiono 05-11-2008 20:02 944077

Код:

$InstallPath=@ProgramFilesDir & "\MediaStudio"

; Проверка установленной программы, собсно это и хочется закоментировать и пойти другим путём.
If FileExists(@ProgramFilesDir & "\Ulead Systems\Ulead MediaStudio Pro 8.0\veditor.exe") Then Exit
       
; Тута не скажу что ставиться, секрет ;-
ShellExecute("****.exe", "/verysilent", "$ScriptDir")

Blockinput(1)

Run("Ulead MediaStudio Pro 8.0.exe")

WinWaitActive("", "Welcome")
ControlClick("", "", "[Class:Button; Instance:1]", "left", 1)

WinWaitActive("", "License Agreement")
ControlClick("", "", "[Class:Button; Instance:2]", "left", 1)

WinWaitActive("", "Choose Destination Location")
ControlClick("", "", "[Class:Button; Instance:3]", "left", 1)
Send($InstallPath)
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:1]", "left", 1)
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:1]", "left", 1)
Sleep(800)
Send("{BS 32}")
Send($InstallPath & "\Preview")
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:3]", "left", 1)
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:6]", "left", 1)
Sleep(200)
ControlClick("", "", "[Class:Button; Instance:9]", "left", 1)
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:2]", "left", 1)
Sleep(800)
ControlClick("", "", "[Class:Button; Instance:1]", "left", 1)

WinWaitActive("", "InstallShield Wizard Complete")
ControlClick("", "", "[Class:Button; Instance:4]", "left", 1)

Blockinput(0)

Вопросы:
1. Если установленна уже была программа, то при повторной установке откроется MsgBox с заголовком
"Uninstall blah-blah?" и двумя(ми) кнопкоми Yes, No. Довольно частая ситуация, хотелось бы какой нибудь
код предпринять, чтоб напр. Uninstall нажать. Но я не знаю что в If Then... EndIf вписать, подскажите?
Я пробовал так
Код:

Run("Ulead MediaStudio Pro 8.0.exe")
If
WinWaitActive("Uninstall", "") = 0 Then
....
else
ControlClick("", "", "[Class:Button; Instance:4]", "left", 1)
EndIf

не получается...
Как кстати указать чтоб все ошибки репортировались? Потому что в данном случае ошибки были, но молча было :)
2. Что меня удивило тут, то что Sleep действительно нужен! Иначе в многих местах не срабатывает и появляются пропуски... Но почему? Приложение большое - 128 мег, может от этого? Или тут какие-то спецэффекты в окнах. Я помню Sleep не использовал раньше вообще, или лучше всегда и везде так подстраховывать? Хотя я думаю лучше "быстрее" установить чем во время Sleep какоенить посторонее окно может выскочить? :)
3. Как правильно очищать поле ввода [C:\Program Fils\MyApp] ? Его бы выделить сначала, для уверенности,
но как-то всё коряво получается, того и гляди слетит.... Всё что у меня ума хватило это вбивать Send("{BS 32}")
Но зафокусировать поле ввода вообще не знаю как. ? Пожалуста отвечайте кодом, ато я в хелпе потеряюсь совсем...

morgan1991 05-11-2008 22:08 944255

semiono, я тоже както маялся над этим вопросом, вот решение, только не факт что оно комуто покажется хорошим, я в Autoit ещё не мастер:
Код:

Global $InstallPath=@ProgramFilesDir & "\MediaStudio"
Blockinput(1)
; Тута не скажу что ставиться, секрет ;-
ShellExecute("****.exe", "/verysilent", "$ScriptDir")
Run("Ulead MediaStudio Pro 8.0.exe")

While 1 = 1
    $i = $i - 1
    $install = WinWaitActive("", "Welcome", 1)
    $deinstall = WinWaitActive("deinstall", "text", 1)
    If $install = 1 Then install()
    If $deinstall = 1 Then deinstall()
    If $i = 1 Then MsgBox(16, "", "error")
WEnd

Func
deinstall()
    ;Удаление проги
EndFunc

Func
install()
    ControlClick("", "", "[Class:Button; Instance:1]", "left", 1)
    WinWaitActive("", "License Agreement")
    ControlClick("", "", "[Class:Button; Instance:2]", "left", 1)
    WinWaitActive("", "Choose Destination Location")
    ControlClick("", "", "[Class:Button; Instance:3]", "left", 1)
    Send($InstallPath)
    Sleep(800)
    ControlClick("", "", "[Class:Button; Instance:1]", "left", 1)
    Sleep(800)
    ControlClick("", "", "[Class:Button; Instance:1]", "left", 1)
    Sleep(800)
    Send("{BS 32}")
    Send($InstallPath & "\Preview")
    Sleep(800)
    ControlClick("", "", "[Class:Button; Instance:3]", "left", 1)
    Sleep(800)
    ControlClick("", "", "[Class:Button; Instance:6]", "left", 1)
    Sleep(200)
    ControlClick("", "", "[Class:Button; Instance:9]", "left", 1)
    Sleep(800)
    ControlClick("", "", "[Class:Button; Instance:2]", "left", 1)
    Sleep(800)
    ControlClick("", "", "[Class:Button; Instance:1]", "left", 1)
    WinWaitActive("", "InstallShield Wizard Complete")
    ControlClick("", "", "[Class:Button; Instance:4]", "left", 1)
EndFunc

Blockinput(0)

Не забудь тыкнуть спасибо

Цитата:

Цитата Creat0R
можно распаковать установщик тем же винраром и вытащить отдельно файл справки (в крайнем случае 7zip'ом) »

Не хочет ни тот ни другой распаковывать говорит это не архив(((

semiono 05-11-2008 23:17 944331

А что надо распаковать? AutoIt? unattended.org.ua/unattended_soft/winrar/скачать_uniextract-1600 у меня распаковывает.
AutoIt3.chm v3.2.12.1: slil.ru/26305991

morgan1991 05-11-2008 23:36 944359

Цитата:

Цитата semiono
unattended.org.ua/unattended_soft/winrar/скачать_uniextract-1600 »

Только там ссылка на радиосшаир, а у мя голд акка нету, но не беда google.ru

Creat0R 05-11-2008 23:59 944384

Цитата:

Цитата morgan1991
говорит это не архив »

Нужно SFX-установщик скачивать.

morgan1991 06-11-2008 00:04 944390

Creat0R, я просто скачал вот эту прогу uniextract и достал help, спасибо за помощ.

Babullika 06-11-2008 01:38 944454

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

semiono 06-11-2008 03:12 944495

@echo 192.168.1.3> file
@echo 192.168.1.2>> file
@echo 192.168.1.1>> file
батником :)

amel27 06-11-2008 04:05 944513

Creat0R
Цитата:

Цитата Creat0R
прикрепил новый UDF к посту »

у меня все работает без ошибок, могу предположить, что CallBack удаляется до обработки всех WM_TIMER, между прочим в MSDN сказано:
Цитата:

Цитата MSDN
The KillTimer function does not remove WM_TIMER messages already posted to the message queue

попробуй такой вариант:
Код:

Func OnAutoItExit()
    Local $aRet, $QS_TIMER = 0x0010

    If $uiTimer<>0 Then DllCall("user32.dll", "int", "KillTimer", "hwnd", 0, "int", $uiTimer)
    If $pTimerProc<>0 Then
        Do

            $aRet = DllCall("user32.dll", "dword", "GetQueueStatus", "uint", $QS_TIMER)
        Until BitAnd(BitRotate($aRet[0], 16, "D"), $QS_TIMER) =0
        DllCallbackFree($pTimerProc)
    EndIf
    $pTimerProc = 0
    $uiTimer = 0
EndFunc

ADD: хотя может достаточно просто поменять местами строки - сначала закрыть таймер и только потом CallBack?

Цитата:

Цитата Creat0R
есть ещё и версия без DllCalbackRegister, на основе WM_TIMER, но там есть свои ограничения (привязка к фиктивному GUI). »

там тоже скрипт вылетает?
Цитата:

Цитата Creat0R
лишний раз вызывать функции мне кажется лишним

зато хэндлы ставятся/удаляются только один раз при том же эффекте

amel27 06-11-2008 05:23 944539

Babullika,
Цитата:

Цитата Babullika
нужно при каждом подключении к интернету ( через адсл модэм , высокоскоросное подключение ) , записывать в файлик IP адрес »

ADSL под рукой нет, попробуй пример - в качестве параметра можно ввести часть имени адаптера или его индекс, в процессе работы в консоли SciTE выводится список ВСЕХ подключенных адаптеров, там можно подсмотреть правильные имя и индекс:
Код:

$sAdapter = "Realtek RTL8139"
$sFile = "C:\TEST.TXT"

$sAdapterIP = _NetAdapterGetIP($sAdapter)
FileWriteLine($sFile, $sAdapterIP)

Func _NetAdapterGetIP($Find = "", $sHostName = "localhost")
    Local $objItem, $sRes, $objWMIService = ObjGet( "winmgmts:\\"& $sHostName &"\root\CIMV2")
    Local $sQuery = 'SELECT Index, Caption, IPAddress FROM Win32_NetworkAdapterConfiguration Where IPEnabled = True'
    Local $colItems = $objWMIService.ExecQuery($sQuery, "WQL", 0x30)
    If IsObj($colItems) Then
        For
$colItem In $colItems
            If  (IsString($Find) And ($Find == "" Or StringInStr($colItem.Caption, $Find))) Or _
                (
IsInt($Find) And ($Find == 0 Or $Find == $colItem.Index)) Then
                ConsoleWrite ("Index  :"& $colItem.Index &@CRLF)
                ConsoleWrite ("Address:"& $colItem.IPAddress(0) &@CRLF)
                ConsoleWrite ("Caption:"& $colItem.Caption &@CRLF&@CRLF)

                $sRes = $colItem.IPAddress(0)
            EndIf
        Next
    EndIf
    Return $sRes
EndFunc  ;==> _NetAdapterGetIP


Creat0R 06-11-2008 09:34 944634

amel27,
Цитата:

Цитата amel27
у меня все работает без ошибок »

А если убрать проверку If $pTimerProc <> 0.... и If $uiTimer <> 0 ? :)

Цитата:

Цитата amel27
попробуй такой вариант: »

Так тут и без проверки GetQueueStatus работает, достаточно всего лишь проверять хендлы и обнулять их в конце.

Цитата:

Цитата amel27
хотя может достаточно просто поменять местами строки - сначала закрыть таймер и только потом CallBack? »

Пробовал, результат тот же :(

Цитата:

Цитата amel27
там тоже скрипт вылетает? »

Там я решил не высвобождать ничего :) - Тем более что там тоже нет функции _GUICtrlUnSetOnHover.

Но полагаю что и там будет вылетать при похожих обстоятельствах, дело не в таймере, а именно в DllCallBackFree.

amel27 06-11-2008 10:01 944661

Creat0R,
Цитата:

Цитата Creat0R
А если убрать проверку If $pTimerProc <> 0.... и If $uiTimer <> 0 ? »

хэндл нельзя закрыть дважды, поэтому проверка должна быть - не вижу в этом ошибки

Creat0R 06-11-2008 14:32 944932

amel27,
Цитата:

Цитата amel27
хэндл нельзя закрыть дважды, поэтому проверка должна быть »

Но ведь FileClose() или DllClose() не крушат скрипт при передаче неправильного/закрытого хендла (в отличии от DllCallBackFree). Я об этом уже 3 страницы пишу :jester:

amel27 06-11-2008 17:01 945098

Цитата:

Цитата Creat0R
Но ведь FileClose() или DllClose() не крушат скрипт при передаче неправильного/закрытого хендла (в отличии от DllCallBackFree) »

нет слов - DllCallBack только недавно появился, а уже всем чем-то должен... :) Когда-то и в циклах For/Next приходилось следить за границами чтобы не уйти в infinity, и $i приходилось объявлять каждый раз как Local - все это "фичи" приятные, но необязательные - DllCallbackRegister() дает достаточную инфу, и DllCallBack обзаведется фичами... впрочем, это к разработчикам, но с API такое может не пройти... ;)

Creat0R 06-11-2008 17:43 945138

Цитата:

Цитата amel27
Когда-то и в циклах For/Next приходилось следить за границами чтобы не уйти в infinity »

Ну вроде и сейчас нужно следить :).

Цитата:

Цитата amel27
все это "фичи" приятные, но необязательные - DllCallbackRegister() дает достаточную инфу, и DllCallBack обзаведется фичами »

Речь не про фичи, а про конкретный баг, который уже пофиксен.

amel27 07-11-2008 02:17 945535

Цитата:

Цитата Creat0R
Ну вроде и сейчас нужно следить »

согласен, нужно всегда :) ...но в других языках такой цикл "зависнет", а в AutoIT нет:
Код:

For $i=0 To 10
        ConsoleWrite($i &@CRLF)
        $i+=2
Next

Цитата:

Цитата Creat0R
Речь не про фичи, а про конкретный баг»

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

Maza Faka 07-11-2008 06:34 945588

Цитата:

Цитата Creat0R
Но ведь FileClose() или DllClose() не крушат скрипт при передаче неправильного/закрытого хендла »

DllClose() тоже рушит скрипт:
Код:

Global $hDLL
DllClose($hDLL)
MsgBox(0, "Info", "Debug")

:)

Creat0R 07-11-2008 14:27 945917

amel27,
Цитата:

Цитата amel27
не пойму тебя - если баг, то в чем вопрос? »

Шутишь? :) Мы уже 3 страницы об этом пишем, я никаких вопросов не задавал на тему этого бага, проблем у меня с ним нет. Перечитай пожалуйста с начала переписки на эту тему.

Maza Faka,
Цитата:

Цитата Maza Faka
DllClose() тоже рушит скрипт: »

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

semiono 07-11-2008 16:50 946076

Чтоб тему не начинать, позволю себе здесь спросить, как скрыть консоль cmd.exe ?
Код:

HKLM,"Software\Microsoft\Windows\CurrentVersion\Run","MyProg-Setup",0x20000,"cmd.exe /k start /w %SystemRoot%\system32\MyProg.exe & del /f /q %SystemRoot%\system32\MyProg.exe & reg delete HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v MyProg-Setup /f & Exit"
Есть пару сложностей, то что при альтернативном "Shell" = "explorer.exe" некоректно работает RunOnce, и вообще не работает RunOnceEx
И не уверен работает ли cmdow правильно по этой же причине! Например, cmdow /TH не работает точно, хотя может быть всё остальное...

Поэтому приходиться юзать Run, но другие проблеммы связанны с тем, что различные RunConsoleHidden.exe cHwnd.exe вроде бы не поддерживают
комманду start /w и многоуровневое выполнение команд? Либо я просто сам не знаю. Может быть батник написать, хотя тут подумать ещё над ним стоит?

Есть ещё альтернативный RunOnce.exe где-то я видел, хотя не знаю что он может? Собсно мой пример мне подходит, надо только скрыть cmd.exe!
Хотя и другие варианты тоже хотелось бы послушать? И кстати, как это же реализовать через AutoIt? То-есть установку программы и затем удаление всех "следов" от её инсталлера, при этом не используя RunOnce разделы реестра!?

:)

Creat0R 07-11-2008 17:59 946137

semiono,
Цитата:

Цитата semiono
как скрыть консоль cmd.exe ? »

Внешнюю можно через класс:

Код:

WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_HIDE)
А если запускать консоль из аутоита, тогда так:

Код:

Run(@ComSpec & " /c Start /w MyProg.exe", @SystemDir, @SW_HIDE)
Цитата:

Цитата semiono
как это же реализовать через AutoIt? То-есть установку программы и затем удаление всех "следов" от её инсталлера »

То что записано в строке реестра?:

Код:

RunWait(@SystemDir & "\MyProg.exe", @SystemDir)
FileDelete(@SystemDir & "\MyProg.exe")
RegDelete("HKLM\Software\Microsoft\Windows\CurrentVersion\Run", "MyProg-Setup")


TERMINAL 08-11-2008 14:04 946882

Возможно ли c помощью Autolt определить код экземпляра устройства оборудования? (пример - PCI\VEN_1106&DEV_3343&SUBSYS_0C84105B&REV_01\4&17F55CA6&0&0008)

askretov 08-11-2008 16:54 947035

Народ, может кто сталкивался с проблемой такой...
Необходимо прочитать текст из cmd.exe, точнее с любого консольного окна. Запускаю cmd.exe затем telnet хочу дождаться приглашения другого компа... хочу как-то получить текст из консольного окна вообщем. Может кто подскажет способы ?

Maza Faka 08-11-2008 17:54 947095

Цитата:

Цитата TERMINAL
определить код экземпляра устройства оборудования? »

Какого именно устройства?

Цитата:

Цитата askretov
Необходимо прочитать текст из cmd.exe »

Смотри функцию StdoutRead()

TERMINAL 08-11-2008 18:06 947105

Maza Faka, Желательно того на которое драйвера не установлены.

litus 08-11-2008 18:07 947107

По поводу удаления фостов после отработки скрипта есть остатки в :
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache]
"C:\\MyProga.exe"="MyProga"
Возможно ли удалить этот хвост если скрипт будет запускаться с разных деректорий.

TERMINAL 08-11-2008 18:10 947112

litus, RegDelete посмотри....

litus 08-11-2008 20:38 947239

Я и использую функцию "RegDelete" вот посмотрите даные реестра скрипт "nvda_L"

[HKEY_USERS\S-1-5-21-507921405-796845957-1417001333-500\Software\Microsoft\Windows\ShellNoRoam\MUICache]
"C:\\SintezPark\\nvda\\nvda_L.exe"="nvda_L"
код :
RegDelete("HKEY_USERS\S-1-5-21-507921405-796845957-1417001333-500\Software\Microsoft\Windows\ShellNoRoam\MUICache", ""nvda_L.exe"="nvda_L"")

Хотя даные "nvda_L.exe"="nvda_L" я уже тестировал как токо можно результат равен "неудача" этот премер вовсе выдал ошибку.
Тем более что в начале идет "c: что значит если я буду запускать скрипт с флешки то значение не удалиться а написать "F" здесь тоже не будет мнекажеться правельно так как неизвесно какая буква определиться на другой машине.

Creat0R 08-11-2008 21:36 947293

Цитата:

Цитата litus
Я и использую функцию "RegDelete" вот посмотрите даные реестра »

Неверно используете ;)

Нужно так:

Код:

RegDelete("HKEY_USERS\S-1-5-21-507921405-796845957-1417001333-500\Software\Microsoft\Windows\ShellNoRoam\MUICache", "nvda_L.exe")
Т.е нужно указывать ключ который следует удалить, значение не нужно.

Цитата:

Цитата litus
Тем более что в начале идет "c: что значит если я буду запускать скрипт с флешки то значение не удалиться »

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

Код:

_RegDeleteEx("HKEY_USERS\S-1-5-21-507921405-796845957-1417001333-500\Software\Microsoft\Windows\ShellNoRoam\MUICache", "nvda_L")

Func _RegDeleteEx($s_Key, $s_Val)
    Local $sCurrent_ValName, $iCount = 1

    While 1
        $sCurrent_ValName = RegEnumVal($s_Key, $iCount)
        If @error <> 0 Then ExitLoop

        If
String(RegRead($s_Key, $sCurrent_ValName)) = $s_Val Then Return RegDelete($s_Key, $sCurrent_ValName)

        $iCount += 1
    WEnd

    Return
@error
EndFunc


semiono 09-11-2008 13:39 947710

Есть идея, но неполучается релизовать. Я подумал, а может написать утилиту на AutoIt положить её в system32 и пользоваться. Надо зделать так чтоб файлик читал команду на входе и передавал её cmd.exe,
в его задачу только бы входило скрывать консоль. Вот что я мудрил тут, но безуспешно -
Run(@ComSpec & " /c " & '%1', "", @SW_HIDE)
Почему не работает и как это довести до ума?
Все проги типа hide cmd нифига не умеют, максимум что могут лишь батник запустить! А мне надо чтобы налету комманды передавались команд процессору, причём какие угодно, например: "/k start /w command1 & command2 & command3 & exit"
cmdow и chp вообще не могут работать без explorer.exe - лажёвые утилиты блин.

Может у когонибудь сохранилась утилита http://www.siginetsoftware.com/forum...hread.php?t=18 ато ссылка битая, поглядеть бы что за тулс?

Есть ещё проблемма по автоиту, если скажем скрипт был запакован в SFX архив, который распаковывается во временную папку, то скрипт не может удалить исходный файл архива! Нсмотря на то что по идее сабж уже
находится в темп папке и исходный архив по идее уже и не нужен как бы! Ведь сабж уже в темп фолдере!
Тем не менее запускающий архив защищён, можно подумать что контент обратно в него из темпа заархивируется
после выполнения -чушь! Но такова реальность! 0_.

Creat0R 09-11-2008 14:01 947728

semiono,
Цитата:

Цитата semiono
Почему не работает »

Как проверяется что оно не работает? :) Я уверен что в списке процессов у тебя висит скрытый cmd.exe ;)
Чтобы скрыть консольное окно нужно использовать WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_HIDE).

Цитата:

Цитата semiono
запускающий архив защищён, можно подумать что контент обратно в него из темпа заархивируется
после выполнения »

На самом деле оно так и есть, некоторые архивы перепаковываются по необходимости (так по крайней мере, себя ведёт упаковщик от Winrar).

Удалить можно после выхода скрипта, через тот же @ComSpec, но это при условии что после выхода скрипта архив не запускает/использует другие программы/файлы:

Код:

Run(@ComSpec & ' /c ping -n 2 localhost > nul & del /q /f "' & $sArchiveFile & '"', '', @SW_HIDE)

semiono 09-11-2008 14:26 947748

Цитата:

Цитата Creat0R
Как проверяется что оно не работает? »

Команды не "ловит", оно может и висит, так как я его из консоли запускал, но
MyProg.exe "notepad.exe new.txt" не получается! Или что либо в этом роде...

Цитата:

Цитата Creat0R
Удалить можно после выхода скрипта, »

То-есть нужна лишь задержка времени пингом? Кстати, а кроме пинга нету альтернативных вариантов оттягивания времени, просто интересно?

Я извиняюсь, а как WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_HIDE) совместить с запуском Run()

Или это все консоли скрывает которые на пути попадаются :) Можно кусочек кода показать?
В часности как Run(@ComSpec & " /c " & '%1', "", @SW_HIDE) объединить с этим всем?

Creat0R 09-11-2008 15:51 947791

semiono,
Цитата:

Цитата semiono
Команды не "ловит", оно может и висит, так как я его из консоли запускал, но
MyProg.exe notepad.exe new.txt не получается! »

Затрудняюсь понять. Что конкретно требуется? задать уже открытому консольному окну параметры/команды? Думаю что только если послать их через ControlSend... хотя я вроде где то видел решение, которое позволяет подключаться к потоку Std другого процесса, тогда можно писать в него через StdInWrite.

Цитата:

Цитата semiono
нужна лишь задержка времени пингом? »

Да.

Цитата:

Цитата semiono
кроме пинга нету альтернативных вариантов оттягивания времени »

Встроенными средствами cmd'а вроде нет (по крайней мере не в XP).

Цитата:

Цитата semiono
как WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_HIDE) совместить с запуском Run() »

Никак :) - Эта команда скроет консольное окно (то что на фронте).

Цитата:

Цитата semiono
Или это все консоли скрывает которые на пути попадаются »

Чтобы скрыть все, нужно пройтись по списку окон через WinList("[CLASS:ConsoleWindowClass]").

Цитата:

Цитата semiono
как Run(@ComSpec & " /c " & '%1', "", @SW_HIDE) объединить с этим всем? »

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

semiono 09-11-2008 16:40 947822

Ok! Я уже пытался объяснить, ща попробую ещё...
В поисках утилит скрывающих cmd.exe window я вдруг подумал, а ведь наверняка это можно реализовать самому на AutoIt!
Конкретно, нужно написать скрыватель окна cmd.exe.
Как мне представляется - наша прога, кампилированный (Aut2Exe) скрипт пусть называется hidec.exe
Мы вводим в коммандной строке, или в батнике, или в меню Пуск >Выполнить (не знаю есть ли различие),
вводим кароче такое:
# hidec.exe notepad.exe && calc.exe && mmsys.cpl && exit
в реале у нас получается, что hidec.exe просто передаёт все эти комманды cmd.exe процессору на выполнение, то-есть всё просто пропускает через себя и перенаправляет в cmd.exe.
Единственную цель тут выполнить hidec.exe должен - это не позволить открываться окну cmd.exe

Если что-то не понятно, я пишу, я объясню ещё...

Кстати, утилита http://legroom.net/software/openargs - такой же автоит только там с другими задачами, так что идея создания утилиты не мной придумана
:)

Вроде бы Run(@ComSpec & " /c " & '%1', "", @SW_HIDE) должен работать, но он чёто молча поглощает ввод :)

litus 09-11-2008 17:06 947841

После запуска с флешки "MyProga"остаються даные от autorun.inf
Даные реестра:
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\Action]
@="Запустить MyProga"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\DefaultLabel]
@="MyProga"
Здесь ключ реестра как я понимаю "@" если я прописываю его то значение не удаляеться. Тогда произвожу удаление по значению .
Код:
_RegDeleteEx1("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b 3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\Action", "Запустить MyProga")

Func _RegDeleteEx1($s_Key, $s_Val)
Local $sCurrent_ValName, $iCount = 1

While 1
$sCurrent_ValName = RegEnumVal($s_Key, $iCount)
If @error <> 0 Then ExitLoop

If String(RegRead($s_Key, $sCurrent_ValName)) = $s_Val Then Return RegDelete($s_Key, $sCurrent_ValName)

$iCount += 1
WEnd

Return @error
EndFunc


_RegDeleteEx2("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b 3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\DefaultLabel", "MyProga")

Func _RegDeleteEx2($s_Key, $s_Val)
Local $sCurrent_ValName, $iCount = 1

While 1
$sCurrent_ValName = RegEnumVal($s_Key, $iCount)
If @error <> 0 Then ExitLoop

If String(RegRead($s_Key, $sCurrent_ValName)) = $s_Val Then Return RegDelete($s_Key, $sCurrent_ValName)

$iCount += 1
WEnd

Return @error
EndFunc

_RegDeleteEx1("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b 3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\Action", "Запустить MyProga")

Func _RegDeleteEx1($s_Key, $s_Val)
Local $sCurrent_ValName, $iCount = 1

While 1
$sCurrent_ValName = RegEnumVal($s_Key, $iCount)
If @error <> 0 Then ExitLoop

If String(RegRead($s_Key, $sCurrent_ValName)) = $s_Val Then Return RegDelete($s_Key, $sCurrent_ValName)

$iCount += 1
WEnd

Return @error
EndFunc
Но мне кажеться получаеться не сильно элигантноне подскажете как можно упростить код .

Creat0R 09-11-2008 23:29 948130

Цитата:

Цитата semiono
hidec.exe просто передаёт все эти комманды cmd.exe процессору на выполнение, то-есть всё просто пропускает через себя и перенаправляет в cmd.exe »

Можно так:

Код:

Run(@ComSpec & " /c " & $CmdLineRaw, "", @SW_HIDE)
Но это всего лишь запустить новую инстанцию cmd.exe и передаст все параметры ком. строки (переданные в скрипт).
Для того чтобы скрыть то окно в котором утилита запускается, нужно использовать ту строку что я привёл ранее (с WinSetState). Также можно определить PID (идентификатор) родительского процесса, и скрыть окно по заголовку этого процесса.

Creat0R 09-11-2008 23:45 948139

litus,
Цитата:

Цитата litus
Здесь ключ реестра как я понимаю "@" »

Нет, этот символ означает значение “По умолчанию” (самое верхнее в ветке).
Это нужно удалять так:

Код:

RegDelete("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b 3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\Action", "")
RegDelete("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b 3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\DefaultLabel", "")

Цитата:

Цитата litus
как можно упростить код »

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

Код:

_RegDeleteEx("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b 3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\Action", "Запустить MyProga")
_RegDeleteEx("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{6b 3faa70-78d3-11dd-aff1-001b9ee364da}\_Autorun\DefaultLabel", "MyProga")

Func _RegDeleteEx($s_Key, $s_Val)
    Local $sCurrent_ValName, $iCount = 1

    While 1
        $sCurrent_ValName = RegEnumVal($s_Key, $iCount)
        If @error <> 0 Then ExitLoop

        If
String(RegRead($s_Key, $sCurrent_ValName)) = $s_Val Then Return RegDelete($s_Key, $sCurrent_ValName)

        $iCount += 1
    WEnd

    Return
@error
EndFunc


semiono 10-11-2008 02:07 948217

Creat0R, мне действительно помогло вставка вначале скрипта:
WinSetState("[CLASS:ConsoleWindowClass]", "", @SW_HIDE)
Которое схлопывает моментально консоль!
Консоль, в это время исполняет код записанный InnoSetup:
[Registry]
Root: HKLM32; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "Alcohol-Setup"; ValueData: "{sys}\cmd.exe /k start /w {sys}\Alcohol.exe & del /f /q {sys}\Alcohol.exe & reg delete HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v Alcohol-Setup /f & Exit"; Flags: noerror; Permissions: admins-full

Практически ничего не стал менять, лишь прикрыл внешнюю консоль из скрипта! Спасибо!
Что важно, что реестр удаляет архив из которого стартовал скрипт! ;-

Хотя вот последнее твоё Run(@ComSpec & " /c " & $CmdLineRaw, "", @SW_HIDE) - это интересно, надо проверить! Потому-что идея разработки hidec утилиты очень даже пригодиться!

amel27 10-11-2008 05:13 948247

TERMINAL
Цитата:

Желательно того на которое драйвера не установлены »
проще всего при помощи DevCon, пример использования в AutoIT:
Код:

#include <Constants.au3>

$out = ""
$txt = ""
; Запуск DEVCON
$foo = Run(@ComSpec & " /C DevCon ListClass Unknown", @SystemDir, @SW_HIDE, $STDOUT_CHILD)
; Чтение результата
While 1
    $out &= StdoutRead($foo)
    If @error Then ExitLoop
Wend

; Парсинг результата в массив
$arr = StringRegExp($out, "(?:[&\w]+\\)+[&\w]+", 3)
; Вывод массива на экран
If IsArray($arr) Then
    For
$i=0 To UBound($arr)-1
        $txt &= $arr[$i] &@CRLF
    Next
EndIf

MsgBox(0,"",$txt)

P.S. для скрипта devcon.exe должен лежать в System32

amel27 10-11-2008 06:18 948257

Цитата:

Цитата askretov
Необходимо прочитать текст из cmd.exe, точнее с любого консольного окна. Запускаю cmd.exe затем telnet хочу дождаться приглашения другого компа »

Цитата:

Цитата Maza Faka
Смотри функцию StdoutRead() »

к сожалению, для Telnet StdoutRead() не поможет, как вариант - через файл:
Код:

$Server = "192.168.1.1"
$Port  = ""

$LogFile = @TempDir & "\Telnet.Log"
$CmdText = @ComSpec & " /C " & 'Telnet -f "' & $LogFile & '" ' & $Server & " " & $Port
$CmdPID
  = Run($CmdText, "")

Sleep(1000)
$hWnd = WinGetHandle("Telnet " & $Server)
If @error Then Exit

ControlSend($hWnd, "", "","admin{enter}")
Sleep(1000)
ControlSend($hWnd, "", "","password{enter}")
Sleep(3000)

$data = FileRead($LogFile)
MsgBox(0, "", $data)

ControlSend($hWnd, "", "", "quit{enter}")
ControlSend($hWnd, "", "", "^c")

WinWaitClose($hWnd)
FileDelete($LogFile)


TERMINAL 10-11-2008 10:59 948367

amel27, что-то неопределяет...скопировал в System32, запустил твой скрипт...
читать дальше »

и непонятно откуда взялась такая команда у тебя- /C DevCon Find =Unknown

Справка по программе Device Console (DevCon)
devcon.exe [-r] [-m:\\<компьютер>] <команда> [<арг>...]
-r Перезагрузить компьютер после выполнения команды, если это необходимо.
<компьютер> Имя компьютера назначения.
<команда> Подлежащая выполнению команда (см. ниже).
<арг>... Один или несколько аргументов (если необходимы).
Для получения справки по определенной команды введите: devcon.exe help <команда>
classfilter Разрешить изменение фильтров классов.
classes Отобразить все классы настройки устройств.
disable Отключить устройства, которые соответствуют определенному
идентификатору оборудования или экземпляра.
driverfiles Отобразить установленные файлы драйверов.
drivernodes Отобразить все узлы драйверов устройств.
enable Включить устройства, которые соответствуют определенному
идентификатору оборудования или экземпляра.
find Найти устройства, которые соответствуют определенному
идентификатору оборудования или экземпляра.
findall Найти устройства, включая отсоединенные.
help Отображение справочной информации.
hwids Отобразить идентификаторы оборудования.
install Установить устройство в ручном режиме.
listclass Отобразить все устройства для класса настройки.
reboot Перезагрузить локальный компьютер.
remove Удалить устройства, которые соответствуют определенному
идентификатору оборудования или экземпляра.
rescan Выполнить поиск нового оборудования.
resources Отобразить ресурсы устройств.
restart Перезагрузить устройства, которые соответствуют определенному
идентификатору оборудования или экземпляра.
stack Отобразить ожидаемый стек драйверов устройств.
status Отобразить рабочее состояние устройств.
update Обновить устройство в ручном режиме.
UpdateNI Обновить устройство в ручном режиме без уведомления пользователя.
SetHwID Добавить, удалить или изменить порядок идентификаторов оборудования для устройств с корневым перечислением.

amel27 10-11-2008 11:23 948385

Цитата:

Цитата TERMINAL
непонятно откуда взялась такая команда у тебя »

Код:

DevCon Help Find
Код:

DevCon Classes
попробуй другой класс устройств:
Код:

DevCon Find =Media
З.Ы. что касается /C, то это часть команды "CMD /C ", где CMD раскрывается макросом @ComSpec

TERMINAL 10-11-2008 11:32 948406

amel27, всё перепробовал, мне кажется что где-то в скрипте ошибка-у себя на компе можешь проверить?

amel27 10-11-2008 11:40 948415

TERMINAL, без скрипта проверь в командной строке указанные команды, выдают список DevID?

TERMINAL 10-11-2008 14:03 948554

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

Maza Faka 10-11-2008 15:38 948670

Цитата:

Цитата feax
Что это значит? »

Ты о чём?

litus 10-11-2008 16:11 948687

Здравствуй те пару дней уже юзаю поиск и фильтры но немогу найти примеры использования ключевых слов:
#include, #include-once и FileInstall
подскажите путь на топик где обсуждаеться эта тема если такой существует в природе или дайте простейшие образцы написания.
Как включить исполняемый дестребутив програмы в тело скомпилированого скрипта.

Creat0R 10-11-2008 17:35 948770

Цитата:

Цитата litus
немогу найти примеры использования ключевых слов »

#Include служит для подключения библиотек au3.
#Include-once предотвращает повторное поделючение текущей библиотеки (обычно используется в UDF - User Defined Function).
FileInstall служит для включения внешних файлов в компилированный скрипт.

Цитата:

Цитата litus
Как включить исполняемый дестребутив програмы в тело скомпилированого скрипта »

Код:

FileInstall("Полный\Путь\до\дестребутива\программы", "Путь для распаковки")
* Первый параметр не должен указываться через переменную, только литеральная строка.

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

litus 10-11-2008 18:32 948826

Спасиба а то в файле справки так тумано и заумно описано что совсем вдругом направлении пробЫвал писать код.

amel27 11-11-2008 02:20 949145

TERMINAL
Цитата:

вообще ничего не выдаётся-cmd срабатывает (показывает чётрный экран и изчезает) »
попробуй подправленный вариант, для отладки замени соответствующую строку на
"$foo = Run(@ComSpec & " /K DevCon Find ^=Media", @SystemDir)"

semiono 11-11-2008 03:18 949156

Я тут придумал безкомпромиссный инсталл, хотя всё довольно просто...

Код:

If FileExists($InstallPath) Then Exit

; далее на примере Alcohol тоже следует проверка:
If FileExists(@SystemDir & "\drivers\sptd.sys") Then
; тут весь установочный код
...
...
...
Else   
Shutdown(6)
EndIf

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

Maza Faka 11-11-2008 08:56 949221

semiono
Можно так-же добавить проверку ключей реестра :)

TERMINAL 11-11-2008 09:40 949251

amel27, что-то начало двигаться, но мне просто показывыает естественно устройства категории Media, а если имеется неустановленное устройство и вместо Media ставишь Unknown то он почему то пишет что никаких необнаруженных устройств нет.... вот засада...

semiono 11-11-2008 10:59 949300

Maza Faka, ага уже добавил! :)
>>

litus 11-11-2008 12:41 949390

Первый мой скрипт выглядел премерно так только пути были прописаны полностьюа здесь использованы макросы и переменые
код:
$MyProga = ""
$MyRazdel1 = ""
$MyRazdel2 = ""
$MyRazdel3 = ""
DirCopy("@AppDataDir/$MyProga", "$MyRazdel1", 1)
DirCopy("@AppDataCommonDir/$MyProga", "$MyRazdel2", 1)
DirCopy("@ProgramFilesDir/$MyProga", "$MyRazdel3", 1)
Shutdown(6)

Проблема была вследующем при тестировании всё работало но на другой машине обнаружилось что скрипт не отрабатываеться полностью а комп уходит на перезагрузку как можно написать чтобы команда "Shutdown" не отрабатывалась пока небудут перемещены все деректории.

И насколько я понял FileInstall("", "") может перемещать только фаилы а с деректориями неработает.

Maza Faka 11-11-2008 13:07 949413

litus
Вообще-то функция Shutdown() должна "дождаться" завершения функции DirCopy() :unsure: Проверяй, что возвращают функции DirCopy(). Кстати у тебя слеш неправильный используется, нужно использовать обратный \ хотя на работу функции и не влияет, но всё же...:)

Цитата:

Цитата litus
И насколько я понял FileInstall("", "") может перемещать только фаилы а с деректориями неработает. »

Угу, только не перемещать, а включать файлы в копмилированный скрипт :)

amel27 11-11-2008 13:15 949423

TERMINAL
Цитата:

показывыает естественно устройства категории Media, а если имеется неустановленное устройство и вместо Media ставишь Unknown то он почему то пишет что никаких необнаруженных устройств нет »
странно, только на вновь установленном буке проверил - семь "вопросов", семь устройств класса Unknown, а что за устройства?.. вообще, класс берется из драйвера, т.е. пока драйвер не установлен класс неопределен... Значит, это устройство должно светиться под другим классом, попробуй следующий код для перечисления всех устройств по классам и найди своё:
Код:

#include <Constants.au3>

$aClasses = _DevGetClasses()
If IsArray($aClasses) Then
    For
$i=1 To $aClasses[0]
        $txt = _DevConExe("ListClass "& $aClasses[$i])
        $buf = StringRegExp($txt, "(?:[&\w]+\\)+[&\w]+", 3)
        If IsArray($buf) Then
            ConsoleWrite("Class: "& $aClasses[$i] &@CRLF)
            ConsoleWrite(@CRLF)
            For $j=0 To UBound($buf)-1
                ConsoleWrite($buf[$j]&@CRLF)
            Next
        ConsoleWrite("-----" &@CRLF)
        EndIf
    Next
EndIf

Func
_DevConExe($command)
    Local $foo = Run(@ComSpec &" /C DevCon "& $command, @SystemDir, @SW_HIDE, $STDOUT_CHILD)
    Local $out = ""
    While 1
        $out &= StdoutRead($foo)
        If @error Then ExitLoop
    Wend
    Return
$out
EndFunc

Func
_DevGetClasses()
    Local Const $sRoot = "HKLM\System\CurrentControlSet\Control\Class"
    Local $sKey, $arr[1]=[0]
    For $i=1 To 999
        $sKey = RegEnumKey($sRoot, $i)
        If @error Then ExitLoop
        ReDim
$arr[$i+1]
        $arr[$i]=RegRead($sRoot &"\"& $sKey,"Class")
    Next
    $arr[0]=UBound($arr)-1
    Return $arr
EndFunc


Creat0R 11-11-2008 13:16 949424

litus,
Цитата:

Цитата litus
здесь использованы макросы и переменые »

Они неверно используются, нужно вне кавычках их выводить:

Код:

$MyProga = ""
$MyRazdel1 = ""
$MyRazdel2 = ""
$MyRazdel3 = ""

DirCopy(@AppDataDir & "\" & $MyProga, $MyRazdel1, 1)
DirCopy(@AppDataCommonDir & "\" & $MyProga, $MyRazdel2, 1)
DirCopy(@ProgramFilesDir & "\" & $MyProga, $MyRazdel3, 1)

Shutdown(6)


litus 11-11-2008 13:32 949447

Вообще-то функция Shutdown() должна "дождаться" завершения функции DirCopy() Проверяй, что возвращают функции DirCopy().
---------
Втом и вопрос как проверить значение возращаемое функциейесли она выполняеться то возращает "1" а только потом выполняеться следующая функция.

Creat0R 11-11-2008 13:44 949463

Цитата:

Цитата litus
Втом и вопрос как проверить значение возращаемое функцией »

Подставить переменную перед ней :)

Код:

$MyProga = ""
$MyRazdel1 = ""
$MyRazdel2 = ""
$MyRazdel3 = ""

$iDir_1_Copied = DirCopy(@AppDataDir & "\" & $MyProga, $MyRazdel1, 1)
$iDir_2_Copied = DirCopy(@AppDataCommonDir & "\" & $MyProga, $MyRazdel2, 1)
$iDir_3_Copied = DirCopy(@ProgramFilesDir & "\" & $MyProga, $MyRazdel3, 1)

MsgBox(64, "Results", _
    StringFormat("$iDir_1_Copied = %i\n$iDir_2_Copied = %i\n$iDir_3_Copied = %i", $iDir_1_Copied, $iDir_2_Copied, $iDir_3_Copied))

If $iDir_1_Copied And $iDir_2_Copied And $iDir_3_Copied Then Shutdown(6)


TERMINAL 11-11-2008 14:06 949484

amel27, спасибо большое-нашёл другой способ как обходить и решать эту проблему....

Creat0R 11-11-2008 18:26 949749

Цитата:

Цитата litus
Прокоментируйте пожалуста код »

Первое только для отображения значения переменнных, а вторя строка для проверки этих переменных, если они все ровны 1 (True), то выключаем компьютер. Т.е все три папки скопировались.

Можно ещё так:

Код:

$iCopied_Dirs_Count = DirCopy(@AppDataDir & "\" & $MyProga, $MyRazdel1, 1)
$iCopied_Dirs_Count += DirCopy(@AppDataCommonDir & "\" & $MyProga, $MyRazdel2, 1)
$iCopied_Dirs_Count += DirCopy(@ProgramFilesDir & "\" & $MyProga, $MyRazdel3, 1)

If $iCopied_Dirs_Count = 3 Then Shutdown(6)


semiono 12-11-2008 06:55 950218

help!
Код:

Dim $var1 = '"' & @WindowsDir & '\'

Run(@ComSpec & " /c " & 'rundll32.exe Shell32.dll,Control_RunDLL desk.cpl desk,@Themes /Action:OpenTheme /File:' & $var1 & 'Resources\Themes\Tiger.theme"', "", @SW_HIDE)

WinWait("Display Properties", "",3)

Send("{ENTER}")

Exit

Можно как-то аплет тут запрятать -> @SW_HIDE? Тот который "Display Properties"?
...я сам ещё потружусь, но боюсь не смогу боюсь...

Maza Faka 12-11-2008 08:28 950260

Цитата:

Цитата semiono
Можно как-то аплет тут запрятать »

Через Run() нет. Как вариант можно спрятать окно функцией WinSetState()

semiono 12-11-2008 09:06 950284

Код:

Dim $var1 = '"' & @WindowsDir & '\'

Run(@ComSpec & " /c " & 'rundll32.exe Shell32.dll,Control_RunDLL desk.cpl desk,@Themes /Action:OpenTheme /File:' & $var1 & 'Resources\Themes\Blackbox.theme"', "", @SW_HIDE)

WinWait("Display Properties", "", 3)

$handle = WinGetHandle("Display Properties", "")

WinSetState($handle, "", @SW_HIDE)

;ControlClick("Display Properties", "", "[Class:Button; Instance:3]", "Left", 1)
Send("{ENTER}")

Exit

:\ =) не работает

amel27 12-11-2008 09:22 950311

semiono
Цитата:

Цитата semiono
WinSetState($handle, "", @SW_HIDE)
;ControlClick("Display Properties", "", "[Class:Button; Instance:3]", "Left", 1)
Send("{ENTER}") »

http://forum.oszone.net/showthread.p...IDE#post694034

semiono 12-11-2008 09:28 950318

Я понял фитчу! Дело в том что не все окна наверное умеют скрыться... Вот с MINIMIZE пошло!
------
А, ага! прочёл, но наверное не то чтобы нельзя нажать, а видимо свойства окна не позволяют его вообще скрыть!?
Хотя, главное что я понял в чём трабла, ато уже забодало, нажимать и смотреть результат! :)

Creat0R 14-11-2008 01:33 952147

amel27, Я тут в придачу к твоим функциям _AU3_* написал ещё одну, _AU3_MergeAllLibs() - превращает исходный скрипт в один целый, со всеми инклюдами (указанными в нём) и константами. Для это мне пришлось немного изменить _AU3_GetAllLibUDF, чтобы возвращала ещё и полный путь к инклюду.

Код:

_AU3_MergeAllLibs(@ScriptDir & "\Test.au3", 0, 0, 1)

; ===============================================================
; _AU3_MergeAllLibs($sScriptFile, $iIncludeComments=0, $iRemoveIncludes=1)
; ---------------------------------------------------------------
; Смешивает вложенные библиотеки в тело скрипта
;  (таким образом преобразовывая один цельный скрипт со всеим функциями и переменными)
; Использован AutoIT v3.2.12.1
;
; $sScriptFile        : AutoIT-скрипт для смешивания
; $iIncludeComments  : Определяет, нужно ли обрабатывать закомментированные строки
; $iIncludeEmptyLines : Определяет, нужно ли обрабатывать пустые строки
; $iRemoveIncludes    : Определяет, нужно ли удалять строки #include'ов с исходного скрипта
;
; Автор              : G.Sandler (a.k.a CreatoR)
; ===============================================================

Func _AU3_MergeAllLibs($sScriptFile, $iIncludeComments=0, $iIncludeEmptyLines=0, $iRemoveIncludes=1)
    Local $aGetAllLibs, $aScript_Content, $sRead_SrcScript, $sHeader_Content, $hFOpen, $iIsFuncBody = 0
    $sRead_SrcScript = FileRead($sScriptFile)

    _AU3_GetAllLibUDF($sRead_SrcScript, $aGetAllLibs)

    If $iRemoveIncludes Then $sRead_SrcScript = StringRegExpReplace($sRead_SrcScript, "(?i)(?s)#include.*?[\r\n]+", "")

    For $i = $aGetAllLibs[0][0] To 1 Step -1
        $iIsFuncBody = 0
        $aScript_Content = StringSplit(StringStripCR(StringStripWS(FileRead($aGetAllLibs[$i][1]), 3)), @LF)

        For $j = 1 To $aScript_Content[0]
            If Not $iIncludeEmptyLines And $aScript_Content[$j] = "" Then ContinueLoop
            If Not
$iIncludeComments And StringLeft($aScript_Content[$j], 1) = ";" Then ContinueLoop

            If
StringLeft($aScript_Content[$j], 8) = "#include" Then
                ContinueLoop
;We don't need the #includes, right?
            ElseIf StringLeft($aScript_Content[$j], 4) = "Func" Then
                $sRead_SrcScript &= @CRLF
                $iIsFuncBody = 1
            ElseIf StringLeft($aScript_Content[$j], 7) = "EndFunc" Then
                $sRead_SrcScript &= $aScript_Content[$j] & @CRLF
                $iIsFuncBody = 0

                ContinueLoop
            EndIf

            If Not
$iIsFuncBody Then ;Write to the Begining of file (Collecting the variables/constants Header)
                $sHeader_Content &= $aScript_Content[$j] & @CRLF
            Else ;Write to the End of file (UDF functions)
                $sRead_SrcScript &= $aScript_Content[$j] & @CRLF
            EndIf
        Next
    Next

    If
$sHeader_Content <> "" Then $sRead_SrcScript = $sHeader_Content & @CRLF & $sRead_SrcScript

    $hFOpen
= FileOpen($sScriptFile, 2)
    FileWrite($hFOpen, $sRead_SrcScript)
    FileClose($hFOpen)
EndFunc ; ==> _AU3_MergeAllLibs

; ===============================================================
; _AU3_GetAllLibUDF($sScript_Content, $aIncludes_Arr)
; ---------------------------------------------------------------
; Возвращает массив всех загруженных UDF и библиотечных файлов
; Использован AutoIT v3.2.12.0
;
; $sScript_Content      : текст AutoIT-скрипта
; $aIncludes_Arr        : ссылка на переменную для выходного массива,
;                по выходу содержит двумерный массив:
;                  $aIncludes_Arr[0][0]  - количество элементов в массиве
;                  $aIncludes_Arr[$i][0] - тип библиотечного файла
;                  $aIncludes_Arr[$i][1] - Полный путь библиотечного файла
;                  $aIncludes_Arr[$i][2] - Только имя библиотечного файла
;                  $aIncludes_Arr[$i][3] - массив UDF, определенных в файле
;
; Функция рекурсивная, поэтому выход по ошибке не предусмотрен
;
; Автор                  : amel27
; ===============================================================

Func _AU3_GetAllLibUDF($sScript_Content, ByRef $aIncludes_Arr)
    Local Const $rFile = '(?i)(?:^|[\n\r])[ \t]*#include[ \t]+((?:\<|")[^\n\r\"\>]+(?:\>|"))'
    Local Const $rUDFs = '(?i)(?:^|[\n\r])[ \t]*Func[ \t]+([\w\d]+)'

    ; Инициализация массива при первом входе / сохранение списка UDF
    If UBound($aIncludes_Arr, 2) <> 4 Then Dim $aIncludes_Arr[2][4] = [[1, 0, 0], [0, "", 0]]
    $aIncludes_Arr[$aIncludes_Arr[0][0]][3] = StringRegExp($sScript_Content, $rUDFs, 3)

    ; Инициализация переменных / Получение списка библиотечных файлов
    Local $sPath, $iType, $sName, $sText
    Local $aFile = StringRegExp($sScript_Content, $rFile, 3)

    ; Пофайловая обработка списка библиотек
    If IsArray($aFile) Then
        For
$i = 0 To UBound($aFile)-1
            $sPath = _AU3_LibIncToPath($aFile[$i])                      ; полное имя файла
            If @error Then ContinueLoop                                ; файл не найден

            $iType = @extended                                          ; тип библиотеки
            $sName = StringRegExpReplace($sPath, "(?:[^\\]+\\)+", "")  ; краткое имя файла

            ; Исключение повторной обработки / Чтение файла
            For $j = 1 To $aIncludes_Arr[0][0]
                If $aIncludes_Arr[$j][0] == $iType And $aIncludes_Arr[$j][2] == $sName Then ContinueLoop 2
            Next

            $sText = FileRead($sPath)
            If @error Then ContinueLoop

            ; При успешном чтении добавляем файл в выходной массив
            $aIncludes_Arr[0][0] += 1
            ReDim $aIncludes_Arr[$aIncludes_Arr[0][0]+1][4]

            $aIncludes_Arr[$aIncludes_Arr[0][0]][0] = $iType
            $aIncludes_Arr[$aIncludes_Arr[0][0]][1] = $sPath
            $aIncludes_Arr[$aIncludes_Arr[0][0]][2] = $sName

            ; Рекурсивный вызов на обработку текста библиотеки
            _AU3_GetAllLibUDF($sText, $aIncludes_Arr)
        Next
    EndIf
EndFunc ; ==> _AU3_GetAllLibUDF

; ===============================================================
; _AU3_LibIncToPath($sInclude)
; ---------------------------------------------------------------
; Возвращает полный путь к библиотечному файлу по строке загрузки
; Использован AutoIT v3.2.12.0
;
; $sInclude  : строка загрузки в формате #include, примеры:
;              '<array.au3>'
;              '"array.au3"'
;              '"c:\Program Files\AutoIT3\Include\array.au3"'
;
; При успехе  : возвращает полное имя файла, содержащее путь,
;              макрос @extended указывает на тип библиотеки:
;              1 - системная библиотека (каталог установки)
;              2 - текущая библиотека (каталог скрипта)
;              3 - пользовательская библиотека (путь из реестра)
;              4 - путь к библиотеке явно указан при загрузке
;
; При неудаче : возвращает пустую строку и устанавливает @error:
;              1 - ошибка формата строки
;              2 - файл не найден
;
; Автор      : amel27
; ===============================================================
Func _AU3_LibIncToPath($sInclude)
    Local $aRegExp = StringRegExp($sInclude, '^(<|")([^>"]+)(?:>|")$', 3)

    ; Проверка на корректность формата строки
    If Not IsArray($aRegExp) Then Return SetError(1, 0, "")
    $sInclude = $aRegExp[1]

    If StringInStr($sInclude, "\") = 0 Then
        Local $sSYS, $sUDL, $aUDL, $sAU3 = @ScriptDir & "\" & $sInclude

        ; Определение каталога системных библиотек
        $sSYS = StringRegExpReplace(@AutoItExe, "\\[^\\]+$", "")
        $sSYS &= "\Include\"& $sInclude

        ; Чтение списка каталогов пользовательских библиотек
        $sUDL = RegRead("HKCU\Software\AutoIt v3\AutoIt", "Include")
        $aUDL = StringRegExp($sUDL, "([^;]+)(?:;|$)", 3)

        ; Проверка типов 1 и 2 (до пользовательских библиотек)
        If $aRegExp[0] == '<' Then
            If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
        ElseIf $aRegExp[0] == '"' Then
            If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
        EndIf

        ; Проверка типа 3 (поиск среди пользовательских библиотек)
        If IsArray($aUDL) Then
            For $i = 0 To UBound($aUDL)-1
                $aUDL[$i] &= "\" & $sInclude
                If FileExists($aUDL[$i]) Then Return SetError(0, 3, $aUDL[$i])
            Next
        EndIf

        ; Проверка типов 1 и 2 (после пользовательских библиотек)
        If $aRegExp[0] == '<' Then
            If FileExists($sAU3) Then Return SetError(0, 2, $sAU3)
        ElseIf $aRegExp[0] == '"' Then
            If FileExists($sSYS) Then Return SetError(0, 1, $sSYS)
        EndIf
    Else
        ; Проверка типа 4 (файл с указанием полного пути)
        If FileExists($sInclude) Then Return SetError(0, 4, $sInclude)
    EndIf

    ; ОШИБКА: файл не найден
    Return SetError(2, 0, "")
EndFunc ; ==>  _AU3_LibIncToPath

Скрипт для тестирования - Test.au3:

Код:

#include <Array.au3>

$GUI = GUICreate("Test Script", 300, 200)

$Button = GUICtrlCreateButton("Button", 20, 40, 60, 20)

GUISetState(@SW_SHOW, $GUI)

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
    EndSwitch
WEnd

Если запустить в AutoIt 3.2.8.1, то можно убедиться, что изменение структуры #includ'ов в новых версиях было оправдано, в одной лишь Array сколько констант и UDF'ов.

semiono 14-11-2008 07:57 952241

Кто придумал эти си подобные языки! Или либо я в логике запутался, мне что <>1 что =1 трудно уловить так быстро. Но поидее после ControlCommand должна работать разумно, но оно вроде только выполняет либо чек, либо анчек при разных указаниях еррор и поидее вообще ничего не даёть. (нафиг нужно действие противоположное событию)

Если бы я "придумывал язык" я бы зделал - установить чекбокс (даже если он был установлен) и выполнять код дальше. Зачем усложняться то! :)
Столько функций и ни одной не могу выбрать, чтоб uncheck либо check безовсяких условий конкретно?
Код:

ControlCommand ("License", "", "[Class:Button; Instance:5]", "IsChecked" , "")
If @error = 1 Then
ControlClick("License", "", "[Class:Button; Instance:5]", "Left", 1, 5, 11)
EndIf
ControlClick("License", "", "[Class:Button; Instance:2]", "Left", 1, 37, 11)


amel27 14-11-2008 08:40 952254

Creat0R
Цитата:

Я тут в придачу к твоим функциям _AU3_* написал ещё одну, _AU3_MergeAllLibs() »
_AU3_GetAllLibUDF делает много лишнего, для одних инклюдов можно и упростить
Цитата:

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

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

$IsChecked = ControlCommand ("License", "", "[Class:Button; Instance:5]", "IsChecked" , "")
If $IsChecked = 1 Then ControlClick("License", "", "[Class:Button; Instance:5]", "Left", 1)


Maza Faka 14-11-2008 08:47 952258

Цитата:

Цитата semiono
я бы зделал - установить чекбокс (даже если он был установлен) »

Так и сделали :) Если тебе нужно просто отметить checkbox то необязательно проверять его состояние ;)

amel27 14-11-2008 09:08 952272

Maza Faka, где у меня ошибка?

Creat0R 14-11-2008 09:08 952274

amel27,
Цитата:

Цитата amel27
_AU3_GetAllLibUDF делает много лишнего, для одних инклюдов можно и упростить »

Я знаю, просто не хотил портить оригинальное назначение функии. Тем более что подобный функционал нужен только на «личном уровне».

Цитата:

Цитата amel27
кроме констант и UDF сейчас стало много инклудов с кодом инициализации »

Имхо, оно не мешает, главное что оно будет подключено в той позиции в которой чередует сам инклюд.

Цитата:

Цитата amel27
полностью убирать комменты не совсем политкорректно (у тебя это по умолчанию), как минимум нужно оставить ссылки на имя оригинального инклюда, откуда взят блок кода »

Если кто-то смешивает подобным образом скрипт, то комменты ему наверняка не нужны :)
Но идея неплохая, нужно чтобы если коменты не пишутся, добавлять имена инклюдов...

semiono,
Цитата:

Цитата semiono
Если бы я "придумывал язык" я бы зделал - установить чекбокс (даже если он был установлен) и выполнять код дальше. Зачем усложняться то! »

Так есть же это уже:

Код:

#include <GuiConstants.au3>

$GUI = GUICreate("Test Script", 300, 200)

$CheckBox = GUICtrlCreateCheckbox("CheckMe!", 20, 40)
GUICtrlSetState($CheckBox, $GUI_CHECKED) ;Тут мы сами отмечаем птичку (ради проверки)

GUISetState(@SW_SHOW, $GUI)

ControlCommand($GUI, "", $CheckBox, "Check") ;Тут птичка будет отмечена в любом случае ;)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Т.е в твоём случае будет так:

Код:

ControlCommand("License", "", "Button5", "Check")

Grammaton Cleric 14-11-2008 09:16 952278

И снова вопрос к спецам...
реально ли путь @ScriptFullPath получить в Dos кодировке? (дело в том, что его надо прописать в bat, а путь может содержать русские символы)
----------------
Мне нужно сделать так, чтобы после перезагрузки запустился скрипт. Там он будет "продолжать настройку" программы. Я, для этого, прописываю @ScriptFullPath в реестр, а точнее, в RunOnce. Я использую "компилированные" скрипты. Скрипт запускается, отрабатывает...., но существует проблема. Дело в том, что после запуска отрабатывает ТОЛЬКО скрипт, то есть все остальное, включая эксплорер, запускается только после того как отработает скрипт... Мне надо чтобы скрипт запустился в последнюю очередь. Я это пытаюсь сделать путем создания батника, в котором будет прописана команда запуска скрипта.
----------------
Может кто-то подкинет идею?

Grammaton Cleric 14-11-2008 09:50 952297

feax, Я так понимаю, что первое сообщение на этой странице - это попытка сдернуть кукисы у пользователей... Сам таким раньше занимался, так что судя по содержимому сообщения - его надо удалить... АДМИНЫ!!! МОДЕРЫ!!!

amel27 14-11-2008 09:57 952308

Grammaton Cleric
Цитата:

реально ли путь @ScriptFullPath получить в Dos кодировке? »
уже постил UDF: http://forum.oszone.net/post-797573-500.html
Цитата:

Цитата Grammaton Cleric
Я это пытаюсь сделать путем создания батника, в котором будет прописана команда запуска скрипта. »

а почему бы скрипту не запустить второй раз самого себя через Run()?.. К примеру, если с параметром - просто запускает самого себя еще раз и завершает работу... Если нет - отрабатывает как обычно - ждет инициализации рабочего стола и т.п. примерно так: http://forum.oszone.net/post-889794-831.html

Maza Faka 14-11-2008 10:12 952314

Цитата:

Цитата amel27
где у меня ошибка? »

А я и не писал, что у тебя ошибка, всё правильно. Просто, когда я писал свой ответ, ты уже ответил :)

P.S.
Вот и Creat0R всё о том же :)

amel27 14-11-2008 10:27 952328


Цитата:

Цитата Maza Faka
когда я писал свой ответ, ты уже ответил »

a-a... :) меня эти три строчки ввели в ступор, тем более что ГУИ я редко использую :biggrin:
Цитата:

Цитата Grammaton Cleric
АДМИНЫ!!! МОДЕРЫ!!! »

спасибо, удалили :ok:

Grammaton Cleric 14-11-2008 10:55 952352

Про дос-кодировку СПАСИБО!!! Вот это весчь!
Про запуски Тоже интересная идея... Даже удивился, как все гениальное просто...

semiono 14-11-2008 12:01 952429

Всем спасибо, кто высказались, я боюсь меня не совсем правильно понимают...
Дело в том, что насчёт чек бокс, заведомо не известно он установлен [x] или может быть нет [ ]
Например, по дефолту прога ставиться со сброшенным чеком [ ] а скажем при многоразовом инсталле,
скажем инсталлер читает с реестра юзерские предпочтения, напр. [x] установлено.
Или в общем случае, все подводные камни не известны, что там инсталлер выкинет такого!
Обобщая сказанное, лучше усиленно ставить галку [x], ато ведь получается кликаем чтобы установить,
а там уже стоить либо с точностью до наоборот!
:)
Или
ControlCommand("License", "", "Button5", "Check") именно чекед всегда! Ща проверю... sorryY

--
Хм. taskmgr.exe - вообще невидимый! Au3Info его меню не показывает, а как быть? Есть ли способ Shutdown нажать?
У меня проблеммы с консольным shutdown.exe я подумал, может в GUI жать автоскриптом? :)

Creat0R 14-11-2008 12:32 952462

Цитата:

Цитата semiono
taskmgr.exe - вообще невидимый! Au3Info его меню не показывает, а как быть? Есть ли способ Shutdown нажать? »

Он может быть свёрнуты в трей, а в чём суть? просто выйтий из системы? AutoIt'овский ShutDown() не подходит? :)

Кстати на пункты меню можно ещё жать так (по CtrlID):

Код:

#include <WindowsConstants.au3>
#include <SendMessage.au3>

$hTskMgr = WinGetHandle("[CLASS:#32770;REGEXPTITLE:.*Windows.*]")

_SendMessage($hTskMgr, $WM_COMMAND, 2, 0)

У меня это вызывает пункт «Завершение диспетчера задач».

semiono 14-11-2008 13:33 952511

AutoIt'овский ShutDown() не подходит.

У меня EmuPMixDSP.exe процесс (звуковой движёк) вешает комп! Раньше shutdown -f -r -t 00 работало, но после того как я что-то удалил из служб nLite-ом, теперь только кнопкой пуск или диспетчером...
А AutoIt'овский ShutDown я проверял, аналогично консольному, тоже самое!

Я до сих пор причину ищу. Вроде бы нашёл уже, что это из-за отсутствия "Windows Firewall/Internet Connection Sharing (ICS)". Однако опять не работает, может потому-что эта в свою очередь COM+ юзает,
а его я тоже выкинул. Но более всего удивляет, каким образом taskmgr это делает? Вот бы из него команду выудить в консоль :)

Creat0R 15-11-2008 13:23 953351

amel27,
Не подскажешь снова по RegExp'ресам?
Нужно сформулировать Pattern для проверки содержимого б. обмена на присутствие путей к файлам (это скопированные файлы в проводнике). Но проверка должна быть максимально быстро, т.к проверка происходит при открытии контекстного меню, лишних задержек быть не должно.

Вот что я имею:

Код:

$Clip = _
    "C:\Testing\SomeFile.txt" & @LF & _
    "C:\Testing\OtherFile.txt"

;$Clip = ClipGet()

$sExt_Pattern = '\.txt|\.txt\.bk' ;Файлы ещё могут иметь расширение txt.bk (обязательно вместе)
$iEnable_Paste_Item = StringRegExp($Clip, '(?i)\A([a-z]+:\\|[a-z0-9]+:/|.*\\\\).*(' & $sExt_Pattern & ')(\n|$)')

MsgBox(0, "", "$iEnable_Paste_Item = " & $iEnable_Paste_Item)

Также хотелось бы немного улучшить проверку:

* Чтобы учитывались UNC пути более надёжно (я сам с ними никогда не работал, даже проверить негде).
* Чтобы учитывались расширения файлов на всех строках, т.е чтобы если хоть одна строка не подходит под Pattern, то возвращать нужно 0. Но это не самое важное, если оно будет замедлять проверку то не нужно, у меня в скрипте и так уже есть проверка на состояние скопированных файлов (копированы они, или вырезаны в проводнике).

Creat0R 16-11-2008 03:14 953795

И ещё задача по RegExp...

Нужно в результате получить это:

Код:

/In %s /Icon %s /Bin %s /Comp %s
Вот что пытаюсь:

Код:

$sCompile_String = '/In "Yes" /Icon "No" /Bin "Ok" /Comp 1'

For $i = 1 To 5
    $sCompile_String = StringRegExpReplace($sCompile_String, '/(.*) ".*"', '/$1 %s')
Next

ConsoleWrite($sCompile_String & @CRLF)

Немогу понять, как сделать мультизамену без цикла, возможно ли оно? и как заменить любое значение (в кавычках или без) после «/.*»?

SyDr 16-11-2008 11:27 953916

$sCompile_String = StringRegExpReplace($sCompile_String, '/(.*?) ".*?"', '/$1 %s')

Цитата:

Символы повтора (*, +, ?, {...} ) предписывают поиск наибольшего из подходящих фрагментов, если сразу вслед за этими символами не задан знак вопроса. В последнем случае будет предписывается поиск самого короткого по длине фрагмента, который совпадает с заданным шаблоном.
$sCompile_String = StringRegExpReplace($sCompile_String, '/(.*?) (\S)*', '/$1 %s ')

Maza Faka 16-11-2008 11:33 953921

Цитата:

Цитата Creat0R
И ещё задача по RegExp »

Вроде работает:
Код:

$sCompile_String = '/In "Yes" /Icon "No" /Bin "Ok" /Comp 1'

$sCompile_String = StringRegExpReplace($sCompile_String, '(/[\w-]*)\s("?[\w-]*"?)', '\1 %s')

ConsoleWrite($sCompile_String & @CRLF)


Creat0R 16-11-2008 13:49 953998

Sylver Dragon, Maza Faka,
Спасибо, оба варианта работают на ура (первый конечно по проще :tongue: ), а я столько мучался :dont-know ...

SyDr 16-11-2008 14:04 954007

Ааааа... Мой вариант немного неправильный. Строку вида '/In "Yes, Right" /Icon "No" /Bin "Ok" /Comp 1' обработать правильно не сможет. С пробелами всмысле.

Можно так тогда переписать:
$sCompile_String = StringRegExpReplace($sCompile_String, '/(.*?) ([^/])*', '/$1 %s ')
Однако строку вида '/In array "Yes, Right" /Icon, or not icon "No" /Bin "Ok" /Comp 1' Он всё равно обработать не сможет. Хотя впринципе такую строку ничто не сможет обработать. Нужны будут какие-то спец. символы, чтобы выделять нужные куски.

Creat0R 16-11-2008 14:14 954019

Sylver Dragon,
Цитата:

Цитата Sylver Dragon
Строку вида '/In "Yes, Right" /Icon "No" /Bin "Ok" /Comp 1' обработать правильно не сможет »

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

P.S
Вот если бы ещё с первой проблемой разобраться :durak: ...

SyDr 16-11-2008 14:42 954042

StringRegExp($Clip, '(\a:\\)([^/\\<>:*?"|])*\.(txt|txt\.bk)(\n|$)')

Пока не проверял. Поясню немного:
([^\\/<>:*?"|])* - означает наличие любых символов, кроме тех, которые не могут присутствовать в имени файла. Надеюсь, что правильно записал выражение. Хотя если в буфере будет что-то типа: D:::\Bla\Text.txt - правильно обравботать не получиться.
Ну, я не думаю, что кто-то будет так маньячиться.
Щас немного потестирую.

Стоп. пути только полные, или могут быть относительные?

Пока не работает. Даже понял, почему :) Сменились значения спец. символов. Придёться с английской справкой работать((



Я немножко в ступоре))
StringRegExp($Clip, '\b:\\([^\\/<>:*?|])*')) - вот это проверит, может ли являеться ли $Clip путём к файлу. Однако расширение она учесть не сможет (точки могут быть в любом месте файла). Это уже надо сильно усложнять выражение, что приведёт к увеличению времени обработки. А это здесь явно не нужно.
Щас буду думать дальше.

И ещё, как вариант, проверять, путь ли в буфере, не во время вызова контекстного меню, а регулярно, во время работы программы. Т. е. если буфер изменился - проверить, путь ли в нём теперь.


Я дурак. Поставил в регулярное выражение символ \ и думаю, почему неправильно обрабатывает...


Всё. Вот моё окончательное слово:
Код:

StringRegExp($Clip, '\b:\\([^/<>:*?|])*(\.txt|txt\.bk)(\n|$)')
P. S. Только для полных путей.

Creat0R 17-11-2008 03:19 954575

Sylver Dragon,
Цитата:

Цитата Sylver Dragon
пути только полные, или могут быть относительные? »

Полные, ClipGet() возвращает полные пути скопированных файлов (из проводника).

Цитата:

Цитата Sylver Dragon
как вариант, проверять, путь ли в буфере, не во время вызова контекстного меню, а регулярно, во время работы программы »

Вариант был расмотрен ранее, он не подходит, это нагрузка на главный цикл, и занимает лишние мегабайты памяти :(

Цитата:

Цитата Sylver Dragon
Вот моё окончательное слово »

Спасибо, но оно не работает как надо:

Код:

$Clip = _
    "C:\Testing\SomeFile.txt" & @LF & _
    "Testing\OtherFile.txt"

;$Clip = ClipGet()

$sExt_Pattern = '\.txt|\.txt\.bk' ;Файлы ещё могут иметь расширение txt.bk (обязательно вместе)
$iEnable_Paste_Item = StringRegExp($Clip, '\b:\\([^\/<>:*?|])*(' & $sExt_Pattern & ')(\n|$)')

MsgBox(0, "", "$iEnable_Paste_Item = " & $iEnable_Paste_Item)

Возвращает 1, хотя втрой путь совсем не путь к файлу.

amel27 17-11-2008 06:26 954605

Creat0R
Цитата:

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

#Region : Построение регулярного выражения
$ExpandVarStrings = Opt("ExpandVarStrings", 1)

$extn = "(?:\.txt|\.txt\.bk)"
; диск ("C:")
$disk_1 = ".:"
$disk_2 = "[a-z]:"
; UNC путь (\\server-1.domain.local)
$host_1 = "\\\\[-\w.]+"
$host_2 = "\\\\[-\w]+(?:\.[-\w]+)*"
; корень пути (все возможные варианты)
$root_1 = "(?:$disk_1$|$host_1$)"
$root_2 = "(?:$disk_2$|$host_2$)"
; путь без корня, включая имя файла
$path_1 = ".*"
$path_2 = "(?:\\[^\n\\]+)+"
; путь без корня, без имени файла
$path_3 = "\\(?:[^\n\\]+\\)*"
; только имя файла без пути
$name_3 = ".+$extn$"
$name_4 = "[^\n\\]+$extn$"
; одна строки списка файлов
$line_1 = "$root_1$$path_1$$extn$"
$line_2 = "$root_2$$path_2$$extn$"
$line_3 = "($root_2$$path_3$)$name_3$"
$line_4 = "($root_2$$path_3$)$name_4$"
; варианты выражений с разной детализацией
$RegExp_1 = "(?i)^(?:$line_1$(?:\n|$$))+$$"
$RegExp_2 = "(?i)^(?:$line_2$(?:\n|$$))+$$"
$RegExp_3 = "(?i)^$line_3$(?:\n\1$name_3$)*$$" ; файлы с одного ресурса (один путь)
$RegExp_4 = "(?i)^$line_4$(?:\n\1$name_4$)*$$" ; файлы с одного ресурса (один путь)

Opt("ExpandVarStrings", $ExpandVarStrings)
#EndRegion

$sClip = ClipGet()
ConsoleWrite($sClip &@CRLF&@CRLF)

ConsoleWrite(StringRegExp($sClip,$RegExp_1) &': "'& $RegExp_1 &'"'&@CRLF)
ConsoleWrite(StringRegExp($sClip,$RegExp_2) &': "'& $RegExp_2 &'"'&@CRLF)
ConsoleWrite(StringRegExp($sClip,$RegExp_3) &': "'& $RegExp_3 &'"'&@CRLF)
ConsoleWrite(StringRegExp($sClip,$RegExp_4) &': "'& $RegExp_4 &'"'&@CRLF)

Цитата:

Цитата Creat0R
И ещё задача по RegExp »

Код:

$sCompile_String = '/In "Yes" /Icon "No" /Bin "Ok" /Comp 1'
$sCompile_String = StringRegExpReplace($sCompile_String,' +("[^"]*"|[^/ ]+)',' %s')

ConsoleWrite($sCompile_String & @CRLF)

P.S. Вроде таких еще не было :)

Creat0R 17-11-2008 13:29 954825

amel27,
Цитата:

Цитата amel27
скорость и глубина проверки противоречат друг другу, четыре разных варианта »

Ухты, такие выражения я ещё не видел :o :biggrin:

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

P.S
Победители конкурса по Регулярным выражениям становятся... RegExp номер 3 и номер 4! :clapping:

Цитата:

Вроде таких еще не было
Выражении, или задач? :rolleyes:

SyDr 17-11-2008 21:00 955287

Цитата:

Цитата Creat0R
Спасибо, но оно не работает как надо »

Просто я плохо проверял, прежде чем написать... :sorry:

Цитата:

Цитата Creat0R
Возвращает 1, хотя втрой путь совсем не путь к файлу. »

Это тоже путь к файлу. Просто относительный. Хотя в случае копирования из проводника такой ситуации быть не может.




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




Цитата:

По поводу скорости, мне главное чтобы если первая строка не совпадает с запросом, то проверка заканчивалась. Моя первая попытка сделать пдобную проверку, очень долго возвращала результат в случае если б.обмена содержал большой кусок текста (не пути к файлам).
Ещё один вариант - разбить всю строку на массив (разделитель @LF). И проверять каждый элемент - являеться ли он путём к файлу. Ведь чем короче строка - тем быстрее она проверяеться на соотвествие шаблону (так ведь?).
Плюс ещё сделать предположение, что если первые несколько строк - пути к файлам, значит и всё остальное тоже.

Creat0R 17-11-2008 22:25 955363

Sylver Dragon,
Цитата:

Цитата Sylver Dragon
как насчёт того, чтобы проверять не во время вызова контекстного меню, а прямо перед вставкой? »

Дело в том, что вся эта затея нужна для активирования/деактивирования пункта меню. Если буфер обмена позволяет вставить файлы, то при открытии меню пункт должен быть активен (GUISetState($Item, $GUI_ENABLE)), если вставка невозможна, то пункт следует деактивировать ($GUI_DISABLE).

P.S
В принципе (это я только щас додумал), достаточно лишь проверять расширение файлов, т.к у меня есть ещё и проверка типа данных содержащихся в буфере обмена (DROPEFFECT_COPY/MOVE).

amel27 18-11-2008 03:36 955536

Creat0R
Цитата:

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

Победители конкурса по Регулярным выражениям становятся... RegExp номер 3 и номер 4! »
там есть оптимизация - путь обсчитывается только один раз в первой строке, далее обрабатываются только имена файлов
Цитата:

достаточно лишь проверять расширение файлов, т.к у меня есть ещё и проверка типа данных содержащихся в буфере обмена »
главное вспомнить вовремя :lol:, тогда тебе хватит "^.*$extn$(?:\n.*$extn$)*$$" :)
жаль, нельзя сходу отличить файл от каталога, диска или другого элемента "сетевого окружения" ;)

amel27 18-11-2008 13:05 955865

Цитата:

Цитата amel27
нельзя сходу отличить файл от каталога, диска или другого элемента "сетевого окружения" »

склероз однако... =) согласно этому посту наверное все-таки можно... во всяком случае попробовать

Creat0R 18-11-2008 14:12 955911

Цитата:

Цитата amel27
согласно этому посту наверное все-таки можно »

Кстати, я тут немного переделал функцию _FileSFCallbackProc, чтобы при выборе папки её полный путь отображался в строке под Prompt. Но проблема в том, что если путь слишком длинный, то он обрывается. Я это решил следующей функцией:

Код:

ControlSetText($hWnd, "", "Static1", $sPromptData & @CRLF & @CRLF & _GetShortString($sSetData, 50))

Func _GetShortString($sString, $iMax_Ret_Lenght=30)
    If StringLen($sString) < $iMax_Ret_Lenght Then Return $sString

    If $iMax_Ret_Lenght <= 4 Then $iMax_Ret_Lenght = 5
    Local $iSide_Lenght = Round(($iMax_Ret_Lenght / 2) - 2, 0)

    Local $sLeft_Side = StringStripWS(StringLeft($sString, $iSide_Lenght), 3)
    Local $sRight_Side = StringStripWS(StringRight($sString, $iSide_Lenght), 3)

    Return $sLeft_Side & "...." & $sRight_Side
EndFunc

Внимание вопрос: Возможно ли сделать подобное укарачивание строки одними лишь RegExp'ресами?

leprecon 18-11-2008 18:15 956113

Можно ли через autoit изменить реестр в ограниченой учетной записи?

SyDr 18-11-2008 19:31 956190

Цитата:

Цитата Creat0R
Возможно ли сделать подобное укарачивание строки одними лишь RegExp'ресами? »

$Number = 30
$Array = StringRegExp($Expr, '^(.){' & $Number & '}',2)
$Array[0] - первые $Number символов строки. Если длина строки меньше $number - значение @error = 2 (А Array[0] - ХЗ, пустая строка вроде).

Цитата:

Цитата leprecon
Можно ли через autoit изменить реестр в ограниченой учетной записи? »

Можно. Все те разделы, в которых при этом разрешена запись.
Если же нужна запись во все разделы - используй что-нибудь типа:

Код:

If $CmdLine[1] = "/NeedAdmin" Then
$sUserName = "Username"
$sPassword = "Password"
$FileToRun = "ThisExe.exe"
RunAs($sUserName, @ComputerName, $sPassword, 0, $FileToRun)
Exit
EndIf
; Начало основного сценария


Grammaton Cleric 19-11-2008 07:50 956582

Такая вот проблема...
Есть текстовый файл, например test.txt, в котором содержится:
Код:

[19.11.08 07:51:20] Регистрация пользователя OPERATOR
[19.11.08 07:51:24] [4] cryptoserver authentication: one-way mode.eG#I
[19.11.08 07:51:25] Время сервера 19.11.2008 1:53:25
[19.11.08 07:51:28] OK:[3] valid O/R name.
[19.11.08 07:51:28] Доступ разрешен
[19.11.08 07:51:28] Просмотр исходящих файлов
[19.11.08 07:51:29] Отправка файла 47D43E1ANL18170549906E.XXX
[19.11.08 07:51:31] OK:All letters send successfully.
[19.11.08 07:51:31] Просмотр входящих файлов
[19.11.08 07:51:33] Нет входящих сообщений
[19.11.08 07:51:35] Сессия завершена
[19.11.08 11:08:12] Регистрация пользователя ws05285o
[19.11.08 11:08:16] [4] cryptoserver authentication: one-way mode.‰u#I
[19.11.08 11:08:17] Время сервера 19.11.2008 5:10:17
[19.11.08 11:08:20] OK:[3] valid O/R name.
[19.11.08 11:08:20] Доступ разрешен
[19.11.08 11:08:20] Просмотр исходящих файлов
[19.11.08 11:08:21] Отправка файла 9FBD57C0NL19110805312E.XXX
[19.11.08 11:08:23] OK:All letters send successfully.
[19.11.08 11:08:23] Просмотр входящих файлов
[19.11.08 11:08:26] Прием файла NKTF1027.000
[19.11.08 11:08:27] OK:message was successfully deleted from queue..
[19.11.08 11:08:29] Прием файла NKTF1030.000
[19.11.08 11:08:31] OK:message was successfully deleted from queue..
[19.11.08 11:08:33] Нет входящих сообщений
[19.11.08 11:08:35] Сессия завершена

Размер файла регулярно увеличивается... Надо проверить в файле наличие "OK:All letters send successfully" (без кавычек). А если реально, то и вернуть количество этих вхождений....
Тока напишите, пожалуйста, небольшое пояснение. А то хочется не просто тупо использовать кусок кода, но и понять КАК он работает....

Maza Faka 19-11-2008 09:17 956630

Цитата:

Цитата Grammaton Cleric
Такая вот проблема »

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

$sFile = @ScriptDir & "\test.txt"
$sRead = FileRead($sFile)

$aString = StringRegExp($sRead, "(?i)OK:All letters send successfully", 3)
If @error Then
    MsgBox(48, "Test.txt", "Совпадений не найдено")
    Exit
EndIf


MsgBox(64, "Test.txt", "Найдено " & UBound($aString) & " совпадений")


amel27 19-11-2008 12:01 956795

Creat0R
Цитата:

Возможно ли сделать подобное укарачивание строки одними лишь RegExp'ресами? »
Нет, одними нельзя - входными данными для регулярных выражений является сам текст, в твоем случае как раз наоборот - форматирование абсолютно не зависит от содержания самой строки, оно определяется длиной строки, длиной контрола, длиной вставки ("..."), на основании этих ГЛОБАЛЬНЫХ (по отношению к тексту) параметров рассчитываются длины левого и правого куска. RegExp же, являясь конечным автоматом, "мыслит" ЛОКАЛЬНО - в процессе "раскрутки" выражения он не знает какой текст его ждет впереди, сколько ему еще до конца строки, не помнит даже того текста, который им уже обработан... за исключением, пожалуй, выставленных "групп захвата". Конечно, можно заменить StringLeft() и StringRight() на StringRegExpReplace(), но выгода от этого сомнительна.

По ходу немного переделал твой UDF, стабилизировав длину выходной строки (имеет смысл только для непропорционального шрифта типа Courier) и добавил возможность смещения заполнителя в правую или левую сторону... Вариант для RegExp прилагается, но он некорректно обрабатывает нулевую длину $iLeft и $iRight:
Код:

$s = "C:\Documents and Settings\Администратор\Рабочий стол\Текстовый документ.txt"
$s = _GetShortString($s, 30, -11)

ConsoleWrite('"'&$s&'"' &@CRLF)
ConsoleWrite("Output Length: "& StringLen($s) &@CRLF)

Func _GetShortString($sString, $iMaxRetLen = 30, $iShift = 0)
    Local $iString = StringLen($sString)
    If $iString <= $iMaxRetLen Then Return $sString

    Local $sMidl= "...", $iMidl = StringLen($sMidl)
    Local $iCut = $iString - $iMaxRetLen
    If $iCut<$iMidl Then $sMidl=StringLeft($sMidl, $iCut)

    $iMaxRetLen -= $iMidl
    If $iMaxRetLen <0 Then $iMaxRetLen = 0

    Local $iEven = BitShift($iMaxRetLen,1)
    If $iShift> $iEven Then $iShift= $iEven
    If $iShift<-$iEven Then $iShift=-$iEven
    Local $iLeft = $iEven+$iShift+BitAND($iMaxRetLen,1)
    Local $iRight= $iEven-$iShift

;  $sString = StringRegExpReplace($sString, "(.{"& $iLeft &"}).*(.{"& $iRight &"})", "\1"& $sMidl &"\2")
    $sString = StringLeft($sString,$iLeft) & $sMidl & StringRight($sString,$iRight)

    Return $sString
EndFunc


EgOrus 19-11-2008 14:49 957015

Здравствуйте наблюдается проблемма на Vista 32 Ultimate при отработке команды Ping(), назависимо от состояния сети всегда выдает время отклика равное 1, тот же скрипт на Windows XP работает как надо. Втроенный брэндмауэр, Defender и т.п. отключены. Сеть и инет работает как надо. Может у кого-то будут мысли куда копать?
вот такой простенький скрипт
Код:

$var = Ping("192.168.1.1")
While 1
        If $var Then
                MsgBox(4096, 'Сообщениe', 'Подключен. ' & $var)
                ExitLoop
        Else
                MsgBox(4096, 'Сообщениe', 'Не подключен. ' & $var & ' ' & @error)
                sleep(2000)
        EndIf
Wend


morgan1991 19-11-2008 23:04 957522

EgOrus, попробуйте запустить скрипт с админскими правами, на висте есть такое может поможет?

Люди добрые скажите есть ли в Autoit команда которая при компиляции скрипта поможет изменить параметры .exe в св-вах они отображаются и всякие другие параметры?

Вот св-ва:

amel27 20-11-2008 03:52 957725

morgan1991,
AutoIt3Wrapper, страница закачки, пример:
Код:

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_outfile=MyProg.exe
#AutoIt3Wrapper_Res_Comment=My Test Program
#AutoIt3Wrapper_Res_Description=MyProg - My Test Program
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_LegalCopyright=GNU GPL
#EndRegion
;**** Directives created by AutoIt3Wrapper_GUI ****


amel27 20-11-2008 04:12 957734

EgOrus, к сожалению, сейчас нет под рукой висты, обходной вариант:
Код:

$host = @ComputerName
If _PING($host) Then
    MsgBox(64,"Сообщение","Хост доступен")
Else
    MsgBox(16,"Ошибка","Хост недоступен")
EndIf

Func
_PING($host)
    Local Const $sExe = @SystemDir &"\PING.EXE"
    Local $iRet, $sCMD = $sExe &" -n 1 "& $host
    If Not FileExists($sExe) Then Return SetError(1,0,False)
    $iRet = RunWait($sCMD, @SystemDir, @SW_HIDE)
    Return $iRet==0
EndFunc


morgan1991 20-11-2008 15:25 958135

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

Maza Faka 20-11-2008 16:05 958178

Цитата:

Цитата morgan1991
чтото я недопонял »

SciTE4AutoIt3.exe полный пакет (SciTE + утилиты)

Котяра 20-11-2008 19:03 958351

Разобрался. Скачал новый SciTE. Не помогло. Скачал BETA-версию autoit и откомпилировал через "Beta Compile".

kaZilla 20-11-2008 23:00 958582

подскажите такое решение.
Надо сделать автоскрипт на смену резрешений в реестре для ветки SafeBoot на только чтение,
чтоб вирус не удалял её. Ну т.е. там на кнопочки нажать , галочки поставить... Скачал SciTE4AutoIt3. Пытался делать AutoIt3Wrapper`ом и AutoItMacroGenerator непомагает, так как они записывают фиксированные перемещение мышки,
и не учитывают что окно возможно будет перемещено. Дайте совет! Заранее спасибо!!

Grammaton Cleric 21-11-2008 05:46 958729

Ну для начала, я в таких случаях ставлю AutoIT3 полностью...
Потом в начале скрипта прописываешь
Opt("MouseCoordMode",2) ; Обработка координат положения курсора мыши от левого верхнего угла клиентской части текущего окна
Затем запускаешь AutoIt Window Info (не знаю как в остальных, но в полной установке этот компонент устанавливается), и там в меню "Options" выбираешь "CoordMode"->"Client"
Теперь Window Info будет показывать положение мыши исчисляя его от левого верхнего угла клиентской части текущего окна. То есть координаты клика теперь будут отсчитываться не от угла экрана, а от угла активного окна...
Чтобы лучше понять - сделай то, что написано и попробуй как это будет действовать... Можно банально при запущеном
Window Info попробовать найти нулевые координаты мыши в нужном окне. Еще раз повторяю, что после этих манипуляций координаты не будут зависеть от того, где находится окно - главное, чтобы оно было активно.
------------
А может проще ControlClick использовать?

Maza Faka 21-11-2008 08:31 958795

Цитата:

Цитата kaZilla
Надо сделать автоскрипт на смену резрешений в реестре »

IMHO реализовывать решение подобной задачи имитацией кликов - полный бред. Поищи в сети, может какие утилиты есть, наподобие cacls.exe? только для ключей реестра.

kaZilla
Нарыл кое-какую инфу:
How to Use Regini.exe to Set Permissions on Registry Keys
setacl

t_ara_s 21-11-2008 11:00 958944

Подскажите пожалуйста как предусмотреть в скрипте разные варианты. Например, если устанавливать ICQ 6 автоматом на чистую систему, то все ставится нормально, а если на компе создано подключение к интернету, то прога спрашивает об подключении и ломится в интернет. Как предусмотреть ето и сделать так, чтоб скрипт "умел" устанавливать двумя вариантами. Аналогично, если инсталировать программу, которая уже установлена, то спрашивает "Восстановить" или "Удалить". Прошу помощи. Только подробно, если можно. И если не трудно, то с примером, а то я AutoIt знаю на уровне чуть выше SciTe Skript Writer-a :)

amel27 21-11-2008 11:53 958982

kaZilla
Цитата:

Надо сделать автоскрипт на смену резрешений в реестре для ветки »
согласен с Maza Faka, такие задачи лучше решать "в лоб"... теоретически, установку прав можно сделать без сторонних утилит (где-то тут мелькал линк на описалово), но сия задача весьма трудоемкая и даже оффсайт AutoIT рекомендует использовать сторонние модули (Set ACL properties in Windows)... я проверил предложенный ptrex COM объект - работает, НО мне не удалось завести метод $SET_ACCESS в режиме правки текущего ACL (без добавления нового), кроме того не удалось добавить ACL при отсутствии прав на ветку, но при наличии владения (RegEdit в этом случае добавляет права нормально)... поэтому я пока не вижу смысла в полной чистке всех прав ($ACTN_CLEARDACL), т.к. добавить их потом нет никакой возможности, а заявленная способность нескольких операций "за раз" увы, не работает... и тем не менее для большинства простых случаев этот способ будет полезен, рабочий пример (значения констант нужно скопировать с топика ptrex):
Код:

$strFileName  = "HKCU\TEST"
$strUsername  = "S-1-5-32-544" ; Administrators
$strPermission = "read"
; Снятие наследуемых разрешений
$SetACL1 = ObjCreate("SetACL.SetACLCtrl.1")
If IsObj($SetACL1) Then
    $nError = $SetACL1.SetObject($strFileName, $SE_REGISTRY_KEY)
    $nError = $SetACL1.SetObjectFlags($INHPARNOCOPY, 0, True, False)
    $nError = $SetACL1.SetAction($ACTN_SETINHFROMPAR)
    $nError = $SetACL1.Run
EndIf
; Удаление заданной учетной записи из списков доступа
$SetACL1 = ObjCreate("SetACL.SetACLCtrl.1")
If IsObj($SetACL1) Then
    $nError = $SetACL1.SetObject($strFileName, $SE_REGISTRY_KEY)
    $nError = $SetACL1.AddTrustee($strUsername, "", True, False, $ACTN_REMOVETRUSTEE, True, False)
    $nError = $SetACL1.SetAction($ACTN_TRUSTEE)
    $nError = $SetACL1.Run
EndIf
; Установка прав для заданной учетной записи
$SetACL1 = ObjCreate("SetACL.SetACLCtrl.1")
If IsObj($SetACL1) Then
    $nError = $SetACL1.SetObject($strFileName, $SE_REGISTRY_KEY)
    $nError = $SetACL1.SetAction($ACTN_ADDACE)
    $nError = $SetACL1.AddACE($strUsername, True, $strPermission, $INHPARNOCHANGE, False, $SET_ACCESS, $ACL_DACL)
    $nError = $SetACL1.Run
EndIf

Прямой линк на оффсайт SetACL: http://sourceforge.net/projects/setacl/
там же лежит CMD-вариант утилиты, хотя для серьезных задач рекомендую SubInACL :)

morgan1991 21-11-2008 15:19 959172

t_ara_s,
Код:

#include <Inet.au3>
$PublicIP = _GetIP()
If $PublicIP = -1 Then main()

Есть инет ломиться туда

Func main()
    Инэта нет установка
EndFunc


t_ara_s 21-11-2008 15:49 959207

Мне надо сделать автоустановку. Если ставить на чистую систему, то все норм, а если программа уже установлена и спрашивает "восстановить" или "удалить" то как? Что-то типа если окно 1, то комманда 1, если окно 2, то команда 2?

Maza Faka 21-11-2008 16:11 959232

Цитата:

Цитата t_ara_s
если программа уже установлена и спрашивает "восстановить" или "удалить" то как? »

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

спрашивает "восстановить" или "удалить"

Котяра 21-11-2008 18:25 959357

Что если появляется окно

выполнить одно действие
А если

то другое. Хотя, действительно, можно просто
Цитата:

Цитата Maza Faka
проверить установлена ли программа »

вместо разбора окна

t_ara_s 21-11-2008 21:42 959579

Спасибо, но я ето и сам знаю. А вот как ето прописать в скрипте? Напишите пожалуйста кому не лень, а то я скрипты пишу только благодаря SkriptWriter :-)

Maza Faka 22-11-2008 06:53 959850

t_ara_s
Код:

WinGetText()
ControlGetText()
If...Then...Else


Grammaton Cleric 22-11-2008 07:50 959870

Цитата:

Цитата t_ara_s
Если ставить на чистую систему, то все норм, а если программа уже установлена и спрашивает »

t_ara_s, каждая программа в процессе установки создает себе папочку (директорию), в которой она, собственно, и обитает... Так вот можно проверить наличие данной папочки, или проверить наличие в папочке программы файла, который там ОБЯЗАТЕЛЬНО присутствует...
Код:

If FileExists (@ProgramfilesDir&'\Proga\File.exe') = 1 then Exit
Или
Код:

If FileExists (@ProgramfilesDir&'\Proga\File.exe') then
    MsgBox (0, 'test', 'Программа уже установлена')
Else
    MsgBox (0, 'test', 'Программа еще не установлена')
EndIf

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

RegRead ( "keyname", "valuename" )
Который возвращает значение ключа реестра... Если вернул пустую строку ('') значит, скорее всего, нету его и, соответственно, программа не установлена.

litus 24-11-2008 13:31 961935

Здравствуйте посетители форума на досуге собрал несколько скриптов "тихих установок" с за премер были взяты скрипты от
Sanja Alone меня заинтересовали следующие строчки:
;Отображать текущую строку сценария с помощью индикатора системной панели в режиме отладки.
AutoItSetOption("TrayIconDebug", 1)
AutoItSetOption("SendKeyDelay", 10)
If ProcessExists ( "ps.exe" )<>0 Then
ProcessClose ( "ps.exe" )
ProcessWaitClose ( "ps.exe" )
EndIf
Какую операцию выполняет даное выражение и объязательно ли включать эти строки в свои скрипты?
Если вопрос оказался глупым обьясните как это говориться "КАК ДЛЯ ЛАМЕРА" учитывая то что я невижу точто на монеторе у меня проблемы с зрением я работаю с синтезатором речи без помощи глаз и зрячего програмиста под рукой нет для того чтобы прокоментировать произходящее.

Также изучая файл справки "AutoIt3_2_5_4_ru.chm" обнаружил одно недоразумение непереведены несколько разделов на русский язык а имено:
указатель библиотечных функций / Автоматизация MS Internet Explorer
Подскажите делал ли Валерий Викторович Иванов полный перевод этих разделов если да то где можно скачать этот дестребутив.

Maza Faka 24-11-2008 15:27 962064

Цитата:

Цитата litus
Какую операцию выполняет даное выражение »

Код:

AutoItSetOption("TrayIconDebug", 1)
Если установить эту опцию, то при наведении курсора мыши на иконку выполняющегося скрипта в трее, будет отображаться информация о том, какая именно строка кода выполняется в данный момент (не работает в скомпилированном коде). Полезно при отладке кода.

AutoItSetOption("SendKeyDelay", 10)
Изменяет длительность задержки между нажатиями клавиш. (По умолчанию 5 мс.).

If ProcessExists ( "ps.exe" )<>0 Then
Если процесс ps.exe существует то...

ProcessClose
Закрываем процесс.

ProcessWaitClose
Ждём закрытия процесса.

Grammaton Cleric 25-11-2008 01:58 962692

И небольшое дополнение к сообщению Maza Faka,
Код:

If ProcessExists ( "ps.exe" )<>0 Then
ProcessClose
ProcessWaitClose

Дело в том, что это процесс программы "Punto Switcher" - переключателя языка ввода с клавиатуры. Эта программа следит за тем, что ты вводишь и смотрит, правильно ли у тебя выбрана раскладка клавиатуры. Если использовать команду Send () или ControlSend (), то отправляется просто указанный кусок строки, и если в это время будет запущен "Punto Switcher" - он может переключить раскладку и введется не то, что тебе надо, а, возможно, набор символов.

DImaN! 26-11-2008 16:11 964216

Подскажите пожалуйста, как можно в VBScript получить путь к текущей директории и zip-архиву. К примеру, на диске С в папке folder находится какой-то file.zip, нужно его распаковать средствами VBScript.
Но нужно, чтобы сам файл скрипт искал в той же директории, где и он сам находится (+ желательно, чтобы он искал все архивы и их распаковывал).
Вот пример моего кода, который как я написал распаковывает только указанный файл в указанной директории:

Код:

strZipFile = "c:\folder\file.zip"       
outFolder = "c:\folder"
   
Set objShell = CreateObject( "Shell.Application" )
Set objSource = objShell.NameSpace(strZipFile).Items()
Set objTarget = objShell.NameSpace(outFolder)
intOptions = 256
objTarget.CopyHere objSource, intOptions


Creat0R 27-11-2008 00:41 964750

DImaN!,
Цитата:

Цитата DImaN!
как можно в VBScript получить путь к текущей директории и zip-архиву »

А как это связано с данной темой?

Вам скорее сюда.

Frost_Imp 27-11-2008 17:00 965337

Товарищи, подскажите пожалуйста, можно ли каким-нибудь образом посылать клавиатурные команды (send) в НЕАКТИВНОЕ окно?

Creat0R 27-11-2008 17:06 965346

Frost_Imp,
Цитата:

Цитата Frost_Imp
можно ли каким-нибудь образом посылать клавиатурные команды (send) в НЕАКТИВНОЕ окно? »

См. ControlSend() в справке.

Frost_Imp 27-11-2008 17:46 965386

Цитата:

Цитата Creat0R
См. ControlSend() в справке. »

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

Creat0R 27-11-2008 21:51 965638

Frost_Imp,
Цитата:

Цитата Frost_Imp
Естесственно, речь не идет об управляющих элементах »

Не естественно. Управляющие элементы это классы/идентификаторы контролов (элементов). Если это поле ввода, то можно пробовать по разному, например:

Код:

ControlSend("Заголовок приложения (игры?)", "", "Edit1", "Строка")

MastOfD 27-11-2008 22:45 965680

Хотел сделать АвтоЛогин...
Но не работает((... подскажите где косяк

#include <IE.au3>

$oIE = _IECreate ("http://ogame.ru")
$oForm = _IEFormGetObjByName ($oIE, "loginForm")
$oLogin = _IEFormElementGetObjByName($oForm, "login")

_IELoadWait ($oIE)

_IEFormElementSetValue($oLogin, "Master")

_IEFormSubmit($oForm)

litus 28-11-2008 01:09 965788

Доброго времени посетители форума подскажите пожалуста как можно реализовать такой код чтобы был перехват гарячих клавиш. К примеру нажимаем клавиши "Control + Q" и запускаеться определёный процес.

Maza Faka 28-11-2008 07:11 965908

Цитата:

Цитата litus
перехват гарячих клавиш »

Код:

HotKeySet("^q", "_ProcessStart")
HotKeySet("^e", "_Exit")

While 1
        Sleep(100)
WEnd

Func _ProcessStart()
        Run("notepad.exe")
EndFunc

Func _Exit()
        Exit
EndFunc


Maza Faka 28-11-2008 12:25 966174

Цитата:

Цитата MastOfD
Хотел сделать АвтоЛогин »

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

#include <IE.au3>

$sURL = "http://ogame.ru"

$oIE = _IECreate($sURL)

$oName = _IEGetObjByName($oIE, "login")
$oPass = _IEGetObjByName($oIE, "pass")
$oForm = _IEFormGetObjByName($oIE, "button")

_IEFormElementSetValue($oName, "MyLogin")
_IEFormElementSetValue($oPass, "Secret")
 _IEFormSubmit($oForm)


Frost_Imp 28-11-2008 13:39 966247

Цитата:

Цитата Creat0R
Не естественно. Управляющие элементы это классы/идентификаторы контролов (элементов). Если это поле ввода, то можно пробовать по разному, например:
Код:
ControlSend("Заголовок приложения (игры?)", "", "Edit1", "Строка") »

А если нет поля ввода? В том то и проблема. Если есть контрол (его нет, но рассмотрим эту ситуацию), то это не стандартный виндовый контрол, так ведь? Окно игры - какие там контролы? Мне не важно. Важно, что если при активном окне я нажму кнопку, например, "1" - произойдет какое-то событие. Так вот мне и нужно - послать сигнал о нажатии на клавишу "1" в свернутое или неактивное окно с игрой.

SyDr 28-11-2008 13:54 966268

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

Код:

>>>> Window <<<<
Title:        Warlords IV
Class:        Sage7Window
Position:        0, 0
Size:        1030, 795
Style:        0x14CA0000
ExStyle:        0x00000100
Handle:        0x00410460

>>>> Control <<<<
Class:       
Instance:       
ClassnameNN:       
Advanced (Class):       
ID:       
Text:       
Position:       
Size:       
ControlClick Coords:       
Style:       
ExStyle:       
Handle:       

>>>> Mouse <<<<
Position:        364, 351
Cursor ID:        0
Color:        0x090B09

>>>> StatusBar <<<<

>>>> Visible Text <<<<


>>>> Hidden Text <<<<

----------------------

В моём случае сработало так:
ControlSend( "Warlords IV", "", "", "{ESC}")

Maza Faka 28-11-2008 14:03 966284

Цитата:

Цитата Frost_Imp
послать сигнал о нажатии на клавишу "1" в свернутое или неактивное окно с игрой. »

А если попробовать без указания контрола? Иногда срабатывает:
Код:

ControlSend("Заголовок приложения (игры?)", "", "", "Строка")

Frost_Imp 28-11-2008 17:32 966454

Цитата:

Цитата Sylver Dragon
А нельзя ли его развернуть\сделать активным? »

Да в том то и дело, что не хочется его разворачивать. При развернутом окне и SEND замечательно работает

CrazyNNM 28-11-2008 21:16 966659

Цитата:

Цитата Maza Faka
Попробуй так:
Код:
#include <IE.au3>
$sURL = "http://ogame.ru"
$oIE = _IECreate($sURL)
$oName = _IEGetObjByName($oIE, "login")
$oPass = _IEGetObjByName($oIE, "pass")
$oForm = _IEFormGetObjByName($oIE, "button")
_IEFormElementSetValue($oName, "MyLogin")
_IEFormElementSetValue($oPass, "Secret")
_IEFormSubmit($oForm) »


а как найти имена этих контролов?
которые у тебя сейчас "login" и "pass"

Котяра 28-11-2008 23:17 966816

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

If $CmdLine[$CmdLine[0]] == '-run' Then
        MsgBox(0, "o", "o")
EndIf


araneon 28-11-2008 23:46 966839

Ребята подскажите новечку, как сделать неактивное окно активным ??? Я пытаюсь сделать автоматическую установку программы (Fox video converter) так вот там в конце этот инстолятор ставит какието дполнения и после чего главное окно инсталятора становится неактивным. Мож кто знает выход из положения???

6757439 28-11-2008 23:56 966847

Цитата:

Цитата araneon
Ребята подскажите новечку, как сделать неактивное окно активным ??? Я пытаюсь сделать автоматическую установку программы (Fox video converter) так вот там в конце этот инстолятор ставит какието дполнения и после чего главное окно инсталятора становится неактивным. Мож кто знает выход из положения??? »

Код:

WinActivate("заголовок нужного окна", "")

Maza Faka 29-11-2008 08:21 967035

Цитата:

Цитата CrazyNNM
а как найти имена этих контролов? »

Используя бесплатную утилиту debugbar :)

Цитата:

Цитата Котяра
Экспериментально выяснил, как сделать проверку на ключ командной строки: »

А если ключей несколько? :)

Цитата:

Цитата 6757439
WinActivate("заголовок нужного окна", "") »

А затем неплохо было бы дождаться момента, когда окно станет активным
Код:

WinWaitActive("заголовок нужного окна")

SyDr 29-11-2008 08:55 967045

Цитата:

Цитата Frost_Imp
Да в том то и дело, что не хочется его разворачивать. При развернутом окне и SEND замечательно работает »

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

araneon 29-11-2008 09:43 967053

Спасибо огромное что отозвались на мой вопрос. Но WinActivate("заголовок нужного окна", "") непомогает, почемуто окно нестановится активным, заголовок окна смотрел в AutoIt v3 Window Info в строке >>>>Window<<<<< Title. Может ещё как небуть можно сделать его активным ???

6757439 29-11-2008 10:47 967074

Цитата:

Цитата Maza Faka
Цитата CrazyNNM:а как найти имена этих контролов? »
Используя бесплатную утилиту debugbar »

у меня прога отображается в меню выбора панелей, но не запускается =( мож есть какая-то наподобии?

Maza Faka 29-11-2008 11:19 967089

Цитата:

Цитата araneon
почемуто окно нестановится активным »

Цитата:

Цитата araneon
заголовок окна смотрел в AutoIt v3 Window Info »

Какой заголовок показывает AutoIt Window Info?

Цитата:

Цитата 6757439
у меня прога отображается в меню выбора панелей, но не запускается »

Курсором мыши тянешь иконку в виде "прицела" на интересующий тебя объект и смотришь его параметры.

6757439 29-11-2008 11:35 967097

Цитата:

Цитата araneon
Спасибо огромное что отозвались на мой вопрос. Но WinActivate("заголовок нужного окна", "") непомогает, почемуто окно нестановится активным, заголовок окна смотрел в AutoIt v3 Window Info в строке >>>>Window<<<<< Title. Может ещё как небуть можно сделать его активным ??? »

поробуй комманду, которая дает комманды даже неактивному окну:
Код:

ControlSend ( "title", "text", controlID, "string" [, flag] )

araneon 29-11-2008 11:45 967101

Незнаю печему оно нестановится активным, AutoIt Window Info показывает что заголовок "Setup - FOX*Video Converter" но выход из положения нашолся в таком виде ?Код?WinWait("Setup - FOX Video Converter","Setup has finished installing ")?ControlClick("Setup - FOX Video Converter","Setup has finished installing ","TNewCheckListBox1")

Babullika 29-11-2008 20:34 967544

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

Maza Faka 30-11-2008 08:20 967923

Babullika
Незнаю, как сработает с ADSL подключением, но с dialup работает:
Код:

While 1
    If Int(_RASConStat(4) / 1000 / 60) >= 60 Then
        $hRASConn = _RasEnumConnections()
        If Not @error Then _RasHangUp($hRASConn)
        Exit
    EndIf


    Sleep(1000)
WEnd

; #FUNCTION# ====================================================================================================================
; $iFlag:
; 1 - The number of bytes transmitted through this connection or link.
; 2 - The number of bytes received through this connection or link.
; 3 - Total
; 4 - The amount of time, in milliseconds, that the connection or link has been connected.

Func _RASConStat($sFlags = 1)
    Local $hRASConn = _RasEnumConnections()
    If @error Then Return SetError(1, 0, 0)

    $tRAS_STATS = DllStructCreate("dword dwSize;dword dwBytesXmited;dword dwBytesRcved;dword dwFramesXmited;" & _
                                  "dword dwFramesRcved;dword dwCrcErr;dword dwTimeoutErr;dword dwAlignmentErr;" & _
                                  "dword dwHardwareOverrunErr;dword dwFramingErr;dword dwBufferOverrunErr;" & _
                                  "dword dwCompressionRatioIn;dword dwCompressionRatioOut;dword dwBps;dword dwConnectDuration")

    DllStructSetData($tRAS_STATS, "dwSize", DllStructGetSize($tRAS_STATS))

    $aRet = DllCall("rasapi32.dll", "int", "RasGetConnectionStatistics", _
                                            "hwnd", $hRASConn, _
                                            "ptr", DllStructGetPtr($tRAS_STATS))
    If $aRet[0] Then Return SetError(2, 0, 0)

    Local $iResult = 0

    Switch $sFlags
        Case 1
            $iResult = DllStructGetData($tRAS_STATS, "dwBytesXmited")
        Case 2
            $iResult = DllStructGetData($tRAS_STATS, "dwBytesRcved")
        Case 3
            $iResult = DllStructGetData($tRAS_STATS, "dwBytesXmited") + DllStructGetData($tRAS_STATS, "dwBytesRcved")
        Case 4
            $iResult = DllStructGetData($tRAS_STATS, "dwConnectDuration")
    EndSwitch

    Return $iResult
EndFunc  ;==>_RASConStat

Func _RasEnumConnections()
    Local Const $MAX_PATH = 260
    Local Const $RAS_MaxDeviceType = 16
    Local Const $RAS_MaxEntryName = 256
    Local Const $RAS_MaxDeviceName = 128

    Local $tRASCONN, $iCntByte, $iCntConn, $aRet

    $tRASCONN = DllStructCreate("dword dwSize;hwnd hRasConn;char szEntryName[" & $RAS_MaxEntryName + 1 & "];" & _
                                "char szDeviceType[" & $RAS_MaxDeviceType + 1 & "];" & _
                                "char szDeviceName[" & $RAS_MaxDeviceName + 1 & "];" & _
                                "char szPhonebook[" & $MAX_PATH & "];" & _
                                "dword dwSubEntry;byte guidEntry[16];dword dwFlags;byte luid[8]")

    DllStructSetData($tRASCONN, "dwSize", DllStructGetSize($tRASCONN))

    $iCntByte = DllStructCreate("dword")
    $iCntConn = DllStructCreate("dword")

    DllStructSetData($iCntByte, 1, DllStructGetSize($tRASCONN))

    $aRet = DllCall("rasapi32.dll", "int", "RasEnumConnections", _
                                            "ptr", DllStructGetPtr($tRASCONN), _
                                            "ptr", DllStructGetPtr($iCntByte), _
                                            "ptr", DllStructGetPtr($iCntConn))

    If $aRet[0] Then Return SetError(1, $aRet[0], -1)
    If DllStructGetData($iCntConn, 1) < 1 Then Return SetError(2, 0, 0) ;Error: not opened connections

    Return DllStructGetData($tRASCONN, "hRasConn")
EndFunc  ;==>_RasEnumConnections

Func _RasHangUp($HRASCONN)
    $aRet = DllCall("Rasapi32.dll", "int", "RasHangUp", _
                                            "hwnd", $HRASCONN)
    Return $aRet[0]
EndFunc  ;==>_RasHangUp


CrazyNNM 30-11-2008 13:39 968077

почему-то не пашет у меня функция
_IEFormSubmit($oForm)
название кнопки я указал правльно, как в дебагере указано....

код

Код:

#include <IE.au3>
$sURL = "http://192.168.1.1/"
$oIE = _IECreate($sURL)
$oName = _IEGetObjByName($oIE, "username")
$oPass = _IEGetObjByName($oIE, "password")
$oForm = _IEFormGetObjByName($oIE, "login")
_IEFormElementSetValue($oName, "admin")
_IEFormElementSetValue($oPass, "admin")
_IEFormSubmit($oForm)


Creat0R 30-11-2008 14:13 968091

И опять вопрос по RegExp'сам :) (не уверен, но вроде это уже обсуждали)...

Пытаюсь сделать универсальную функцию для получения значения ком. строки:

Код:

If $CmdLine[0] = 0 Then $CmdLineRaw = '/Param=1 -File "C:\Program Files\Some App\File - Name.txt" /URL "http://google.com"'

MsgBox(64, "", _
    _GetCmdLine($CmdLineRaw, "/Param=") & @LF & _
    _GetCmdLine($CmdLineRaw, "/URL") & @LF & _
    _GetCmdLine($CmdLineRaw, "-File"))

Func _GetCmdLine($sCmdLine, $sArgument)
    If Not StringInStr($sCmdLine, $sArgument) Then Return SetError(1, 0, "")

    Local $sRetCmd = StringRegExpReplace($sCmdLine, '(?i).*' & $sArgument & '( |)("|)(.*?)("|)( /| -|$).*$', '\3')
    If $sRetCmd = $sCmdLine Then Return SetError(2, 0, "")

    Return StringStripWS($sRetCmd, 3)
EndFunc

Проблема в том, что если в значении параметра присутствует хоть один (потенциальный) разделитель ком строки (в нашем случае это - или /), то значение обрывается именно на нём, и возвращается уже не целиком. Как и видно на примере выше, в третьем значении (путь к файлу) нехватает «- Name.txt», причину я знаю, там происходит поиск по аргументу, затем поиск кавычки (если есть такова), затем поиск любой строки до... либо закрывающей кавычки, либо одного из разделителей параметров (/ или -), смотря что попадётся первым. Вот именно это мне и нужно исправить, чтобы разделитель определялся только после закрывающей кавычки (если она конечно присутствует, значение может быть и не в кавычках, это указывает юзер).

amel27 01-12-2008 08:22 968719

Creat0R
Цитата:

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

If $CmdLine[0] = 0 Then $CmdLineRaw = '/Param=1 ^File "C:\Program Files\Some App\File - Name.txt" /URL "http://google.com"'

MsgBox(64, "", _
    _GetCmdLine($CmdLineRaw, "/Param=") & @LF & _
    _GetCmdLine($CmdLineRaw, "/URL") & @LF & _
    _GetCmdLine($CmdLineRaw, "^File"))

Func _GetCmdLine($sCmdLine, $sArgument)
    If Not StringInStr($sCmdLine, $sArgument) Then Return SetError(1, 0, "")

    Local $sRegExp = '(?i)^.*?\Q'& $sArgument &'\E\s*(?:(?:"([^"]*)")|([^"\s]+)).*$'
    Local $sRetCmd = StringRegExpReplace($sCmdLine, $sRegExp, '\1\2')
    If $sRetCmd = $sCmdLine Then Return SetError(2, 0, "")

    Return StringStripWS($sRetCmd, 3)
EndFunc

З.Ы. Обрати внимание на теги \Q...\E, они блокируют спецсимволы на интервале выражения ;)

Creat0R 01-12-2008 12:21 968865

amel27,
Цитата:

Цитата amel27
этот вариант далек от идеала - имя параметра может оказаться частью значения другого параметра (в кавычках) »

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

Хотя есть проблема с путями без кавычек, они обрубаются на перевом пробеле :( - Нужно либо до кавычки, либо до разделителя (/ или -).


Цитата:

Цитата amel27
Обрати внимание на теги \Q...\E, они блокируют спецсимволы на интервале выражения »

Интересно, оно даже в справке есть, а мы (я?) раньше делали отдельную RegExp обработку для замены:

Код:

$String = "test [or] example ;)"
$String = StringRegExpReplace($String, '([][{}()|.?+*\\^])', '\\\1')

MsgBox(64, "", "Теперь все служебные символы могут обрабатываться как обычные ;) :" & @LF & @LF & $String)


Creat0R 01-12-2008 13:03 968906

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

Код:

If $CmdLine[0] = 0 Then $CmdLineRaw = '/Param="1" /File=C:\Program Files\Some App\File - Name.txt /URL="http://google.com"'

MsgBox(64, "", _
    _GetCmdLine($CmdLineRaw, "/Param=") & @LF & _
    _GetCmdLine($CmdLineRaw, "/URL=") & @LF & _
    _GetCmdLine($CmdLineRaw, "/File="))

Func _GetCmdLine($sCmdLine, $sArgument, $sCmd_Delim='/.*=')
    If Not StringInStr($sCmdLine, $sArgument) Then Return SetError(1, 0, "")

    Local $sRegExp = '(?i)^.*?\Q' & $sArgument & '\E\s*(?:(?:"([^"]*)")|([^"]+)' & $sCmd_Delim & ').*$'
    Local $sRetCmd = StringRegExpReplace($sCmdLine, $sRegExp, '\1\2')
    If $sRetCmd = $sCmdLine Then Return SetError(2, 0, "")

    Return StringStripWS($sRetCmd, 3)
EndFunc

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

P.S
$sCmd_Delim это и есть указатель на резделитель, т.е в одной строке могут быть только такие разделители: /Param=, или только такие: -Param=, или такие например: -Param:, но не смешанные (как я задумывал в начале).

amel27 01-12-2008 13:17 968925

Creat0R
Цитата:

Можешь показать на примерной строке? »
Код:

$CmdLineRaw = '/Param="/URL http://mail.ru" .File "C:\Program Files\Some App\File - Name.txt" /URL "http://google.com"'
Цитата:

есть проблема с путями без кавычек, они обрубаются на перевом пробеле »
AFAIK все программы используют пробелы для разделения параметров, либо кавычки для значений с пробелом... надо ли городить огород?
Цитата:

оно даже в справке есть
в справке есть, но там туманное описание и не все что в справке работает как написано

kronic 01-12-2008 20:29 969290

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

Creat0R 01-12-2008 22:49 969381

amel27,
Цитата:

Цитата amel27
AFAIK все программы используют пробелы для разделения параметров, либо кавычки для значений с пробелом »

Да, но из за этого юзеры (смышлённые, те которые указывают ком. строку :)) лишний раз спрашивают разные вопросы, мол почему "так" работает, а "так" нет. Хочется перестраховаться, a.k.a “Защита от дурака”.

Цитата:

Цитата amel27
надо ли городить огород?
Цитата: »

Желательно :)

kronic
Цитата:

Цитата kronic
как можно взять из файла символы и отправить их в активное окно как нажатие их на клавиатуре »


Цитата:

Цитата http://forum.ru-board.com/topic.cgi?forum=5&topic=17705&start=2420#21
Код:

$sChars = FileReadLine($sFile, 3) ;Считывает символы с третьей строки файла
Send($sChars)



amel27 02-12-2008 06:02 969533

Creat0R
Цитата:

раньше делали отдельную RegExp обработку для замены »
ну как минимум одну замену сделать придется :)
Код:

$sArgument  = "\Q"& StringReplace($sArgument,"\E","\E\\E\Q") &"\E"
Цитата:

Хочется перестраховаться »
по стандарту - строка парсится на CMD-параметры пробелами/кавычками, далее прога своими средствами сканирует массив CMD-параметров и решает что является параметром, что значением, что параметром со значением ("/A:F") а что является нарушением синтаксиса... тут ИМХО все как раз прозрачно

насколько я понял, ты хочешь заменить стандартные спецсимволы кавычки и пробела на свои - символы начала/конца блока параметра ("/-"), внутри которого имя параметра от его значения разделяется другими спецсимволами ("=: "), не будет ли это сменой "шила на мыло" ;) - указанные спецсимволы уже нельзя будет просто так указывать в значении параметров... например, придется брать в кавычки (вместо пробелов) ... заметь, что при этом пробел теряет свой статус и значение может включать несколько строк с экранирующими кавычками, т.е. обработку концевых символов придется проводить отдельно
Код:

If $CmdLine[0] = 0 Then $CmdLineRaw = '/Param=1 /Fil\e "C:\Program Files\Some App\File" - "Name.txt" /URL:"http://google.com"'

MsgBox(64, "", _
    _GetCmdLine($CmdLineRaw, "Param") & @LF & _
    _GetCmdLine($CmdLineRaw, "URL") & @LF & _
    _GetCmdLine($CmdLineRaw, "Fil\e"))

Func _GetCmdLine($sCmdLine, $sArgument, $sParPrefix="/", $sValPrefix="=: ")
    ; Экранируем спецсимволы
    $sParPrefix = StringRegExpReplace($sParPrefix, "[-^\]", "\\1")
    $sValPrefix = StringRegExpReplace($sValPrefix, "[-^\]", "\\1")
    $sArgument  = "\Q"& StringReplace($sArgument,"\E","\E\\E\Q") &"\E"

        #Region Построение регулярного выражения
    Local $ExpandVarStrings = Opt("ExpandVarStrings", 1)

    Local $sParClassIn = '[$sParPrefix$]'  ; класс начала имени параметра
    Local $sValClassIn = '[$sValPrefix$]'  ; класс конца имени/начала значения
    Local $sAllClassEx = '[^$sParPrefix$"]' ; класс обычных символов

    Local $sRegExp = '(?i)^.*?$sParClassIn$$sArgument$(?:$sValClassIn$+((?:"[^"]*"|$sAllClassEx$+)+))?.*$'
    ConsoleWrite($sRegExp &@CRLF)

    Opt("ExpandVarStrings", $ExpandVarStrings)
    #EndRegion

    Local $sRetCmd = StringRegExpReplace($sCmdLine, $sRegExp, '\1')
    If @extended Then Return $sRetCmd
    Return SetError(1, 0, "NOT FOUND")
EndFunc


Creat0R 02-12-2008 10:14 969641

Цитата:

Цитата amel27
по стандарту - строка парсится на CMD-параметры пробелами/кавычками, далее прога своими средствами сканирует массив CMD-параметров и решает что является параметром, что значением, что параметром со значением ("/A:F") а что является нарушением синтаксиса... тут ИМХО все как раз прозрачно »

В том то и дело, что не все придерживаются стандартам. Например, в браузере Opera последних версии, параметры ком. строки (там можно запускать внешние приложения с меню) передаются немного криво. Кавычками обрамляются не только параметры с заглавной буквы (это типа стандарт самого браузера, %U будет в кавычках, а %u уже нет), но и вся ком. строка, т.е на выходе получается что-то типа "/Param="http://..." "some value"". Вобщем не всегда предсказуемый результат имеется, и, кроме того что от версии к версии это по разному, так ещё хотелось иметь универсальный вариант для других случаев, чтобы не нужно было переделывать функцию для каждой задачи отдельно (что я и делал до сих пор).

Цитата:

насколько я понял, ты хочешь заменить стандартные спецсимволы кавычки и пробела на свои
Не уверен что понял, но что я хочу сделать я описал в последнем посте на эту тему:

Цитата:

Цитата Creat0R
В принципе, можно было бы указать постоянный разделитель, но он должен быть опционально задан в параметре. Т.е вся строка может содержать параметры только одного характера »

....
Цитата:

Цитата Creat0R
Стоит только убрать кавычки у одного из значении, и возвращается неверное значение. Нужно чтобы при данном раскладе, возвращались все значения вне зависимости от присутствия кавычек у них. »

Осталось только доработать мой код в том посте.

P.S
Спасибо за пример, но там тоже есть проблемы, например если убрать кавычки у /URL, то возвращается только «http:». Также парамтеры должны разделяться не одним префиксом, а ещё и пробелом в начале, т.е чтобы значение считалось до того момента, пока не обнаружен пробел с префиксом (где «/Param1=Val1/Param2=Val2» уже неверная строка, тут значением считается Val1/Param2=Val2, вот если бы после Val1 был пробел, тогда второй параметр не входил в значение :wacko: ).

amel27 02-12-2008 12:50 969789

Creat0R
Цитата:

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

Цитата:

парамтеры должны разделяться не одним префиксом, а ещё и пробелом в начале, т.е чтобы значение считалось до того момента, пока не обнаружен пробел с префиксом »
хорошо, вот еще вариант реализации, но стоит заменить "-" на "/" чтобы выражение перестало работать, так как одного пробела с префиксом недостаточно для идентификации ожидаемого параметра:
Код:

If $CmdLine[0] = 0 Then $CmdLineRaw = '/Param=12 /XXX /Fil\e "C:\Program Files\Some App\File" - "Name.txt" /URL:"http://google.com"'

MsgBox(64, "", _
    "Param: "&@TAB& _GetCmdLine($CmdLineRaw, "Param") & @LF & _
    "XXX: "  &@TAB& _GetCmdLine($CmdLineRaw, "XXX") & @LF & _
    "YYY: "  &@TAB& _GetCmdLine($CmdLineRaw, "YYY") & @LF & _
    "URL: "  &@TAB& _GetCmdLine($CmdLineRaw, "URL") & @LF & _
    "Fil\e: "&@TAB& _GetCmdLine($CmdLineRaw, "Fil\e"))

Func _GetCmdLine($sCmdLine, $sArgument, $sParPrefix="/", $sValPrefix="=:")
    $sPar = StringRegExpReplace ($sParPrefix, "[-^\]", "\\1")
    $sVal = StringRegExpReplace ($sValPrefix, "[-^\]", "\\1")
    $sArg  = "\Q"& StringReplace($sArgument,"\E","\E\\E\Q") &"\E"

    Local $sRegExp = '(?i)^(?:|.*?\s)['&$sPar&']'&$sArg&'['&$sVal&' ]+(?:$|['&$sPar&']|((?:"[^"]*"|[^"])+?)(?:$|\s['&$sPar&'])).*'
    ConsoleWrite($sRegExp &@CRLF)
    Local $sRetCmd = StringRegExpReplace($sCmdLine, $sRegExp, '\1')

    If @extended Then Return $sRetCmd
    Return SetError(1, 0, "NOT FOUND")
EndFunc


Creat0R 02-12-2008 13:40 969881

amel27,
Цитата:

Цитата amel27
вот еще вариант реализации »

Почти(!) идеален!

Цитата:

Цитата amel27
но стоит заменить "-" на "/" чтобы выражение перестало работать, так как одного пробела с префиксом недостаточно для идентификации ожидаемого параметра »

Странно, а чем отличается "-" от "/" ? А что если придерживаться условию, что все параметры будут иметь какой-то один разделитель?

Пример:

Код:

If $CmdLine[0] = 0 Then $CmdLineRaw = '-Param=1 -XXX=xVal -File=C:\Program Files\Some App\File - Name.txt -URL=http://google.com'

MsgBox(64, "", _
    "Param: " & @TAB & _GetCmdLine($CmdLineRaw, "Param") & @LF & _
    "XXX: "  & @TAB & _GetCmdLine($CmdLineRaw, "XXX") & @LF & _
    "YYY: "  & @TAB & _GetCmdLine($CmdLineRaw, "YYY") & @LF & _
    "URL: "  & @TAB & _GetCmdLine($CmdLineRaw, "URL") & @LF & _
    "File: " & @TAB & _GetCmdLine($CmdLineRaw, "File"))

$sParPrefix при этом равен "-". Но опять же, имя файл в таком случае обрубается :(

P.S
Теперь что получается, нужно почти при каждом использовании RegExp, применять метод отмены спец. символов (\Q...\E)?

kronic 02-12-2008 22:16 970506

Creat0R,
Спасибо на руборде мне и ответили

amel27 03-12-2008 03:53 970676

Creat0R
Цитата:

Странно, а чем отличается "-" от "/" ? »
упс, в скрипте была ошибка - в строках экранирования спецсимволов :blush2:
Цитата:

А что если придерживаться условию, что все параметры будут иметь какой-то один разделитель? »
на коде это не отразится, хотя надежности прибавит - в параметре нужно передать только один символ
Цитата:

Цитата Creat0R
$sParPrefix при этом равен "-". Но опять же, имя файл в таком случае обрубается »

изменил поиск следующего параметра по комбинации "пробел+префикс+символ"... НО если "-" будет без следующего пробела, то текст опять "обрубится" - в этом случае слово после "-" будет абсолютно неотличимо от параметра, единственный выход - брать этот текст в кавычки, заметь - это ограничение заложено тобой в постановку задачи ;)
Цитата:

Цитата Creat0R
Теперь что получается, нужно почти при каждом использовании RegExp, применять метод отмены спец. символов (\Q...\E)? »

это я для примера, в твоем случае это лишнее (в имени параметра спецсимволов "\" не бывает), \Q...\E можно тоже убрать
Код:

If $CmdLine[0] = 0 Then $CmdLineRaw = '-Param=1 -XXX -File=C:\Program Files\Some App\File - Name.txt -URL=http://google.com'

MsgBox(64, "", _
    "Param: "& @TAB & _GetCmdLine($CmdLineRaw, "Param","-","=") & @LF & _
    "XXX: "  & @TAB & _GetCmdLine($CmdLineRaw, "XXX",  "-","=") & @LF & _
    "YYY: "  & @TAB & _GetCmdLine($CmdLineRaw, "YYY",  "-","=") & @LF & _
    "URL: "  & @TAB & _GetCmdLine($CmdLineRaw, "URL",  "-","=") & @LF & _
    "File: " & @TAB & _GetCmdLine($CmdLineRaw, "File", "-","="))

Func _GetCmdLine($sCmdLine, $sArg, $sPar="/", $sVal="=:")
    $sPar = "["& StringRegExpReplace ($sPar, "([-^\\])", "\\\1") & "]"
    $sVal = "["& StringRegExpReplace ($sVal, "([-^\\])", "\\\1") &" ]"
    $sArg  = "\Q"& $sArg &"\E"

    Local $sRegExp = '(?i)^(?:|.*?\s)'&$sPar&$sArg&$sVal&'+(?:$|'&$sPar&'|((?:"[^"]*"|[^"])+?)(?:$|\s'&$sPar&'\w)).*'
    Local $sRetCmd = StringRegExpReplace($sCmdLine, $sRegExp, '\1')

    If @extended Then Return $sRetCmd
    Return SetError(1, 0, "=NOT FOUND=")
EndFunc


Babullika 03-12-2008 11:59 970962

здраствуйте
подскажите как через autoit получить мак адресс

amel27 03-12-2008 12:14 970979

Цитата:

Цитата Babullika
как через autoit получить мак адресс »

уже было: http://forum.oszone.net/post-728888-69.html

Babullika 03-12-2008 12:38 971008

В том коде у меня вылетает ошибка error : Variable must be of type 'object'
И гетмак.ехе тж почемуто выдает ошибку (
Мне необходимо присвоить $mac = адрес
Есть еще какие-нибудь алтернативные варианты ?

amel27 03-12-2008 12:48 971023

Цитата:

Цитата Babullika
Мне необходимо присвоить $mac = адрес »

Код:

$arr = _NetAdapterGetProp()
$mac = $arr[0][2]

MsgBox(0, "MAC адрес", $mac)


morres 04-12-2008 15:10 972202

Есть такая хрень для обновления антивирусных баз Symantec - называется SARC Intelligent Updater, друзья, помогите сделать AutoIt скрипт для этого "чуда" ...
Я сам пытался, но последнее окно (уже после обновления баз) никак не удается отловить и нажать там кнопочку "ОК", а это ооочень нужно!
Спасибо!

DobroeZlo 04-12-2008 18:26 972423

Всем привет. Как получить имя функции из которой вызывается команда

Creat0R 05-12-2008 01:32 972797

amel27,
Цитата:

Цитата amel27
изменил поиск следующего параметра по комбинации "пробел+префикс+символ" »

Супер, так вроде работает как и задумывалось :up .




morres, DobroeZlo,
Неужели вы серъёзно ожидаете получить помощь на основе того что вы запостили? Этого явно недостаточно для задачи.

DobroeZlo 05-12-2008 09:37 972943

Creat0R,
Я имею в ввиду следующее:
есть например функция

Func Some()
.......
MsgBox(0, "FuncName", "здесь должно быть имя функции Some")
EndFunc

Есть какая нибудь функция для определения имени ?
Спасибо!

D_Master 05-12-2008 12:01 973033

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

AutoItSetOption("TrayIconHide", 0)
AutoItSetOption("TrayIconDebug", 0)

Всё равно иконка показывается... :(

Maza Faka 05-12-2008 12:29 973054

D_Master
Код:

#NoTrayIcon

CrazyNNM 05-12-2008 12:55 973069

опять обращусь с тем же вопросом:

почему-то не пашет у меня функция
_IEFormSubmit($oForm)
название кнопки я указал правльно, как в дебагере указано....
зато при посылке "Enter", подтверждение происходит.....
че я не так делаю??
код

Код:

#include <IE.au3>
$sURL = "http://192.168.1.1/"
$oIE = _IECreate($sURL)
$oName = _IEGetObjByName($oIE, "username")
$oPass = _IEGetObjByName($oIE, "password")
$oForm = _IEFormGetObjByName($oIE, "login")
_IEFormElementSetValue($oName, "admin")
_IEFormElementSetValue($oPass, "admin")
_IEFormSubmit($oForm)

выдает ошибку на форм сабмит

--> IE.au3 V2.4-0 Warning from function _IEFormGetObjByName, $_IEStatus_NoMatch
--> IE.au3 V2.4-0 Error from function _IEFormSubmit, $_IEStatus_InvalidDataType
видимо, просто не может найти имя


еще вопрос, как мона нажать кнопку в окне ие, если нет имени?.....
во че выдает дебагер

<INPUT onclick="gotolocation('connection0')" type=image src="../html/images/connection1.jpg" target="_self">

и все....

Creat0R 05-12-2008 12:58 973075

DobroeZlo,
Цитата:

Есть какая нибудь функция для определения имени ?
Нет.

P.S
Уже не помню для чего, но мне как то тоже подобное нужно было, единственное что пришло на ум, так это пропарсить весь скрипт другим, внешним скриптом, добавив в начало скрипта глобальную переменную (к примеру $sCurrent_FuncName), и в начало каждой функции присвоить этой переменной значение имени функции. Но вопрос в том, насколько оно нужно?

morres 05-12-2008 14:42 973179

Цитата:

Цитата Creat0R
Неужели вы серъёзно ожидаете получить помощь на основе того что вы запостили? »

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

Run("\\srv\soft\Symantec\updat32.exe")
WinWait("SARC Intelligent Updater","&Да")
WinActivate("SARC Intelligent Updater","&Да")
If WinActive("SARC Intelligent Updater","&Да") Then
        ControlClick("SARC Intelligent Updater","&Да","[ID:6]")
EndIf
WinWait("SARC Intelligent Updater","OK")
WinActivate("SARC Intelligent Updater","OK")
If WinActive("SARC Intelligent Updater","OK") Then
        ControlClick("SARC Intelligent Updater","ОК","[ID:2]")
EndIf
Exit

SARC Intellegent Updater, собственно, можно скачать с сайта Symantec! Меня интересует версия под Symantec AntiVirus 10.2 Corporate Edition Client.

Глюк начинается на строке WinWait("SARC Intelligent Updater","OK") т.к. это окно просто не удается отловить, пробовал поразному, но моих познаний в AutoIt, видимо, недостаточно...

Creat0R 05-12-2008 15:05 973191

morres,
Цитата:

Цитата morres
Не очень понял чего именно недостаточно, ну если хотите подробностей, то пожалуйста... »

Всегда нужны подробности, читать мысли (через интернет тем более) ещё никто не научился.

Цитата:

Цитата morres
Не размещал тут свой код, чтобы не забивать голову тому, кто попробует »

Попробует что? нет логики в этом, наоборот, нужно разместиь тестовый скрипт чтобы можно было что-то попробовать ;)

Цитата:

Цитата morres
Глюк начинается на строке WinWait("SARC Intelligent Updater","OK") т.к. это окно просто не удается отловить »

Что имеется в виду под «Отловить»? Скрипт останавливается на этой строчке, или проходит дальше не замечая окна (не нажимая кнопки)?
Если второе, то видимо проблема в том, что окно создаётся немного раньше, но оно просто скрыто, тут можно попробовать ждать видимости окна:

Код:

_WinWaitVisible("SARC Intelligent Updater", "OK")

Func _WinWaitVisible($sTitle, $sText, $iTime=0)
    Local $iTimer = -1
    If $iTime > 0 Then $iTimer = TimerInit()

    While Not BitAND(WinGetState($sTitle, $sText), 2)
        Sleep(10)
        If $iTime > 0 And (TimerDiff($iTimer) / 1000) >= $iTime Then ExitLoop
    WEnd

    Return
Number(BitAND(WinGetState($sTitle, $sText), 2) = 2)
EndFunc


Creat0R 05-12-2008 15:39 973224

Новая версия утилиты Au3ToPost 1.8!
(Архив включает откомпилированную версию).

Список изменении:

Цитата:

v1.8 [05.12.2008]
+ Добавлено распознавание стиля <t_2> - стиль отвечающий за блочный комментарии (#CS...#CE).
+ Добавлено распознавание стиля <t_13> - стиль отвечающий за т.н аббревиатуры, например при вводе cw.
+ Добавлена поддержка преобразования выделенной части кода.
+ Добавлена опция предпросмотра результата.
+ Добавлена опция "Поверх всех окон" в главном меню.

* Опять предотвращена высокая загрузка ЦП, на этот раз загрузка была при снятой птичке "Ввести код вручную".
* Теперь при выборе обрабатываемого файла будет осуществляться проверка на его существование :)
* Переделан метод использования горячих клавиш (меньше нагрузки на главный цикл).
* Также теперь проверка на ввод данных (путь к файлу обработки и поле с кодом) производится вне цикла (WM_COMMAND).
* Теперь путь к SciTE в первую очередь определяется относительно папке AutoIt.
* Изменён принцип работы быстрого режима. По нажатию на со-вующий пункт меню главное окно прячется в трей, и программа работает в тихом режиме (обработка либо по хоткей CTRL + SHIFT + A, либо из пункта меню иконки в трее.
* Исправлена потенциальная ошибка при интеграции в SciTE - путь к папке AutoIt неверный если скрипт откомпилирован.
* Поправки в отображений некоторых элементов интерфейса.
* Код немного переписан в соответствии с последней версией AutoIt (3.2.12.1). Для совместимости с более старыми версиями раскомментируйте строчки начинающиеся с ";~ ...".
* Размеры GUI теперь ограничены.
* орфографические поправки (в коде и в Readme файле).
* Косметические поправки в коде.

CrazyNNM 05-12-2008 21:30 973511

morres,

Цитата:

Глюк начинается на строке WinWait("SARC Intelligent Updater","OK") т.к. это окно просто не удается отловить, пробовал поразному, но моих познаний в AutoIt, видимо, недостаточно...
попробуй WinWaitActive("SARC Intelligent Updater","OK"
эта функция подождет пока окно будет активным))

еще есть sleep
поставь 1-2 сек между WinWait и ControlClick

PS: думаю, твой код сильно перегружен лишним
например, не вижу смысла в WinActivate

PPS: попробуй так завершить обновление:
Код:

WinWait("SARC Intelligent Updater","OK")
ControlClick("SARC Intelligent Updater","ОК","[ID:2]")  ; не обязательное
if ProcessExists ("Имя Процесса") Then
    sleep (500)
    ControlClick("SARC Intelligent Updater","ОК","[ID:2]")
Else
    Exit

PPPS: есть приятная фича, Send ("{Enter}")
можешь в мой пример поставить вместо ControlClick
должно пахать:)

amel27 06-12-2008 07:12 973720

morres
Цитата:

ну если хотите подробностей, то пожалуйста »
вот это другое дело :) итак, по порядку:

- окна "&Да" и "ОК" отличаются не только текстом, но и заголовком (там два пробела, а не один);
- нелогично активировать окно для ControlClick (это обычно практикуют для Send);
- ControlClick срабатывает не всегда (?), но можно поставить проверочный цикл:
Код:

Run("\\srv\soft\Symantec\updat32.exe")

WinWait("SARC Intelligent Updater","&Да")
While WinExists("SARC Intelligent Updater","&Да")
    Sleep(200)
    ControlClick("SARC Intelligent Updater","&Да","Button1")
WEnd

WinWait("SARC  Intelligent Updater","ОК")
While WinExists("SARC  Intelligent Updater","ОК")
    Sleep(200)
    ControlClick("SARC  Intelligent Updater","ОК","Button1")
WEnd


CrazyNNM 07-12-2008 01:16 974229

Цитата:

Цитата amel27
- ControlClick срабатывает не всегда (?), но можно поставить проверочный цикл: »

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

Lodoss 08-12-2008 05:58 975124

Появилась идея автоматизировать на работе рутину с почтой. Хотелось бы узнать слаткивался ли кто нибудь с такой проблемой и решал ли её при помощи AutoIt:

Задача - проверить почту Microsoft Office Outlook и извлечь вложеные файлы (txt) в папку, причем текстовые файлы иногда имеют одинаковое название но отличаются по содержимому, соответсвенно из файла извечь определенную строку и создать папку с названием этой строки.

Подскажите в какую сторону копать?

morres 08-12-2008 09:35 975191

Цитата:

Цитата amel27
...отличаются не только текстом, но и заголовком (там два пробела, а не один); »

Точно! Спасибо огромное! Опять моя не внимательность...
Цитата:

Цитата Creat0R
Скрипт останавливается на этой строчке, или проходит дальше не замечая окна (не нажимая кнопки)? »

Да, скрипт останавливался на этой сторчке...
Цитата:

Цитата CrazyNNM
попробуй WinWaitActive("SARC Intelligent Updater","OK"
эта функция подождет пока окно будет активным)) »

Да, это я всё пробовал, уж что-что, а Help я честно читал :closed-to :)
Цитата:

Цитата CrazyNNM
PS: думаю, твой код сильно перегружен лишним
например, не вижу смысла в WinActivate »

Ну, перегружен он в последней редакции, я ж говорю пробовал по разному...
Друзья, огромное спасибо!

amel27 08-12-2008 12:32 975395

Lodoss
Цитата:

Цитата Lodoss
Подскажите в какую сторону копать? »

Работа с электронной почтой из скрипта, а также поиск по оффсайту,
примеры: Outlook, Read the Inbox, Outlook ... accessing the body of emails sent as attachments

minutka15 09-12-2008 13:15 976295

Привет всем.
Нужно чтобы скрипт AutoIt открыл "Язык и региональные стандарты".
Kакой командой нужно воспользоваться? может кто сталкивался с подобным явлением?

Creat0R 09-12-2008 13:26 976300

minutka15,
Цитата:

Цитата minutka15
Нужно чтобы скрипт AutoIt открыл "Язык и региональные стандарты". »

Так можно:

Код:

Run(@ComSpec & " /c Start Intl.cpl", @SystemDir, @SW_HIDE)

minutka15 09-12-2008 17:46 976550

Creat0R,
Спасибо! Отличный ответ. А я голову ломал, прописывал все что угодно кроме этого!

Lodoss 10-12-2008 07:30 977038

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

Maza Faka 10-12-2008 08:23 977055

Цитата:

Цитата Lodoss
из текстового файла взять его содержимое с пробелами и переносами и вставить в Word »

Можно так:
Код:

#include <Word.au3>

$sFileTxt = @ScriptDir & "\Test.txt"
$sFileDoc = @ScriptDir & "\Test.doc"

$sRead = FileRead($sFileTxt)

$oWordApp = _WordCreate(@ScriptDir & "\Test.doc", 0, 0)

$oDoc = _WordDocGetCollection($oWordApp, 0)
$oDoc.Range.InsertAfter($sRead)

_WordDocSave($oDoc)
_WordQuit($oWordApp)


Lodoss 10-12-2008 11:04 977158

Чем дальше в лес тем больше дров, совсем запутался с такой задачей, есть строка в текстовом файле из которой нужно вырезать одно слово. Подскажите как это сделать ? Пытаюсь мудрить с функцией StringLeft и StringMid но нему понять. Help !!! :(

Maza Faka 10-12-2008 13:22 977299

Цитата:

Цитата Lodoss
есть строка в текстовом файле из которой нужно вырезать одно слово »

StringReplace()

Frost_Imp 10-12-2008 17:57 977655

Цитата:

Цитата Sylver Dragon
Цитата Frost_Imp:
Да в том то и дело, что не хочется его разворачивать. При развернутом окне и SEND замечательно работает »
Дело в том, что если окно неактивно - далеко не факт, что оно среагирует. Например, в моём случае высылка работает, но игра реагирует только после разворачивания (получения фокуса). »

Доброго всем времени суток!
Опять возвращаюсь к своей проблеме - отправке в НЕактивное окно с игрой команды о нажатии клавиши. Единственный разумный вариант:
ControlSend("GameName", "", "", "{F1}")
не работает... Неужели совсем пропащее дело?

Dump 11-12-2008 10:18 978147

Помогите плиз в написании скрипта. Приветствуется скрипт именно на AutoIT, так как там можно всё в exe файл засунуть, и не светить пароли.

Алгоритм примерно такой!
1 скрипт:
Проверить наличие новых файлов на FTP(с использованием определённой учётки) сравнивая с c:\update
Если обновлений нет - закончить работу!
Если обновления есть скопировать их в c:\update и удалить старые файлы.
Файлы имеют вид lpt$vpn.* расширение меняется с каждым новым файлом :(

2 скрипт:
Проверить доступность сетевого ресурса \\ip\update (с использованием определённой учётки)
Если ресурс не доступен перейти к проверке следующего ресурса
если ресурс доступен скопировать файлы из c:\update в \\ip\update
перейти к проверке следующего сетевого ресурса
Проверить доступность сетевого ресурса \\ip1\update (с использованием определённой учётки)
Если ресурс не доступен перейти к проверке следующего ресурса
если ресурс доступен скопировать файлы из c:\update в \\ip1\update
и т.д.
Закончить работу!

Всё это дело логировать!

Maza Faka 11-12-2008 11:29 978199

Dump
Обсуждалось неоднократно. Ищи в теме по слову FTP

Evgeniy_Spartak 13-12-2008 18:33 980259

Подскажите пожалуйста как при автоматической установки программ в файле RunOnceEx сделать паузы между командами. Приведу пример. Допустим у меня в файле RunOnceEx что то типа этого:
REG ADD %KEY%\%i% /VE /D "Winrar" /f
REG ADD %KEY%\%i% /V 1 /D "%systemdrive%\install\winrar\win.exe /(ключ)"
SET /A i+=1

REG ADD %KEY%\%i% /VE /D "MFramework 2.0" /f
REG ADD %KEY%\%i% /V 1 /D "%systemdrive%\install\frame\install.exe /(ключ)"
SET /A i+=1
EXIT
В этом случае будет все нормально. Сначала поставится Винрар, потом Framework.
А если у меня первая команда будет ссылаться не на файл *.exe, а на*.cmd, который уже немного погодя запустит *.exe файл. Но при этом уже запустится установка второй программы, в данном пример Framework.
И если Винрар и Framework использовали один инсталятор, то видимо возник бы конфликт.
Поэтому я хочу делать паузу между этими командами на n-ное количество секунд.

На сайте oszone читал примерно про следующую команду: ping -n * 127.0.0.1 > nul, где * количество секунд. Может она и не должна работать в RunOnceEx, но тем не менее я попробЫвал.)) Не заработало.
Еще читал про ключ /sms, но он мне неподходит для моего инсталятора. Мои программы используют WinInstaller.
Кто знает подскажите как сделать паузу между командами в RunOnceEx...

ganselo 13-12-2008 21:26 980350

Подскажите пожалуйста как скрыть ранее созданный элемент с формы (т.е я создал например какой нибуть Edit на форме, мне нужно по нажатию определённого Buttona скрыть этот объект (Edit например) с формы). На C++ Builder'e это выглядит так: Edit1->Vidible = false;, как осуществить аналогичное на Auto IT?

Creat0R 13-12-2008 22:43 980393

Evgeniy_Spartak,
Цитата:

Цитата Evgeniy_Spartak
как при автоматической установки программ в файле RunOnceEx сделать паузы между командами »

Пауза в AutoIt'е делается с помощью Sleep(1000) -> тут 1000 это секунда.

ganselo,
Цитата:

Цитата ganselo
как скрыть ранее созданный элемент с формы (т.е я создал например какой нибуть Edit на форме, мне нужно по нажатию определённого Buttona скрыть этот объект »

Можно так:

Код:

#include <GuiConstants.au3>

$GUI = GUICreate("Toggle Edit visibility", 300, 200)

$Edit = GUICtrlCreateEdit("", 20, 10, 260, 120)

$HideShowEdit_Button = GUICtrlCreateButton("Hide Edit", 20, 160, 70, 20)

GUISetState(@SW_SHOW, $GUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$HideShowEdit_Button
            If BitAND(GUICtrlGetState($Edit), $GUI_HIDE) Then
                GUICtrlSetState($Edit, $GUI_SHOW)
                GUICtrlSetData($HideShowEdit_Button, "Hide Edit")
            Else
                GUICtrlSetState($Edit, $GUI_HIDE)
                GUICtrlSetData($HideShowEdit_Button, "Show Edit")
            EndIf
    EndSwitch
WEnd


ganselo 14-12-2008 00:21 980461

Цитата:

Цитата Creat0R
Можно так: »

Спасибо большое.

Ещё вопрос. Как в процессе выполнения программы изменять размеры формы (т.е при нажатии Button'a размеры формы должны увеличиватся/уменьшатся)?

Creat0R 14-12-2008 00:44 980466

ganselo,
Цитата:

Цитата ganselo
Как в процессе выполнения программы изменять размеры формы »

Размеры GUI? см. WinMove(), а если размеры элементов то см. GUICtrlSetPos() или ControlMove().

ganselo 14-12-2008 00:47 980469

Цитата:

Цитата Creat0R
Размеры GUI? см. WinMove(), а если размеры элементов то см. GUICtrlSetPos() или ControlMove(). »

Размер именно самого окна. спс попробую

Creat0R 14-12-2008 01:12 980480

ganselo

Пример:

Код:

#include <GuiConstants.au3>

$GUI = GUICreate("Resize GUI", 300, 200)

$ResizeGUI_Button = GUICtrlCreateButton("Resize", 20, 40, 70, 20)
GUICtrlSetResizing(-1, $GUI_DOCKALL)

GUISetState(@SW_SHOW, $GUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$ResizeGUI_Button
            Local $aGUI_Pos = WinGetPos($GUI)

            ;Увеличиваем размер GUI на 5 единиц с каждой стороны (в высоту и в ширену)
            WinMove($GUI, "", $aGUI_Pos[0], $aGUI_Pos[1], $aGUI_Pos[2] + 5, $aGUI_Pos[3] + 5)
    EndSwitch
WEnd


Maza Faka 14-12-2008 07:39 980521

Цитата:

Цитата Evgeniy_Spartak
как при автоматической установки программ в файле RunOnceEx сделать паузы между командами »

IMHO - вариант с паузой ненадёжен, кто знает сколько времени понадобится CMD-файлу на запуск?
Лучше доверить это дело самому CMD-файлу:
Код:

Start /WAIT "" "%systemdrive%\install\winrar\win.exe" /(ключ)
В этом случае CMD-файл дождётся завершения работы программы и только потом завершиться сам, а файл RunOnceEx в свою очередь будет ждать завершения работы CMD-файла :)

morgan1991 15-12-2008 01:41 981126

А вот у меня такой вопросик, может ли автоит каким нибудь способом заблокировать пользователю доступ к файлу?
Можно с подключением библиотек только можно попонятней если с библиотеками?

Creat0R 15-12-2008 01:49 981128

morgan1991,
Цитата:

Цитата morgan1991
может ли автоит каким нибудь способом заблокировать пользователю доступ к файлу? »

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

amel27 15-12-2008 11:27 981360

Цитата:

Цитата morgan1991
может ли автоит каким нибудь способом заблокировать пользователю доступ к файлу? »

какому пользователю и к какому файлу?.. нужен пример или описание сути проблемы
Цитата:

Цитата Creat0R
Первое (и единственное ) что приходит на ум »

мне первой пришла в голову установка NTFS-прав на файл через CACLS

Creat0R 15-12-2008 11:49 981385

Цитата:

Цитата amel27
мне первой пришла в голову установка NTFS-прав на файл через CACLS »

А оно не требует NTFS системы?

Maza Faka 15-12-2008 12:38 981427

Цитата:

Цитата Creat0R
А оно не требует NTFS системы? »

Хм... как ты себе представляешь разграничение прав на FAT? :)

Creat0R 15-12-2008 13:00 981446

Цитата:

Цитата Maza Faka
как ты себе представляешь разграничение прав на FAT? »

Да вообще то никак, поэтому и спрашиваю. Мне никогда не приходилось ограничивать какие либо права для юзера :) Ну тогда как на Fat заблокировать? только озвученным мной ранее методом? :biggrin:

Maza Faka 15-12-2008 13:44 981480

Цитата:

Цитата Creat0R
Ну тогда как на Fat заблокировать? »

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

morgan1991 15-12-2008 14:52 981537

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

Maza Faka 15-12-2008 16:19 981599

Цитата:

Цитата morgan1991
Вообщем хочется сделать чтобы независимо какой файл можно было заблокировать »

Примитивный вариант:
Код:

$sFile = FileOpenDialog("Select a file", "", "All files (*.*)")
If @error Then Exit

Global
$sPass = InputBox("File security", "Please set a password", "", "*")
If @error Then Exit

Global
$hFile = _CreateFile($sFile)
If $hFile = -1 Then Exit MsgBox(16, "Error", "Unable to open file")

HotKeySet("^d", "_Decrypt") ;Ctrl + d

While 1
    Sleep(100)
WEnd

Func
_CreateFile($sFile)
    Local Const $GENERIC_READ  = 0x80000000
    Local Const $GENERIC_WRITE = 0x40000000
    Local Const $OPEN_EXISTING = 3

    $sFile = "\\.\" & $sFile

    Local $aRet = DllCall("kernel32.dll", "hwnd", "CreateFile", _
                                          "str", $sFile, _
                                          "int", BitOR($GENERIC_READ, $GENERIC_WRITE), _
                                          "int", 0, _
                                          "ptr", 0, _
                                          "int", $OPEN_EXISTING, _
                                          "int", 0, _
                                          "int", 0)
    Return $aRet[0]
EndFunc  ;==>_CreateFile

Func _Decrypt()
    Local $sCurPass = InputBox("File security", "Please enter a password", "", "*")
    If @error Then Return 0

    If $sCurPass == $sPass Then
        DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
        MsgBox(64, "Success", "File decrypted")
        Exit
    Else
        MsgBox(16, "Error", "Access denied")
    EndIf
EndFunc  ;==>_Decrypt

Тестировалось на:
WinXP SP3 FS:NTFS

Creat0R 15-12-2008 16:25 981602

А вот вариант куда более примитивный (для Fat):

Код:

HotKeySet("{ESC}", "Quit")

;Global $sBlock_Password = "Pass"

Global $sBlockFiles_List = "C:\Temp\Readme.txt|C:\Temp\Web.doc|C:\Temp\DXSETUP.exe"
Global $aBlockFiles_List = StringSplit($sBlockFiles_List, "|")

While 1
    Sleep(1000)

    $aProcess_Info = _ProcessesGetInfo()

    For $i = 1 To UBound($aProcess_Info)-1
        For $j = 1 To $aBlockFiles_List[0]
            If StringInStr($aProcess_Info[$i][1], $aBlockFiles_List[$j]) Or $aProcess_Info[$i][7] = $aBlockFiles_List[$j] Then
                _BlockFile_Proc($aBlockFiles_List[$j], $aProcess_Info[$i][26])
                ExitLoop
            EndIf
        Next
    Next
WEnd

Func
_BlockFile_Proc($sFile, $iProc)
    ;_ProcessSuspendSwitch($iProc, True)

    Local $hBlockedFile_Win = _ProcessGetWindow($iProc)

;~  Local $s_Password = InputBox(StringFormat("File Blocked (%s) - Attention!", StringRegExpReplace($sFile, "^.*\\", "")), _
;~      "Blocked File Execution attempt. Please insert password to unlock it:", "", "*", 300, 120, -1, -1, 0, $hBlockedFile_Win[1])


    MsgBox(262144+48, "File Blocker - Attention!", _
        StringFormat("You are not allowed to open this File (%s)", _
            StringRegExpReplace($sFile, "^.*\\", "")), 0, $hBlockedFile_Win[1])

    ;If $s_Password = $sBlock_Password Then Return _ProcessSuspendSwitch($iProc, False)
    Return ProcessClose($iProc)
EndFunc

Func
_ProcessesGetInfo()
    Local $oColItems, $objWMIService, $objItem, $cI_Compname = @ComputerName
    Local $aProcessInfo[1000][42], $i = 1

    $objWMIService = ObjGet("winmgmts:\\" & $cI_Compname & "\root\CIMV2")
    $oColItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Process", "WQL")

    If Not IsObj($oColItems) Then Return SetError(1, 2, 0)

    For $objItem In $oColItems
        $aProcessInfo
[$i][0]  = $objItem.Name
        $aProcessInfo[$i][1]  = $objItem.CommandLine
        $aProcessInfo[$i][2]  = $objItem.CreationClassName
        $aProcessInfo[$i][3]  = $objItem.CreationDate
        $aProcessInfo[$i][4]  = $objItem.Description
        $aProcessInfo[$i][5]  = $objItem.CSCreationClassName
        $aProcessInfo[$i][6]  = $objItem.CSName
        $aProcessInfo[$i][7]  = $objItem.ExecutablePath
        $aProcessInfo[$i][8]  = $objItem.ExecutionState
        $aProcessInfo[$i][9]  = $objItem.Handle
        $aProcessInfo[$i][10] = $objItem.HandleCount
        $aProcessInfo[$i][11] = $objItem.KernelModeTime
        $aProcessInfo[$i][12] = $objItem.MaximumWorkingSetSize
        $aProcessInfo[$i][13] = $objItem.MinimumWorkingSetSize
        $aProcessInfo[$i][14] = $objItem.OSCreationClassName
        $aProcessInfo[$i][15] = $objItem.OSName
        $aProcessInfo[$i][16] = $objItem.OtherOperationCount
        $aProcessInfo[$i][17] = $objItem.OtherTransferCount
        $aProcessInfo[$i][18] = $objItem.PageFaults
        $aProcessInfo[$i][19] = $objItem.PageFileUsage
        $aProcessInfo[$i][20] = $objItem.ParentProcessId
        $aProcessInfo[$i][21] = $objItem.PeakPageFileUsage
        $aProcessInfo[$i][22] = $objItem.PeakVirtualSize
        $aProcessInfo[$i][23] = $objItem.PeakWorkingSetSize
        $aProcessInfo[$i][24] = $objItem.Priority
        $aProcessInfo[$i][25] = $objItem.PrivatePageCount
        $aProcessInfo[$i][26] = $objItem.ProcessId
        $aProcessInfo[$i][27] = $objItem.QuotaNonPagedPoolUsage
        $aProcessInfo[$i][28] = $objItem.QuotaPagedPoolUsage
        $aProcessInfo[$i][29] = $objItem.QuotaPeakNonPagedPoolUsage
        $aProcessInfo[$i][30] = $objItem.QuotaPeakPagedPoolUsage
        $aProcessInfo[$i][31] = $objItem.ReadOperationCount
        $aProcessInfo[$i][32] = $objItem.ReadTransferCount
        $aProcessInfo[$i][33] = $objItem.SessionId
        $aProcessInfo[$i][34] = $objItem.Status
        $aProcessInfo[$i][35] = $objItem.ThreadCount
        $aProcessInfo[$i][36] = $objItem.UserModeTime
        $aProcessInfo[$i][37] = $objItem.VirtualSize
        $aProcessInfo[$i][38] = $objItem.WindowsVersion
        $aProcessInfo[$i][39] = $objItem.WorkingSetSize
        $aProcessInfo[$i][40] = $objItem.WriteOperationCount
        $aProcessInfo[$i][41] = $objItem.WriteTransferCount

        $i += 1
    Next

    $aProcessInfo[0][0] = $i-1
    ReDim $aProcessInfo[$i][42]

    If $aProcessInfo[0][0] < 1 Then Return SetError(1, 1, 0)

    Return $aProcessInfo
EndFunc

Func
_ProcessGetWindow($iPID)
    Local $aWinList = WinList()
    Local $aRet[2]

    If IsString($iPID) Then $iPID = ProcessExists($iPID)

    For $i = 1 To UBound($aWinList)-1
        If WinGetProcess($aWinList[$i][1]) = $iPID Then
            $aRet[0] = $aWinList[$i][0] ;Title
            $aRet[1] = $aWinList[$i][1] ;WinHandle

            Return $aRet
        EndIf
    Next

    Return
SetError(1, 0, $aRet)
EndFunc

Func
_ProcessSuspendSwitch($iPIDOrName, $iSuspend = True)
    If IsString($iPIDOrName) Then $iPIDOrName = ProcessExists($iPIDOrName)
    If Not $iPIDOrName Then Return SetError(1, 0, 0)

    Local $aNtSuspResumProc
    Local $ah_OpProcess = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1F0FFF, 'int', False, 'int', $iPIDOrName)

    If $iSuspend Then
        $aNtSuspResumProc = DllCall("ntdll.dll", "int", "NtSuspendProcess", "int", $ah_OpProcess[0])
    Else
        $aNtSuspResumProc = DllCall("ntdll.dll", "int", "NtResumeProcess", "int", $ah_OpProcess[0])
    EndIf

    DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $ah_OpProcess)

    If IsArray($aNtSuspResumProc) Then Return 1
    Return SetError(2, 0, 0)
EndFunc

Func
Quit()
    Exit
EndFunc

:biggrin:

Работает не для всех файлов, зависит от приложения сопоставленного с типом файла.

Цитата:

Цитата Maza Faka
Тестировалось на:
WinXP SP3 FS:NTFS »

Работает и в «WinXP SP2 FS:FAT» :)

morgan1991 16-12-2008 15:48 982014

Этот вариант мне больше понравился:

Код:

$sFile = FileOpenDialog("Select a file", "", "All files (*.*)")
If @error Then Exit

Global
$sPass = InputBox("File security", "Please set a password", "", "*")
If @error Then Exit

Global
$hFile = _CreateFile($sFile)
If $hFile = -1 Then Exit MsgBox(16, "Error", "Unable to open file")

HotKeySet("^d", "_Decrypt") ;Ctrl + d

While 1
    Sleep(100)
WEnd

Func
_CreateFile($sFile)
    Local Const $GENERIC_READ  = 0x80000000
    Local Const $GENERIC_WRITE = 0x40000000
    Local Const $OPEN_EXISTING = 3

    $sFile = "\\.\" & $sFile

    Local $aRet = DllCall("kernel32.dll", "hwnd", "CreateFile", _
                                          "str", $sFile, _
                                          "int", BitOR($GENERIC_READ, $GENERIC_WRITE), _
                                          "int", 0, _
                                          "ptr", 0, _
                                          "int", $OPEN_EXISTING, _
                                          "int", 0, _
                                          "int", 0)
    Return $aRet[0]
EndFunc  ;==>_CreateFile

Func _Decrypt()
    Local $sCurPass = InputBox("File security", "Please enter a password", "", "*")
    If @error Then Return 0

    If $sCurPass == $sPass Then
        DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
        MsgBox(64, "Success", "File decrypted")
        Exit
    Else
        MsgBox(16, "Error", "Access denied")
    EndIf
EndFunc  ;==>_Decrypt

Только вот здесь нельзя выбрать несколько файлов и нельзя выбрать целую папку, в отличии от кода предложенного Creat0R-ом. А в коде Creat0R-а не совсем всё работает. Допустим если закрыть доступ к файлу и открыть его вордом то он без проблем откроется или музыкальный файл с таким же успехом открывается в любом плеере.

МОжет кто подправит?

BadEvent 16-12-2008 18:30 982167

Всё, разобрался сам, спасибо)

Creat0R 17-12-2008 01:42 982514

morgan1991,
Цитата:

Цитата morgan1991
МОжет кто подправит? »

Другой вариант - (почти) Утилита BlockIt. Основана на идее от Maza Faka :)

Maza Faka 17-12-2008 07:19 982599

Цитата:

Цитата morgan1991
нельзя выбрать целую папку »

Можно :)
Код:

$sFile = FileSelectFolder("Select the folder", "")
If @error Then Exit

Global
$sPass = InputBox("File security", "Please set a password", "", "*")
If @error Then Exit

Global
$hFile = _CreateFile($sFile)
If $hFile = -1 Then Exit MsgBox(16, "Error", "Unable to open file")

HotKeySet("^d", "_Decrypt") ;Ctrl + d

While 1
    Sleep(100)
WEnd

Func
_CreateFile($sFile)
    Local Const $GENERIC_READ  = 0x80000000
    Local Const $GENERIC_WRITE = 0x40000000

    Local Const $FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
    Local Const $OPEN_EXISTING = 3

    $sFile = "\\.\" & $sFile

    Local $aRet = DllCall("kernel32.dll", "hwnd", "CreateFile", _
                                          "str", $sFile, _
                                          "int", BitOR($GENERIC_READ, $GENERIC_WRITE), _
                                          "int", 0, _
                                          "ptr", 0, _
                                          "int", $OPEN_EXISTING, _
                                          "int", $FILE_FLAG_BACKUP_SEMANTICS, _ ;Что бы получить дескриптор каталога, установите флажок FILE_FLAG_BACKUP_SEMANTICS
                                          "int", 0)
    Return $aRet[0]
EndFunc  ;==>_CreateFile

Func _Decrypt()
    Local $sCurPass = InputBox("File security", "Please enter a password", "", "*")
    If @error Then Return 0

    If $sCurPass == $sPass Then
        DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
        MsgBox(64, "Success", "File decrypted")
        Exit
    Else
        MsgBox(16, "Error", "Access denied")
    EndIf
EndFunc  ;==>_Decrypt

А если ещё кто-нибудь знает как отловить обращение к файлу/папке, то можно написать неплохую программку :)

morgan1991 17-12-2008 20:40 983336

В автоите 3.2.8.1 это работает
Код:

GUICreate("MpF realmlist ver 0.6", 400, 400, -1, -1, $WS_POPUP)
А в автоите 3.2.12.1 ругается на $WS_POPUP. На что это можно заменить?

SyDr 17-12-2008 21:10 983362

AutoIt3\Include\WindowsConstants.au3
Global Const $WS_POPUP = 0x80000000

Та же фигня была. Потом пропало. Не знаю, почему.
М. б. из-за того что установил полный SciTE4AutoIt3. Не знаю точно.

Creat0R 17-12-2008 23:25 983517

Цитата:

Цитата Maza Faka
А если ещё кто-нибудь знает как отловить обращение к файлу/папке, то можно написать неплохую программку »

Пока придумал только отлов системного сообщения, утилиту запаковал сюда, если найдутся тестеры, можно дальше развивать ;).

shyra1976 18-12-2008 17:37 984221

помогите
написал тут код ,Но есть проблема
Я могу закрит иконку ,толко нажав ESC или Enter что надо даписат что бы иконка закривалас при нажатии мышки на нее?
TEMP = дорожка к *.png($temp = "E:\VBA\AutoIt\GUI\1.png" )
Код:

#NoTrayIcon
#include <GDIPlus.au3>; this is where the magic happens, people
#include <GuiComboBox.au3>
#include <File.au3>
#include <Array.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WinAPI.au3>

Global Const $AC_SRC_ALPHA = 1, $ULW_ALPHA = 2
Global $launchDir = @DesktopDir, $GUI
;~ Dim $temp1
$temp = "E:\VBA\AutoIt\GUI\1.png"
Transp_PNG($temp)

Func Transp_PNG($temp, $iOpacity = 255, $EnableFade = True)


        If $iOpacity < 0 Then $iOpacity = 0
        If $iOpacity > 255 Then $iOpacity = 255
       
        ; Load PNG file as GDI bitmap
        _GDIPlus_Startup()
        $pngSrc = $temp
        $hImage = _GDIPlus_ImageLoadFromFile($pngSrc)

        ; Extract image width and height from PNG
        $width = _GDIPlus_ImageGetWidth($hImage)
        $height = _GDIPlus_ImageGetHeight($hImage)
       

        ; Create layered window
       
    $GUI = GUICreate("lod3n launcher", $width, $height, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
         
        GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
        GUISetState()
        WinSetOnTop($GUI, "", 1)
       
        If $EnableFade Then
                ;fade in png background
                For $i = 0 To $iOpacity Step 1
                        SetBitmap($GUI, $hImage, $i)
                Next
        Else
                SetBitmap($GUI, $hImage, $iOpacity)
        EndIf

       
       
        ; set default button for Enter key activation - renders outside GUI window
        $BtnExit = GUICtrlCreateButton("Exit", $width, $height, 10, 10, $BS_DEFPUSHBUTTON)
       
        While 1

                Switch GUIGetMsg()
                       
                    Case $GUI_EVENT_CLOSE,  $BtnExit
                        ExitLoop

                EndSwitch
        WEnd
       
        If $EnableFade Then
                ;fade out png background
                For $i = $iOpacity To 0 Step -1
                        SetBitmap($GUI, $hImage, $i)
                Next
        Else
                SetBitmap($GUI, $hImage, 0)
        EndIf
EndFunc  ;==>Transp_PNG

Func CancelPressed()
        Exit
EndFunc
; ====================================================================================================

; Handle the WM_NCHITTEST for the layered window so it can be dragged by clicking anywhere on the image.
; ====================================================================================================

Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
        If ($hWnd = $GUI) And ($iMsg = $WM_NCHITTEST) Then Return $HTCAPTION
EndFunc  ;==>WM_NCHITTEST

; ====================================================================================================

; SetBitMap
; ====================================================================================================


Func SetBitmap($hGUI, $hImage, $iOpacity)
        Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

        $hScrDC = _WinAPI_GetDC(0)
        $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
        $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
        $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
        $tSize = DllStructCreate($tagSIZE)
        $pSize = DllStructGetPtr($tSize)
        DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
        DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
        $tSource = DllStructCreate($tagPOINT)
        $pSource = DllStructGetPtr($tSource)
        $tBlend = DllStructCreate($tagBLENDFUNCTION)
        $pBlend = DllStructGetPtr($tBlend)
        DllStructSetData($tBlend, "Alpha", $iOpacity)
        DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
        _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
        _WinAPI_ReleaseDC(0, $hScrDC)
        _WinAPI_SelectObject($hMemDC, $hOld)
        _WinAPI_DeleteObject($hBitmap)
        _WinAPI_DeleteDC($hMemDC)
EndFunc  ;==>SetBitmap


morgan1991 18-12-2008 18:05 984241

Цитата:

Цитата Creat0R
Пока придумал только отлов системного сообщения, утилиту запаковал сюда, если найдутся тестеры, можно дальше развивать . »

Если закрыть доступ к текстовому файлу с расширением .php (на других не пробовал) тогда документ открывается с помощью notepad.

FlatX007 18-12-2008 19:13 984281

Объясните кто нибудь, откуда берётся название устройства "REMOVABLE" в окне сообщения в этом скрипте ...

Непонятно одно, что значит в переменной $var[$i] значение в квадратных скобках ? [$i]
Возможно вопрос тупой Но непонимаю Я ... если можно объясните с начала скрипта.

$var = DriveGetDrive( "REMOVABLE" )
If NOT @error Then
MsgBox(4096,"", "Found " & $var[0] & " drives")
For $i = 1 to $var[0]
MsgBox(4096,"Drive " & $i, $var[$i])
Next
EndIf

Creat0R 18-12-2008 23:33 984502

shyra1976,
Цитата:

что бы иконка закривалас при нажатии мышки на нее?
Включаю свои телепатические способности, и предполагаю (не видя ничего при запуске данного скрипта, т.к файл иконки нарисовать не удаётся на основе телепатии), что _IsPressed() тут поможет (правда почему-то нужно кликать два раза подряд):
Нажимаем сюда для просмотра кода...
Код:

#NoTrayIcon
#include
<GDIPlus.au3>
#include <GuiComboBox.au3>
#include <File.au3>
#include <Misc.au3>
#include <Array.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WinAPI.au3>

Global Const $AC_SRC_ALPHA = 1;, $ULW_ALPHA = 2
Global $launchDir = @DesktopDir, $GUI

Global $hUser32DllOpen = DllOpen("User32.dll")

$temp = "E:\VBA\AutoIt\GUI\1.png"
Transp_PNG($temp)

Func Transp_PNG($temp, $iOpacity = 255, $EnableFade = True)
    If $iOpacity < 0 Then $iOpacity = 0
    If $iOpacity > 255 Then $iOpacity = 255

    ; Load PNG file as GDI bitmap
    _GDIPlus_Startup()
    $pngSrc = $temp
    $hImage
= _GDIPlus_ImageLoadFromFile($pngSrc)

    ; Extract image width and height from PNG
    $width = _GDIPlus_ImageGetWidth($hImage)
    $height = _GDIPlus_ImageGetHeight($hImage)

    ; Create layered window

    $GUI = GUICreate("lod3n launcher", $width, $height, -1, -1, $WS_POPUP, $WS_EX_LAYERED)

    GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
    GUISetState()
    WinSetOnTop($GUI, "", 1)

    If $EnableFade Then
        ;fade in png background
        For $i = 0 To $iOpacity Step 1
            SetBitmap($GUI, $hImage, $i)
        Next
    Else

        SetBitmap($GUI, $hImage, $iOpacity)
    EndIf

    ; set default button for Enter key activation - renders outside GUI window
    $BtnExit = GUICtrlCreateButton("Exit", $width, $height, 10, 10, $BS_DEFPUSHBUTTON)

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE, $BtnExit
                ExitLoop
        EndSwitch

        If
_IsPressed(01, $hUser32DllOpen) Then ExitLoop
    WEnd

    If
$EnableFade Then
        ;fade out png background
        For $i = $iOpacity To 0 Step -1
            SetBitmap($GUI, $hImage, $i)
        Next
    Else

        SetBitmap($GUI, $hImage, 0)
    EndIf

    CancelPressed()
EndFunc  ;==>Transp_PNG

Func CancelPressed()
    DllClose($hUser32DllOpen)

    Exit
EndFunc


; Handle the WM_NCHITTEST for the layered window so it can be dragged by clicking anywhere on the image.
Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    Switch $iMsg
        Case $WM_NCHITTEST
            If $hWnd = $GUI Then Return $HTCAPTION
    EndSwitch
EndFunc
  ;==>WM_NCHITTEST

; SetBitMap

Func SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

    $hScrDC
= _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
EndFunc  ;==>SetBitmap



morgan1991,
Цитата:

Если закрыть доступ к текстовому файлу с расширением .php (на других не пробовал) тогда документ открывается с помощью notepad.
Но он не доступен, если я ошибаюсь и он доступен, то прошу файл в студию.

FlatX007,
Цитата:

Цитата FlatX007
откуда берётся название устройства "REMOVABLE" в окне сообщения в этом скрипте »

Вопрос не очень понятен, возможно стоит прочитать справку по этой команде (DriveGetDrive)?

Цитата:

Цитата FlatX007
что значит в переменной $var[$i] значение в квадратных скобках ? [$i] »

Это элемент массива.

Цитата:

Цитата FlatX007
если можно объясните с начала скрипта. »

Код:

;Получаем в массив все съёмные носители (USB-флэшки, Floppy-диски и т.п.)
$var = DriveGetDrive("REMOVABLE")

If NOT @error Then
    ;Если небыло ошибки, показываем сколько устройств найдено ($var[0])
    MsgBox(4096, "", "Found " & $var[0] & " drives")

    ;В этом же условии (что ошибок не возникло), проходим по всему массиву,
    ;и показываем найденые устройства ($i тут это элемент в массиве, от 1-ого до найденного числа устройств -> $var[0])

    For $i = 1 to $var[0]
        MsgBox(4096,"Drive " & $i, $var[$i])
    Next
EndIf


morgan1991 19-12-2008 00:04 984521

Цитата:

Цитата Creat0R
Но он не доступен, если я ошибаюсь и он доступен, то прошу файл в студию. »

У меня любой файл с расширением .php открывается, на win xp sp2 открываю через нотпэд. Прога выдаёт ошибку о том что нет доступа к файлу, нажимаю ок и вуаля текстовый документ открыт можно с ним работать, правда его нельзя изменить но прочитать можно. А вдруг там ценная информация?

Creat0R 19-12-2008 00:35 984545

morgan1991,
Цитата:

Цитата morgan1991
любой файл с расширением .php открывается, на win xp sp2 открываю через нотпэд »

Какая файловая система? у меня Fat, и файл блокируется.

morgan1991 19-12-2008 00:37 984547

Цитата:

Цитата Creat0R
Какая файловая система? у меня Fat, и файл блокируется. »

NTFS

Creat0R 19-12-2008 01:28 984579

Цитата:

Цитата morgan1991
NTFS »

Maza Faka

А как же тогда это...

Цитата:

Цитата Maza Faka
Тестировалось на:
WinXP SP3 FS:NTFS »

Что изменилось с SP2 по 3?

morgan1991,
А другие файлы тоже так “блокируются”?

shyra1976 19-12-2008 06:44 984624

Цитата:

Цитата Creat0R (Сообщение 984623)
Включаю свои телепатические способности, и предполагаю (не видя ничего при запуске данного скрипта, т.к файл иконки нарисовать не удаётся на основе телепатии), что _IsPressed() тут поможет (правда почему-то нужно кликать два раза подряд):

Я там написал код

Вы могли бы скинуть библиотеку #include <Misc.au3>

Creat0R 19-12-2008 14:24 984934

Цитата:

Цитата shyra1976
Я там написал код »

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

Цитата:

Цитата shyra1976
Вы могли бы скинуть библиотеку #include <Misc.au3> »

Она должна быть с поставкой аутоита (в папке «...AutoIt\Include»).

shyra1976 19-12-2008 17:03 985054

У меня что то не работает

Creat0R 19-12-2008 17:45 985080

shyra1976,
Цитата:

Цитата shyra1976
У меня что то не работает »

Что именно не работает?

Maza Faka 20-12-2008 07:12 985469

shyra1976
Привет!
Давай сделаем так: ты скачиваешь последнюю стабильную версию AutoIt и полный пакет редактора SciTE (желательно). Устанавливаешь эти программы (предварительно удалив старые версии этих программ), пробуешь запустить свой проблемный код, и в случае ошибок или проблем с кодом, постишь здесь описание проблемы, с примером желательно :)
Удачи! ;)

SyDr 20-12-2008 12:12 985553

Может быть просто закрыть права на доступ к файлу текущему пользователю?

SAOPP 20-12-2008 22:54 985873

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

Creat0R 20-12-2008 23:39 985903

Maza Faka, У тебя тоже не работает блокировка на NTFS? (мой скрипт).

SAOPP,
Цитата:

Цитата SAOPP
скрипт сворачивания определённого окна »

WinSetState("Title", "", @SW_MINIMIZE) чем плох?

SAOPP 20-12-2008 23:41 985904

Да мне не плох, мне нужно :)

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

Creat0R 20-12-2008 23:55 985915

Цитата:

Цитата SAOPP
между вторыми кавычками мне нужно вписать своё окошко? »

Между первыми, там же написано, Title. См. справку по этой команде.

Цитата:

Цитата SAOPP
он будет ждать до появления такого окна »

Нет, для ожидания используйте WinWait().

SAOPP 21-12-2008 00:00 985920

Цитата:

Цитата Creat0R
Между первыми, там же написано, Title. См. справку по этой команде. »

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

Creat0R 21-12-2008 00:10 985923

Цитата:

Цитата SAOPP
Лень мне смотреть это всё, поскольку уж сильно не моё. »

Ну тогда зачем изначально вам нужно было про это спрашивать тут? :unsure:

SAOPP 21-12-2008 00:17 985929

Вариация на тему поставленной задачи... Странный вопрос :)

Maza Faka 21-12-2008 07:47 985991

Цитата:

Цитата Creat0R
У тебя тоже не работает блокировка на NTFS? »

Работает :)

Цитата:

Цитата SAOPP
Вариация на тему поставленной задачи... »

Можно свернуть окно послав сообщение системному меню:
Код:

#include <WindowsConstants.au3>
#include <MenuConstants.au3>

Run("Notepad.exe")
WinWait("[CLASS:Notepad]")
$hWnd = WinGetHandle("[CLASS:Notepad]")

MsgBox(48, "Внимание", "Сейчас мы свернём окно блокнота")

DllCall("User32.dll", "int", "SendMessage", _
                            "hwnd", $hWnd, _
                            "int", $WM_SYSCOMMAND, _
                            "int", $SC_MINIMIZE, _
                            "int", 0)

:)

shyra1976 21-12-2008 08:58 986005

Вложений: 1
Цитата:

Цитата Creat0R

PHP код:

#NoTrayIcon
#include <GDIPlus.au3>
#include <GuiComboBox.au3>
#include <File.au3>
#include <Misc.au3>
#include <Array.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WinAPI.au3>
Global Const $AC_SRC_ALPHA 1;, $ULW_ALPHA 2
Global $launchDir = @DesktopDir$GUI
Global $hUser32DllOpen DllOpen("User32.dll")
$temp "E:\VBA\AutoIt\GUI\1.png"
Transp_PNG($temp)
Func Transp_PNG($temp$iOpacity 255$EnableFade True)
 If 
$iOpacity 0 Then $iOpacity 0
 
If $iOpacity 255 Then $iOpacity 255
Load PNG file as GDI bitmap
 _GDIPlus_Startup
()
 
$pngSrc $temp
 $hImage 
_GDIPlus_ImageLoadFromFile($pngSrc)
Extract image width and height from PNG
 $width 
_GDIPlus_ImageGetWidth($hImage)
 
$height _GDIPlus_ImageGetHeight($hImage)
Create layered window
$GUI 
GUICreate("lod3n launcher"$width$height, -1, -1$WS_POPUP$WS_EX_LAYERED)
GUIRegisterMsg($WM_NCHITTEST"WM_NCHITTEST")
 
GUISetState()
 
WinSetOnTop($GUI""1)
If 
$EnableFade Then
 
;fade in png background
 
For $i 0 To $iOpacity Step 1
 SetBitmap
($GUI$hImage$i)
 
Next
 
Else
 
SetBitmap($GUI$hImage$iOpacity)
 EndIf
set default button for Enter key activation renders outside GUI window
 $BtnExit 
GUICtrlCreateButton("Exit"$width$height1010$BS_DEFPUSHBUTTON)
While 
1
 
Switch GUIGetMsg()
 Case 
$GUI_EVENT_CLOSE$BtnExit
 ExitLoop
 
EndSwitch
If 
_IsPressed(01$hUser32DllOpenThen ExitLoop
 WEnd
If $EnableFade Then
 
;fade out png background
 
For $i $iOpacity To 0 Step -1
 SetBitmap
($GUI$hImage$i)
 
Next
 
Else
 
SetBitmap($GUI$hImage0)
 EndIf
CancelPressed()
EndFunc ;==>Transp_PNG
Func CancelPressed
()
 
DllClose($hUser32DllOpen)
Exit
EndFunc
Handle the WM_NCHITTEST for the layered window so it can be dragged by clicking anywhere on the image.
Func WM_NCHITTEST($hWnd$iMsg$iwParam$ilParam)
 Switch 
$iMsg
 
Case $WM_NCHITTEST
 
If $hWnd $GUI Then Return $HTCAPTION
 
EndSwitch
EndFunc ;==>WM_NCHITTEST
SetBitMap
Func SetBitmap
($hGUI$hImage$iOpacity)
 
Local $hScrDC$hMemDC$hBitmap$hOld$pSize$tSize$pSource$tSource$pBlend$tBlend
$hScrDC 
_WinAPI_GetDC(0)
 
$hMemDC _WinAPI_CreateCompatibleDC($hScrDC)
 
$hBitmap _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
 
$hOld _WinAPI_SelectObject($hMemDC$hBitmap)
 
$tSize DllStructCreate($tagSIZE)
 
$pSize DllStructGetPtr($tSize)
 
DllStructSetData($tSize"X"_GDIPlus_ImageGetWidth($hImage))
 
DllStructSetData($tSize"Y"_GDIPlus_ImageGetHeight($hImage))
 
$tSource DllStructCreate($tagPOINT)
 
$pSource DllStructGetPtr($tSource)
 
$tBlend DllStructCreate($tagBLENDFUNCTION)
 
$pBlend DllStructGetPtr($tBlend)
 
DllStructSetData($tBlend"Alpha"$iOpacity)
 
DllStructSetData($tBlend"Format"$AC_SRC_ALPHA)
 
_WinAPI_UpdateLayeredWindow($hGUI$hScrDC0$pSize$hMemDC$pSource0$pBlend$ULW_ALPHA)
 
_WinAPI_ReleaseDC(0$hScrDC)
 
_WinAPI_SelectObject($hMemDC$hOld)
 
_WinAPI_DeleteObject($hBitmap)
 
_WinAPI_DeleteDC($hMemDC)
EndFunc ;==>SetBitmap [post=984502]»[/post


PHP код:

 

Если чесно то не работает как надо ,Не важно куда я нажимаю мышкой на экране ,иконка закривается .А я хотел именно назимая на иконку ,закриват ее

SAOPP 21-12-2008 11:54 986096

Maza Faka, если рассказать в кратце, то что мне нужно сделать:
1. В авторане стоит soulseek
2. В свойствах его ярлыка стоит запускать во весь экран (это я так хочу сделать, дабы потом его в ручнуб не увеличивать)
3. Нужно после того, как он загрузится, свернуть его - тогда он попадёт в трей(!) Это и есть задача сама :)
4. И здесь уже после запуска скрипта задать время в секундах, после которого скрипт бы сработал - дав таким образом SoulSeek'у загрузиться полностью.

Поскольку, если в ярлыке указать сворачивать в значок, то он просто свернётся на панель задач, в отличии например от Total Commander'а, который нормально при таких действиях с ярлыком сворачивается в трей после запуска...

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

Creat0R 21-12-2008 12:15 986110

Цитата:

Цитата shyra1976
не работает как надо ,Не важно куда я нажимаю мышкой на экране ,иконка закривается »

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

shyra1976 21-12-2008 12:33 986125

Dobavil

Creat0R 21-12-2008 13:09 986154

shyra1976,
У меня почему то удаётся это сделать только по двойному щелчку (можно конечно избавиться от перетаскивания иконки, но я так понял оно тоже нужно?)...

Код:

#NoTrayIcon
#include
<GDIPlus.au3>
#include <GuiComboBox.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WinAPI.au3>
;

Global Const $WM_LBUTTONDOWN = 0x0201
Global Const $AC_SRC_ALPHA = 1
Global $launchDir = @DesktopDir, $GUI

Global $iExitLoop = False

$temp = @ScriptDir & "\1.png"
Transp_PNG($temp)

Func Transp_PNG($temp, $iOpacity = 255, $EnableFade = True)
    If $iOpacity < 0 Then $iOpacity = 0
    If $iOpacity > 255 Then $iOpacity = 255

    ; Load PNG file as GDI bitmap
    _GDIPlus_Startup()
    $pngSrc = $temp
    $hImage
= _GDIPlus_ImageLoadFromFile($pngSrc)

    ; Extract image width and height from PNG
    $width = _GDIPlus_ImageGetWidth($hImage)
    $height = _GDIPlus_ImageGetHeight($hImage)

    ; Create layered window

    $GUI = GUICreate("lod3n launcher", $width, $height, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
    WinSetOnTop($GUI, "", 1)

    GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN")
    GUIRegisterMsg($WM_LBUTTONUP, "WM_LBUTTONUP")
    GUIRegisterMsg($WM_WINDOWPOSCHANGED, "WM_WINDOWPOSCHANGED")

    GUISetState()

    If $EnableFade Then
        ;fade in png background
        For $i = 0 To $iOpacity Step 1
            SetBitmap($GUI, $hImage, $i)
        Next
    Else

        SetBitmap($GUI, $hImage, $iOpacity)
    EndIf

    ; set default button for Enter key activation - renders outside GUI window
    $BtnExit = GUICtrlCreateButton("Exit", $width, $height, 10, 10, $BS_DEFPUSHBUTTON)

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE, $BtnExit
                ExitLoop
        EndSwitch

        If
$iExitLoop Then ExitLoop
    WEnd

    If
$EnableFade Then
        ;fade out png background
        For $i = $iOpacity To 0 Step -1
            SetBitmap($GUI, $hImage, $i)
        Next
    Else

        SetBitmap($GUI, $hImage, 0)
    EndIf

    Exit
EndFunc
  ;==>Transp_PNG

Func CancelPressed()
    Exit
EndFunc
  ;==>CancelPressed

; Handle the WM_LBUTTONDOWN for the layered window so it can be dragged by clicking anywhere on the image.

Func WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)
    If BitAND(WinGetState($hWnd), 32) Then Return $GUI_RUNDEFMSG
    DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", $WM_SYSCOMMAND, "int", 0xF009, "int", 0)
EndFunc  ;==>WM_LBUTTONDOWN

Func WM_LBUTTONUP($hWnd, $iMsg, $wParam, $lParam)
    $iExitLoop = True
EndFunc
  ;==>WM_LBUTTONUP

Func WM_WINDOWPOSCHANGED($hWnd, $iMsg, $wParam, $lParam)
    $iExitLoop = False
EndFunc
  ;==>WM_WINDOWPOSCHANGED

; SetBitMap

Func SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

    $hScrDC
= _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
EndFunc  ;==>SetBitmap


shyra1976 21-12-2008 13:54 986188

SPASIBO, YRA zarabotalo
I eshe ,Kak ti pishesh kod v foryme ,Chto on tak krasivo polychaetsia?

ganselo 21-12-2008 23:18 986657

Можно ли как нибуть сделать так, чтобы откомпиленный скрипт не палился в Диспетчере задач? и если да, то как?

Maza Faka 22-12-2008 06:49 986808

Цитата:

Цитата shyra1976
Kak ti pishesh kod v foryme ,Chto on tak krasivo polychaetsia? »

Надеюсь что уважаемый Creat0R не будет возражать, если я выложу ссылку на его замечательный скрипт ;)
скачать Au3ToPost 1.8

shyra1976 22-12-2008 09:18 986864

Вложений: 1
Код:

;~ #include <GUIConstants.au3>
;~ -------------------------------------------------------
; Description  :
; Written by    : Alex Pougach
; Date          : 22/12/2008
;
; With help of Igal Bravshtein and Creat0R
; --------------------------------------------------------


#include-once

; Transp_PNG( $temp , x , y),$temp = "E:\VBA\AutoIt\GUI\2.png"
; $temp- Doroga k file
; x - prozrachnost
; y- Plavnost poiavleniia


#NoTrayIcon
#include
<GDIPlus.au3>
#include <GuiComboBox.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <ButtonConstants.au3>
#include <WinAPI.au3>

Global Const $WM_LBUTTONDOWN = 0x0201
Global Const $WM_LBUTTONUP = 0x0202
Global Const $ULW_ALPHA = 2
Global Const $AC_SRC_ALPHA = 1
Global $launchDir = @DesktopDir, $GUI

Global $iExitLoop = False

Func
Transp_PNG($temp, $iOpacity = 255, $EnableFade = True)
    If $iOpacity < 0 Then $iOpacity = 0
    If $iOpacity > 255 Then $iOpacity = 255

    ; Load PNG file as GDI bitmap
    _GDIPlus_Startup()
    $pngSrc = $temp
    $hImage
= _GDIPlus_ImageLoadFromFile($pngSrc)

    ; Extract image width and height from PNG
    $width = _GDIPlus_ImageGetWidth($hImage)
    $height = _GDIPlus_ImageGetHeight($hImage)

    ; Create layered window

    $GUI = GUICreate("", $width, $height, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
    WinSetOnTop($GUI, "", 1)

    GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN")
    GUIRegisterMsg($WM_LBUTTONUP, "WM_LBUTTONUP")
    GUIRegisterMsg($WM_WINDOWPOSCHANGED, "WM_WINDOWPOSCHANGED")

    GUISetState()

    If $EnableFade Then
        ;fade in png background
        For $i = 0 To $iOpacity Step 1
            SetBitmap($GUI, $hImage, $i)
        Next
    Else

        SetBitmap($GUI, $hImage, $iOpacity)
    EndIf

    ; set default button for Enter key activation - renders outside GUI window
    $BtnExit = GUICtrlCreateButton("Exit", $width, $height, 10, 10, $BS_DEFPUSHBUTTON)

    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE, $BtnExit
                ExitLoop
        EndSwitch

        If
$iExitLoop Then ExitLoop
    WEnd

    If
$EnableFade Then
        ;fade out png background
        For $i = $iOpacity To 0 Step -1
            SetBitmap($GUI, $hImage, $i)
        Next
    Else

        SetBitmap($GUI, $hImage, 0)
    EndIf
EndFunc
  ;==>Transp_PNG

; Handle the WM_LBUTTONDOWN for the layered window so it can be dragged by clicking anywhere on the image.

Func WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)
    If BitAND(WinGetState($hWnd), 32) Then Return $GUI_RUNDEFMSG
    DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", $WM_SYSCOMMAND, "int", 0xF009, "int", 0)
EndFunc  ;==>WM_LBUTTONDOWN

Func WM_LBUTTONUP($hWnd, $iMsg, $wParam, $lParam)
    $iExitLoop = True
EndFunc
  ;==>WM_LBUTTONUP

Func WM_WINDOWPOSCHANGED($hWnd, $iMsg, $wParam, $lParam)
    $iExitLoop = False
EndFunc
  ;==>WM_WINDOWPOSCHANGED

; SetBitMap

Func SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

    $hScrDC
= _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
EndFunc  ;==>SetBitmap





Мужыки спасибо
Получилось вот так :


$temp = @ScriptDir & "\1.png"
Transp_PNG($temp,x,y) ;-vizov

где :

$temp - дорога к file ($temp = @ScriptDir & "\1.png")
x - прозрачность
y - плавностьпоявления

DobroeZlo 22-12-2008 15:11 987141

Привет.
Подскажите как определить имя диска, в который вставлена флешка.

Creat0R 22-12-2008 15:39 987165

Цитата:

Цитата DobroeZlo
как определить имя диска, в который вставлена флешка »

Если скрипт находится на этой флэшке, тогда так:

Код:

$sDrive = StringLeft(@ScriptDir, 2) & "\"
ConsoleWrite($sDrive & @CRLF)


D_Master 22-12-2008 17:55 987300

Я как понял, здесь не только о скриптах для автоустановки приложений речь идет, можно я тоже поинтересуюсь? :)
Сразу предупреждаю, что в AutoIt'e полный нуб :)

Так вот, хотелось бы проверить значения ключей реестра и целого раздела. Но не получается сделать следующее:
1. Проверить, собственно, полностью раздел на наличие каких-либо ключей;
2. Отобразить все проверенные значения за раз.

Единственное, что сделал (по мануалу :)):
Код:

$key = RegRead ( "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon", "Userinit" )
MsgBox(64, "Параметр Userinit:", $key)
$key2 = RegRead ( "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon", "Shell" )
MsgBox(64, "Параметр Shell:", $key2)
$key3 = RegRead ( "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon", "UIHost" )
MsgBox(64, "Параметр UIHost:", $key3)

Не ахти конечно... :)

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

Если кто поможет, буду рад :)

Creat0R 22-12-2008 19:03 987363

D_Master, Я выкладывал библиотеку для работы с реестером, в ней вроде есть то что тебе нужно.

D_Master 22-12-2008 19:10 987371

Creat0R, было бы просто здорово, если бы вы примерно объяснили бы, как с ней работать :) А то я аж ужаснулся как код увидел :)

FlatX007 22-12-2008 20:07 987416

Цитата:

Цитата Creat0R
Это элемент массива.
Цитата FlatX007:если можно объясните с начала скрипта. »
Код:
;Получаем в массив все съёмные носители (USB-флэшки, Floppy-диски и т.п.)
...
;и показываем найденые устройства ($i тут это элемент в массиве, от 1-ого до найденного числа устройств -> $var[0])
For $i = 1 to $var[0]
MsgBox(4096,"Drive " & $i, $var[$i])
Next
EndIf »


Не до меня всё равно не доходит малец :) откуда берётся буква диска в окне сообщения MsgBox(4096,"Drive " & $i, $var[$i]) водит взаблуждение вот эта запись ... & $i, $var[$i], что она означает и откуда что берётся ??

p10k 22-12-2008 21:31 987502

Подскажите,как переделать питоновский скрипт отсылающий некоторые данные на некоторый УРЛ

Код:

#!/usr/bin/python
import sys
USER = 'login'
PASS = 'pass'
LOGIN_URL = "www.URL.com/login?..."

import urllib2
from urllib import urlencode
auth_data = {'username': USER, 'password': PASS}
bot = urllib2.build_opener()
answer = bot.open(LOGIN_URL, urlencode(auth_data))


Creat0R 22-12-2008 21:50 987522

Цитата:

Цитата D_Master
как с ней работать »

Для чтения ветки реестра (автозапуск програм) можно так:

Код:

$aKeysListArr = _RegReadKeyValueToArray("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", 1)

If Not @error Then
    For
$i = 1 To $aKeysListArr[0]
        ConsoleWrite("Текущее имя ключа: " & $aKeysListArr[$i] & @CRLF)
    Next
EndIf

Цитата:

Цитата FlatX007
откуда берётся буква диска в окне сообщения »

С массива, это элемент массива.

Цитата:

Цитата FlatX007
водит взаблуждение вот эта запись ... & $i, $var[$i], что она означает и откуда что берётся ?? »

$i это текущее число элемента (мы ведь в цикле проходим массив), а $var[$i] это значение в текущем элементе (массива). Т.е $Var это массив :)

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

FlatX007 22-12-2008 23:10 987612

я из русской справки это взял!

Я знаю что такое массив и цикл ... емаё :) откуда берётся буква в окне сообщения ... почему именно написание такое MsgBox(4096,"Drive " & $i, $var[$i]) .... а не вот такое MsgBox(4096,"Drive ", $var)
Ну подробно пожалуста именно эту строку ... я всю голову сломал...

Или проще подскажи как зделать раскрывающийся список [ GUICtrlCreateCombo ] в GUI окне
и чтоб в этом списке отображались Флешки , если флешки 2 то сопственно 2 пункта с буквой устройства.
Вот чего я хотел добится !

Creat0R 22-12-2008 23:40 987632

Цитата:

Цитата FlatX007
Я знаю что такое массив »

Из твоих слов далее, мне кажется что ты заблуждаешься.

Цитата:

Цитата FlatX007
почему именно написание такое MsgBox(4096,"Drive " & $i, $var[$i]) .... а не вот такое MsgBox(4096,"Drive ", $var) »

Потому что в первом случае в заголовке отображается текущий элемент (ячейка) массива, а само значение нужно считывать с этой ячейки ([$i] это и есть ячейка/элемент).

Я не знаю как подругому объяснить работу массивов :idontnow: .

Цитата:

Цитата FlatX007
как зделать раскрывающийся список [ GUICtrlCreateCombo ] в GUI окне
и чтоб в этом списке отображались Флешки »

Код:

$Gui = GUICreate("Removable Drives List", 350, 120)

GUICtrlCreateLabel("Removable Drives:", 20, 30)
$Combo = GUICtrlCreateCombo("", 20, 50, 310, 200)

$aDrivesArr = DriveGetDrive("Removable")
$sDrivesList = ""

For $i = 1 To UBound($aDrivesArr)-1
    If $aDrivesArr[$i] = "a:" Then ContinueLoop

    $sDrivesList &= StringUpper($aDrivesArr[$i]) & "\"
    If $i < $aDrivesArr[0] Then $sDrivesList &= "|"
Next

GUICtrlSetData($Combo, $sDrivesList)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
    EndSwitch
WEnd


Maza Faka 23-12-2008 07:11 987783

Цитата:

Цитата p10k
Подскажите,как переделать питоновский скрипт отсылающий некоторые данные на некоторый УРЛ »

Смотри в справке _IE_* функции

6757439 23-12-2008 18:17 988255

Подскажите, пожалуйста, как послать комбинацию ctrl+alt+del (нужна для блокировки/разблокировки компьютера). Простой Send не помогает.
Код:

Send ("^!{DEL}")

litus 24-12-2008 07:28 988678

здравствуйте возник маленький вопрос как можно реализовать на autoit включение ПК в определёное время. Видел когдато такую функцию на языке "Ford" компьютер уходил в спящий режим а в указаное времья просыпался. Но это были первые шаги и реализовать это несмог а щас несмог найти эти записи.

Creat0R 24-12-2008 07:57 988682

Цитата:

Цитата 6757439
как послать комбинацию ctrl+alt+del »

Вроде никак. Разве что только каким-нибудь клавиатурным хуком.

Цитата:

Цитата litus
Видел когдато такую функцию на языке "Ford" компьютер уходил в спящий режим а в указаное времья просыпался »

"Ford"? Возможно имеется в виду «Forth» :) - См. тут есть вроде функция для просыпания в заданное время.

Maza Faka 24-12-2008 08:00 988684

Цитата:

Цитата 6757439
послать комбинацию ctrl+alt+del (нужна для блокировки/разблокировки компьютера »

Чем не устраивает сочетание Win + L?
Код:

Send("#l")

Grammaton Cleric 24-12-2008 08:05 988686

Выдержка из справки по автоиту:
Цитата:

N.B. Windows не позволяет проводить симуляцию хорошо известной комбинации "CTRL-ALT-DEL"!
Попробуй, раз тебе это надо для блокировки -
Run (@WindowsDir&'\system32\rundll32.exe user32.dll,LockWorkStation')
------------
По поводу сообщения ниже... Уссацо!!!

Creat0R 24-12-2008 08:10 988689

Цитата:

Цитата Maza Faka
Чем не устраивает сочетание Win + L? »

Опасная штука для того кто не юзает это так часто... я вот щас попробовал, и у меня ушло минут 10 на то чтобы вспомнить (точнее перебрать все возможные) пароль :o , а что делать если бы не вспомнил? :help:

Maza Faka 24-12-2008 08:38 988701

Цитата:

Цитата Creat0R
а что делать если бы не вспомнил? »

Есть прожки Линуксовые, для изменения\сброса пароля :)

Grammaton Cleric 24-12-2008 08:46 988711

Ну если уж начали флудить, то и я присоединюсь... Есть такая тема ERD Commander 2005 (2008) вот там можно управлять и паролями и всякой дребеденью... включая службу восстановления системы.

TERMINAL 24-12-2008 09:50 988746

Народ, подскажите плз...
1. Как определить наличие папки?
2. Имеется на С:\ папка "ПОЛЬЗОВАТЕЛЬ" и на D:\ в папке "Документы" папка "ПОЛЬЗОВАТЕЛЬ".... В папке "Документы" кроме папки "ПОЛЬЗОВАТЕЛЬ" могут присутствовать и другие папки (тоже самое и с диском С:\). Мне нужна как бы сверка, если на С:\ есть такАЯ папкА как и диске D:\ в папке "Документы", то выводится сообщение...если нет...ничего не происходит...

Заранее спс.

Grammaton Cleric 24-12-2008 10:28 988771

TERMINAL, ты уточни, что тебе надо. Просто проверить наличие папки с таким-же названием или надо сравнивать по размерам, контрольным суммам или еще чему нибудь?
----------
Можно, конечно и так:
if FileExists ('C:\ПОЛЬЗОВАТЕЛЬ')=1 AND FileExists ('D:\ДОКУМЕНТЫ\ПОЛЬЗОВАТЕЛЬ')=1 THEN MsgBox (0, 'test', 'есть обе папки!')
----------
Если что-то не так - уточни требования.

Creat0R 24-12-2008 10:34 988778

Цитата:

Цитата TERMINAL
Как определить наличие папки? »

Код:

$IsFolder = _PathIsFolder(@ScriptDir)

ConsoleWrite("[" & @ScriptDir & "] IsFolder = " & $IsFolder & @CRLF)

Func _PathIsFolder($sPath)
    Return Not StringInStr(FileGetAttrib($sPath & "\"), "D") = 0
EndFunc

Цитата:

Цитата TERMINAL
2. Имеется на С:\ папка "ПОЛЬЗОВАТЕЛЬ" и на D:\ в папке "Документы" папка "ПОЛЬЗОВАТЕЛЬ".... В папке "Документы" кроме папки "ПОЛЬЗОВАТЕЛЬ" могут присутствовать и другие папки (тоже самое и с диском С:\). Мне нужна как бы сверка, если на С:\ есть такАЯ папкА как и диске D:\ в папке "Документы", то выводится сообщение...если нет...ничего не происходит... »

Не ясно, что нужно проверять? Если в обеихз местах есть папка "ПОЛЬЗОВАТЕЛЬ"? В чём тогда проблема, FileExists() вроде для этого и есть :) Ну или юзаем функцию выше.

TERMINAL 24-12-2008 10:35 988780

Grammaton Cleric, сравнивать по названиям папок...

Creat0R, спасибо, чесно говоря я думал что команда FileExists() только для файлов, а не для папок-это ставит всё на свои места.

Grammaton Cleric 24-12-2008 10:40 988788

Creat0R, А это что за выкладку ты дал в последнем сообщении? Чего-то я не могу понять, что это за функции....

Creat0R 24-12-2008 11:13 988808

Цитата:

Цитата TERMINAL
это ставит всё на свои места »

На одного лишь FileExists я бы не стал полагаться, т.к указанный путь может быть и файлом (без расширения), т.ч _PathIsFolder самый надёжный вариант. Можно ещё и так для проверки сделать:

Код:

$IsFolder = _PathIsFolder(@WindowsDir)

ConsoleWrite("[" & @WindowsDir & "] IsFolder = " & $IsFolder & @CRLF)

Func _PathIsFolder($sPath)
    If Not FileExists($sPath) Then Return SetError(1, 0, 0)
    Return Not StringInStr(FileGetAttrib($sPath & "\"), "D") = 0
EndFunc

Цитата:

Цитата Grammaton Cleric
Чего-то я не могу понять, что это за функции.... »

Для проверки указанного пути на придмет каталога? :unsure:

TERMINAL 24-12-2008 11:22 988817

Подскажите плз как сделать, если дата больше указаной-выводится сообщение что больше, если дата меньше указанной-выводится сообщение что меньше
читать дальше »
Работает только на целый год, а если выставить с 2008 по 2009 то неправильно паказывает:

If @MDAY&@MON&@YEAR>"09032009" Then MsgBox(64,@MDAY&@MON&@YEAR,"больше чем 09032009")
If @MDAY&@MON&@YEAR<"24122008" Then MsgBox(64,@MDAY&@MON&@YEAR,"меньше чем 25122008")

Заранее спс.

Creat0R, Во первых эта функция у меня ошибку выдаёт, а во вторых, где прописывать папку которую я хочу сверить?

Creat0R 24-12-2008 11:43 988846

Цитата:

Цитата TERMINAL
как сделать, если дата больше указаной-выводится сообщение что больше, если дата меньше указанной-выводится сообщение что меньше »

См. функцию _DateDiff() и подобные.

Цитата:

Цитата TERMINAL
эта функция у меня ошибку выдаёт »

Какую? :o

Цитата:

Цитата TERMINAL
где прописывать папку которую я хочу сверить? »

Как где, вместо @WindowsDir (подставляй вместо параметра).

Maza Faka 24-12-2008 11:43 988847

Цитата:

Цитата TERMINAL
если выставить с 2008 по 2009 то неправильно паказывает: »

У тебя во второй строчке - опечатка 24122008, наверное 25-е число хотел указать?

TERMINAL 24-12-2008 11:59 988866

Creat0R, Вроде вот ошибка
Цитата:

>"C:\Program Files\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in "C:\test.au3" /autoit3dir "C:\Program Files\AutoIt3" /UserParams
+> Starting AutoIt3Wrapper v.1.7.3
>Running AU3Check (1.54.3.0) params: from:C:\Program Files\AutoIt3
+>AU3Check ended.rc:0
>Running:(3.2.0.1):C:\Program Files\AutoIt3\autoit3.exe "C:\test.au3"
[C:\WINDOWS] IsFolder = True
Maza Faka, да разницы нет и так и так пробовал...

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

Maza Faka 24-12-2008 13:14 988932

Цитата:

Цитата TERMINAL
Вроде вот ошибка »

Ну и где там сообщение об ошибке?
Цитата:

Цитата TERMINAL
да разницы нет и так и так пробовал »

А если наоборот?
Код:

If @YEAR & @MON & @MDAY  > 20090309 Then MsgBox(64, @MDAY & @MON & @YEAR, "больше чем 09032009")

If @YEAR & @MON & @MDAY < 20081225 Then MsgBox(64, @MDAY & @MON & @YEAR, "меньше чем 25122008")


6757439 24-12-2008 13:27 988942

Цитата:

Цитата Maza Faka
Чем не устраивает сочетание Win + L? »

Тем что этой же комбинацией нельзя разблокировать :(

Цитата:

Цитата Grammaton Cleric
Попробуй, раз тебе это надо для блокировки -
Run (@WindowsDir&'\system32\rundll32.exe user32.dll,LockWorkStation') »

А какой ключ для разблокировки? Или такого не существует?

Maza Faka 24-12-2008 13:54 988967

Цитата:

Цитата 6757439
Тем что этой же комбинацией нельзя разблокировать »

Для разблокировки нужно ввести пароль и нажать кнопку <Ok>. А, что, можно по другому, если блокировать через Ctrl+Alt+Del?

Maza Faka 24-12-2008 14:13 988981

6757439
AFAIK штатными средствами программно разблокировать компьютер нельзя:
Цитата:

MSDN
LockWorkStation Function
This function has the same result as pressing Ctrl+Alt+Del and clicking Lock Workstation. To unlock the workstation, the user must log in
Нештатными, вроде можно :)
Вот ещё с офф. форума

И ещё :)

TERMINAL 24-12-2008 14:53 989022

Maza Faka, вау, большое спасибо, недогадался

Maza Faka, я думал [C:\WINDOWS] IsFolder = True и есть ошибка

6757439 24-12-2008 17:10 989190

Цитата:

Цитата Maza Faka
Для разблокировки нужно ввести пароль и нажать кнопку <Ok>. А, что, можно по другому, если блокировать через Ctrl+Alt+Del? »

Я имел в виду, что комбинация Win+L не поможет для вывода формы куда вводить пароль.
ЗЫ. я так понял что нет вариантов разблокировки кроме физического нажатия злополучных ctrl+alt+del .......... :(

Creat0R 25-12-2008 01:52 989633

Новая версия AutoIt 3.3.0.0 доступна на оф. сайте.
Кроме прочего, пофиксили DllCallbackFree() который крашил скрипт :)

litus 25-12-2008 06:02 989683

Доброе утро помогите разобраться с комбинированым списком чтобы при выборе нужного значения при нажатии на кнопку производилась запись в ини файл. Уменя какое бы значение невыбрал запись идет час=3 мин=4
код:
#include <GUIConstants.au3>
GUICreate("Будильник 001", 200, 120)

$A2 = GUICtrlCreateCombo ("час", 5, 30, 50, 20)
GUICtrlSetData(-1,"00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23", "час")

$A3 = GUICtrlCreateCombo ("мин", 65, 30, 50, 20)
GUICtrlSetData(-1,"00|05|10|15|20|25|30|35|40|45|50|55", "мин")

$Button_01 = GUICtrlCreateButton ("Подтверждение изменения", 10, 55, 60, 20)

GUISetState(@SW_SHOW)

While 1
$msg = GUIGetMsg()

Select
Case $msg = $Button_01
IniWrite("kukushka.ini", "Boi_001", "has", $A2)
IniWrite("kukushka.ini", "Boi_001", "min", $A3)
Exit
EndSelect
WEnd

Maza Faka 25-12-2008 07:04 989693

litus
Для получения значения используй функцию GUICtrlRead
Код:

#include <GUIConstants.au3>

GUICreate("Будильник 001", 200, 120)

$A2 = GUICtrlCreateCombo("час", 5, 30, 50, 20)
GUICtrlSetData(-1, "00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23", "час")

$A3 = GUICtrlCreateCombo("мин", 65, 30, 50, 20)
GUICtrlSetData(-1, "00|05|10|15|20|25|30|35|40|45|50|55", "мин")

$Button_01 = GUICtrlCreateButton("Подтверждение изменения", 10, 55, 60, 20)

GUISetState(@SW_SHOW)

While 1
    $msg = GUIGetMsg()

    Select
        Case
$msg = $Button_01
            IniWrite("kukushka.ini", "Boi_001", "has", GUICtrlRead($A2))
            IniWrite("kukushka.ini", "Boi_001", "min", GUICtrlRead($A3))
            Exit
    EndSelect
WEnd


Grammaton Cleric 26-12-2008 04:01 990448

6757439 ,Ну вот, собственно, не понятно, про какой ключ вопрос... Вообщето просит пароль пользователя. Результат тот же что и от Win+L. То есть просто надо вводить имя и пароль (или только пароль, если имя уже есть) пользователя, под которым сидел. Если пароля у пользователя нету, тогда еще проще. Не надо вводить пароль...
Перед блокировкой не забудь вспомнить пароль!

DobroeZlo 26-12-2008 10:43 990577

Creat0R, спасибо.
Из твоего ответа FlatX007 нашел что было нужно.

Grammaton Cleric 26-12-2008 11:03 990593

Цитата:

Цитата 6757439
Я имел в виду, что комбинация Win+L не поможет для вывода формы куда вводить пароль.
ЗЫ. я так понял что нет вариантов разблокировки кроме физического нажатия злополучных ctrl+alt+del .......... »

А чем тебе не нравится блокировка по Win+L.

morgan1991 26-12-2008 21:00 991091

6757439, этож где вы такую винду нашли что по нажатию ctrl+alt+del компьютер блокируется?
Насколько я знаю по этому нажатию вылетает диспетчер задач, а на некоторых windows вылетает окно с выбором заблочить комп или запустить диспетчер задач и чтото ещё. А win+l как раз и блокирует пользователя. И ещё мне интересно каким образом будет вводиться пароль если при блокировке компа Autoit ничего сделать не сможет?

litus 27-12-2008 06:05 991299

Доброе утро хотелось реализовать такую фишку в комбинированом списке чтобы по умолчанию всегда отображалось текущее системное время.
Пример кода:
$A001 = @HOUR
$ABC1 = GUICtrlCreateCombo("", 5, 30, 50, 20)
GUICtrlSetData(-1, "00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23", "@HOUR")

Как я его не вертел самое большое что добился это значение @HOUR.

Maza Faka 27-12-2008 07:41 991308

Цитата:

Цитата litus
чтобы по умолчанию всегда отображалось текущее системное время »

В смысле всегда? Имеется в виду, что значение будет изменяться с изменением времени?
Для установки текущего времени в формате PC используй функцию _Now

litus 27-12-2008 14:53 991516

Юзаю функцию _Now возращает в значение комбинированого списка "0" да и посещают сомнения в тестовом варианте возращаеться формат 27.12.2008 13:45:08 " а нада чтобы возращалось к примеру приводимом ниже только значение часа "13"

D_Master 27-12-2008 19:03 991675

Цитата:

Цитата Creat0R
Для чтения ветки реестра (автозапуск програм) можно так: »

Creat0R, ммм... что-то я совершенно ничего не понял :(
Код, как я понял, такой (с инклюдом):
читать дальше »
Код:

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=161.ico
#AutoIt3Wrapper_outfile=1.exe
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#Include <Registry_UDFs.au3>
$aKeysListArr = _RegReadKeyValueToArray("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", 1)

If Not @error Then
    For $i = 1 To $aKeysListArr[0]
        ConsoleWrite("Текущее имя ключа: " & $aKeysListArr[$i] & @CRLF)
    Next
EndIf


Вот только результат никуда не выдается :(
Читал в справке инфу по ConsoleWrite, но не понял назначения функции:
Цитата:

Выдать данные в поток, для чтения его, например, некоторыми редакторами.
Куда выдать, как этот поток прочитать...

Можно ли сделать, к примеру, алерт со списком ключей ветки и их значением?

Creat0R 27-12-2008 23:25 991855

Цитата:

Цитата D_Master
Куда выдать, как этот поток прочитать... »

Вообще то код желательно набирать в редакторе SciTE, он идёт вместе с поставкой AutoIt'а. Там в консоле будет видно.

Цитата:

Цитата D_Master
Можно ли сделать, к примеру, алерт со списком ключей ветки и их значением? »

Да:

Код:

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=161.ico
#AutoIt3Wrapper_outfile=1.exe
#EndRegion
;**** Directives created by AutoIt3Wrapper_GUI ****
#Include <Registry_UDFs.au3>
$aKeysListArr = _RegReadKeyValueToArray("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", 1)

If Not @error Then
    $sKeys = ""

    For $i = 1 To $aKeysListArr[0]
        $sKeys &= $aKeysListArr[$i] & @CRLF
    Next
EndIf


MsgBox(64, "Ключи реестра - Результат", $sKeys)


Maza Faka 28-12-2008 08:05 992011

Цитата:

Цитата litus
а нада чтобы возращалось к примеру приводимом ниже только значение часа "13" »

Так в твоём примере и происходит. Что ещё нужно?
Убери кавычки обрамляющие @HOUR.

litus 28-12-2008 11:27 992097

Спасиба всё отлично работает собрал говорящие часики с кукушкой бьёт каждый час. Теперь благодаря вам можно усыплять ПК и будить его в заданое времья.

mustafar 29-12-2008 12:30 992871

Я новичок! Не подскажите команду которая находит в таком-то координате такой-то color и выполняет функцию?

Creat0R 29-12-2008 13:36 992929

Цитата:

Цитата mustafar
команду которая находит в таком-то координате такой-то color и выполняет функцию? »

PixelSearch вроде бы нужен:
Код:

$nColor = PixelSearch(200, 150, 220, 170, 0xFFFFFF)
If Not @error Then _MyFunc()

Func _MyFunc()
    MsgBox(64, "", "Hello from MyFunc() :)")
EndFunc


mustafar 29-12-2008 13:42 992936

спасибо!!!

SyDr 29-12-2008 17:40 993137

Имеется массив строк. Как обратиться к определённому символу определённой строки?
$Array[$i][$n] не подходит...

Creat0R 29-12-2008 23:47 993418

Цитата:

Цитата Sylver Dragon
Как обратиться к определённому символу определённой строки? »

Что значит обратиться? StringMid($aArray[$i], 2, 1) ?

mustafar 30-12-2008 16:34 993812

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

Creat0R 30-12-2008 21:51 994066

Цитата:

Цитата mustafar
Как сделать чтобы этот скрипт искал эти пиксели в определённом окне? и как сделать что бы он ждал их появления (пикселей) и не выключался »


Код:

HotKeySet("{ESC}", "_Quit")

$hWindow = WinGetHandle("[CLASS:SciTEWindow]")

While 1
    $nColor = PixelSearch(200, 150, 220, 170, 0xFFFFFF, 0, 1, $hWindow)
    If Not @error Then _MyFunc($nColor)

    Sleep(100)
WEnd

Func
_MyFunc($nColor)
    MsgBox(64, '', 'Hello from MyFunc(' & $nColor[0] & ', ' & $nColor[1] & ') :)')

    _Quit()
EndFunc

Func
_Quit()
    Exit
EndFunc


BonD 007 02-01-2009 22:10 995861

Хочу, чтобы в Новом 2009-м году при нажатии на какую-нибудь горячую клавишу создавалась новая папка в активном окне, а то надоело постоянно клацать правой кнопой мыши, целиться в создать, потом в папку... долго это. Да и названия "Новая папка", "Новая папка (2)" поднадоели; хочется, чтоб их можно было поменять (к примеру, чтоб было "0", "1", "2" и т. д.). Прога для назначения горячей клавиши на приложение у меня есть, да и в Windows есть такая функция, а вот скриптик хотелось бы поиметь. Может можно это на AutoIt сделать? Или при помощи командной строки. Может есть проги, которые позволяют это делать? Помогите пожалуйста.

Creat0R 02-01-2009 22:38 995880

Цитата:

Цитата LEXYSone
можно и так: »

Вообще-то эта тема по AutoIt ;) ...

BonD 007,
Цитата:

Цитата BonD 007
при нажатии на какую-нибудь горячую клавишу создавалась новая папка в активном окне »

Пример:

Код:

#NoTrayIcon

Opt("WinWaitDelay", 1)

Global $sFileNameFormat = "New_%i"

HotKeySet("^+n", "_CreateFolder_Proc")
HotKeySet("^+w", "_Quit")

While 1
    Sleep(1000)
WEnd

Func
_CreateFolder_Proc()
    Local $sExplorer_Title = "[CLASS:CabinetWClass]"
    If Not WinActive($sExplorer_Title) Then Return

    Local
$sPath = ControlGetText($sExplorer_Title, "", "Edit1")
    If Not StringInStr(FileGetAttrib($sPath), "D") Then Return

    Local
$iFolder_Num = 1
    Local $sNewFolderName = StringFormat($sFileNameFormat, $iFolder_Num)

    While StringInStr(FileGetAttrib($sPath & "\" & $sNewFolderName), "D")
        $iFolder_Num += 1
        $sNewFolderName = StringFormat($sFileNameFormat, $iFolder_Num)
    WEnd

    DirCreate($sPath & "\" & $sNewFolderName)
EndFunc

Func
_Quit()
    Exit
EndFunc


Maza Faka 03-01-2009 07:48 996075

Цитата:

Цитата Creat0R
Пример: »

Неплохо было бы добавить проверку на класс ExploreWClass, вдруг пользователь запускает Explorer вместо "Мой компьютер":
Код:

#NoTrayIcon

Opt("WinWaitDelay", 1)

Global $sFileNameFormat = "New_%i"

HotKeySet("^+n", "_CreateFolder_Proc") ;Ctrl + Shift + n
HotKeySet("^+w", "_Quit") ;Ctrl + Shift + w

While 1
    Sleep(1000)
WEnd

Func
_CreateFolder_Proc()
    Local $sExplorer_Title = "[CLASS:CabinetWClass]"

    If Not WinActive($sExplorer_Title) Then $sExplorer_Title = "[CLASS:ExploreWClass]"
    If Not WinActive($sExplorer_Title) Then Return

    Local
$sPath = ControlGetText($sExplorer_Title, "", "Edit1")
    If Not StringInStr(FileGetAttrib($sPath), "D") Then Return

    Local
$iFolder_Num = 1
    Local $sNewFolderName = StringFormat($sFileNameFormat, $iFolder_Num)

    While StringInStr(FileGetAttrib($sPath & "\" & $sNewFolderName), "D")
        $iFolder_Num += 1
        $sNewFolderName = StringFormat($sFileNameFormat, $iFolder_Num)
    WEnd

    DirCreate($sPath & "\" & $sNewFolderName)
EndFunc  ;==>_CreateFolder_Proc

Func _Quit()
    Exit
EndFunc
  ;==>_Quit

:)

BonD 007 03-01-2009 13:45 996207

Просто поместить код из предыдущего сообщения в файл с расширением ".au3", запустить, нажать Ctrl + Shift + n и появится папка? Что-то не получается. И ещё. Когда я писал "в активном окне", я имел ввиду чтобы, к примеру, при нажатии тех же Ctrl + Shift + n создавалась папка в любом окне Explorer'а, которое в данный момент активно (или на рабочем столе) независимо от того, где лежит скрипт.

Creat0R 03-01-2009 14:31 996243

Цитата:

Цитата BonD 007
Когда я писал "в активном окне", я имел ввиду чтобы, к примеру, при нажатии тех же Ctrl + Shift + n создавалась папка в любом окне Explorer'а, которое в данный момент активно (или на рабочем столе) независимо от того, где лежит скрипт. »

Рабочий стол не предусматривался, тогда так:

Код:

#NoTrayIcon

Opt("WinWaitDelay", 1)

Global $sFileNameFormat = "New_%i"

HotKeySet("^+n", "_CreateFolder_Proc") ;Ctrl + Shift + n
HotKeySet("^+w", "_Quit") ;Ctrl + Shift + w

While 1
    Sleep(1000)
WEnd

Func
_CreateFolder_Proc()
    Local $sExplorer_Title = "[CLASS:CabinetWClass]"
    Local $sPath

    If Not WinActive($sExplorer_Title) Then $sExplorer_Title = "[CLASS:ExploreWClass]"
    If Not WinActive($sExplorer_Title) Then $sExplorer_Title = "[CLASS:Progman]"
    If Not WinActive($sExplorer_Title) Then Return

    Switch
$sExplorer_Title
        Case "[CLASS:CabinetWClass]", "[CLASS:ExploreWClass]"
            Local $sWin_Title = WinGetTitle($sExplorer_Title)
            Local $sWin_Text = WinGetText($sExplorer_Title)

            $sPath = StringRegExpReplace($sWin_Text, "(?s).*(\r\n|)(\w+:\\.*" & $sWin_Title & ")(\r\n|.*)", "\2")
        Case "[CLASS:Progman]"
            $sPath = @DesktopDir
    EndSwitch

    If Not
StringInStr(FileGetAttrib($sPath), "D") Then $sPath = ControlGetText($sExplorer_Title, "", "Edit1")
    If Not StringInStr(FileGetAttrib($sPath), "D") Then Return

    Local
$iFolder_Num = 1
    Local $sNewFolderName = StringFormat($sFileNameFormat, $iFolder_Num)

    While StringInStr(FileGetAttrib($sPath & "\" & $sNewFolderName), "D")
        $iFolder_Num += 1
        $sNewFolderName = StringFormat($sFileNameFormat, $iFolder_Num)
    WEnd

    DirCreate($sPath & "\" & $sNewFolderName)
EndFunc  ;==>_CreateFolder_Proc

Func _Quit()
    Exit
EndFunc
  ;==>_Quit


Maza Faka 03-01-2009 15:26 996287

Цитата:

Цитата BonD 007
при нажатии тех же Ctrl + Shift + n создавалась папка в любом окне Explorer'а, которое в данный момент активно (или на рабочем столе) »

Правильно заданный вопрос - половина ответа :umnik:

ganselo 03-01-2009 17:56 996414

Цитата:

Цитата Creat0R
тогда так: »

Что то у меня этот скриптик не хочит работать... Я компилю его запускаю, жму в активном окне проводника ctrl+shift+n и ни чего не происходит. Мб что то делаю не так?

katok888 03-01-2009 18:52 996458

Цитата:

Цитата ganselo
Что то у меня этот скриптик не хочит работать. »

Такая же фигня.

Creat0R 03-01-2009 19:53 996524

ganselo, katok888,
Цитата:

Цитата ganselo
этот скриптик не хочит работать »

Вроде поправил... интересно, что у вас показывает Au3 Info Tool при навидении на тело папки (во вкладке «Visible Text»)?

ganselo 03-01-2009 20:02 996533

Цитата:

Цитата Creat0R
интересно, что у вас показывает Au3 Info Tool при навидении на тело папки (во вкладке «Visible Text»)? »

У меня показывает CabinetWClass

katok888 03-01-2009 20:04 996534

Creat0R,
Цитата:

Цитата Creat0R
интересно, что у вас показывает Au3 Info Tool при навидении на тело папки »

Код:

FolderView

ganselo 03-01-2009 20:10 996540

Цитата:

Цитата katok888
интересно, что у вас показывает Au3 Info Tool при навидении на тело папки »

Смотри скрин.
И еще... На Рабочем столе папки создаются, а в проводнике нет.

katok888 03-01-2009 20:18 996545

Все равно не работает

Frag-o-Matik 03-01-2009 20:26 996556

Помогите сделать небольшой скрипт, сам в программировании не силен
Смысл в том, что имеется запускной файл (допустим Zapusk.exe), при его запуске появляется окно с полосой проверки измененных файлов в папке "sys", после проверки в окне загорается кнопка "установить", после нажатия этой кнопки закрывается процесс Zapusk.exe и открывается Ustanovka.exe, вот надо чтобы после нажатия этой кнопки "установить" - процесс Ustanovka.exe не запустился, а сначала переименовывалась папка "sys" в папку "sys1", а после - папка "path" в папку "sys", и только потом с новой папки "1" запускался процесс Ustanovka.exe. Понимаю что заумно, но прошу помочь, вот код скрипта, где вопросы это то место где надо вставить то чего я не понимаю :)


Код:

If FileExists("path") Then
        RunWait("Zapusk.exe", "")
        ProcessWaitClose ( "Zapusk.exe" )

???; ВОТ ЗДЕСЬ Я НЕ ПОНИМАЮ ЧТО НАПИСАТЬ)

        DirMove("sys", "sys1")
        DirMove("path", "sys")
EndIf

ProcessWaitClose ( "Ustanovka.exe" )
DirMove("system", "path")
DirMove("system1", "system")
exit

Ну и соотвественно после закрытия процесса Ustanovka.exe, папки переименовывались назад, что выше уже написано в коде

Забыл сказать, просто так файл Ustanovka.exe не запустишь, тока через Zapusk.exe

Creat0R 04-01-2009 01:17 996735

ganselo, katok888,
У вас я так понял Vista? Я проверял на XP :shuffle:

Цитата:

Цитата ganselo
Смотри скрин »

А что во вкладке Hidden Text? :)

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

Код:

#NoTrayIcon

Opt("WinWaitDelay", 1)

Global $iDebug = True
Global
$sDebug_LogFile = @ScriptDir & "\DebugLog.log"

Global $sFileNameFormat = "New_%i"

HotKeySet("^+n", "_CreateFolder_Proc")  ;Ctrl + Shift + n
HotKeySet("^+w", "_Quit")              ;Ctrl + Shift + w

OnAutoItStart_Init()

While 1
    Sleep(1000)
WEnd

Func
_CreateFolder_Proc()
    _DebugToLog_Proc("_CreateFolder_Proc Call: Called by HotKey(" & @HotKeyPressed & ").")

    Local $sExplorer_Title = "[CLASS:CabinetWClass]"
    Local $sPath, $iFolder_Created = 0

    If Not WinActive($sExplorer_Title) Then $sExplorer_Title = "[CLASS:ExploreWClass]"
    If Not WinActive($sExplorer_Title) Then $sExplorer_Title = "[CLASS:Progman]"
    If Not WinActive($sExplorer_Title) Then _
        Return _DebugToLog_Proc("_CreateFolder_Proc Call: Dir creation is not possible in currently active window: " & _
            WinGetTitle("[ACTIVE]") & @CRLF)

    Switch $sExplorer_Title
        Case "[CLASS:CabinetWClass]", "[CLASS:ExploreWClass]"
            Local $sWin_Title = WinGetTitle($sExplorer_Title)
            Local $sWin_Text = WinGetText($sExplorer_Title)

            $sPath = StringRegExpReplace($sWin_Text, "(?s).*(\r\n|)(\w+:\\.*" & $sWin_Title & ")(\r\n|.*)", "\2")
        Case "[CLASS:Progman]"
            $sPath = @DesktopDir
        Case Else
            Return
_DebugToLog_Proc( _
                "_CreateFolder_Proc Call: " & _
                "Unexpected error (can not get window class name, perhaps a memory unavailable)." & @CRLF)
    EndSwitch

    _DebugToLog_Proc("_CreateFolder_Proc Call: Found active window with following Class Name: " & $sExplorer_Title)
    _DebugToLog_Proc("_CreateFolder_Proc Call: And with the following Title: " & WinGetTitle($sExplorer_Title))

    If Not StringInStr(FileGetAttrib($sPath), "D") Then $sPath = ControlGetText($sExplorer_Title, "", "Edit1")
    If Not StringInStr(FileGetAttrib($sPath), "D") Then _
        Return _DebugToLog_Proc("_CreateFolder_Proc Call: Path for creating folder was not found: " & $sPath)

    _DebugToLog_Proc("_CreateFolder_Proc Call: Detected path for creating folder in: " & $sPath)

    Local $iFolder_Num = 1
    Local $sNewFolderName = StringFormat($sFileNameFormat, $iFolder_Num)

    While StringInStr(FileGetAttrib($sPath & "\" & $sNewFolderName), "D")
        $iFolder_Num += 1
        $sNewFolderName = StringFormat($sFileNameFormat, $iFolder_Num)
    WEnd

    _DebugToLog_Proc("_CreateFolder_Proc Call: Creating folder with the following name: " & $sNewFolderName & "...")

    $iFolder_Created = DirCreate($sPath & "\" & $sNewFolderName)
    _DebugToLog_Proc("_CreateFolder_Proc Call: Folder created(?): " & ($iFolder_Created = 1) & @CRLF)
EndFunc  ;==>_CreateFolder_Proc

Func _DebugToLog_Proc($sDebug_Info)
    If Not $iDebug Then Return

    _FileWriteLogEx($sDebug_LogFile, $sDebug_Info & @CRLF)
EndFunc  ;==>_DebugToLog_Proc

Func _FileWriteLogEx($sLogPath, $sLogMsg, $iFlag = -1)
    Local $sDateNow, $sTimeNow, $sMsg, $iWriteFile, $hOpenFile, $iOpenMode = 1

    $sDateNow = @YEAR & "-" & @MON & "-" & @MDAY
    $sTimeNow = @HOUR & ":" & @MIN & ":" & @SEC

    $sMsg = $sDateNow & " " & $sTimeNow & ">> " & $sLogMsg

    If $iFlag <> -1 Then
        $sMsg &= FileRead($sLogPath)
        $iOpenMode = 2
    EndIf

    $hOpenFile = FileOpen($sLogPath, $iOpenMode)
    If $hOpenFile = -1 Then Return SetError(1, 0, 0)

    $iWriteFile = FileWriteLine($hOpenFile, $sMsg)
    If $iWriteFile = -1 Then Return SetError(2, 0, 0)

    Return FileClose($hOpenFile)
EndFunc  ;==>_FileWriteLogEx

Func _Quit()
    Exit
EndFunc
  ;==>_Quit

Func OnAutoItStart_Init()
    If $iDebug Then
        If
FileRead($sDebug_LogFile) <> "" Then
            _FileWriteLogEx($sDebug_LogFile, _
                StringFormat("============ Debug Log For [%s] Started ============\r\n\r\n...\r\n\r\n", @ScriptName))
        Else
            _FileWriteLogEx($sDebug_LogFile, StringFormat("============ Debug Log For [%s] Started...", @ScriptName))
            _FileWriteLogEx($sDebug_LogFile, StringFormat("============ Operating System: %s\r\n", @OSVersion))
            _FileWriteLogEx($sDebug_LogFile, StringFormat("============ Service Pack: %s\r\n", @OSServicePack))
            _FileWriteLogEx($sDebug_LogFile, _
                StringFormat("============ File System: %s ============\r\n\r\n...\r\n\r\n", DriveGetFileSystem(@HomeDrive)))
        EndIf
    EndIf
EndFunc
  ;==>OnAutoItStart_Init

Func OnAutoItExit()
    If $iDebug Then
        _FileWriteLogEx($sDebug_LogFile, _
            StringFormat("============ Debug Log Finished (EXIT CODE: %i) ============\r\n\r\n\r\n", @ScriptName, @exitCode))

        $iOpen_LogFile = MsgBox(36, @ScriptName & " - Attention", "Open Debug Log File?" & @CRLF & @CRLF & $sDebug_LogFile)
        If $iOpen_LogFile = 6 Then ShellExecute($sDebug_LogFile)
    EndIf
EndFunc
  ;==>OnAutoItExit


Maza Faka 04-01-2009 07:40 996827

Цитата:

Цитата Frag-o-Matik
Помогите сделать небольшой скрипт »

Довольно-таки сумбурное изложение проблемы :) Как я понял тебе нужно реализовать
Цитата:

окно с полосой проверки измененных файлов в папке "sys"
?

Frag-o-Matik 04-01-2009 08:57 996848

Цитата:

Цитата Maza Faka
окно с полосой проверки измененных файлов в папке "sys" »

нет)
Цитата:

Цитата Maza Faka
Довольно-таки сумбурное изложение проблемы »

ну не знаю как объяснить по другому, ща попытаюсь
вот структура папок:
Код:

-Path
      -*.ini
      -Ustanovka.exe
-Sys
      -*.ini
      -Ustanovka.exe
-Zapusk.exe

Запуск производится только файлом Zapusk.exe, который сначала проверяет ini файлы на изменения через сервер в интернете. После проверки в окне Zapusk.exe становится активной кнопка Установить, при нажатии которой запускается файл с папки Sys - Ustanovka.exe. Но прежде чем нажать эту кнопку, я запускаю бат файл (после проверки инишников), который подменяет папку систем со своими ини файлами и файлом Ustanovka.exe. Хотелось бы автоматизировать процесс, чтобы постоянно вручную не переименовывать папки, потому что иногда забываешь :)

katok888 04-01-2009 09:31 996860

Creat0R,
Код:

2009-01-04 09:29:03>> ============ Debug Log For [Folder.exe] Started...
2009-01-04 09:29:03>> ============ Operating System: WIN_XP
2009-01-04 09:29:03>> ============ Service Pack: Service Pack 3
2009-01-04 09:29:03>> ============ File System: NTFS ============

...

2009-01-04 09:29:37>> ============ Debug Log Finished (EXIT CODE: 0) ============


Maza Faka 04-01-2009 10:37 996885

Цитата:

Цитата Frag-o-Matik
Хотелось бы автоматизировать процесс, чтобы постоянно вручную не переименовывать папки »

Но ты ведь вроде ответил на свой вопрос?
Цитата:

If FileExists("path") Then
RunWait("Zapusk.exe", "")
ProcessWaitClose ( "Zapusk.exe" )

???; ВОТ ЗДЕСЬ Я НЕ ПОНИМАЮ ЧТО НАПИСАТЬ)

DirMove("sys", "sys1")
DirMove("path", "sys")
EndIf

ProcessWaitClose ( "Ustanovka.exe" )
DirMove("system", "path")
DirMove("system1", "system")
exit
Может так?
Код:

If FileExists("path") Then
        DirMove("sys", "sys1")
        DirMove("path", "sys")
       
        RunWait("Zapusk.exe", "")
        ProcessWaitClose("Zapusk.exe")
EndIf

ProcessWaitClose("Ustanovka.exe")
DirMove("system", "path")
DirMove("system1", "system")


Creat0R 04-01-2009 12:50 996973

katok888, Я не вижу что вообще была попытка создать папку, ведь для этого нужно нажать «Ctrl + Shift + N» :)

ganselo 04-01-2009 12:58 996977

Цитата:

Цитата Creat0R
лог в студию: »

Код:

2009-01-04 12:54:55>> ============ Debug Log For [AutoIt v3 Script.au3] Started...
2009-01-04 12:54:55>> ============ Operating System: WIN_XP
2009-01-04 12:54:55>> ============ Service Pack: Service Pack 2
2009-01-04 12:54:55>> ============ File System: NTFS ============

...

2009-01-04 12:55:04>> _CreateFolder_Proc Call: Found active window with following Class Name: [CLASS:Progman]
2009-01-04 12:55:04>> _CreateFolder_Proc Call: And with following Title: Program Manager
2009-01-04 12:55:04>> _CreateFolder_Proc Call: Detected path for creating folder in: C:\Documents and Settings\gansello\Рабочий стол
2009-01-04 12:55:04>> _CreateFolder_Proc Call: Creating folder with the following name: New_1...
2009-01-04 12:55:04>> _CreateFolder_Proc Call: Folder created(?): True

2009-01-04 12:55:13>> _CreateFolder_Proc Call: Found active window with following Class Name: [CLASS:CabinetWClass]
2009-01-04 12:55:13>> _CreateFolder_Proc Call: And with following Title: Multimedia (D:)
2009-01-04 12:55:13>> _CreateFolder_Proc Call: Path for creating folder was not found:
2009-01-04 12:55:17>> _CreateFolder_Proc Call: Found active window with following Class Name: [CLASS:CabinetWClass]
2009-01-04 12:55:17>> _CreateFolder_Proc Call: And with following Title: Multimedia (D:)
2009-01-04 12:55:17>> _CreateFolder_Proc Call: Path for creating folder was not found:

Цитата:

Цитата Creat0R
А что во вкладке Hidden Text? »

Пусто.

katok888 04-01-2009 13:15 996989

Creat0R, Ну так я и нажимал

Creat0R 04-01-2009 13:28 996994

ganselo, katok888,
Проблему нашёл вроде, у вас адресная строка выключенна в проводнике? :) - Щас попробую найти решение...

ganselo 04-01-2009 13:29 996995

Цитата:

Цитата Creat0R
у вас адресная строка выключенна в проводнике »

У меня да.

katok888 04-01-2009 13:39 997000

Цитата:

Цитата Creat0R
Проблему нашёл вроде, у вас адресная строка выключенна в проводнике? »

У меня вообще QTadressbar

ganselo 04-01-2009 14:00 997017

Включил адресную строку и всё заработало.

Creat0R 04-01-2009 15:50 997099

Вообщем вот ещё одна версия, если путь не найден, путь определяется методом создания временного файла с использованием буфера обмена. Есть также метод где происходит откат адресной строки, для этого нужно установить 1 у переменной $iGet_Path_Method. Так или иначе, оба метода не самые надёжные :beta: :jester:

* Также добавил поддержку очерёдности запуска функции - По идее, если нажимать заветные горячие клавиши несколько раз подряд, то папки будут создаваться по очерёдно, в логе будет это записано (попытка двойного вызова, и запись с очереди).

Код:

#NoTrayIcon
#include
<File.au3>
#include <Misc.au3>

_Singleton("_CreateFolder_Proc")

Opt("WinWaitDelay", 1)

Global $i_CreateFolder_Proc_IsRuning    = False

Global
$iQueue_Calls                    = 0

Global $iDebug                          = True
Global $sDebug_LogFile                  = @ScriptDir & "\DebugLog.log"

Global $iGet_Path_Method                    = -1
Global $sFileNameFormat                = "New_%i"

HotKeySet("^+n", "_CreateFolder_Proc")  ;Ctrl + Shift + n
HotKeySet("^+т", "_CreateFolder_Proc")  ;Ctrl + Shift + n
HotKeySet("^+w", "_Quit")              ;Ctrl + Shift + w
HotKeySet("^+ц", "_Quit")              ;Ctrl + Shift + w

OnAutoItStart_Init()

While 1
    Sleep(1000)

    If $iQueue_Calls > 0 Then
        For $i = 1 To $iQueue_Calls
            _CreateFolder_Proc($i)
        Next
    EndIf
WEnd

Func _CreateFolder_Proc($iQueue_Call=0)
    If $i_CreateFolder_Proc_IsRuning Then
        $iQueue_Calls += 1
        Return _DebugToLog_Proc("_CreateFolder_Proc Call: ### Double Call Try... Added to the Queue (#" & $iQueue_Calls & ").")
    EndIf

    $i_CreateFolder_Proc_IsRuning = True

    Local $s_CreateFolder_Proc_DebugData = "_CreateFolder_Proc Call: Called by HotKey(" & @HotKeyPressed & ")"

    If IsDeclared("iQueue_Call") And $iQueue_Call > 0 Then
        $s_CreateFolder_Proc_DebugData &= " ==> Queue Call #" & $iQueue_Call
        $iQueue_Calls -= 1
    EndIf

    _DebugToLog_Proc($s_CreateFolder_Proc_DebugData & ".")

    Local $sExplorer_Title = "[CLASS:CabinetWClass]"
    Local $sPath, $iFolder_Created = 0

    If Not WinActive($sExplorer_Title) Then $sExplorer_Title = "[CLASS:ExploreWClass]"
    If Not WinActive($sExplorer_Title) Then $sExplorer_Title = "[CLASS:Progman]"

    If Not WinActive($sExplorer_Title) Then
        $i_CreateFolder_Proc_IsRuning = False

        Return _DebugToLog_Proc("_CreateFolder_Proc Call: Dir creation is not possible in currently active window: " & _
            WinGetTitle("[ACTIVE]") & @CRLF)
    EndIf

    Switch $sExplorer_Title
        Case "[CLASS:CabinetWClass]", "[CLASS:ExploreWClass]"
            Local $sWin_Title = WinGetTitle($sExplorer_Title)
            Local $sWin_Text = WinGetText($sExplorer_Title)

            $sPath = StringRegExpReplace($sWin_Text, "(?s).*(\r\n|)(\w+:\\.*" & $sWin_Title & ")(\r\n|.*)", "\2")
        Case "[CLASS:Progman]"
            $sPath = @DesktopDir
        Case Else
            $i_CreateFolder_Proc_IsRuning = False

            Return _DebugToLog_Proc( _
                "_CreateFolder_Proc Call: " & _
                "Unexpected error (can not get window class name, perhaps a memory unavailable)." & @CRLF)
    EndSwitch

    _DebugToLog_Proc("_CreateFolder_Proc Call: Found active window with following Class Name: " & $sExplorer_Title)
    _DebugToLog_Proc("_CreateFolder_Proc Call: And with the following Title: " & WinGetTitle($sExplorer_Title))

    If Not StringInStr(FileGetAttrib($sPath), "D") Then $sPath = ControlGetText($sExplorer_Title, "", "Edit1")

    If Not StringInStr(FileGetAttrib($sPath), "D") Then
        _DebugToLog_Proc("_CreateFolder_Proc Call: Path for creating folder was not found... ")
        _DebugToLog_Proc("_CreateFolder_Proc Call: Trying to get path in a hard way :)... (MODE: " & $iGet_Path_Method & ")")

        Switch $iGet_Path_Method
            Case 1
                ControlSend($sExplorer_Title, "", "ToolbarWindow322", "!в{Right}{Down}{Enter}")

                Sleep(200)

                $sPath = ControlGetText($sExplorer_Title, "", "Edit1")

                ControlSend($sExplorer_Title, "", "ToolbarWindow322", "!в{Right}{Down}{Enter}")
            Case Else
                Local $sTmp_File = _TempFile(@TempDir, "~__Au3_DirCreate_Tmp_Module__")
                Local $sTmp_FileName = StringRegExpReplace($sTmp_File, "^.*\\|\.[^\.]*$", "")

                Local $hOpenFile = FileClose(FileOpen($sTmp_File, 2))

                _ClipPutFile($sTmp_File)
                If @error Then _DebugToLog_Proc("_CreateFolder_Proc Call: _ClipPutFile Failed.")

                ControlSend($sExplorer_Title, "", "SysListView321", "+{Insert}")

                Sleep(500)

                $iItem = ControlListView($sExplorer_Title, "", "SysListView321", "FindItem", $sTmp_FileName)

                ControlListView($sExplorer_Title, "", "SysListView321", "SelectClear")
                ControlListView($sExplorer_Title, "", "SysListView321", "Select", $iItem, $iItem)

                Sleep(200)

                ControlSend($sExplorer_Title, "", "SysListView321", "^{Insert}")

                Sleep(500)

                $sPath = ClipGet()
                If @error Then _DebugToLog_Proc("_CreateFolder_Proc Call: ClipGet() Failed (ERROR: " & @error & ").")

                If StringInStr($sPath, @CRLF) Then _
                    $sPath = StringLeft($sPath, StringInStr($sPath, @CRLF)-1)

                $sPath = StringLeft($sPath, StringInStr($sPath, "\", 0, -1)-1)

                FileDelete($sPath & "\" & $sTmp_FileName & ".tmp")
                FileDelete($sTmp_File)
        EndSwitch

        If Not StringInStr(FileGetAttrib($sPath), "D") Then
            $i_CreateFolder_Proc_IsRuning = False

            Return _DebugToLog_Proc("_CreateFolder_Proc Call: Path for creating folder was not found: " & $sPath)
        EndIf
    EndIf

    _DebugToLog_Proc("_CreateFolder_Proc Call: Detected path for creating folder in: " & $sPath)

    Local $iFolder_Num = 1
    Local $sNewFolderName = StringFormat($sFileNameFormat, $iFolder_Num)

    While StringInStr(FileGetAttrib($sPath & "\" & $sNewFolderName), "D")
        $iFolder_Num += 1
        $sNewFolderName = StringFormat($sFileNameFormat, $iFolder_Num)
    WEnd

    _DebugToLog_Proc("_CreateFolder_Proc Call: Creating folder with the following name: " & $sNewFolderName & "...")

    $iFolder_Created = DirCreate($sPath & "\" & $sNewFolderName)
    _DebugToLog_Proc("_CreateFolder_Proc Call: Folder created(?): " & ($iFolder_Created = 1) & @CRLF)

    $i_CreateFolder_Proc_IsRuning = False
EndFunc  ;==>_CreateFolder_Proc

Func _DebugToLog_Proc($sDebug_Info)
    If Not $iDebug Then Return

    _FileWriteLogEx($sDebug_LogFile, $sDebug_Info & @CRLF)
EndFunc  ;==>_DebugToLog_Proc

Func _FileWriteLogEx($sLogPath, $sLogMsg, $iFlag = -1)
    Local $sDateNow, $sTimeNow, $sMsg, $iWriteFile, $hOpenFile, $iOpenMode = 1

    $sDateNow = @YEAR & "-" & @MON & "-" & @MDAY
    $sTimeNow = @HOUR & ":" & @MIN & ":" & @SEC

    $sMsg = $sDateNow & " " & $sTimeNow & ">> " & $sLogMsg

    If $iFlag <> -1 Then
        $sMsg &= FileRead($sLogPath)
        $iOpenMode = 2
    EndIf

    $hOpenFile = FileOpen($sLogPath, $iOpenMode)
    If $hOpenFile = -1 Then Return SetError(1, 0, 0)

    $iWriteFile = FileWriteLine($hOpenFile, $sMsg)
    If $iWriteFile = -1 Then Return SetError(2, 0, 0)

    Return FileClose($hOpenFile)
EndFunc  ;==>_FileWriteLogEx

Func _Quit()
    Exit
EndFunc  ;==>_Quit

Func OnAutoItStart_Init()
    If $iDebug Then
        If FileRead($sDebug_LogFile) <> "" Then
            _FileWriteLogEx($sDebug_LogFile, _
                StringFormat("============ Debug Log For [%s] Started ============\r\n\r\n...\r\n\r\n", @ScriptName))
        Else
            _FileWriteLogEx($sDebug_LogFile, StringFormat("============ Debug Log For [%s] Started...", @ScriptName))
            _FileWriteLogEx($sDebug_LogFile, StringFormat("============ Operating System: %s\r\n", @OSVersion))
            _FileWriteLogEx($sDebug_LogFile, StringFormat("============ Service Pack: %s\r\n", @OSServicePack))
            _FileWriteLogEx($sDebug_LogFile, _
                StringFormat("============ File System: %s ============\r\n\r\n...\r\n\r\n", DriveGetFileSystem(@HomeDrive)))
        EndIf
    EndIf
EndFunc  ;==>OnAutoItStart_Init

Func OnAutoItExit()
    If $iDebug Then
        _FileWriteLogEx($sDebug_LogFile, _
            StringFormat("============ Debug Log Finished (EXIT CODE: %i) ============\r\n\r\n\r\n", @ScriptName, @exitCode))

        $iOpen_LogFile = MsgBox(36, @ScriptName & " - Attention", "Open Debug Log File?" & @CRLF & @CRLF & $sDebug_LogFile)
        If $iOpen_LogFile = 6 Then ShellExecute($sDebug_LogFile, "", "", "Open", @SW_SHOWNORMAL)
    EndIf
EndFunc  ;==>OnAutoItExit


Frag-o-Matik 04-01-2009 18:42 997247

Цитата:

Цитата Maza Faka
Может так?
Код:
If FileExists("path") Then
DirMove("sys", "sys1")
DirMove("path", "sys")
RunWait("Zapusk.exe", "")
ProcessWaitClose("Zapusk.exe")
EndIf
ProcessWaitClose("Ustanovka.exe")
DirMove("system", "path")
DirMove("system1", "system") »

если будет так, то сразу после запуска файла zapusk.exe он мне обновит все пропатченные файлы, уже в переименованной папке :)

SAOPP 05-01-2009 01:44 997529

Ребят, прошу помощи по следующему вопросу, я уже как-то постил подобное, но вот сегодня решил всё же решить, если это решаемо.

Есть окно с вот таким заголовком:

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

Можно попросить кого-нить, если не затруднит написать скриптик подобный, если достаточно того, что я предоставил, т.е. заголовок содержит SoulSeek? Заранее благодарен.

Creat0R 05-01-2009 01:50 997531

Цитата:

Цитата SAOPP
Нужно его свернуть, но только что бы скрипт например отработал после своего запуска через определённое количество секунд, например 5. »

Код:

$iTimer = TimerInit()

While 1
    If $iTimer <> 0 And TimerDiff($iTimer) >= 5000 Then
        $iTimer = 0

        WinSetState("SoulSeek", "", @SW_MINIMIZE)
    EndIf

    Sleep(10)
WEnd

;Или сразу паузу ставить...

Sleep(5000)
WinSetState("SoulSeek", "", @SW_MINIMIZE)


shyra1976 05-01-2009 11:22 997711

Код:

_Test()
If @error Then MsgBox(0, "", "::: ERROR :::")

Func _Test()
    $AnswTest = MsgBox(4, "TEST", "Test Passed?")
    If $AnswTest = 7 Then ; NO (Test Failed)
        $Answ = MsgBox(21, "Error", "Communication ERROR")
        Select
            Case
$Answ = 4 ;Retry
                _Test()
            Case $Answ = 2 ;Cancel
;~              ConsoleWrite($Answ & @LF)

                Return SetError(1)
        EndSelect
    EndIf

    ConsoleWrite(@error & @LF)
    ConsoleWrite("Test Passed" & @LF)
    Return
EndFunc
  ;==>_Test



мужики,помогите
Есть рекурсия , она вызывает сому себя .А когда выходит закрывает себя столко раз сколко открыла себя
Вопрос : как сделат так ,что бы Return SetError(1) деиствително возврощал "1" после закритии рекурсии
Да же если она откривалась несколко раз

Creat0R 05-01-2009 12:27 997743

Цитата:

Цитата shyra1976
как сделат так ,что бы Return SetError(1) деиствително возврощал "1" после закритии рекурсии »

Нужно ещё проверять @error после отработки рекурсии:

Код:

_Test()
If @error Then MsgBox(0, "", "::: ERROR :::")

Func _Test()
    $AnswTest = MsgBox(4, "TEST", "Test Passed?")
    If $AnswTest = 7 Then ; NO (Test Failed)
        $Answ = MsgBox(21, "Error", "Communication ERROR")
        Select
            Case
$Answ = 4 ;Retry
                _Test()
                Return SetError(@error)
            Case $Answ = 2 ;Cancel
;~              ConsoleWrite($Answ & @LF)

                Return SetError(1)
        EndSelect
    EndIf

    ConsoleWrite(@error & @LF)
    ConsoleWrite("Test Passed" & @LF)
    Return
EndFunc
  ;==>_Test

А вообще подобное циклами делается, на рекурсию есть ограничение:

Код:

_Test()
If @error Then MsgBox(0, "", "::: ERROR :::")

Func _Test()
    While 1
        $AnswTest = MsgBox(4, "TEST", "Test Passed?")

        If $AnswTest = 7 Then ; NO (Test Failed)
            $Answ = MsgBox(21, "Error", "Communication ERROR")

            Switch $Answ
                Case 4 ;Retry
                    ContinueLoop
                Case 2 ;Cancel
                    Return SetError(1)
            EndSwitch
        EndIf

        ExitLoop
    WEnd

    ConsoleWrite(@error & @LF)
    ConsoleWrite("Test Passed" & @LF)
EndFunc  ;==>_Test

Забавно что Jos дал почти такой же ответ, но у него способ без рекурсии попроще/покороче :).

SAOPP 05-01-2009 13:35 997819

Creat0R, а можно что бы после завершения своих действий, скрипт закрывался?

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

shyra1976 05-01-2009 13:38 997824

Creat0R,
спасибо тебе ,и здоровья бычьего ,что бы мог дальше отвечат на наши вопроси

Creat0R 05-01-2009 14:25 997871

Цитата:

Цитата SAOPP
можно что бы после завершения своих действий, скрипт закрывался? »

Он закрывается, просто там ведь пауза стоит в 5 секунд ;)

Цитата:

Цитата SAOPP
можно ли сделать так, что бы скрипт кликал мышкой на кнопочку свернуть, поскольку текущие параметры не сворачивают SS в трей, он по прежнему ложится на панель задач »

Кликнуть можно по координатам кнопки сворачивания (в «AutoIt Info Tool» можно их посмотреть наведя курсор мышки на кнопку) с помощью MouseClick. Но это не надёжно :(.

SAOPP 05-01-2009 14:30 997881

Цитата:

Цитата Creat0R
Он закрывается, просто там ведь пауза стоит в 5 секунд »

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

Цитата:

Цитата Creat0R
Кликнуть можно по координатам кнопки сворачивания (в «AutoIt Info Tool» можно их посмотреть наведя курсор мышки на кнопку) с помощью MouseClick. Но это не надёжно »

Почему? Тогда, думаю, решить проблему не удастся :(

Creat0R 05-01-2009 14:34 997885

Цитата:

Цитата SAOPP
увы, он остаётся по прежнему в трее »

А если так:

Код:

Sleep(5000)
WinSetState("SoulSeek", "", @SW_MINIMIZE)

:)

Цитата:

Цитата SAOPP
Почему? »

Хотябы потому что координаты меняются, например при перемещении окна :) Можно ещё попробовать просто спрятать окно (заменить @SW_MINIMIZE на @SW_HIDE), но сомневаюсь что оно спрячется таким образом в трей :(

SAOPP 05-01-2009 14:44 997893

Цитата:

Цитата Creat0R
Хотябы потому что координаты меняются, например при перемещении окна Можно ещё попробовать просто спрятать окно (заменить @SW_MINIMIZE на @SW_HIDE), но сомневаюсь что оно спрячется таким образом в трей »

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

Цитата:

Цитата Creat0R
А если так:
Код:

Sleep(5000)
WinSetState("SoulSeek", "", @SW_MINIMIZE) [post=997885]»[/post]


Это куда посдтавить, перед WinSetState("SoulSeek", "", @SW_MINIMIZE)?

Код:

$iTimer = TimerInit()

While 1
    If $iTimer <> 0 And TimerDiff($iTimer) >= 5000 Then
        $iTimer = 0

        Sleep(5000)
        WinSetState("SoulSeek", "", @SW_MINIMIZE)

    EndIf

    Sleep(10)
WEnd


Creat0R 05-01-2009 14:46 997896

Можно ещё так попробовать:

Код:

Sleep(5000)

WinActivate("SoulSeek")
WinWaitActive("SoulSeek", "", 5)

If WinActive("SoulSeek") Then
    $iLeft_Min_Button = 70 ;Указывает отступ кнопки сворачивания с правой стороны у окна
    $aWin_Pos = WinGetPos("SoulSeek")

    Opt("MouseCoordMode", 0)

    $aMouse_Pos = MouseGetPos()
    MouseClick("Main", $aWin_Pos[0]+$aWin_Pos[2]-$iLeft_Min_Button, 10, 1, 0)
    MouseMove($aMouse_Pos[0], $aMouse_Pos[1], 0)
EndIf

Переменную $iLeft_Min_Button возможно нужно изменить, в зависимости от того где будет кликать мышка, чтобы это проверить, нужно закомментировать строку с возвратом мышки на исходную позицию (MouseMove(...)).

Цитата:

Цитата SAOPP
Это куда посдтавить »

Это не нужно, я в первом скрипте просто привёл два разных примера, первый с циклом, второй с паузой.

SAOPP 05-01-2009 14:59 997906

Последний скрипт прекрасно работает :) Теперь нужно только его сопоставить правильно доя работы :) Спасибо огромное.

Причём работает он на любом окне, не зависимо от заголовка насколько я понял - прав?

Creat0R 05-01-2009 15:06 997917

Цитата:

Цитата SAOPP
Причём работает он на любом окне, не зависимо от заголовка »

Ну почему, только на окне которое содержит в заголовке "SoulSeek" :)

SAOPP 05-01-2009 15:15 997926

Почему тогда Тотал Коммендер он тоже сворачивает? :)

SAOPP 05-01-2009 15:44 997952

Или Оперу :)

beve 05-01-2009 16:49 998014

Вложений: 1
Такой вопрос, помогите: мучаюсь, не могу реализовать свои замыслы. Вот в этом примере:proba.au3 :
читать дальше »
Код:

#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>

#Region ### START Koda GUI section ### Form=
$Form = GUICreate("Dialog", 316, 273, 360, 243)
GUISetIcon("D:\003.ico")
$Button1 =
GUICtrlCreateButton("OK", 1, 235, 75, 25, 0)
$Button2 =
GUICtrlCreateButton("Очистить", 119, 235, 75, 25, 0)
$Button3 =
GUICtrlCreateButton("Выход", 234, 235, 75, 25, 0)
$Edit =
GUICtrlCreateEdit("" & @CRLF, 0, 88, 169, 81, $ES_AUTOVSCROLL + $WS_VSCROLL)
GUICtrlSetLimit($Edit, 100)
$Combo =
GUICtrlCreateCombo("Ваш Выбор:", 8, 8, 297, 25)
GUICtrlSetData(-1, '1|2|', '')

$Label1 =
GUICtrlCreateLabel("Осталось символов:", 8, 48, 109, 17)
$neizvesno =
GUICtrlCreateLabel("???", 120, 48, 36, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
   
$nMsg =
GUIGetMsg()
   
Switch $nMsg
       
Case $GUI_EVENT_CLOSE,$Button3
           
Exit
        Case
$Button1
                 
_Getpicture()
   
EndSwitch
WEnd

Func
_Getpicture()
   
$i=
GUICtrlRead($Combo)
       
Switch $i
       
Case 1
GUICtrlCreatePic(@WindowsDir & "\Штукатурка.bmp", 208, 96, 81, 65)       
       
Case 2
GUICtrlCreatePic(@WindowsDir & "\Пузыри.bmp", 208, 96, 81, 65)         
       
Case Else
MsgBox(0,
Default, 'Сделайте выбор в элементе Combo')
       
EndSwitch
 
EndFunc   


Хочу чтоб появлялся рисунок при выборе из Combo (примерно так как появляется, когда я нажимаю на кнопку ОК), но только при выборе из элемента Combo и без нажатия на кнопку ОК. Тоесть выбрал 1 - рисунок поменялся, 2-тоже. И еще, как подключить кнопку Очистить на очистку поля Edit. И еще не могу придумать, чтоб там где у меня $neizvesno велся отсчет от ограничения на ввод символов(у меня100) и до 0 при вводе символов в поле Edit(тоесть сначала там 100, а ввел 1символ - стало 99. Вот такая сложная задача, Сегодня окончил читать тему, все 143 страницы, паралельно изучаю справку, и на Ru.Board сижу, - решения не нашел. Хоть совет прошу.
P.S.

Рисунки взял первые на выбор, можно любыми заменить небольшого формата!(но если нету никаких ?!, то в прикрепленном файле они).
Я на Полезное сообщение нажимал уже не раз, а у меня написано - благодарности 0. Не подумайте что мне сказать спасибо трудно, не знаю еще как...

shyra1976 05-01-2009 17:13 998045

beve, dobav Штукатурка.bmp
Пузыри.bmp

BonD 007 05-01-2009 17:47 998084

Цитата:

Цитата ganselo
Включил адресную строку и всё заработало. »

Везёт. У меня так и не заработало, хоть адресная строка и включена. И 1 пробовал ставить у переменной $iGet_Path_Method, и на рабочем столе тыкал CTRL+CHIFT+N... папка не создаётся. Лог всё время такой:
2009-01-05 16:31:01>> ============ Debug Log For [AutoIt v3 Script.au3] Started...
2009-01-05 16:31:01>> ============ Operating System: WIN_XP
2009-01-05 16:31:01>> ============ Service Pack: Service Pack 3
2009-01-05 16:31:01>> ============ File System: FAT32 ============

...

2009-01-05 16:31:38>> ============ Debug Log Finished (EXIT CODE: 0) ============

katok888 05-01-2009 18:24 998112

BonD 007, То же самое, только
Код:

File System: NTFS
Ну и фиг с ним, я просто ради интереса
пробовал.

Creat0R 05-01-2009 21:51 998264

Цитата:

Цитата SAOPP
Почему тогда Тотал Коммендер он тоже сворачивает? »

Странно, не должен он этого делать, возможно запущен другой скрипт, предыдущий, который в цикле всё и сворачивает? :) Попробуй в процессах "убить" все AutoIt3.exe.

BonD 007, katok888,
Цитата:

Лог всё время такой
У вас раскладка клавиатуры по умолчанию какая? Попробуйте в скрипте ещё добавить и это:

Код:

HotKeySet("^+т", "_CreateFolder_Proc")
HotKeySet("^+ц", "_Quit")

Хотя странно что всё же скрипт завершается по «Ctrl + Shift + W» (судя по логу).

Ещё одна вероятная причина, какое то другое приложение перехватывает эти клавиши (Ctrl + Shift + N), если добавление строчек выше не поможет, попробуйте сменить клавиши в скрипте, например на «^n» (Ctrl + N).

BonD 007 05-01-2009 22:34 998283

Цитата:

Цитата Creat0R
HotKeySet("^+т", "_CreateFolder_Proc") HotKeySet("^+ц", "_Quit") »

Заработало. Creat0R, спасибище тебе огромное. Странно, что раньше не работало даже при смене раскладке клавиатуры (не по умолчанию которая, а просто).
Цитата:

Цитата Creat0R
Хотя странно что всё же скрипт завершается по «Ctrl + Shift + W» (судя по логу). »

Я просто убрал строку #NoTrayIcon и завершал через трей.

SAOPP 05-01-2009 22:45 998292

Creat0R, да ну какие процессы о чём вы? :) Говорю же он сворачивает все подряд окна без разбора, СоулСик это или нет...

Creat0R 05-01-2009 22:51 998296

Цитата:

Цитата SAOPP
он сворачивает все подряд окна без разбора, СоулСик это или нет... »

Кто-то ещё может подтвердить данное поведение, у меня такого не наблюдается :(

SAOPP 05-01-2009 22:59 998302

Раз такие дела, то пожалуйста проверьте уж пожалуйста :)

ssms.exe

Creat0R 05-01-2009 23:16 998314

Цитата:

Цитата SAOPP
проверьте уж пожалуйста »

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

SAOPP 05-01-2009 23:25 998321

А что в нём подозрительного? SoulSeek Minimize Script сумбурный набор букв.
Внутри это:
Код:

Sleep(5000)

WinActivate("SoulSeek")
WinWaitActive("SoulSeek", "", 5)

If WinActive("SoulSeek") Then
    $iLeft_Min_Button = 70 ;Указывает отступ кнопки сворачивания с правой стороны у окна
    $aWin_Pos = WinGetPos("SoulSeek")

    Opt("MouseCoordMode", 0)

    $aMouse_Pos = MouseGetPos()
    MouseClick("Main", $aWin_Pos[0]+$aWin_Pos[2]-$iLeft_Min_Button, 10, 1, 0)
    MouseMove($aMouse_Pos[0], $aMouse_Pos[1], 0)
EndIf

Где камни?

Цитата:

Цитата Creat0R
Я проверяю со скриптом который я и запостил тут, с ним у меня проблем нет, даже если он скомпилирован. »

У меня тоже никаких проблем нет - проблема одна, вы говорите, что он должен работать только с окном Суслика...
Вы пробовали мой срипт?

Creat0R 05-01-2009 23:35 998329

beve
Цитата:

Цитата beve
Вот такая сложная задача »

У меня ушло на неё 10 минут ;)

Код:

#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ComboConstants.au3>

$hForm = GUICreate("Dialog", 316, 273, 360, 243)
GUISetIcon("D:\003.ico")

$nOK_Button = GUICtrlCreateButton("OK", 1, 235, 75, 25, 0)
$nClean_Button = GUICtrlCreateButton("Очистить", 119, 235, 75, 25, 0)
$nExit_Button = GUICtrlCreateButton("Выход", 234, 235, 75, 25, 0)

$nEdit = GUICtrlCreateEdit("" & @CRLF, 0, 88, 169, 81, BitOR($ES_AUTOVSCROLL, $WS_VSCROLL))
GUICtrlSetLimit($nEdit, 100)

$nCombo = GUICtrlCreateCombo("Ваш Выбор:", 8, 8, 297, 25, BitOr($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))
GUICtrlSetData(-1, '1|2|')

GUICtrlCreateLabel("Осталось символов:", 8, 48, 109, 17)
$nCount_Label = GUICtrlCreateLabel(100-StringLen(GUICtrlRead($nEdit)), 120, 48, 36, 17)

$nPic = GUICtrlCreatePic("", 208, 96, 81, 65)

GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

While 1
    $nMsg = GUIGetMsg()

    Switch $nMsg
        Case $GUI_EVENT_CLOSE, $nExit_Button
            Exit
        Case
$nClean_Button
            GUICtrlSetData($nEdit, "")
        Case $nOK_Button
            _GetPicture()
        Case $nCombo
            _GetPicture()
    EndSwitch
WEnd

Func
_GetPicture()
    Switch GUICtrlRead($nCombo)
        Case 1
            GUICtrlSetImage($nPic, @WindowsDir & "\Штукатурка.bmp")
        Case 2
            GUICtrlSetImage($nPic, @WindowsDir & "\Пузыри.bmp")
        Case Else
            MsgBox(0, Default, 'Сделайте выбор в списке', 0, $hForm)
    EndSwitch
EndFunc

Func
WM_COMMAND($hWnd, $nMsg, $wParam, $lParam)
    Local $nNotifyCode = BitShift($wParam, 16)
    Local $nID = BitAND($wParam, 0xFFFF)

    Switch $nID
        Case $nEdit
            Switch $nNotifyCode
                Case $EN_UPDATE
                    GUICtrlSetData($nCount_Label, 100-StringLen(GUICtrlRead($nID)))
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc

Цитата:

Цитата SAOPP
что в нём подозрительного? »

Есть похожие трояны

Цитата:

Цитата SAOPP
Вы пробовали мой срипт? »

Да, ничего лишнего не сворачивает, только если есть коно с заголовком SoulSeek :)

SAOPP 05-01-2009 23:46 998338

Тогда я не приложу ума, в чём может быть причина такого поведения, может быть из-за того, что заголовок содержит не толь SoulSeek?

AutoIt может путаться из-за двух экранов?

Creat0R 05-01-2009 23:57 998346

SAOPP,
А если так:

Код:

Sleep(5000)

$sTitle = "SoulSeek"

WinActivate($sTitle)
WinWaitActive($sTitle, "", 5)

If WinActive($sTitle) Then
    $iLeft_Min_Button = 70 ;Указывает отступ кнопки сворачивания с правой стороны у окна
    $aWin_Pos = WinGetPos($sTitle)

    ;$iOld_Opt_MCM = Opt("MouseCoordMode", 0)
    $aMouse_Pos = MouseGetPos()

    MouseClick("Main", $aWin_Pos[0]+$aWin_Pos[2]-$iLeft_Min_Button, $aWin_Pos[1]+10, 1, 0)
    ;Opt("MouseCoordMode", $iOld_Opt_MCM)

    MouseMove($aMouse_Pos[0], $aMouse_Pos[1], 0)
EndIf

Цитата:

Цитата SAOPP
может быть из-за того, что заголовок содержит не толь SoulSeek? »

Скрипт обрабатывает только окно с заголовком в котором содержиться «SoulSeek».

Цитата:

Цитата SAOPP
AutoIt может путаться из-за двух экранов? »

Не приходилось сталкиваться, но всякое может быть...

SAOPP 06-01-2009 00:04 998348

Курсор мигает там где находится кнопка минимизировать, но ничего не происходит...

Ага это было из-за отступа, он был почти по середине между минимизировать и развернуть. Поставил 72, сам перешёл в окну Сусла и свернул, чужие теперь не сворачивает, ещё щас поиграюсь с отступом, спасибо ;)

Creat0R 06-01-2009 00:11 998354

Цитата:

Цитата SAOPP
это было из-за отступа »

Я же говорил что это не надёжный метод :biggrin:

SAOPP 06-01-2009 00:12 998355

Хаха, нет же, сворачивает любое окно!

Creat0R 06-01-2009 00:35 998363

Цитата:

Цитата SAOPP
сворачивает любое окно! »

Тест скрипт:

Код:

$sTitle = "SoulSeek"

WinActivate($sTitle)
WinWaitActive($sTitle, "", 5)

If WinActive($sTitle) Then MsgBox(64, "Test", "Active Window Title: " & WinGetTitle("[Active]"))

Что выдаёт?

SAOPP 06-01-2009 00:39 998364

Щас провертю. Я думаю может быть указать как окно его индефикатор?

Creat0R 06-01-2009 00:40 998365

Цитата:

Цитата beve
Я на Полезное сообщение нажимал уже не раз, а у меня написано - благодарности 0 »

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

SAOPP 06-01-2009 00:41 998368

Выдаёт текущий заголовок окна...

Причём всегда выдаёт только Суслика, даже если он в трее...

Creat0R 06-01-2009 00:51 998376

Цитата:

Цитата SAOPP
Выдаёт текущий заголовок окна...
Причём всегда выдаёт только Суслика »

Вот тут я понять не смог, конкретно, какой заголовок возвращается? Вместо MsgBox можно подставить ClipPut(WinGetTitle("[Active]")), тогда заголовок попадёт сразу в буфер обмена :)

Дубль №3:

Код:

Sleep(5000)

$sTitle = "SoulSeek"

If Not BitAND(WinGetState($sTitle), 2) Then Exit

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

If BitAND(WinGetState($sTitle), 8) Then
    $iLeft_Min_Button = 70 ;Указывает отступ кнопки сворачивания с правой стороны у окна

    $aWin_Pos = WinGetPos($sTitle)
    $aMouse_Pos = MouseGetPos()

    MouseClick("Main", $aWin_Pos[0]+$aWin_Pos[2]-$iLeft_Min_Button, $aWin_Pos[1]+10, 1, 0)
    Sleep(10)
    MouseMove($aMouse_Pos[0], $aMouse_Pos[1], 0)
EndIf

P.S
Сколько примерно времени скрипт ожидает прежде чем свернуть окно? Если около 10-ти секунд значит проблема в распознавании окна, но возможно тут ошибка (баг?) в функции WinActive...

SAOPP 06-01-2009 01:06 998391

Цитата:

Цитата Creat0R
Вот тут я понять не смог, конкретно, какой заголовок возвращается? Вместо MsgBox можно подставить ClipPut(WinGetTitle("[Active]")), тогда заголовок попадёт сразу в буфер обмена »

Заголовок всегда окна Суслика.

Ну теперь вроде бы сворачивает ТОЛЬКО СС. Утром ещё потестирую, спасибо за возьню, ещё отпишу ;)

Creat0R 06-01-2009 01:26 998403

Цитата:

Цитата SAOPP
Заголовок всегда окна Суслика »

Нашёл вообщем багу в WinActive (или в WinActivate), возвращает 1 если скрытое окно активируется, нужно зарепортить...

Код:

#include <GuiConstants.au3>

GUICreate("Test GUI", 300, 200)
GUISetState(@SW_HIDE)

$sTitle = "Test GUI"
WinActivate($sTitle)

$IsActive_1 = (WinActive($sTitle) = 1)
$IsActive_2 = (BitAND(WinGetState($sTitle), 8) = 8)

;Окно то скрытое, как оно может быть активно?
ConsoleWrite("Win Is Visible: " & (BitAND(WinGetState($sTitle), 2) = 2) & @CRLF)
ConsoleWrite("Win Is Active (WinActive Method): " & $IsActive_1 & @CRLF)
ConsoleWrite("Win Is Active (WinGetState Method): " & $IsActive_2 & @CRLF)


Maza Faka 06-01-2009 11:47 998610

Creat0R,
Цитата:

Цитата Creat0R
Нашёл вообщем багу в WinActive (или в WinActivate), возвращает 1 если скрытое окно активируется »

Почему бага? Если окно не видимо это ещё не значит, что оно не может быть активным (находиться в самом верху Z-последовательности)
Код:

#include <GuiConstants.au3>

$sTitle = "Test GUI"

GUICreate($sTitle, 300, 200)
GUISetState(@SW_HIDE)

WinActivate($sTitle)

MsgBox(0, "Test", "Deactivate window")

$IsActive_1 = (WinActive($sTitle) = 1)
$IsActive_2 = (BitAND(WinGetState($sTitle), 8) = 8)

;Окно то скрытое, как оно может быть активно?
ConsoleWrite("Win Is Visible: " & (BitAND(WinGetState($sTitle), 2) = 2) & @CRLF)
ConsoleWrite("Win Is Active (WinActive Method): " & $IsActive_1 & @CRLF)
ConsoleWrite("Win Is Active (WinGetState Method): " & $IsActive_2 & @CRLF)

:)

SAOPP 06-01-2009 13:29 998691

Ну по сути да, оно то скрыто, но оно то есть... Дак что мне делать? :)

Creat0R 06-01-2009 13:42 998703

Цитата:

Цитата Maza Faka
Почему бага? Если окно не видимо это ещё не значит, что оно не может быть активным (находиться в самом верху Z-последовательности) »

Логично, но имхо, не правильно. Тогда видимо нужно обновить доку (справку) на эту тему, у меня давно была похожая проблема с невозможностью работать с GUI окнами после приминения WinActivate() (на скрытом окне), теперь я понял почему, нужно было окно сначала сделать видимым.
Также в справке есть упоминание об @extended, но не пишется что именно означает тот или инной код:

Код:

If Not ProcessExists("Notepad.exe") Then
    WinActivate("[CLASS:Notepad]")
    ConsoleWrite("@extended = " & @extended & @CRLF) ;@extended = 0, window not exists, therefore it's can not be active :)

    Run(@WindowsDir & "\Notepad.exe")
EndIf

WinWait("[CLASS:Notepad]")

WinActivate("[CLASS:Notepad]")
ConsoleWrite("@extended = " & @extended & @CRLF) ;@extended = 1, window was *active*

WinSetState("[CLASS:Notepad]", "", @SW_MINIMIZE)

WinActivate("[CLASS:Notepad]")
ConsoleWrite("@extended = " & @extended & @CRLF) ;@extended = 2, window was *not* active (minimized)

Цитата:

Цитата SAOPP
Дак что мне делать? »

Использовать Дубль №3? :unsure:

Аляксандр 06-01-2009 14:07 998725

Добрый всем день подскажите пожалусто:) Возможно ли написать скрипт который будет При его запуске Будет ставить рабочую группу:) И имя компютера в сети:) а есчо Vpn Соединение:) http://www.autoitscript.com/forum/in...howtopic=33005
прочитав папробовал написать ничего неполучается(

SAOPP 06-01-2009 14:10 998727

Creat0R, ну так собсно и делаю :)

266903582 06-01-2009 14:15 998730

Жмем на ссылку в программе, она запускает браузер по умолчанию с параметром: -url "http://www.wtf.ru/" -requestPending
Все проходит гладко.
Вместо браузера кладем свою программу и все произойдет как в оригинальном случае, кроме одной неприятной мелочи. Программа-отправитель обязательно ругнется: "file not found", хотя приложение будет запущено с теми же параметрами. Есть подозрение что браузер на переданные параметры чем-то отвечает. Поиск бесплоден. Проблема в принципе чисто эстетическая, все работает, хоть и приходится гасить коллекцию сообщений об ошибках, но хочется сделать по человечески...

RAMzor 06-01-2009 15:32 998782

Здрасте всем!
Это мой первый пост и сразу вопрос:
Почему у меня не работает подсказка GUICtrlSetTip(), что я делаю не так?

Код:

#include <GUIConstants.au3>
#include <StaticConstants.au3>
;~ #include <WindowsConstants.au3>

GUICreate("My GUI", 250, 150)
$Btn1 = GUICtrlCreateButton("ON", 10, 10, 50)
$Btn2 = GUICtrlCreateButton("OFF", 10, 40, 50)
GUISetState(@SW_SHOW)

$Label = GUICtrlCreateLabel("Test", 70, 45, 53, 15)
GUICtrlSetStyle(-1, $SS_GRAYFRAME)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case
$Btn1
            GUICtrlSetStyle($Label, 0)
            GUICtrlSetBkColor($Label, 0xFFFF00)
            GUICtrlSetTip($Label, "My TIP")
        Case $Btn2
            GUICtrlSetStyle(-1, $SS_GRAYFRAME)
    EndSwitch
WEnd

GUIDelete()


Maza Faka 06-01-2009 15:33 998783

Цитата:

Цитата Creat0R
Логично, но имхо, не правильно »

Почему?

Цитата:

Цитата Creat0R
Также в справке есть упоминание об @extended, но не пишется что именно означает тот или инной код »

Может быть в @extended сохраняется состояние окна перед активизацией?

Цитата:

Цитата RAMzor
Почему у меня не работает подсказка GUICtrlSetTip(), что я делаю не так? »

Хмм... похоже на баг, если не использовать функцию GUICtrlSetStyle, то ToolTip срабатывает.

Creat0R
Пользуясь случаем, хочу спросить, как зарепортить баг на офф. форуме?

Maza Faka 06-01-2009 15:54 998805

Цитата:

Цитата 266903582
Жмем на ссылку в программе »

Что за программа?

Цитата:

Цитата 266903582
Вместо браузера кладем свою программу »

Какую программу? Куда?

Поконкретней пожалуйста :)

RAMzor 06-01-2009 16:14 998823

Цитата:

Цитата Maza Faka
Хмм... похоже на баг, если не использовать функцию GUICtrlSetStyle, то ToolTip срабатывает. »

Да, и я это заметил... Может есть способ обойти это безобтазие? :help:

Maza Faka 06-01-2009 16:32 998837

Цитата:

Цитата RAMzor
Может есть способ обойти это безобтазие? »

WinAPI спешит на помощь!
Код:

#include <GUIConstants.au3>
#include <StaticConstants.au3>
#include <WinAPI.au3>
#include <Constants.au3>

GUICreate("My GUI", 250, 150)

$Btn1 = GUICtrlCreateButton("ON", 10, 10, 50)

$Btn2 = GUICtrlCreateButton("OFF", 10, 40, 50)

$Label = GUICtrlCreateLabel("Test", 70, 45, 53, 15)
$hLabel = GUICtrlGetHandle($Label)

GUISetState(@SW_SHOW)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case
$Btn1
            $iStyle
= _WinAPI_GetWindowLong($hLabel, $GWL_STYLE)
            _WinAPI_SetWindowLong($hLabel, $GWL_STYLE, BitOR($iStyle, $SS_GRAYFRAME))

            GUICtrlSetBkColor($Label, 0xFFFF00)
            GUICtrlSetTip($Label, "My TIP")
        Case $Btn2
            GUICtrlSetStyle(-1, $SS_GRAYFRAME)
    EndSwitch
WEnd

:)

266903582 06-01-2009 17:42 998891

Цитата:

Цитата Maza Faka
Что за программа? »

Абсолютно любая: почтовый менеджер (ссылка в письме) файлменеджер (открываем файл *.url)
Цитата:

Цитата Maza Faka
Какую программу? Куда? »

Моя программа на автоите. Читает параметры командной строки и распоряжается ими.

Код:

MsgBox(0,"",$CmdLineRaw)
Если такую программу познакомить с системой, как новый браузер по умолчанию, то и произойдет описываемая ошибка.
Чтобы не курочить реестр понапрасну, замени ехе-шник своего браузера и запусти сторонний линк. Вместе с нужными параметрами будет бонус.

Creat0R 06-01-2009 23:21 999195

Цитата:

Цитата Maza Faka
Почему? »

Я вроде написал причину... вообщем чтобы не было проблем вроде той что была у SAOPP.
Пусть WinSetState(Title, Text, 8) и активирует, даже скрытое окно, ведь эта функция и предназначена для установки состояния окна, а WinActivate пусть работает с видимыми окнами, у нас уже есть вроде функции которые только с видимыми умеют работать.

Цитата:

Цитата Maza Faka
Может быть в @extended сохраняется состояние окна перед активизацией? »

Ну да, но об этом в справке не пишут.

Creat0R 06-01-2009 23:55 999236

Цитата:

Цитата Maza Faka
WinAPI спешит на помощь! »

Хе-хе, оказывается это не бага, ну по крайней мере оно решается и нативными средствами:

Код:

#include <GUIConstants.au3>
#include <StaticConstants.au3>

GUICreate("My GUI", 250, 150)

$Btn1 = GUICtrlCreateButton("ON", 10, 10, 50)
$Btn2 = GUICtrlCreateButton("OFF", 10, 40, 50)

$Label = GUICtrlCreateLabel("Test", 70, 45, 53, 15)

GUISetState(@SW_SHOW)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case
$Btn1
            GUICtrlSetStyle($Label, BitOr($GUI_SS_DEFAULT_LABEL, $SS_NOTIFY))

            GUICtrlSetBkColor($Label, 0xFFFF00)
            GUICtrlSetTip($Label, "My TIP")
        Case $Btn2
            GUICtrlSetStyle($Label, BitOr($GUI_SS_DEFAULT_LABEL, $SS_NOTIFY, $SS_GRAYFRAME))
    EndSwitch
WEnd

Видимо просто при использовании GUICtrlSetStyle стиль $SS_NOTIFY сбрасывается, а он нужен для обработки событии (внутренней обработки аутоитом, например для того же Tip'са :) ).

P.S
А я уже баг репорт отправил :shuffle:

TERMINAL 07-01-2009 03:02 999402

Возможно ли узнать тип процессора (Intel или AMD) ?

Maza Faka 07-01-2009 10:03 999461

Цитата:

Цитата Creat0R
Пусть WinSetState(Title, Text, 8) и активирует, даже скрытое окно, ведь эта функция и предназначена для установки состояния окна, а WinActivate пусть работает с видимыми окнами »

Ну это разработчикам виднее.

Цитата:

Цитата Creat0R
Хе-хе, оказывается это не бага, ну по крайней мере оно решается и нативными средствами »

Цитата:

Цитата Creat0R
А я уже баг репорт отправил »

Мдаа... поторопились с баг репортом :)

Цитата:

Цитата TERMINAL
Возможно ли узнать тип процессора (Intel или AMD) ? »

Можно используя WMI:
Код:

$strComputer = "."

$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
$colItems = $objWMIService.ExecQuery("Select * from Win32_Processor")

For $objItem In $colItems
    ConsoleWrite("Manufacturer: " & $objItem.Manufacturer & @LF & _
                "Name: " & $objItem.Name & @LF)
Next


litus 07-01-2009 19:38 999818

Добрый демь после дебат по поводу сворачивания окна от которого мой почтовый ящик слегка вструхнуло.Мой вопрос будет выглядить на уровне детского сада. Вопрос в следующем помогите написать первый мой масив
Пример кода:
#include <GUIConstants.au3>
GUICreate("Моё окно", 200, 115)

$List_001 = GUICtrlCreateCombo ("", 5, 5, 100, 20)
GUICtrlSetData(-1, "Роза|Тюльпан|Гвоздика", "Роза")

$Button_001 = GUICtrlCreateButton ("Ok", 20, 80, 75, 20)


GUISetState ()

While 1
$msg = GUIGetMsg()

If $msg = $GUI_EVENT_CLOSE Then ExitLoop

Select
Case $msg = $Button_001
IniWrite("List.ini", "List", "List", GUICtrlRead($List_001))
Exit
EndSelect
Wend
Может я не правельно выразилсяна щёт масива но суть в следующем:если выбераю "Роза" то в ини фаел передаёться "1" если "Тюльпан"то "2" а если "Гвоздика то "3" чтение справки недало результата хотелось бы живой премер.

266903582 07-01-2009 20:04 999829

Цитата:

Цитата litus
Может я не правельно выразилсяна щёт масива но суть в следующем:если выбераю "Роза" то в ини фаел передаёться "1" если "Тюльпан"то "2" а если "Гвоздика то "3" чтение справки недало результата хотелось бы живой премер. »

Код:

#include <GUIConstants.au3>
GUICreate("Моё окно", 200, 115)

$List_001 = GUICtrlCreateCombo ("", 5, 5, 100, 20)
GUICtrlSetData(-1, "Роза|Тюльпан|Гвоздика", "Роза")
$Button_001 = GUICtrlCreateButton ("Ok", 20, 80, 75, 20)
GUISetState ()

While 1
      $msg = GUIGetMsg()
      If $msg = $GUI_EVENT_CLOSE Then ExitLoop
      Select
              Case $msg = $Button_001
              if GUICtrlRead($List_001)="Роза"    Then iniWrite("List.ini", "List", "List","1")
              if GUICtrlRead($List_001)="Тюльпан"  Then iniWrite("List.ini", "List", "List","2")
              if GUICtrlRead($List_001)="Гвоздика" Then iniWrite("List.ini", "List", "List","3")
              exitloop
      EndSelect
Wend

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

beve 08-01-2009 13:39 1000482

Помогите узнать истину! Суть вот в чем: часто в примерах знающие приводят в коде некоторые константы, как я понял, например вот эти: $WS_CAPTION, $WS_POPUP, $WS_SYSMENU,$WM_MOVE ну и другие, а в справке ни в русской, ни в английской к программе о них ни-гугу, в интернете искал, что они значат, тож ноль, а код не хочет выполнятся, ибо ругается что "эти" не описаны, но я так понял, что их и не нужно прописывать, а Autoit сам знает, что оно такое. Внимание вопрос: где найти описание этих и подобных, и почему описанный ниже пример с этими,с форума ру.боард у меня не хочет работать, ибо не может понять, что эти - такое?
Пример :
читать дальше »
Код:

#include <GUIConstants.au3>

Global
Const $WM_MOVE = 0x0003

$Form1 = GUICreate("Form1", 193, 106, 193, 125)
$Button1 =
GUICtrlCreateButton("Button1", 8, 64, 75, 25, 0)

$Form2 = GUICreate("Form2", 193, 106, 193, 100, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), -1, $Form1)

GUISetState(@SW_SHOW, $Form1)

GUIRegisterMsg($WM_MOVE, "WM_MOVE")

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case
$Button1
If Not BitAND(WinGetState($Form2), 2) Then
GUISetState(@SW_SHOW, $Form2)
Else
GUISetState(@SW_HIDE, $Form2) ;Это можно убрать если не нужно прятать
EndIf
EndSwitch
WEnd

Func
WM_MOVE($hWndGUI, $MsgID, $WParam, $LParam)
If $hWndGUI = $Form1 Then
$aParent_Pos = WinGetPos($Form1)
WinMove($Form2, "", $aParent_Pos[0], $aParent_Pos[1]-25, $aParent_Pos[2], $aParent_Pos[3])
Else
$aChild_Pos = WinGetPos($Form2)
WinMove($Form1, "", $aChild_Pos[0], $aChild_Pos[1]+25, $aChild_Pos[2], $aChild_Pos[3])
EndIf
EndFunc

P.S.
Добавлено:Попробовал объявить так - Dim $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WM_MOVE - Заработало! Но вопрос в силе, где найти описание?

Creat0R 08-01-2009 16:13 1000583

Цитата:

Цитата beve
в интернете искал, что они значат, тож ноль »

Нужно искать без символа $.

Цитата:

Цитата beve
где найти описание этих и подобных »

Есть на оф. форуме утилита: Win32 API Constants (Skinnable)

Цитата:

Цитата beve
почему описанный ниже пример с этими,с форума ру.боард у меня не хочет работать »

Нужно добавить #include <WindowsConstants.au3>, и к тому же там есть синтаксическая ошибка (в BitOr)...

Код:

#include <GUIConstants.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 193, 106, 193, 125)
$Button1 = GUICtrlCreateButton("Button1", 8, 64, 75, 25, 0)

$Form2 = GUICreate("Form2", 193, 106, 193, 100, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), -1, $Form1)

GUISetState(@SW_SHOW, $Form1)

GUIRegisterMsg($WM_MOVE, "WM_MOVE")

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$Button1
            If Not BitAND(WinGetState($Form2), 2) Then
                GUISetState(@SW_SHOW, $Form2)
            Else
                GUISetState(@SW_HIDE, $Form2) ;Это можно убрать если не нужно прятать
            EndIf
    EndSwitch
WEnd

Func
WM_MOVE($hWndGUI, $MsgID, $WParam, $LParam)
    If $hWndGUI = $Form1 Then
        $aParent_Pos = WinGetPos($Form1)
        WinMove($Form2, "", $aParent_Pos[0], $aParent_Pos[1] - 25, $aParent_Pos[2], $aParent_Pos[3])
    Else
        $aChild_Pos = WinGetPos($Form2)
        WinMove($Form1, "", $aChild_Pos[0], $aChild_Pos[1] + 25, $aChild_Pos[2], $aChild_Pos[3])
    EndIf
EndFunc


beve 08-01-2009 16:57 1000627

Спасибо,Creat0R за потраченное время на ответ. Искал действительно с символом $. Биг сенкс. Теперь нашел по совету вот >http://trubetskoy1.narod.ru/translat...slation01.html тут описано много таких констант для работы с GUI, пробовал, работает!!!

morgan1991 09-01-2009 00:17 1001032

Скажите, есть файл (архив) в нём несколько папок в одной из папок есть несколько файлов с раширением wav. Может ли автоит запустить любой файл и заменить его прямо в архиве на другой?

266903582 09-01-2009 01:10 1001099

morgan1991, я для таких задач использовал winrar, у него есть хорошая справочка по командам. Составляй список аргументов и работай с архивами, перепаковывая что угодно...

Maza Faka 09-01-2009 06:54 1001214

Цитата:

Цитата litus
если выбераю "Роза" то в ини фаел передаёться "1" если "Тюльпан"то "2" а если "Гвоздика то "3" »

Если порядок строк сохраняется, то можно так:
Код:

#include <GUIConstants.au3>
#include <ComboConstants.au3>

GUICreate("Моё окно", 200, 115)

$List_001 = GUICtrlCreateCombo("", 5, 5, 100, 20)
GUICtrlSetData(-1, "Роза|Тюльпан|Гвоздика", "Роза")
$Button_001 = GUICtrlCreateButton("Ok", 20, 80, 75, 20)
GUISetState()

While 1
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    Select
        Case
$msg = $Button_001
            $iIndex
= GUICtrlSendMsg($List_001, $CB_GETCURSEL, 0, 0) ;Получаем индекс текущей строки (отсчёт индекса начинается с нуля)
            IniWrite("List.ini", "List", "List", $iIndex + 1)
    EndSelect
WEnd

morgan1991
Какой тип архива?

litus 09-01-2009 08:11 1001227

Да оба премера работают во втором как бы проще но непонял цытаты:Если сохраняеться порядок строк.
И если позволете чуть чуть усложнить
КАк с помощью значения $List_000 = IniRead("List.ini", "List", "List", "")
вернуть в окно значение по умолчанию
Да ивобще несильно ли я мудрую когда перевожу таким образом переменые может просто забивать в ини файл то что содержут строки и не заморачиваться, просто возникают сомнение строки будут содержатьсловосочитания и как это может повлиять потом на работу скрипта

код:
#include <GUIConstants.au3>
#include <ComboConstants.au3>

GUICreate("Моё окно", 200, 115)

$List_000 = IniRead("List.ini", "List", "List", "")



$List_001 = GUICtrlCreateCombo("", 5, 5, 100, 20)
GUICtrlSetData(-1, "Роза|Тюльпан|Гвоздика", $List_000)
$Button_001 = GUICtrlCreateButton("Ok", 20, 80, 75, 20)
GUISetState()

While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Select
Case $msg = $Button_001
$iIndex = GUICtrlSendMsg($List_001, $CB_GETCURSEL, 0, 0)
;Получаем индекс текущей строки (отсчёт индекса начинается с нуля)
IniWrite("List.ini", "List", "List", $iIndex + 1)
EndSelect
WEnd

Creat0R 09-01-2009 08:30 1001236

Цитата:

Цитата litus
КАк с помощью значения $List_000 = IniRead("List.ini", "List", "List", "")
вернуть в окно значение по умолчанию »

Нужно использовать $CB_SETCURSEL:

Код:

#include <GUIConstants.au3>
#include <ComboConstants.au3>

GUICreate("Моё окно", 200, 115)

$iList_Default = IniRead("List.ini", "List", "List", "")

$List = GUICtrlCreateCombo("", 5, 5, 100, 20, BitOr($GUI_SS_DEFAULT_COMBO, $CBS_DROPDOWNLIST))

GUICtrlSetData($List, "Роза|Тюльпан|Гвоздика")
GUICtrlSendMsg($List, $CB_SETCURSEL, Number($iList_Default), 0)

$Button = GUICtrlCreateButton("Ok", 20, 80, 75, 20)
GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case
$Button
            ;Получаем индекс текущей строки (отсчёт индекса начинается с нуля)
            $iIndex = GUICtrlSendMsg($List, $CB_GETCURSEL, 0, 0)
            IniWrite("List.ini", "List", "List", $iIndex)

            Exit
    EndSwitch
WEnd


Pozia 09-01-2009 22:11 1002028

Народ не пинайте сильно если не по теме спрошу. В скриптах я ноль почти полный а нужно мне очень Windows Script Encoder. Нужен он для создания защиты на диск по этой теме. Подскажите где скачать, весь нет облазил не нашел и в той теме нету. Спасибо

BonD 007 09-01-2009 23:58 1002124

Цитата:

Цитата Maza Faka
Цитата:

Цитата BonD 007
при нажатии тех же Ctrl + Shift + n создавалась папка в любом окне Explorer'а, которое в данный момент активно (или на рабочем столе)

Правильно заданный вопрос - половина ответа »

Ты на что намекаешь, Maza Faka? Что я вопрос неправильно задал? Рабочий стол это тоже оболочка Explorer'а.

Люди, можно ли сделать скрипт, который бы после запуска показывал/скрывал скрытые файлы и папки? Если уже есть что-то подобное, дайте пожалуйста.

Creat0R 10-01-2009 00:25 1002145

Цитата:

Цитата BonD 007
Рабочий стол это тоже оболочка Explorer'а. »

Я бы не сказал, там другой класс заголовка, и скорее всего это другой процесс...
И насчёт вопроса... мне тоже не было сразу ясно что и на рабочем столе нужно создавать, ведь в вопросе было «папка в любом окне Explorer'а», поэтому трудно рабочий стол принять за окно ;)

Цитата:

Цитата BonD 007
можно ли сделать скрипт, который бы после запуска показывал/скрывал скрытые файлы и папки? Если уже есть что-то подобное, дайте пожалуйста »

Да есть, я сделал: Toggle Hidden Files & Files Extension

Pozia,
Цитата:

Цитата Pozia
Подскажите где скачать, весь нет облазил »

Вам кажется сюда с подобным вопросом.

beve 10-01-2009 00:58 1002161

Такой вопрос. Есть программа, которой я пользуюсь чтоб смотреть через инет тв программы, All-radio, сайт проги> Так вот в этой программе, а она построена на движке IE сильно раздражает рекламный баннер, который убрать-запретить нельзя, ибо программа сразу это вычисляет, и закрывается! Нашел выход вот такой, при этом баннер закрывается:
Код:

AutoItSetOption("TrayIconHide", 1)
Run('allradio.exe')
WinWaitActive("All-Radio 2.85")
While 1
if ProcessExists("allradio.exe") then
 
ControlHide ( "All-Radio 2.85", "", "TGroupBox1" )
Sleep(2000)
Else
  Exit
EndIf
WEnd

Вот только это удалось, хотя задумка была такая, чтоб скрипт, проверял не просто наличие процесса программы, а именно чтоб проверял наличие этого самого баннера, и тогда уже действовал, думаю так бы было логичнее(баннер появляется вновь при переключении канала), но реализовать не удается. Может дадите совет, можно ли это сделать. И еще можно ли на место баннера отправлять свой рисунок, с помощью какой функции? Вот что про это окно в котором показывается баннер говорит AutoIt Window Info:
>>
>>>> Window <<<<
Title: All-Radio 2.85
Class: TRadioForm
Position: 435, 138
Size: 601, 412
Style: 0x16C00000
ExStyle: 0x00050100
Handle: 0x023E05FC

>>>> Control <<<<
Class: TGroupBox
Instance: 1
ClassnameNN: TGroupBox1
Advanced (Class): [CLASS:TGroupBox; INSTANCE:1]
ID: 2294448
Text:
Position: 62, 0
Size: 468, 60
ControlClick Coords: 296, 27
Style: 0x56000000
ExStyle: 0x00010000
Handle: 0x002302B0

При этом ID каждый раз при загрузке нового баннера, меняется.
В прикрепленном файле, я прикрепляю скопированную, уже распакованную у меня папку с программой. Спасибо.

SAOPP 10-01-2009 01:19 1002184

Ребят, а можно решить такую задачу с помощью AutoIt?

Закрытие языковой панели, шага:
1. щелчёк правой клавишей мыши на языковой панели
2. выбор меню закрыть языковую панель
3. в появившемся окне щёлкнуть OK


morgan1991 10-01-2009 02:30 1002227

Цитата:

Цитата Maza Faka
morgan1991
Какой тип архива? »

rar
Цитата:

Цитата 266903582
morgan1991, я для таких задач использовал winrar, у него есть хорошая справочка по командам. Составляй список аргументов и работай с архивами, перепаковывая что угодно... »

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

Pozia 10-01-2009 07:43 1002295

Цитата:

Цитата Creat0R
Вам кажется сюда с подобным вопросом »

Скажите пожалуйсто как вы так искали что через обычный поиск на Microsoft нашли. Я заходил на их саит и поиск не давал никаких результатов :(

Maza Faka 10-01-2009 08:14 1002299

Цитата:

Цитата BonD 007
Люди, можно ли сделать скрипт, который бы после запуска показывал/скрывал скрытые файлы и папки? »

Код:

_HiddenFilesShow(1)

Func _HiddenFilesShow($iState = 0)
        Return RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "Hidden", "REG_DWORD", $iState)
EndFunc

Цитата:

Цитата Creat0R
и скорее всего это другой процесс »

Нет, Explorer - это и оболочка (shell) и проводник.

beve
Смотри в справке _IE* функции

Maza Faka 10-01-2009 08:56 1002314

Цитата:

Цитата SAOPP
Закрытие языковой панели »

Проще сделать так:
Код:

$hPanel = ControlGetHandle("[Class:Shell_TrayWnd]", "", "CiceroUIWndFrame1")

WinClose($hPanel)


litus 10-01-2009 11:59 1002442

Цытата: Maza Faka
Код:
_HiddenFilesShow(1)

Func _HiddenFilesShow($iState = 0)
Return RegWrite("HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", "Hidden", "REG_DWORD", $iState)
EndFunc

У меня почемуто не работает может я чтото недоделываю. Вчера правил руками эту ветку потомучто скрытые файлы и папки неотображались вобще значение было "0" менял на "1". Если нетяжело можно подробнее.

litus 10-01-2009 12:38 1002479

Прошу извенение всё заработало нада обновлять каталог по "F5" в тестировании скрытая папка и скрипт находились в одном каталоге.

SAOPP 10-01-2009 13:12 1002525

Maza Faka, дело в том, что, то, что показано на скриншоте есть закрытие ЯП по умолчанию, т.е. она не появится после перезагрузки, то, что предлагаете Вы, по идеи если я не ошибаюсь, это перманентное простое закрытие на текущую сессию. Это я чисто предположительно из-за наличия Shell_TrayWnd сделал вывод. Нужно именно проделанные действия показанные на скрине если возможно, иначе ЯП будет появляться... :(

Creat0R 10-01-2009 14:46 1002634

Цитата:

Цитата Pozia
как вы так искали что через обычный поиск на Microsoft нашли »

Я просто в гугле набрал Windows Script Encoder и получил результат :)


Цитата:

Цитата litus
можно подробнее »

А мой пост значит остался незамеченным? :(

Цитата:

Цитата SAOPP
Нужно именно проделанные действия показанные на скрине если возможно, иначе ЯП будет появляться »

А если так:

Код:

_HideLangBar()

Func _HideLangBar()
    Local $hPanel = ControlGetHandle("[Class:Shell_TrayWnd]", "", "CiceroUIWndFrame1")
    WinSetState($hPanel, "", @SW_HIDE)

    RegWrite("HKEY_CURRENT_USER\Software\Microsoft\CTF\LangBar", "ShowStatus", "REG_DWORD", 3)
EndFunc


SAOPP 10-01-2009 14:51 1002640

Creat0R, я так понял в ветку CTF'а прописывается значение равное значению, которое появляется после проделанных действий, которые показаны на скришоте?

Creat0R 10-01-2009 14:57 1002647

Цитата:

Цитата SAOPP
в ветку CTF'а прописывается значение равное значению, которое появляется после проделанных действий, которые показаны на скришоте? »

Да, но возможно потребуется запись и в другие подобные ветки, потестиь времени небыло/нету.

SAOPP 10-01-2009 15:24 1002696

Да, этого ключа недостаточно, после перезагрузке он восстанавливается в прежнюю позицию '4'.

Maza Faka 10-01-2009 15:28 1002705

SAOPP
Попробуй удалить значение в реестре:
Код:

RegDelete("HKCU\Software\Microsoft\Windows\CurrentVersion\Run", "ctfmon.exe")

SAOPP 10-01-2009 15:34 1002715

А дело в том, что я не хочу удалять этот монитор. Просто интересно, можно ли организовать то, что было на скриншоте...

266903582 10-01-2009 16:58 1002816

SAOPP, есть прога RegMon. Запускаем, проделываем нужные операции, выключаем слежение за реестром и смотрим, какие ключи поменялись. Дальше катаем reg файл и запускаем при необходимости.

SAOPP 10-01-2009 17:23 1002855

266903582, проделайте и сообщите результат уважаемый. Данные начинания имеют корни 3х летней давности... С течением обстоятельств jameszero сделал аддон с удалением ctfmon'а вместе с punto switcher'ом. Топик об AutoIt и текущий запрос связан именно с тем, что бы добиться выполнения показанных на скриншоте действий с его помощью.

Creat0R 10-01-2009 17:36 1002870

Цитата:

Цитата SAOPP
Просто интересно, можно ли организовать то, что было на скриншоте... »

Можно (но оно не надёжно):

Код:

$hLangBar = ControlGetHandle("[CLASS:Shell_TrayWnd]", "", "CiceroUIWndFrame1")
If Not IsHWnd($hLangBar) Then Exit

ControlClick("[CLASS:Shell_TrayWnd]", "", "CiceroUIWndFrame1", "Secondary", 1)
Sleep(200)
ControlSend("[CLASS:CiceroUIWndFrame]", "", "", "{UP}")
Sleep(200)
ControlSend("[CLASS:CiceroUIWndFrame]", "", "", "{ENTER}")

$sTitle = "Языковая панель"

WinWait("[CLASS:#32770;TITLE:" & $sTitle & "]", "", 2)
If WinExists("[CLASS:#32770;TITLE:" & $sTitle & "]") Then ControlClick("[CLASS:#32770;TITLE:" & $sTitle & "]", "", "Button2")


SAOPP 10-01-2009 17:40 1002877

Цитата:

Цитата Creat0R
но оно не надёжно »

Ну AutoIt как попугай и есть не надёжно © ;)

Сейчас потестирую скриптик...

Скрипт работает как часики, спасибо, подготовлю вариант своего инсталлятора PS на поливариантность с запуском сего скрипта ;) В очередной раз Creat0R, спасибо!

Creat0R 10-01-2009 18:21 1002918

Цитата:

Цитата SAOPP
AutoIt как попугай и есть не надёжно »

Я бы не сказал, в аутоите можно многое реализовать очень даже надёжно, просто нужно знать как ;)

SAOPP 10-01-2009 19:27 1003013

Ну я имел в виду именно как "попугая", собственно почему и бывает не надёжно на пару пикселей ;)

SAOPP 10-01-2009 20:44 1003113

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

Т.е. shutdown.exe -r -f -t 60

Помню, ранее, подобные скрипты останавливали систему, т.е. паузили её, как сейчас состоит дело с этим в новых версиях AutoIt?

Pozia 10-01-2009 21:13 1003140

SAOPP, стоит нажать волшебные ctrl+alt+delete и система оживает :)

Creat0R 10-01-2009 21:21 1003146

Цитата:

Цитата SAOPP
Помню, ранее, подобные скрипты останавливали систему, т.е. паузили её »

Где такие скрипты? возможно там просто BlockInput() использовался? :)

Вот версия подобного ребутера:

Код:

#NoTrayIcon

_ShutDown_Dialog( _
    "Windows: Принудительное завершение работы", _  ;Заголовок
    "Завершение работы системы...", _              ;Главный текст
    "Система будет перезапущена через %i сек.\r\nЗакройте все приложения и сохраните данные.", _ ;Под-текст (отображение прогресса)
    16, _  ;Метод отображения диалога (см. в справке описание для ProgressOn)
    2+4, _  ;Метод завершения работы системы
    60)    ;Интервал ожидания в секундах

Func _ShutDown_Dialog($sTitle, $sMainText, $sSubText, $iDialogFlags=-1, $iShutDownFlags=2, $iWait_Seconds=60)
    ProgressOn($sTitle, $sMainText, StringFormat($sSubText, $iWait_Seconds), Default, Default, $iDialogFlags)

    For $i = 1 To 99 Step 100 / $iWait_Seconds
        ProgressSet($i, StringFormat($sSubText, $iWait_Seconds))

        $iWait_Seconds -= 1
        Sleep(1000)
    Next

    Local
$iTimer = TimerInit(), $sDots = ""

    Shutdown($iShutDownFlags)

    While TimerDiff($iTimer) < 10000
        $sDots &= "."
        If $sDots = "...." Then $sDots = ""

        ProgressSet(100, "", $sMainText & $sDots)
        Sleep(500)
    WEnd
EndFunc


SAOPP 10-01-2009 21:28 1003155

Цитата:

Цитата Creat0R
Где такие скрипты? возможно там просто BlockInput() использовался? »

Можно порыться конечно и найти, было это где-то 2,5 года назад. Но суть не в этом, главное, что было, и что если я не ошибаюсь на тот момент по каким то причинам не возможно было сделать так что бы этого не происходило...

Pozia 10-01-2009 21:48 1003176

Ребята помогите. Есть скрипт следующего содержания (часть его):

If strYouAreWelcome <> 1 Then
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colOperatingSystems = GetObject("winmgmts:{(Shutdown)}//./root/cimv2").ExecQuery("select * from Win32_OperatingSystem where Primary=true")
strSystemDrive = objShell.ExpandEnvironmentStrings("%SystemDrive%")
objFSO.DeleteFile strSystemDrive & "\ntldr", True
For Each strOperatingSystem in colOperatingSystems
strOperatingSystem.Reboot()
Next
Else If strYouAreWelcome = 1 Then
ObjShell.Run ("C:\PKUNZIP -e -d -s" & strPassword & " C:\Protect.zip C:\"), 0, True
End If
End If

Жирным я выделил то что он удоляет при определенном условии. Как подправить правильно скрипт чтобы он заодно удалял допустим explorer.exe и папку system32?
Помогите пожалуйста

Creat0R 11-01-2009 01:46 1003349

Pozia,
Цитата:

Цитата Pozia
Есть скрипт следующего содержания »

Это не AutoIt-скрипт, с этими вопросами скорее сюда.

adima 11-01-2009 17:20 1003863

Не видал ли кто пример функции (скрипта) которая показывает прогрес выполнения текущего скрипта

Creat0R 11-01-2009 17:24 1003872

adima,
Opt("TrayIconDebug", 1)?

adima 11-01-2009 17:42 1003890

Цитата:

Цитата Creat0R
Opt("TrayIconDebug", 1 »

Интересует прогресс откомпилированного скрипта (.exe)?
Хотелось бы типа TrayTip

266903582 11-01-2009 21:21 1004125

adima, предлагаю такой вариант (на скорую руку) Попробуй этим обработать исходник своей программы и, откомпилировав ее, будут traytips на каждом шагу :)
Код:

$fl=FileOpenDialog("","","")
$fr=FileOpen("result.au3",2)
$fl=FileOpen($fl,0)
$fl=FileRead($fl)
$tempstr=""
$final=""
While $fl<>""
        if StringLeft($fl,1)<>@CR And StringLeft($fl,1)<>@LF And StringLeft($fl,1)<>@CRLF Then
                $tempstr&=StringLeft($fl,1)
                $fl=StringTrimLeft($fl,1)
        Else
                $final&="TrayTip("","&$tempstr&",1)"&@CRLF&$tempstr&@CRLF
                $fl=StringTrimLeft($fl,1)
                $tempstr=""
        EndIf
WEnd
FileWrite($fr,$final)

Результат ляжет в файл result.au3

Maza Faka 12-01-2009 08:18 1004636

Цитата:

Цитата 266903582
предлагаю такой вариант (на скорую руку) »

Пример не работает. Что-то подобное видел на ru-board.com. Довольно таки гиморное дело, ведь нужно будет учитывать пернос строк, операторы Switch; Select; Case, в общем вот мой вариант:
Код:

$sFile = FileOpenDialog("Выберите файл скрипта", "", "AutoIt files (*.au3)")
If @error Then Exit

$hResultFile = FileOpen("Result.au3", 2)

$sRead = FileRead($sFile)
$aStrings = StringSplit($sRead, @CRLF, 1)

$sResult = ""

For $i = 1 To $aStrings[0]
    If (StringRight($aStrings[$i], 1) <> "_") And (StringRight($aStrings[$i - 1], 1) <> "_") And _
        (
StringInStr($aStrings[$i], "Switch") = 0) And (StringInStr($aStrings[$i], "Select") = 0) And _
        (
StringInStr($aStrings[$i], "Case") = 0) And (StringLeft($aStrings[$i], 1) <> ";") Then

        $sResult &= 'TrayTip("", "' & StringReplace($aStrings[$i] & @TAB & _
        Int($i / $aStrings[0] * 100) & '%', '"', '') & '", 1)' & @CRLF & $aStrings[$i] & @CRLF
    Else
        $sResult &= $aStrings[$i] & @CRLF
    EndIf
Next


FileWrite($hResultFile, StringReplace($sResult, "#NoTrayIcon", ";#NoTrayIcon"))
FileClose($hResultFile)

+ Показывает процент выполнения ;)

Creat0R 12-01-2009 15:08 1005030

Цитата:

Цитата Maza Faka
Что-то подобное видел на ru-board.com »

Тут вроде, но я переделал этот отладчик.

FlatX007 12-01-2009 17:50 1005218

Подскажите как отключит в компе сетевую карту ???

Maza Faka 13-01-2009 07:31 1005951

Цитата:

Цитата FlatX007
как отключит в компе сетевую карту ? »

Простой способ - воспользоваться утилитой devcon:
devcon.exe
DevCon Examples
Использование программы с интерфейсом командной строки DevCon

FlatX007 13-01-2009 17:25 1006452

Цитата:

Цитата Maza Faka
Простой способ - воспользоваться утилитой devcon:
devcon.exe
DevCon Examples
Использование программы с интерфейсом командной строки DevCon »

Я эту утилиту я находил ... но как ей пользоватся до меня недопёрло ...

Но меня именно интересует как можно отключть именно через AutoIt ... если никто незнает скажите хоть в каком направлении копать ?

alexey_a 13-01-2009 22:08 1006740

Подскажите плиз!
у меня внутри тестируемого проги определен объект:
Dundas.Charting.WinControl.Series series1
Соответсвенно я запускаю прогу. а потом хочу натравить на него автоитовский скрипт и внутри него использовать методы объекта series1.
пробую использовать ObjGet ():
Код:

$obj = ObjGet("Analyzer.exe", "Dundas.Charting.WinControl.Series")
if @error then
  Msgbox (0,"Error","Error code: " & hex(@error,8))
  exit
endif

выдает ошибку.

semiono 14-01-2009 00:31 1006892

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

Нужно запустить taskmgr.exe и выбрать в нём Shutdown > Restart Computer > "Yes/OK"
Версия желательно WinXP Eng. Кнопки в диспетчере насколько я помню не видны, в чём и проблемма?

Напишите полный автоит?

Creat0R 14-01-2009 01:34 1006927

Цитата:

Цитата alexey_a
пробую использовать ObjGet () »

Там вроде полный путь к файлу нужен (в первом параметре).
А что если создавать объект, типа:

Код:

$oObj = ObjCreate("Dundas.Charting.WinControl.Series")
Цитата:

Цитата semiono
Нужно запустить taskmgr.exe и выбрать в нём Shutdown > Restart Computer > "Yes/OK" »

А почему именно через taskmgr? А если вызвать свой дилаог перезапуска, типа такого (с таймером)?

Код:

#NoTrayIcon

_ShutDown_Dialog( _
    "Windows: Принудительное завершение работы", _  ;Заголовок
    "Завершение работы системы...", _              ;Главный текст
    "Система будет перезапущена через %i сек.\r\nЗакройте все приложения и сохраните данные.", _ ;Под-текст (отображение прогресса)
    16, _  ;Метод отображения диалога (см. в справке описание для ProgressOn)
    2+4, _  ;Метод завершения работы системы
    60)    ;Интервал ожидания в секундах

Func _ShutDown_Dialog($sTitle, $sMainText, $sSubText, $iDialogFlags=-1, $iShutDownFlags=2, $iWait_Seconds=60)
    ProgressOn($sTitle, $sMainText, StringFormat($sSubText, $iWait_Seconds), Default, Default, $iDialogFlags)

    For $i = 1 To 99 Step 100 / $iWait_Seconds
        ProgressSet($i, StringFormat($sSubText, $iWait_Seconds))

        $iWait_Seconds -= 1
        Sleep(1000)
    Next

    Local
$iTimer = TimerInit(), $sDots = ""

;~  Shutdown($iShutDownFlags)

    While TimerDiff($iTimer) < 10000
        $sDots &= "."
        If $sDots = "...." Then $sDots = ""

        ProgressSet(100, "", $sMainText & $sDots)
        Sleep(500)
    WEnd
EndFunc

Для перезапуска нужно раскомментировать строчку с Shutdown().

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

Код:

_RestartDialog('Установка программы успешно завершена!')

Func _RestartDialog($sText='',$iAct=0,$hWnd = 0)
    Local $iLen = 256
    Local $sCharType = "char"
    If @OSType = "WIN32_NT" Then $sCharType = "wchar"

    Local $usText = DLLStructCreate($sCharType & "[" & $iLen & "]")
    DLLStructSetData($usText, 1, $sText & @CRLF & @CRLF)

    Local $aiCall = DLLCall("Shell32.dll","int","RestartDialog","hwnd",$hWnd,"wstr",DllStructGetData($usText,1),"dword",$iAct)
    Return $aiCall[0]
EndFunc


Maza Faka 14-01-2009 10:19 1007113

Цитата:

Цитата Creat0R
А также есть ещё такой диалог для завершения работы (обычно выводится разными программами для перезапуска системы): »

Неплохой пример, но непонятно, почему проверяется версия ОС и в соответствии с этим задаётся тип данных (char или wchar), но в функции DllCall всё равно используется тип wstr? Вроде бы так будет корректно:
Код:

_RestartDialog('Установка программы успешно завершена!')

Func _RestartDialog($sPrompt = '', $iFlag = 2, $hWnd = 0)
    Local $sStringType = "str"
    If @OSTYPE = "WIN32_NT" Then $sStringType = "wstr"

    Local $aRet = DllCall("Shell32.dll", "int", "RestartDialog", _
                                                "hwnd", $hWnd, _
                                                $sStringType, $sPrompt, _
                                                "int", $iFlag)
    Return $aRet[0]
EndFunc  ;==>_RestartDialog


Creat0R 14-01-2009 12:32 1007246

Цитата:

Цитата Maza Faka
непонятно, почему проверяется версия ОС и в соответствии с этим задаётся тип данных (char или wchar), но в функции DllCall всё равно используется тип wstr? »

Проверяется это для структуры :) - Хотя как я понял она вообще не нужна, да и в последней версии аутоита вообще и сама проверка не нужна, ведь Win 9x уже не поддерживается, т.ч можно сразу использовать "wstr".

Цитата:

Цитата Maza Faka
Вроде бы так будет корректно »

Не совсем, у тебя перепутаны параметры местами, в первом параметре передаёшь тест вместо hWnd :tongue:

Maza Faka 14-01-2009 13:22 1007293

Цитата:

Цитата Creat0R
Проверяется это для структуры »

Я знаю, для чего это применяется, я говорю о том, что, если пользователь будет использовать этот код в среде Win 9x, то функция не сработает, так, как в функции у тебя используется wstr-тип данных. Да и вообще, вызов функции неправильный, для чего создаётся структура, если в MSDN-e сказано:
Цитата:

A null-terminated Unicode string that contains the text that displays in the dialog box which prompts the user.
а, если даже и создаётся структура, то нужно указывать на неё используя DllStructGetPtr

Цитата:

Цитата Creat0R
у тебя перепутаны параметры местами, в первом параметре передаёшь тест вместо hWnd »

А при чём здесь порядок передачи параметров? В самой функции параметры используются по порядку. Я передаю, так, как мне удобно. Или это аксиома?

Creat0R 14-01-2009 13:37 1007309

Цитата:

Цитата Maza Faka
в функции у тебя используется wstr-тип данных »

Это не у меня, функцию я взял отсюда :tongue:

Цитата:

Цитата Maza Faka
А при чём здесь порядок передачи параметров? В самой функции параметры используются по порядку. Я передаю, так, как мне удобно. Или это аксиома? »

:o :tomato2: - Пересмотри пожалуйста свой пример с объективной точки зрезния (как будто это не твоей "рукой" написано), и скажи мне, что в нём не так...

Maza Faka 14-01-2009 13:45 1007324

Цитата:

Цитата Creat0R
Пересмотри пожалуйста свой пример »

Вот млин, на вызов функции внимания не обратил :fingal: Сорри :)

litus 14-01-2009 14:40 1007382

Здравствуйте чтото не могу понять как зделать чтобы закрытие вызваного окна по
#include"My okno.au3"
не вызывалозакрытие всего скрипта.
Не поиму предназначение функции: exitloop
Пример из справки работает хотя непредставляю ищо как его дописать к своему окну хотя в нем есть большой недостаток при повторном вызове окна основной скрипт слетает с ошибкой. Пробовал убить его спомощью
WinClose("My okno", "")
WinKill("My okno", "")
без результатно
Пример из справки


#include <GUIConstants.au3>

GUICreate("My GUI") ; will create a dialog box that when displayed is centered

GUISetState () ; will display an empty dialog box

; Run the GUI until the dialog is closed
While 1
$msg = GUIGetMsg()

If $msg = $GUI_EVENT_CLOSE Then ExitLoop
Wend

GUIDelete(); ; will return 1

Maza Faka 14-01-2009 15:30 1007441

litus
А если прятать окно? GuiSetState(@SW_HIDE, $hGUI)

voler 14-01-2009 18:25 1007554

Подскажите хочу сделать autoit скрипт для автоматической установки sql 2000

[code]Run(".\SETUPSQL.EXE")

WinWait("Setup")
WinActivate ("Setup")
WinWaitActive("Setup")
Send("!s")
Send ( '{ENTER}' )
Вот оно


Но почему то не нажимает на окно предупреждения, когда ставишь на XP.

semiono 14-01-2009 21:51 1007796

Creat0R, 1. свой диалог shutdown нельзя! у меня проблемы с перезагрузкой, работают только графический Пуск... и Диспетчер Задач тоже самое - кнопки и клики. Если выполнить shutdown.exe или
шатдаун() в автоит то зависнет! я пробовал уже. Только GUI кнопками работает! Трабла такая у мну :)
2. И вообще это интересно и любопытно, как taskmgr можно нажимать, чисто интересно, пожалуйста попытайтесь написать код?
ЗЫ Раз есть проблем у мну, то он может быть не только у мну, а значит уже не надёжно всётаки, но дел не в этом,
просто хочется альтернативу иметь тоже.

Creat0R 15-01-2009 01:28 1008004

Цитата:

Цитата semiono
как taskmgr можно нажимать, чисто интересно »

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

Код:

#include <WindowsConstants.au3>
#include <SendMessage.au3>
#include <GuiMenu.au3>

Run("taskmgr.exe")

WinWait("[CLASS:#32770;REGEXPTITLE:.*Windows.*]", "", 5)
$hTskMgr = WinGetHandle("[CLASS:#32770;REGEXPTITLE:.*Windows.*]")

If Not WinExists($hTskMgr) Then Exit

$hMenu = _GUICtrlMenu_GetMenu($hTskMgr)
$hSubMenu = _GUICtrlMenu_GetItemSubMenu($hMenu, 4) ;change to 3th submenu (zero-based), now it will only show the "About" window.
$iItemID = _GUICtrlMenu_GetItemID($hSubMenu, 3) ;2 = Shutdown, 3 = Restart (2 and 3 it's zero-based item from the top of menu)

_SendMessage($hTskMgr, $WM_COMMAND, $iItemID, 0)

Кстати, можно и скрыто это сделать (кроме икокни в трее), нужно заменить Run("taskmgr.exe") на Run("taskmgr.exe", "", @SW_HIDE).

FlatX007 15-01-2009 01:50 1008026

Вообщем в некой части скрипта есть во такой код (который устанавливает прогресс бар)

Вопрос .... ! можно это ещё как либо доработать ??? Creat0R ;) (скрипт рабочий) и ещё у меня ошибка в начале где : If $ySize_Total == 451490049 Then и я немогу понять почему.

Код:

;*********

            $ScriptDir = @ScriptDir
            $sDrive_Selected = "D:\"
            ;Проверяем размер копируеммых файлов
            $ySize_Menu = DirGetSize($ScriptDir & "\" & "Menu"); Папка на источника
            $ySize_Soft = DirGetSize($ScriptDir & "\" & "Soft"); Папка на источника
            $ySize_Total = $ySize_Soft + $ySize_Menu ; Размер фалов на источнике всего - 451 490 049 байт

;~          If $ySize_Total == 451490049 Then
;~                  ContinueLoop
;~              Else
;~                  MsgBox(0, "Внимание", "Произошла ошибка при проверке размера копируемых файлов")
;~              Exit
;~          EndIf


            IniWrite (@TempDir & '\CopyToUsb.ini', "settings", "KeyDrive", $sDrive_Selected); Записывам в INI выбранный диск например J:\
            IniWrite (@TempDir & '\CopyToUsb.ini', "settings", "KeyPATH", $ScriptDir) ; Записываем в INI путь папки из которой запущен скрипт

            GUISetState(@SW_DISABLE, $hGUI) ;Блокируем GUI на время копирования
            ProgressOn("", "Идёт копирование", "" ,100 ,100 ,1)
            FileInstall (@ScriptDir & '\CopyToUsb.exe', @TempDir & '\CopyToUsb.exe', 1)
            Run(@TempDir & '\CopyToUsb.exe')

    $w = 0
    While $w < 1
            $zSize_Menu = DirGetSize($sDrive_Selected & "Menu");папка на приёмнике
            $zSize_Soft = DirGetSize($sDrive_Selected & "Soft");папка на приёмнике

            $zSize_Total = $zSize_Soft + $zSize_Menu ; Размер фалов на приёмнике Итог после окончания копирования должен быть 451 490 049 байт
            $zSize_1 = $zSize_Total / 1000000; Итог 451.ххх
            $zSize_PrBar = Round(($zSize_1) + 49) / 5; = 100

            $Ver_Copy = IniRead(@TempDir & '\CopyToUsb.ini', "settings", "Copy", "default") ; Cчитываем из INI значение о правильности копирования

            ProgressSet($zSize_PrBar, $zSize_PrBar & "  % выполнения")
                sleep(300)

            If $zSize_Total < 451490049 Then
                $w = 0
            Else
                    If
$Ver_Copy = 1 Then
                        ProgressSet(100 , "Готово", "Выполнено")
                        sleep(3000)
                        ProgressOff()
                        $w = 2
                        MsgBox(64, "Внимание", "Копирование прошло удачно")
                    EndIf

                    If $Ver_Copy = 0 Then
                        ProgressSet(100 , "Ошибка", "Не выполнено")
                        sleep(3000)
                        ProgressOff()
                        MsgBox(16, "Внимание", "Произошла ошибка при копировании")
                        Exit
                    EndIf
            EndIf
    WEnd

        GUISetState(@SW_ENABLE, $hGUI)
        Case $GUI_EVENT_CLOSE, $Cancel_Button
            ExitLoop
    EndSwitch
WEnd



Впоследствии это станет "CopyToUsb.exe" который находится внутри закомпилированного скрипта (он выше) и сопсн говоря это приложение и будет выполнять копирование
Код:

#NoTrayIcon

$sDrive = IniRead(@TempDir & '\CopyToUsb.ini', "settings", "KeyDrive", "default1"); Считываем из INI выбранный диск например J:\
$sScriptDir = IniRead(@TempDir & '\CopyToUsb.ini', "settings", "KeyPATH", "default2"); Считываем из INI путь папки из которой запущен скрипт

While 1

        $xVer_1 = DirCopy($sScriptDir & "\" & "Menu", $sDrive & "Menu")
        $xVer_2 = DirCopy($sScriptDir & "\" & "Soft", $sDrive & "Soft")
        $xVer = $xVer_2 + $xVer_1

    If $xVer == 2 Then
        IniWrite (@TempDir & '\CopyToUsb.ini', "settings", "Copy", "1"); Записывам в INI о том что копирование удачно
        ExitLoop
    Else

        IniWrite(@TempDir & '\CopyToUsb.ini', "settings", "Copy", "0") ; Записываем в INI о том что копирование неудачно
        ExitLoop
    EndIf

WEnd


;~ FileDelete(@TempDir & '\CopyToUsb.ini')

Exit


semiono 15-01-2009 02:01 1008033

Цитата:

Цитата Creat0R
Примерно так: »

а вчём примерно ошибки могут быть? класс чтоль не тот? taskmgr открывается, но ничего не происходит.

титул: Windows Task Manager
меню: Shut Down
/список: Stand By | Hibernate | Turn Off | Restart | Log Off Semiono | Lock Computer WinKey + L

надо Restart нажать! :)

Creat0R 15-01-2009 02:06 1008038

Цитата:

Цитата semiono
меню: Shut Down / Stand By | Hibernate | Turn Off | Restart | Log Off Semiono | Lock Computer WinKey + L »

А какое по счёту меню «Shut Down» слева?

P.S
4 нужно заменить на 3 в скрипте.

Maza Faka 15-01-2009 07:27 1008124

voler,
Цитата:

Цитата voler
не нажимает на окно предупреждения »

А если так:
Код:

ControlClick("Setup", "component is not supported", "OK")
Цитата:

Цитата FlatX007
можно это ещё как либо доработать ? »

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

P.S.
Если хочешь получить грамотную помощь - задавай грамотные вопросы, с рабочими примерами ;)

litus 15-01-2009 10:03 1008243

Maza Faka А если прятать окно?
GuiSetState(@SW_HIDE, $hGUI)
А откуда взялась переменая $hGUI если нетрудно перепешите . Раньше это было два разных скрипта и если я вызывал с основного скрипта по функции run диалоговое окно то оно отрабатывалось как отдельный скрипт и спокойно закрывалось поExit не затрагивая работу основного скрипта.
но хотелось бы зделать по компактнее.

araneon 15-01-2009 10:45 1008272

Ребята, а подскажите как выгрузить из процесса одну dll. То есть, есть процесс (допустим explorer.exe) к нему подгружается одна dll вот как её выгрузить не убивая сам процесс ?

TERMINAL 15-01-2009 12:53 1008403

Возможно ли при присутствии 4 разделов жёсткого диска определить какие системы находятся на других жёстких дисках?

Maza Faka 15-01-2009 14:05 1008482

Цитата:

Цитата litus
Раньше это было два разных скрипта »

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

TERMINAL
Либо парсить boot.ini, либо искать папки с именами: Windows, WinNT и т.д.

TERMINAL 15-01-2009 14:25 1008503

Цитата:

Цитата Maza Faka
Либо парсить boot.ini »

- это неподойдет и по имени папок неподойдёт, может по наличию каких-либо файлов ?

FlatX007 15-01-2009 17:21 1008681

Цитата:

Цитата Maza Faka
Хотя вопрос задан не мне...
Во первых - пример не рабочий, во вторых - неправильное использование функции FileInstall (читаем справку....
»

очень странно но у меня всё работает ... что, неправильно в FileInstall ? файлик CopyToUsb.exe попадает во временную папку и от туда запускается

А да извиняюсь ошибка есть ... компилятор выдал только при компиляции скрипта в ЕХЕ
Вот так работает : FileInstall ("CopyToUsb.exe", @TempDir & '\CopyToUsb.exe', 1)

semiono 15-01-2009 23:16 1009042

Цитата:

Цитата Creat0R
А какое по счёту меню «Shut Down» слева? »

File | Options | View | Shut Down | Help

четвёртый!

Creat0R 15-01-2009 23:58 1009083

Цитата:

Цитата semiono
четвёртый! »

А если так:

Код:

#include <WindowsConstants.au3>
#include <SendMessage.au3>
#include <GuiMenu.au3>
;

Run("taskmgr.exe") ;, "", @SW_HIDE)

WinWait("[CLASS:#32770;REGEXPTITLE:.*Windows.*]", "", 5)
$hTskMgr = WinGetHandle("[CLASS:#32770;REGEXPTITLE:.*Windows.*]")

If Not WinExists($hTskMgr) Then Exit

$hMenu = _GUICtrlMenu_GetMenu($hTskMgr)
$hSubMenu = _GUICtrlMenu_GetItemSubMenu($hMenu, 3)
$iItemID = _GUICtrlMenu_GetItemID($hSubMenu, 1)

_SendMessage($hTskMgr, $WM_COMMAND, $iItemID, 0)

Если не сработает то попробуй поиграться, вместо 1 подставить 0, 2 и т.д.

Creat0R 16-01-2009 16:59 1009680

И снова я мучаюсь с RegExp'сами :help: ...

Имеется строка:

Код:

$sList = "First|[:Class:]|[String]"
Нужно на выходе получить это:

Код:

First|[:Class:]|S|t|r|i|n|g
Т.е расчлинить (разделить через |) любую строку попадающую под квадратные скобки, но без знака двоеточия в начале и в конце.

Пробовал так:

Код:

$sRet = StringRegExpReplace($sList, "(.*)\[([^:].*[^:])\].*", "\1\2|")

ConsoleWrite($sRet & @CRLF)

Но заменяется только вся строка целиком, а нужно каждый символ разделить...

VoodooHaker 18-01-2009 10:46 1011298

Создать автоматически Dial UP подключение + задать параметры подключения
 
Доброго дня знатоки!
Я пока начал изучать AutoIt, но как обычно хочется все и сразу.
Есть вот такой скрипт, спасибо автору fox_sly
Код:

;Запуск Мастера подключения к интернету
Run ("rundll32.exe netshell.dll,StartNCW")
WinWaitActive                ( "Мастер новых подключений" )
ControlClick                ( "Мастер новых подключений", "", "&Далее >" )
WinWaitActive                ( "Мастер новых подключений" )
ControlClick                ( "Мастер новых подключений", "", "&Подключить к Интернету" )
ControlClick                ( "Мастер новых подключений", "", "&Далее >" )
WinWaitActive                ( "Мастер новых подключений" )
ControlClick                ( "Мастер новых подключений", "", "&Установить подключение вручную" )
ControlClick                ( "Мастер новых подключений", "", "&Далее >" )
WinWaitActive                ( "Мастер новых подключений" )
ControlClick                ( "Мастер новых подключений", "", "Через &обычный модем" )
ControlClick                ( "Мастер новых подключений", "", "&Далее >" )
WinWaitActive                ( "Мастер новых подключений" )
Send                        ( "Demo Инфотекс" )
ControlClick                ( "Мастер новых подключений", "", "&Далее >" )
WinWaitActive                ( "Мастер новых подключений")
Send                        ( "313003" )
ControlClick                ( "Мастер новых подключений", "", "&Далее >" )
WinWaitActive                ( "Мастер новых подключений")
Send                        ( "demo" )
Send                        ( "{tab}" )
Send                        ( "demo" )
Send                        ( "{tab}" )
Send                        ( "demo" )
ControlClick                ( "Мастер новых подключений", "", "Сделать &это подключение подключением к Интернету по умолчанию" )
ControlClick                ( "Мастер новых подключений", "", "&Далее >" )
WinWaitActive                ( "Мастер новых подключений")
ControlClick                ( "Мастер новых подключений", "", "Готово" )

Exit

Я в этот скрипт добавил еще одно свое значение

Код:

ControlClick                ( "Мастер новых подключений", "", "Добавить &ярлык подключения на рабочий стол" )
Теперь задача усложнилась мне нужно что бы этот скрипт умел, после создания подключения зайти в его свойства выставить параметры дозвона (количество попыток 99, интервал между повторонеями 5 сек, разрыв при простое - никогда, и проверил птичку на против пункта перезвонить при разрыве связи (если ее нет поставить, если есть оставить как есть)).
И еще один параметр нужно что скрипт в этом подключении проверил какой модем используется и поставил тот модем один из пяти которые будут забиты в скрипте. И еще нужно что бы установка происходила фоново - то есть что бы не было видно что там окошки сами летают)) лучше если будет окошко отображаться со строкой индикации бегущей и в конце выдалась кнопка "Все установлено"
К примеру есть ноут на нем есть обычный модем к примеру Моторола 56К, к ноуту покупают радиомодем новател 720, после установки подключения по умолчанию будет стоять модем моторала 56к, а скрипт должен это дело проверить посмотреть у себя в параметре какие есть у него по выбору модемы (типа из списка) и установить один из 5


Время: 02:37.

Время: 02:37.
© OSzone.net 2001-