Войти

Показать полную графическую версию : [архив - Часть 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 27 28 29 30 31 32 33 34 35 36 37 38 39 [40] 41 42 43 44 45 46 47 48 49 50

amel27
27-11-2007, 11:59
Angelus
Я хочу просто открыть провадник в какойто папке »вот пример:$sPathSelect = "C:\Windows\System32"
Run ("explorer.exe "&$sPathSelect, @SystemDir)
есть возможность даже выбрать папку/файл:$sPathSelect = "C:\Windows\System32"
Run ("explorer.exe /e, /select, "&$sPathSelect, @SystemDir)

FYI: Настройка параметров отображения проводника в Windows XP (http://support.microsoft.com/kb/307856/ru)

Creat0R
27-11-2007, 17:22
amel27,
хотя можно попытаться порулить политикой питания, на ентот счет есть свои API и, к примеру, менять эти настройки на время блокировки
О, это думаю будет проще/надёжнее, а как туда подрулить? http://files.myopera.com/Creat0R/Opera_AC/Icons/Kolobki/blush2.gif , т.к пересмотрев страничку по ссылке что ты дал, я так и не понял как на AutoIt это дело перевести...

вот вариант для версии 3.2.8.1
Гинеально! :clapping: Оно и вправду работает, спасибо!
Может на оф. форуме выложить, пусть поправят в оригинале?

обнаружил что, в 10-ке алгоритм более продуманный в плане производительности.
В UDF'ах? или сам движек AutoIt'а?

Angelus,
просто открыть провадник в какойто папке
Можно просто через ShellExecute(@SystemDir).

amel27
28-11-2007, 12:57
Creat0R
а как туда подрулить? »хм, у меня этот способ как-то странно работает... отключаются клавиши вроде сразу после применения политики, а вот включаться обратно не хотят - требуется перезагрузка компа... помучаю еще чуть :dont-know
Может на оф. форуме выложить, пусть поправят в оригинале? »да я не против, ткни куда выложить... только вот непонятно под какую версию делать UDF - новую или старую?... с другой стороны какой смысл править статус бар, если есть куча других несовместимых с иникодом GUI-функций?
В UDF'ах? или сам движек AutoIt'а? »в старом UDF был единый алгоритм для "своих" и "чужих" окон, в новом варианте "свои" GUI-окна пустили по короткому алгоритму

Creat0R
28-11-2007, 21:25
amel27,
только вот непонятно под какую версию делать UDF - новую или старую?
Конечно же новую, старую никто переделвать уже не будет :)
Я думаю нужно запостить в форум AutoIt Feature Requests (http://www.autoitscript.com/forum/index.php?showforum=4), назвать тему можно примерно так: “Unicode Support for _GUICtrlStatusBar_SetText()”
И предложить чтобы добавили дополнительный параметр $iUFlag...
Кстати, я до сих пор не понял, для чего функция _GUICtrlStatusBarSetUnicode()? что она делает? я ведь думал что именно она мне позволит отображать юникод в статусбаре.

По поводу всё того же юникода... если нельзя определить кодировку (её тип) строки, то может всё же возможно определить не является ли строка юникодной? т.е проверить нет ли юникодных символов в $String'е. Т.к нужно знать какой параметр ставить в той же функции для статусбар, ведь с 65001 не юникодная строка отображаться корректно не будет :(

fak1r
28-11-2007, 21:34
видимо моя проблема так и не решится :((

Maza Faka
29-11-2007, 06:35
fak1rвидимо моя проблема так и не решится
Что за проблема?

amel27
29-11-2007, 11:45
Maza Faka
пролистай назад, требуется автоматизация задач:

- регистрация на сайте (линк дан);
- заливка на сайт файлов.

Creat0R
я до сих пор не понял, для чего функция _GUICtrlStatusBarSetUnicode()? что она делает? »Судя по немногочисленным примерам (http://www.autoitscript.com/forum/index.php?showtopic=45211) переключает контрол в юникодовый режим, только я плохо представляю как можно передать юникодовый текст ANSI-сообщением... и тем более в каком он должен быть формате: UTF-8 или UTF-16?.. И еще настораживает тот факт, что в тырнете по сообщениям типа SB_SETUNICODEFORMAT инфа практически отсутствует... ИМХО все же перед тем как постить свой вариант нужно определиться чем не устраивает предложенный разработчиками способ...
предложить чтобы добавили дополнительный параметр $iUFlag »кроме прочего это будет идти в разрез с ихней кодировкой форматов
может всё же возможно определить не является ли строка юникодной? »можно проверить на соответствие строки требованиям формата (http://ru.wikipedia.org/wiki/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4), к примеру для UTF-8:Func _StringIsUTF8Format($string)
Local $asc, $i, $j, $len = StringLen($string), $ext = $len
For $i=1 To $len
$asc = Asc(StringMid($string, $i, 1))
If Not(BitAnd($asc,0x80)) Then
$ext=0
ElseIf Not(BitXOR(BitAnd($asc,0xE0),0xC0)) Then
$ext=1
ElseIf Not(BitXOR(BitAnd($asc,0xF0),0xE0)) Then
$ext=2
ElseIf Not(BitXOR(BitAnd($asc,0xF8),0xF0)) Then
$ext=3
EndIf
If $i+$ext>$len Then Return False
For $j = $i+1 To $i+$ext
$asc = Asc(StringMid($string, $j, 1))
If BitXOR(BitAnd($asc,0xC0),0x80) Then Return False
Next
$i+=$ext
Next
Return True
EndFunc

HORRIBLE
30-11-2007, 01:02
Все привет.
Как написать, что я зажал кнопку SHIFT ?
Объясните пожалуйсто, вот есть команда ControlClick("Adobe Acrobat 8 Professional", "", "[CLASS:Button; TEXT:Accept; INSTANCE:2]")
INSTANCE:2 - что это такое и откуда это берется?
Спасибо.

Maza Faka
30-11-2007, 06:58
HORRIBLE
Как написать, что я зажал кнопку SHIFT ?
Send("{+ Down}")

INSTANCE:2 - что это такое и откуда это берется?
Это вроде порядкового номера кнопки, если кнопок несколько, то у каждой свой INSTANCE.

В справке всё это обьясняется и очень подробно!

amel27
30-11-2007, 10:07
Send("{+ Down}") »не так, Shift+Down это будет: Send("+{Down}")

есть команда ControlClick("Adobe Acrobat 8 Professional", "", "[CLASS:Button; TEXT:Accept; INSTANCE:2]")
[...] что это такое »то же самое что ControlClick("Adobe Acrobat 8 Professional", "", "Button2")

Creat0R
вроде разобрался как управлять кнопками питания, вот UDF и пример:Global Const $PowerActionNone = 0
Global Const $PowerActionReserved = 1
Global Const $PowerActionSleep = 2
Global Const $PowerActionHibernate = 3
Global Const $PowerActionShutdown = 4
Global Const $PowerActionShutdownReset = 5
Global Const $PowerActionShutdownOff = 6
Global Const $PowerActionWarmEject = 7

Dim $aOFF[3]=[0,0,0]
$aBAK = PowerKeysCallState($aOFF) ; читаем/записываем состояние клавиш
MsgBox(0,'','Клавиши питания заблокированы!')
PowerKeysCallState($aBAK) ; восстанавливаем состояние клавиш
MsgBox(0,'','Состояние клавиш восстановлено!')

; $aKeys[0] - Power Key Action
; $aKeys[1] - Sleep Key Action
; $aKeys[2] - NoteBook Close Action

Func PowerKeysCallState($aKeys = 0)
Local Const $SysPwrPolLen = 232 ; size of SYSTEM_POWER_POLICY structure
Local $buf = DllStructCreate("byte["&$SysPwrPolLen&"]")
Local $tmp = DllStructCreate("long;int;long[2];int;long[2];int;long[2]", DllStructGetPtr($buf))
; Чтение текущей системной политики питания
Local $ret = DllCall("PowrProf.dll", "int", "CallNtPowerInformation", "int", 0, _
"ptr", 0, "int", 0, "ptr", DllStructGetPtr($buf), "int", DllStructGetSize($buf))
If Not(IsArray($ret)) Then SetError(1, @error) ; ошибка DLL
If $ret[0] Then Return SetError(2, $ret[0]) ; ошибка чтения политики
; Сохранение текущей конфигурации клавиш в выходном массиве
Local $i, $res[3]
For $i=1 To 3
$res[$i-1] = DllStructGetData($tmp,$i*2)
Next
; Сохранение требуемой конфигурации в структуре данных политики
If UBound($aKeys,1)=3 Then ; проверка типа данных
For $i=1 To 3
If BitShift($aKeys[$i-1],3)=0 Then ; проверка допустимого значения
DllStructSetData($tmp, $i*2, $aKeys[$i-1])
If $aKeys[$i-1]=0 Then DllStructSetData($tmp,$i*2+1,BitOR (DllStructGetData($tmp,$i*2+1,2),0x80000000),2)
If $aKeys[$i-1]>0 Then DllStructSetData($tmp,$i*2+1,BitAND(DllStructGetData($tmp,$i*2+1,2),0x7FFFFFFF),2)
EndIf
Next
; Применение новой политики
$ret = DllCall("PowrProf.dll", "int", "CallNtPowerInformation", "int", 0, _
"ptr", DllStructGetPtr($buf), "int", $SysPwrPolLen, "ptr", 0, "int", 0)
If Not(IsArray($ret)) Then SetError(1, @error) ; ошибка DLL
If $ret[0] Then Return SetError(3, $ret[0]) ; ошибка записи политики
EndIf
Return $res
EndFunc

TERMINAL
30-11-2007, 10:15
amel27, Creat0R, Подскажите плз...Как удалить с рабочего стола все ярлыки за исключением ярлыка КОРЗИНА.lnk. Я написал скриптик, но как только он встречает ярлык КОРЗИНА - сразу скрипт перестаёт работать.

Maza Faka
30-11-2007, 11:31
TERMINAL
Вообще-то корзина это не ярлык, а класс и так просто с рабочего стола её не удалить, можно через реестр:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\NameSpace\{645FF040-5081-101B-9F08-00AA002F954E}]
@="Recycle Bin"
Выложи свой скрипт.

TERMINAL
30-11-2007, 12:01
Maza Faka, Ты меня не понял-мне все ярлыки нужно удалить за исключением корзины.

Maza Faka
30-11-2007, 15:38
TERMINAL
Можно так:
#include <File.au3>

Dim $path = @DesktopDir
Global $LnkArray = _FileListToArray($path, "*.lnk")
_ArrayDisplay($LnkArray)

For $i = 1 To $LnkArray[0]
If $LnkArray[$i] <> "Корзина.lnk" Then FileDelete($path &"\"& $LnkArray[$i])
Next
Но если ярлыков много, то будет быстрее, если переместить ярлык "корзины" в другую папку, удалить все ярлыки и переместить ярлык "корзины" обратно.

NikLok
30-11-2007, 16:05
amel27, для начала можно ТУТ (главы 8, 9 »
Ты не в курсе почему не открывается этот материал более?

А самое главное нет ли у тебя да и у Creatora заодно желание создать аналог BSPI, который я очень уважаю, но автор его редко дорабатывает!
Я думаю преимущества Вам понятны. А сама разработка была бы замечательным учебным примером для остальных!

Creat0R
30-11-2007, 17:16
amel27, можно проверить на соответствие строки
Работает, спасибо - я не думал что это реально построить лишь встроенными функциями AutoIt'а :)

HORRIBLE, Maza Faka, amel27,
Send("{+ Down}")
не так, Shift+Down это будет: Send("+{Down}")
Но как я понял, требуется зажать Shift, а не Shift и вниз ;) ...

Send("{SHIFTDOWN}"), и соответственно отпустить - Send("{SHIFTUP}").
amel27,

вроде разобрался как управлять кнопками питания, вот UDF и пример:
Я не сомневался ;), ещё и в придачу “блокирует” закрытие крышки ноута :) - Спасибо.

HORRIBLE
01-12-2007, 14:44
Скажите почему не работает последняя команда, что я не так пишу???
Или тут нельзя этой командой пользоваться, а можно только табом добраться до кнопочки ACCEPT?
Пасибо.

Maza Faka
01-12-2007, 15:55
HORRIBLE
Попробуй так:
ControlClick("Adobe Acrobat 8 Professional", "", "Internet Explorer_Server1")

Creat0R
02-12-2007, 01:48
amel27,
По поводу определения флэша...
Я проверил, на системе никогда не устанавливался флэш плеер, функция от piccaso вернула версию 6, я установил плеер, возвращает 9 - вот я и подумал, а что если просто проверять совместимость текущей версии и версии плеера? (или может есть возможность послать запрос (от лица IE) на получение инфы о том, установлен ли в системе Flash плеер?).

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

Global $oErr = ObjEvent("AutoIt.Error", "_ComError")

$FlashCurrentVersion = _GetFlashVersion()
$FlashIsCompatible = IsCompatible_Flash_Version($FlashCurrentVersion)

If Not @error Then
MsgBox(64, "", "Flash Player is compatible (installed last version)? = " & $FlashIsCompatible)
Else
MsgBox(48, "Error", "Please check your connection to the Internet.")
EndIf

Func IsCompatible_Flash_Version($Version=9)
If Number($Version) <= 0 Then Return False

Local $sSource = _HTTPGetSource("www.adobe.com", "/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash")
If @error Then Return SetError(1, 0, -1)

Local $InetFlashVersion = StringRegExpReplace($sSource, '(?i)(?s).*?<strong>Version</strong>:(.*?)</li>.*', '\1')
$InetFlashVersion = StringStripWS($InetFlashVersion, 3)
$InetFlashVersion = StringLeft($InetFlashVersion, 1)
If Number($InetFlashVersion) > Number($Version) Then Return False
Return True
EndFunc

Func _GetFlashVersion()
Local $oSwf, $sVersion
$oSwf = ObjCreate("ShockwaveFlash.ShockwaveFlash")
If @error Then Return 0 ; No flash at all
$oSwf.AllowScriptAccess = "always"
$sVersion = $oSwf.GetVariable("$Version")
If @error Then
$oSwf = ObjCreate("ShockwaveFlash.ShockwaveFlash.3")
If @error Then
$oSwf = ObjCreate("ShockwaveFlash.ShockwaveFlash.2")
If @error Then Return 0
Return 2
EndIf
Return 3
EndIf
$sVersion = StringTrimLeft($sVersion, 3)
$sVersion = StringLeft($sVersion, StringInStr($sVersion, ",") - 1)
Return Number($sVersion)
EndFunc

Func _HTTPGetSource($sHost, $sPage)
TCPStartup()

Local $sRetSource = ""
Local $nCurrentLine, $sRcvBytes = 1024
Local $Name_To_IP = TCPNameToIP($sHost)
Local $iSocket = TCPConnect($Name_To_IP, 80)

If $iSocket = -1 Then
TCPCloseSocket($iSocket)
Return SetError(1, 0, 0)
EndIf

Local $sCommand = "GET " & $sPage & " HTTP/1.1" & @CRLF
$sCommand &= "Host: " & $sHost & @CRLF
$sCommand &= "User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)" & @CRLF
$sCommand &= "Connection: close" & @CRLF & @CRLF

Local $iBytesSent = TCPSend($iSocket, $sCommand)
If $iBytesSent = 0 Or @error Then Return SetError(2, @error, 0)

While 1
$nCurrentLine = TCPRecv($iSocket, $sRcvBytes)
If @error <> 0 Then ExitLoop
If $nCurrentLine <> '' Then $sRetSource &= $nCurrentLine
WEnd

TCPCloseSocket($iSocket)
TCPShutdown()

Return $sRetSource
EndFunc

Func _ComError()
; Just set @error, the script will handle it...
Local $iErr = $oErr.number
If $iErr = 0 Then $iErr = -1
SetError($iErr)
EndFunc

Один нюанс - я не уверен как задать «User Agent» для Http запроса, нужно в принципе для Internet Explorer, но в википедии (http://ru.wikipedia.org/wiki/User_Agent) слишком много вариантов, я выбрал самый простой (средний).

amel27
02-12-2007, 08:31
Creat0R
на системе никогда не устанавливался флэш плеер, функция от piccaso вернула версию 6 »может тогда не заморачиваться? =)Func IsShockwaveInst()
Local $i
For $i=13 To 7 Step -1
If IsObj(ObjCreate("ShockwaveFlash.ShockwaveFlash." & $i)) Then Return True
Next
Return False
EndFunc

не думал что это реально построить лишь встроенными функциями AutoIt'а »ты не понял мою мысль - проблема не в ограниченности языка, а в самой системе кодировок, та же UTF-8 строка всегда будет соответствать некоторой ANSI-последовательности... хотя она будет похожа скорей на набор спецсимволов, чем на осмысленный текст (а вдруг это шифротекст? ;) ), поэтому чем длинней текст тем точней можно угадать кодировку

“блокирует” закрытие крышки ноута »на самом деле приведенная UDF контролирует POWER-клавиши только для On-Line состояния, для управления клавишами в режиме On-Battery требуется другая такая же UDF (типа PowerKeysCallDCState), в которой первый параметр заменен с "0" на "1": ; ...
; Чтение текущей системной политики питания
Local $ret = DllCall("PowrProf.dll", "int", "CallNtPowerInformation", "int", 1, _
"ptr", 0, "int", 0, "ptr", DllStructGetPtr($buf), "int", DllStructGetSize($buf))
; ...
; Применение новой политики
$ret = DllCall("PowrProf.dll", "int", "CallNtPowerInformation", "int", 1, _
"ptr", DllStructGetPtr($buf), "int", $SysPwrPolLen, "ptr", 0, "int", 0)
; ...




© OSzone.net 2001-2012