[Архив - Часть 1.2] AutoIt скрипты

Ответить
 • Просмотры: 2
Аватара пользователя
amel27

Re: [Архив - Часть 1.2] AutoIt скрипты

Сообщение amel27 »

Creat0R

А чем не устраивает простое отключение/включение родительского окна?

Код:

Код: Выделить всё

#include 
GUICreate("My GUI")
Opt("GUICoordMode",2)
$Button_1 = GUICtrlCreateButton ("Open File",  10, 30, 100)
GUISetState ()
While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = $GUI_EVENT_CLOSE
            ExitLoop
        Case $msg = $Button_1
            WinSetState ("My GUI", "", @SW_DISABLE)
            $a = FileOpenDialog ( "FileOpenDialog", "c:\", "All (*.*)")
            WinSetState ("My GUI", "", @SW_ENABLE)
            WinActivate ("My GUI")
    EndSelect
Wend
Аватара пользователя
Creat0R

Re: [Архив - Часть 1.2] AutoIt скрипты

Сообщение Creat0R »

amel27


Цитата:



чем не устраивает простое отключение/включение родительского окна?



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

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





Код:

Код: Выделить всё

#include 
$ParentWin = GUICreate("Parent GUI", 250, 250)
$Button = GUICtrlCreateButton("Child", 20, 50)
GUISetState()
$ChildWin = GUICreate("Child GUI", 200, 200, -1, -1, -1, -1, $ParentWin)
While 1
    $msg1 = GUIGetMsg()
        Select
        Case $msg1 = $GUI_EVENT_CLOSE
            Exit
        Case $msg1 = $Button
            GUISetState(@SW_DISABLE, $ParentWin)
            GUISetState(@SW_SHOW, $ChildWin)
            While 1
                $msg2 = GUIGetMsg()
                Select
                    Case $msg2 = $GUI_EVENT_CLOSE
                        GUISetState(@SW_RESTORE, $ParentWin)
                        GUISetState(@SW_ENABLE, $ParentWin)
                        GUISetState(@SW_HIDE, $ChildWin)
                        ExitLoop
                EndSelect
            Wend
    EndSelect
WEnd

Кстати, почти такой же способ (в плане задумки функиональности) как ты привёл в примере, я использовал для скрипта который разукрашивает скрипты для поста Изображение . Ты его уже видел? тот который я запостил
[архив - Часть 2] AutoIt скрипты
.



P.S

Вместо WinSetState лучше GuiSetState, и порядок таких объявлении очень важен... если именно для дочернего гуи, то так как я привёл в посте (@SW_HIDE в конце), это идеальный способ (таким образом не мигает окно родительского гуи в момент его активации).

И ещё, вместо WinActivate("Title") лучше WinSetState("Title", "", @SW_RESTORE), это если для гуи, оно быстрее срабатывает.



P.S.S.

А ты не знаешь случам как решить задачку про проверку на нажатие определённой клавиши, кнопки мышки, или любого другого действия со стороны пользователя? (Которую я тоже привёл в
[архив - Часть 2] AutoIt скрипты
).
Аватара пользователя
amel27

Re: [Архив - Часть 1.2] AutoIt скрипты

Сообщение amel27 »

Dentel
Цитата:



У меня есть сервер, к которому не подключен монитор. На сервере установлена WinXP. Захожу на этот сервер с помощью "Подключение к удаленному рабочему столу" через локальную сеть. На сервере вылажен скрипт. Если "подключение" активно, то скрипт работает и делает то, что надо. Если "подключение" закрыто, скрипт глохнет



При отключении рабочий стол блокируется, для нормальной работы его нужно разблокировать удаленно или с локальной консоли... Поэтому связка AutoLogon+VNC удобней для администрирования серверов нежели RDP. ИМХО.
Аватара пользователя
amel27

Re: [Архив - Часть 1.2] AutoIt скрипты

Сообщение amel27 »

Creat0R
Цитата:



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



Можно самому написать аналогичные функции, пример:

Код:

Код: Выделить всё

#include 
#include 
$GUIParent = GUICreate("My GUI", 290, 70)
Opt("GUICoordMode",2)
$Button_1 = GUICtrlCreateButton ("Message Box",  30, 25, 100)
$Button_2 = GUICtrlCreateButton ("File Open",  30, -1)
GUISetState ()
While 1
    $msg = GUIGetMsg()
    Select
        Case $msg = $GUI_EVENT_CLOSE
            ExitLoop
        Case $msg = $Button_1
            _MsgBox ($GUIParent, "Сообщение", "Текст сообщения", $MB_OK + $MB_ICONASTERISK)
        Case $msg = $Button_2
            $file = _FileOpenDialog ($GUIParent, "Выбор файла", "C:\WINDOWS", "Документы (*.DOC)|Все (*.*)")
            _MsgBox ($GUIParent, "Сообщение", "Выбран файл: " & $file, $MB_OK + $MB_ICONASTERISK)
    EndSelect
Wend
Func _MsgBox ($mainGUI, $MsgBoxTitle, $MsgBoxText, $MsgBoxType)
    $ret = DllCall ("user32.dll", "int", "MessageBox", _
            "hwnd", $mainGUI, _
            "str", $MsgBoxText , _
            "str", $MsgBoxTitle, _
            "int", $MsgBoxType)
    Return $ret [0]
EndFunc
Func _FileOpenDialog ($mainGUI, $sTitle, $sInitDir, $sFilter = 'All (*.*)')
    Local $aFilter = StringSplit ( $sFilter, '|')
    Local $aCSTR [$aFilter [0] *2+1]
    Local $i, $iStart, $iFinal, $sCStruct = '', $sWStruct = ''
    $aCSTR [0] = $aFilter [0] *2
    For $i=1 To $aFilter [0]
        $iStart = StringInStr ($aFilter [$i], '(', 0, 1)
        $iFinal = StringInStr ($aFilter [$i], ')', 0,-1)
        $aCSTR [$i*2-1] = StringStripWS (StringLeft ($aFilter [$i], $iStart-1), 3)
        $aCSTR [$i*2] = StringStripWS (StringTrimRight (StringTrimLeft ($aFilter [$i], $iStart), StringLen ($aFilter [$i]) -$iFinal+1), 3)
        $sCStruct = $sCStruct & 'byte[' & StringLen ($aCSTR [$i*2-1])+1 & '];byte[' & StringLen ($aCSTR [$i*2])+1 & '];'
        $sWStruct = $sWStruct & 'byte[' & StringLen ($aCSTR [$i*2-1])*2+2 & '];byte[' & StringLen ($aCSTR [$i*2])*2+2 & '];'
    Next
    Local $uCSTR = DllStructCreate ($sCStruct & 'byte[1]')
    Local $uWSTR = DllStructCreate ($sWStruct & 'byte[2]')
    For $i=1 To $aCSTR [0]
        DllStructSetData ($uCSTR, $i, $aCSTR [$i])
    Next
    $ret = DllCall ("kernel32.dll", "int", "MultiByteToWideChar", _
        "int", 0, _
        "int", 0, _
        "ptr", DllStructGetPtr ($uCSTR), _
        "int", DllStructGetSize ($uCSTR), _
        "ptr", DllStructGetPtr ($uWSTR), _
        "int", DllStructGetSize ($uWSTR) )
    $ret = DllCall("Shell32.dll", "int", 'GetFileNameFromBrowse', _
            'hwnd', $mainGUI, _
            'wstr', '', _
            'int', 255, _
            'wstr', $sInitDir, _
            'wstr', '', _
            'ptr', DllStructGetPtr ($uWSTR), _
            'wstr', $sTitle )
    Return $ret [2]
EndFunc
Аватара пользователя
amel27

Re: [Архив - Часть 1.2] AutoIt скрипты

Сообщение amel27 »

Creat0R
Цитата:



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



- AutoIT не годится для программ типа "клавиатурных шпионов" - такие программы работают на уровне ядра, а не в пользовательском режиме;

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

- существуют API-функции, позволяющие снимать состояние всех клавиш виртуальной клавиатуры за один вызов, т.е. возможно отслеживать все действия пользователя, но пока активно окно приложения.
Ответить

Вернуться в «AutoIt»