Показать полную графическую версию : [Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:.
TERMINAL
10-04-2008, 14:15
amel27, Проблемка в том что у всех юзеров один и тот же айпишник а имена пользователей разные....
у всех юзеров один и тот же айпишник а имена пользователей разные.... »Если ты про мой гипотетический вариант, то там сеть вообще не нужна - файл может быть локальный... Если про готовые примеры то это тоже не проблема - там кроме IP еще и номер порта задается, так что (даже если в интерфейсе этого не видно) в скрипте можно указать разные номера портов для одного IP.
что нужно прописать что бы снять галочку "Desktop Shortcut"??? »Эта ветка по общим вопросам, для вопросов по установке конкретных программ ищите соответствующую тему или создавайте новую (это из шапки)... Либо формулируйте вопрос без привязки к конкретной программе/версии... Подсказка: используйте "AutoIT Window Info" из комплекта AutoIT.
amel27 , спасибо, но это не совсем то... Не подскажешь, как получить статистику через Ras API?
KillHunter
10-04-2008, 20:25
Эта ветка по общим вопросам, для вопросов по установке конкретных программ ищите соответствующую тему или создавайте новую (это из шапки)... Либо формулируйте вопрос без привязки к конкретной программе/версии... Подсказка: используйте "AutoIT Window Info" из комплекта AutoIT. »
Я извиняюсь что влез не в ту тему,но эмуляцию клика я и сам могу прописать.Меня интересует эмуляция клавиатурных
нажатий(по идее там нужно нажать TAB,4 раза Down,SPACE и ENTER,я пишу что-то типа:
Send("{TAB}")
Send("{DOWN 4}")
Send("{SPACE}")
Send("{ENTER}")
но ярлык всё равно создаётся)
Меня интересует эмуляция клавиатурных
нажатий »Эмуляция нажатий (равно как и "кликов") довольно ненадежна при работе с окнами, так как нужно быть уверенным что активизировано именно то окно и именно тот элемент окна, иначе комбинация не сработает или уйдет не туда и результат непредсказуем.... Поэтому для установки ПО этот метод применять нежелательно, либо как крайний случай. AutoIT имеет достаточно возможностей для прямой работы с окнами, главное однозначно идентифицировать окно и элемент (заголовок, класс, текст). Вот вариант для твоего случая:#include <GuiTreeView.au3>
$hDTCtrl = ControlGetHandle("DAEMON Tools", "", "SysTreeView321") ; ищем элемент окна
$hDTItem = _GUICtrlTreeView_FindItem($hDTCtrl, "Desktop Shortcut") ; ищем нужный пункт списка
_GUICtrlTreeView_SetChecked($hDTCtrl, $hDTItem, False) ; снимаем чекбокс
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
Вот вариант для твоего случая: »
Всё равно ярлык остаётся...(((
Всё равно ярлык остаётся...((( »ну коли не хошь в свою тему чтобы не оффтопить кидай ВЕСЬ скрипт в ПМ
KillHunter, Может проще его удалять из AutoIt скрипта в конце?!
но это не совсем то... Не подскажешь, как получить статистику через 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
amel27, да, именно так! Спасибо огромное, все работает!
KillHunter
12-04-2008, 02:31
Может проще его удалять из AutoIt скрипта в конце?! »
Может и проще,но мне интересно понять где я ошибся....
Если напишешь как ярлык удалить буду благодарен.
Maza Faka
12-04-2008, 16:20
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;
Полдня бьюсь, не получается :(
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
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-е нужно преобразовывать в бинарный код?
Можно ли написать скрипт который бы включал и отключал сетевую плату через диспетчер устройств?
KillHunter, Если напишешь как ярлык удалить буду благодарен. »
Ну это детский вопрос и возможно мой ответ будет правильным.
Ярлык это файл с расширением lnk. Поэтому удалив этот файл ты удалишь ярлык.
Вот например я удаляю тотал мандер из автозапуска:
If FileExists(@StartupDir & "\Total Commander.lnk") Then
FileDelete(@StartupDir & "\Total Commander.lnk")
EndIf
Аналогично с программами.
Когда хочешь удалить из панели быстрого запуска просто нужно правильно указать положение файла.
Это скорре всего что- то типа
@UserProfileDir & "\Application Data\Microsoft\Internet Explorer\Quick Launch\Твоя программа.lnk"
Maza Faka, почему на Дельфи такое формирование строки получается, а на AutoIt-е нужно преобразовывать в бинарный код? »ну хотя бы потому, что AutoIT не поддерживает указатели на переменные (в данном случае строковые) - только на структуры, поэтому приходится формировать структуру в два приема: сначала создаем строку (так же как в DELFI), потом присваиваем (т.е. "копируем") это значение в структуру... но при выполнении последней операции (копирования строки) AutoIT просто обязан оборвать строку на первом нулевом байте (конец строки!), только бинарные строки позволяют содержать нулевые байты (как в юникоде)
KillHunter
мне интересно понять где я ошибся »похоже, что при входе в окно выбора компонент курсор находится совсем не в том месте где предполагалось - не на выборе режима (Standard/Custom), а уже на списке компонент, т.е. первый TAB будет лишний... Самое неприятное, что при таком положении "SPACE" отрабатывает не на компоненте ярлыка, а на кнопке "Next" что сбивает весь дальнейший ход установки. И еще неприятный момент - если вручную вернуться на этап выбора компонент (через "Back") курсор встанет как и положено на "Standard/Custom".
Всё равно ярлык остаётся »все оказалось не так просто - галка снимается, но до установщик "не догоняет", что компоненту не нужно ставить... тем не менее выход есть - использовать новую ф-цию _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)
Можно ли написать скрипт который бы включал и отключал сетевую плату через диспетчер устройств? »Насколько важно именно через Диспетчер устройств?.. AFAIK через "сетевые подключения" можно добиться такого же результата... Как альтернатива для Висты можно использовать WMI, для 2К/XP - утилиту DevCon (http://support.microsoft.com/kb/311272)... думаю можно замутить аналогичное и в 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
amel27, что-то попробовал скомпелировать чаты по твоей ссылке-все ошибки выдают:(
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.