PDA

Показать полную графическую версию : [Архив - Часть 1.2] AutoIt скрипты


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [26]

Dentel
30-11-2006, 16:42
qeraser

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

amel27
01-12-2006, 05:17
Creat0R
А чем не устраивает простое отключение/включение родительского окна?#include <GUIConstants.au3>

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
01-12-2006, 09:06
amel27
чем не устраивает простое отключение/включение родительского окна?
Ну например, в панели задачь появляется дополнительная вкладка :) , или если сделать поверх всех окон гуи, то вызываемое окно буде за ним... можно конечно выкрутится функцией WinSetOnTop, но это, имхо, не удобно...
В идеале, хочется чтобы можно было вызвать окно сохранения (к примеру), и нажимая на окно гуи, чтобы вызванное окно мигало, точно также как это происходит если вызвать дочернее окно гуи... вот пример:


#include <GUIConstants.au3>

$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


Кстати, почти такой же способ (в плане задумки функиональности) как ты привёл в примере, я использовал для скрипта который разукрашивает скрипты для поста :) . Ты его уже видел? тот который я запостил тут (http://forum.oszone.net/thread-60616-50.html#post516357).

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

P.S.S.
А ты не знаешь случам как решить задачку про проверку на нажатие определённой клавиши, кнопки мышки, или любого другого действия со стороны пользователя? (Которую я тоже привёл в посте со скриптом для разукрашивания (http://forum.oszone.net/thread-60616-50.html#post516357)).

amel27
01-12-2006, 09:43
DentelУ меня есть сервер, к которому не подключен монитор. На сервере установлена WinXP. Захожу на этот сервер с помощью "Подключение к удаленному рабочему столу" через локальную сеть. На сервере вылажен скрипт. Если "подключение" активно, то скрипт работает и делает то, что надо. Если "подключение" закрыто, скрипт глохнет При отключении рабочий стол блокируется, для нормальной работы его нужно разблокировать удаленно или с локальной консоли... Поэтому связка AutoLogon+VNC удобней для администрирования серверов нежели RDP. ИМХО.

amel27
02-12-2006, 10:23
Creat0RВ идеале, хочется чтобы можно было вызвать окно сохранения (к примеру), и нажимая на окно гуи, чтобы вызванное окно мигало, точно также как это происходит если вызвать дочернее окно гуиМожно самому написать аналогичные функции, пример:#include <GUIConstants.au3>
#include <Constants.au3>

$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
02-12-2006, 11:00
Creat0RА ты не знаешь случам как решить задачку про проверку на нажатие определённой клавиши, кнопки мышки, или любого другого действия со стороны пользователя? (Которую я тоже привёл в посте со скриптом для разукрашивания).- AutoIT не годится для программ типа "клавиатурных шпионов" - такие программы работают на уровне ядра, а не в пользовательском режиме;
- нет надежных средств для снятия состояния клавиатуры, пользовательские программы работают с виртуальной, а не реальной клавиатурой;
- существуют API-функции, позволяющие снимать состояние всех клавиш виртуальной клавиатуры за один вызов, т.е. возможно отслеживать все действия пользователя, но пока активно окно приложения.




© OSzone.net 2001-2012