Ru-Board.club
← Вернуться в раздел «Программы»

» AutoIT

Автор: Zwook
Дата сообщения: 30.12.2008 14:38

Цитата:
Можно попробовать с Memory UDF


Цитата:
Не уверен, но может AutoIt Inline Assembly UDF поможет?


Спасибо!




Цитата:
Лучше в справку сходить, MouseMove не возвращает массивов, возможно речь про PixelSearch(), и там кстати возвращается одномерный массив, но только если найден цвет, иначе @error = 1 (отсюда может и всплывать ошибка связанная с неверной размерностью массива).



Цитата:
В том, что с двумерными массивами нужно обращаться соответственно



Это я все знаю, но это не совсем то, что мне нужно было... я попробую сформулировать вопрос лучше ...

Я изменил немного функцию....
Не получилось сформулировать вопрос, решил показать конкретно ту функцию.



Код:
Func Start()
    MouseDown("left")

    $Coord = PixelSearch(0, 0, 1200, 750, 0x55705c, 1)
    $Safecoord = PixelSearch(210, 140, 430, 515, 0x55705c, 1)

If $Safecoord[1] <210 Then ;Вот эта часть
    $Safecoord[1] = 210 ;Не работает
    EndIf ;Что делать?

If IsArray($Safecoord) Then
    MouseMove( 255, $Safecoord[1]-90, 0 )
EndIf

    If IsArray($Coord) Then
    MouseMove( 255, $Coord[1], 0 )
EndIf
EndFunc
Автор: araneon
Дата сообщения: 30.12.2008 16:31
ViSiToR неподскажеш как Функцию Отключения/Подключения к Интернету можно применить к VPN соединению, а то у меня неработает (((
Автор: Zwook
Дата сообщения: 30.12.2008 16:39

Цитата:
неподскажеш как Функцию Отключения/Подключения к Интернету можно применить к VPN соединению, а то у меня неработает (((


???


Код:
; AutoIt Version: 3.0
; Language: English
; Platform: WinXP SP2 (Tested)
; Author: Kenneth Padgett / IT Lifesaver / kenneth@itlifesaver.com
; Version: 1.0
;
; Script Function:
; Creates a PPTP VPN connection on Windows XP clients
; to connect to the server info you provide
;


#NoTrayIcon
#compiler_icon=itlifesaver.ico
#include <GUIConstants.au3>

$COMPANY_NAME = "Work VPN" ; name of the VPN icon
$COMPANY_IP = "123.123.123.123" ; can be DNS name too
$ConfigureDNS = True ; true if script should set DNS servers, false if not
$COMPANY_DNS1 = "192.168.1.10"
$COMPANY_DNS2 = "" ; optional
$NotDefaultGW = True ; true if script should uncheck the 'Use remote network as default gateway', if you want inet traffic to go through the VPN, set to false

$DELAY = 100

$answer = MsgBox(4, "VPN Connection", "This script will create a VPN connection to " & $COMPANY_NAME & ", Ready?")
If $answer = 7 Then
Exit
EndIf

; Prompt user for VPN login info
$frmInformation = GUICreate("Enter Information", 287, 194, 193, 115)
$lblUserName = GUICtrlCreateLabel("User Name:", 16, 40, 60, 17)
$lblPassword = GUICtrlCreateLabel("Password:", 16, 80, 53, 17)
$txtUserName = GUICtrlCreateInput("", 112, 40, 153, 21)
$txtPassword = GUICtrlCreateInput("", 112, 80, 153, 21, BitOR($ES_PASSWORD,$ES_AUTOHSCROLL))
$lblPassword2 = GUICtrlCreateLabel("Confirm Password:", 16, 120, 91, 17)
$txtPassword2 = GUICtrlCreateInput("", 112, 120, 153, 21, BitOR($ES_PASSWORD,$ES_AUTOHSCROLL))
$btnOK = GUICtrlCreateButton("&OK", 200, 160, 75, 25, 0)
$lblInfo = GUICtrlCreateLabel("Enter your VPN Login Information Below!", 48, 8, 196, 17)
GUISetState(@SW_SHOW)

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $btnOK
If GUICtrlRead($txtPassword) <> GUICtrlRead($txtPassword2) Then
MsgBox (16, "Error", "Passwords do not match! Try again.")
Else
$Username = GUICtrlRead($txtUsername)
$Password = GUICtrlRead($txtPassword)
ExitLoop
EndIf
Case $GUI_EVENT_CLOSE
Exit

EndSwitch
WEnd
GUISetState(@SW_HIDE)

; Run Network Setup
Run("control ncpa.cpl")
WinWaitActive("Network Connections")

; Check if VPN by same name already exists, since it'll break script later if Windows add's a number at the end of the name...
$ControlID = ControlListView("Network Connections", "", "SysListView321", "FindItem", $COMPANY_NAME, "Virtual Private Network")
If $ControlID <> -1 Then
$answer = MsgBox(4404, "Error", "VPN Connection to " & $COMPANY_NAME & " already exists! Remove it and recreate it?")
If $answer = 6 Then
ControlListView("Network Connections", "", "SysListView321", "Select", $ControlID)
Send("{DEL}")
WinWaitActive("Confirm Connection Delete")
Send("!y")
Sleep($DELAY)
Else
MsgBox(16, "Exit", "Script stopped by user")
Exit
EndIf
EndIf

; open new connection wizard from file menu
Send("!f")
Send("n")

WinWaitActive("New Connection Wizard")
Send("!n")
Sleep($DELAY)

; What do you want to do?
Send("!o")
Sleep($DELAY)
Send("!n")
Sleep($DELAY)

; How do you want to connect to the network at your workplace?
Send("!v")
Sleep($DELAY)
Send("!n")
Sleep($DELAY)

; Specifiy a name for this connection to your workplace.
Send($COMPANY_NAME)
Send("!n")
Sleep($DELAY)

; Windows can make sure the public network is connected first.
Send("!d")
Sleep($DELAY)
Send("!n")
Sleep($DELAY)

; What is the name or address of the VPN server?
Send($COMPANY_IP)
Send("!n")
Sleep($DELAY)

; Wizard Complete, do we want a desktop shortcut?
Send("!s")
Sleep($DELAY)
Send("{ENTER}")

WinWaitClose("New Connection Wizard")

WinWaitActive("Connect " & $COMPANY_NAME)

Send($Username)
Send("{TAB}")
Send($Password)
Sleep($DELAY)
Send("!s") ; save password...
Send("!a") ; for anyone who uses this computer, use "!n" for 'Me only'
Sleep($DELAY)

If $ConfigureDNS Or $NotDefaultGW Then

Send("!o") ; open Properties

WinWaitActive($COMPANY_NAME & " Properties")
Send("^{TAB 3}")
Sleep($DELAY)

Send("!o") ; highlight 'This connection uses the following items:'...
Sleep($DELAY)
; select TCP/IP from the listview:
$ControlID = ControlListView($COMPANY_NAME & " Properties", "", "SysListView321", "FindItem", "Internet Protocol (TCP/IP)")
If $ControlID = -1 Then
MsgBox(16, "Error", "Could not select TCP/IP, please finish setup manually")
Exit
EndIf
ControlListView($COMPANY_NAME & " Properties", "", "SysListView321", "Select", $ControlID)
Sleep($DELAY)

Send("!r") ; open properties
WinWaitActive("Internet Protocol (TCP/IP) Properties")

If $ConfigureDNS Then
Send("!e") ; Use the following DNS server addresses
Sleep($DELAY)
Send($COMPANY_DNS1)
Sleep($DELAY)

If $COMPANY_DNS2 <> "" Then
Send("{TAB}")
Send($COMPANY_DNS2)
Sleep($DELAY)
Endif
EndIf

If $NotDefaultGW Then
Send("!v")
WinWaitActive("Advanced TCP/IP Settings")

Send("!u") ; Uncheck 'Use default gateway on remote network'
ControlClick("Advanced TCP/IP Settings", "", 1) ; click OK
EndIf

WinWaitActive("Internet Protocol (TCP/IP) Properties")
ControlClick("Internet Protocol (TCP/IP) Properties", "", 1) ; click OK

WinWaitActive($COMPANY_NAME & " Properties")
ControlClick($COMPANY_NAME & " Properties", "", 1) ; click OK
EndIf

WinClose("Network Connections")
Автор: ViSiToR
Дата сообщения: 30.12.2008 20:44
Zwook 15:38 30-12-2008
Цитата:
решил показать конкретно ту функцию


Там же есть уже проверка на массивность, в чём проблема проверять и для сравнения значения в [1]?


Код: Func Start()
MouseDown("left")

$Coord = PixelSearch(0, 0, 1200, 750, 0x55705c, 1)
$Safecoord = PixelSearch(210, 140, 430, 515, 0x55705c, 1)

If IsArray($Safecoord) Then
If $Safecoord[1] < 210 Then $Safecoord[1] = 210
MouseMove( 255, $Safecoord[1]-90, 0)
EndIf

If IsArray($Coord) Then MouseMove( 255, $Coord[1], 0)
EndFunc
Автор: Zwook
Дата сообщения: 30.12.2008 21:59
А все оказалось гениально просто, спасбо вам Визитор! Щас балаюсь с UDF'ами изменяющие опкод. Если чего стоящее получится, то выложу сюда.
Автор: Maza Faka
Дата сообщения: 31.12.2008 05:47
ViSiToR

Цитата:
Кстати, на оф. форуме делали сравнение

Хм... действительно COM-метод очень медленный. Для сравнения обработал папку с кучей mp3-файлов (62 GB), результаты очевидны:
Твой скрипт: 1613 ms
Мой скрипт: 6583 ms

А я то думал, что строка If StringInStr(FileGetAttrib($sFilePath & "\"), "D") Then будет замедлять работу скрипта, когда, как COM-метод не нуждается в подобной проверке.
Спасибо за информацию, больше использовать COM-методы для поиска файлов не буду

P.S.
И всё же, почему COM-метод медленее?
Автор: ViSiToR
Дата сообщения: 31.12.2008 11:26
Maza Faka 06:47 31-12-2008
Цитата:
И всё же, почему COM-метод медленее?

Думаю из за постоянного обращения к объекту (при каждом получении пути), который срабатывает вне скрипта (в системе). Т.е скрипт как бы постоянно “дёргает” движёк COM-объектов, ведь тот же не знает что скрипт взял на себя обработку

P.S
Самый быстрый метод как ни странно, оказался запуск консольной команды «dir» Но там свои проблемы (с кодировкой к примеру).
Автор: Maza Faka
Дата сообщения: 31.12.2008 11:40
ViSiToR

Цитата:

Думаю из за постоянного обращения к объекту

Возможно.


Цитата:

Самый быстрый метод как ни странно, оказался запуск консольной команды «dir»

Ну почему же странно, по моему вполне очевидно
Автор: araneon
Дата сообщения: 31.12.2008 12:57
Zwook можеш немнога пояснить свой код??? А то я ещё слобоват в этом
Автор: Leagnus
Дата сообщения: 01.01.2009 13:34
на стр. 132 в скрипте Main_GUI.au3 описка (вероятно кодера picasso, но вдруг кто за правду примет?). Не "Costum Struct", а "custom struct". А то костюмная структура получаетцо в памяти.

Мысли вслух. Чем структ отличается от массива? Тем, что массив – упрощённая, оскоплённая структура без указателя на адрес памяти и с однотипными данными? И читать созданный структ не обязательно с пом. DllCall, как написано в справке по AutoIt. Не пойму: зачем, чтобы считать данные в уже созданном одной прогой структе, другая прога ещё раз создаёт структ по переданному ей адресу? Адрес один, а ребёночка каждый хочет родить по-своему...
Автор: Maza Faka
Дата сообщения: 01.01.2009 15:32
Leagnus

Цитата:
И читать созданный структ не обязательно с пом. DllCall, как написано в справке по AutoIt. Не пойму: зачем, чтобы считать данные в уже созданном одной прогой структе, другая прога ещё раз создаёт структ по переданному ей адресу?

Хм... интересно рассуждаешь, может примеры запостишь, если есть?
Автор: Loopback
Дата сообщения: 01.01.2009 15:35

Цитата:
Мысли вслух. Чем структ отличается от массива? Тем, что массив – упрощённая, оскоплённая структура без указателя на адрес памяти и с однотипными данными? И читать созданный структ не обязательно с пом. DllCall, как написано в справке по AutoIt.

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

Цитата:

Не пойму: зачем, чтобы считать данные в уже созданном одной прогой структе, другая прога ещё раз создаёт структ по переданному ей адресу? Адрес один, а ребёночка каждый хочет родить по-своему...

А что такое структура? Структура - это условность, по сути это просто участок памяти с определенной длиной. Одни и те же данные могут быть интерпретированы по-разному. Например, есть блок памяти длиной 8 байт, его можно представить как:

byte[8]
char[4];char[4]
int;int
ptr;ptr
short;short;short;short
и т.д.

Так что структуры, в общем-то, служат для удобства выделения определенных типов данных. И когда мы в Autoit "создаем" структуру по заданному адресу, мы просто имеем в виду: по такому-то адресу должен быть "int", по такому-то - указатель и т.д.
Автор: Leagnus
Дата сообщения: 01.01.2009 16:23

Цитата:
...может примеры запостишь

Да хотя бы здесь – интересна сама UDF COMAU3.au3
Автор: ViSiToR
Дата сообщения: 01.01.2009 16:37
Leagnus 17:23 01-01-2009
Цитата:
Да хотя бы здесь

Я на этой основе и сделал свой пример
Автор: Maza Faka
Дата сообщения: 02.01.2009 06:41
Leagnus

Цитата:
Не пойму: зачем, чтобы считать данные в уже созданном одной прогой структе, другая прога ещё раз создаёт структ по переданному ей адресу?

Дык, а как сделать по другому? Передать готовую структуру? Как ты себе это представляешь, и вообще, чем не устраивает данный метод?
Автор: Leagnus
Дата сообщения: 02.01.2009 15:14
Представляю так: структ, как объект, создаётся одной прогой, а другая, получив от первой указатель на этот созданный "сервис", просто считывает свойства подобъектов готового структа. Иначе зачем давать адрес, с которого народ уже съехал или по которому тебе не видать жителей и ты строишь дом заново и заселяешь его.
Автор: Maza Faka
Дата сообщения: 02.01.2009 16:50
Leagnus

Цитата:
структ, как объект, создаётся одной прогой

Но структура не объект.


Цитата:
а другая, получив от первой указатель на этот созданный "сервис"

Она и получает указатель на адрес в памяти.


Цитата:
Иначе зачем давать адрес, с которого народ уже съехал

Почему съехал?! По адресу, как раз всё и сохраняется (кстати в MSDN-е есть предупреждение о том, что бы память по переданному адресу не обнулялась, пока принимающее приложение не закончит обработку уведомления).
Мне интересно, ты видел реализацию

Цитата:

структ, как объект, создаётся

в каких либо других языках?
Автор: Dm666
Дата сообщения: 02.01.2009 22:00
Господа, подскажите плз, кто знает. Вроде простая вещь, но никак не могу сделать.
Есть форма, на ней 3 окошка Input с ограничением ввода на 5 знаков каждое. Как сделать так, чтобы при вводе 5-го знака курсор сам прыгал в следующее окошко инпута? Чтобы TAB не нажимать...
Долго курил хэлп, но ничего не нашел. Это вообще возможно, или я странного хочу?

Автор: ViSiToR
Дата сообщения: 02.01.2009 23:00
Dm666 23:00 02-01-2009
Цитата:
Как сделать так, чтобы при вводе 5-го знака курсор сам прыгал в следующее окошко инпута?

Вот так:


Код: #include <GuiConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
;

$hGUI = GUICreate("Input Auto-Tab Demo", 300, 180)

$Input_1 = GUICtrlCreateInput("", 20, 20, 260, 20)
$Input_2 = GUICtrlCreateInput("", 20, 50, 260, 20)
$Input_3 = GUICtrlCreateInput("", 20, 80, 260, 20)

;~ GUICtrlSetLimit($Input_1, 5)
;~ GUICtrlSetLimit($Input_2, 5)
;~ GUICtrlSetLimit($Input_3, 5)


$Ok_Button = GUICtrlCreateButton("Ok", 20, 140, 60, 20)
$Exit_Button = GUICtrlCreateButton("Exit", 100, 140, 60, 20)

GUISetState()
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $Exit_Button
ExitLoop
Case
$Ok_Button
MsgBox(64, "...", "Ok - This is a Test", 0, $hGUI)
EndSwitch
WEnd

Func
WM_COMMAND($hWnd, $nMsg, $wParam, $lParam)
Local $nNotifyCode = BitShift($wParam, 16)
Local $nID = BitAND($wParam, 0xFFFF)

Switch $nID
Case $Input_1, $Input_2, $Input_3
Switch $nNotifyCode
Case $EN_UPDATE
Local $sRead_Input = GUICtrlRead($nID)
Local $sFirstChars = StringLeft($sRead_Input, 3)

If StringLen($sRead_Input) >= 5 Then
If $nID = $Input_3 Then
GUICtrlSetState($Ok_Button, $GUI_FOCUS)
Else
GUICtrlSetState($nID+1, $GUI_FOCUS)
EndIf

GUICtrlSetData($nID, StringLeft($sRead_Input, 5))
EndIf
EndSwitch
EndSwitch

Return $GUI_RUNDEFMSG
EndFunc
Автор: Dm666
Дата сообщения: 03.01.2009 12:18
ViSiToR

Цитата:
Оно?


Да!!! MegaThanx!!! Работает как часы. Пошел разбираться с принципом работы...
Еще раз спасибо!
Автор: hunter19
Дата сообщения: 03.01.2009 16:38
Может кто знает, как отследить список всех файлов, переносимых (drag & drop) с любого файлового менеждера или проводника в саму программу? А то макрос @GUI_DragFile возвращает только один файл. Пересмотрел весь help, так ничего и не нашёл.
Edited
[Нашел решение]
Автор: araneon
Дата сообщения: 03.01.2009 16:53
И снова прошу помощи у знатоков, можно ли средствами AutoIt реализовать реконект инета, нашол вариант при помощи bat файла (rasdial), но хотелось бы всё же autoit использовать, к тому же нужно после реконекта послать двойное нажатие клавиши F5 в USDownloader когда тот свёрнут в трей. Просто надо, чтобы после реконекта USD сразу неначинал закачивать файл без таймера. Заранее огромное спасибо. РЕШЕНИЕ НАЙДЕНО
Автор: andnosi
Дата сообщения: 03.01.2009 17:49
Вопрос по поводу слайдера.
В окне изменения аппаратного ускорения видеокарты

отключаю это аппаратное ускорение (ставлю слайдер на нулевую позицию) и кликаю кнопку "Применить". Внешне все ок, но если закрыть и снова открыть это окно, то вижу, что на самом деле аппаратное ускорение не выключилось. Почему?

Вот отрывок из кода, связанный со слайдером:

Код:
$h_slider = ControlGetHandle("Свойства: Модуль подключения монитора и ", " Установите вручную уровень ап", "msctls_trackbar321")
_GUICtrlSlider_SetPos($h_slider, 0)
ControlClick("Свойства: Модуль подключения монитора и "," Установите вручную уровень ап","Button5")
Автор: wasmkv
Дата сообщения: 03.01.2009 18:39
Нашел подпрограмму проверки подключения к Интернету здесь :

Код: $state=-1
$state1=Ping("www.google.com", 250)

While 1
If $state1=0 Then
Select
Case
$state1=0 And _IsCon()=0
TrayTip("Internet Connection","Disconnected, Check That Cable Is Plugged In",2,2)
$state=0
Case $state1=0
TrayTip("Internet Connection","Disconnected, Check Modem For Connection",2,2)
$state=0
EndSelect

Else
EndIf

Sleep(10000)
Exit
WEnd

Func
_IsCon()
$IsCon=DllCall("WinInet.dll","int","InternetGetConnectedState","int_ptr",0,"int",0)
Return $iscon[0]
EndFunc
Автор: Maza Faka
Дата сообщения: 04.01.2009 06:49
wasmkv

Цитата:
Нашел подпрограмму проверки подключения к Интернету

У меня эта функция всегда возвращает истину. А вот эти функции работают правильно:

1.

Код: $connect = _GetNetworkConnect()

If $connect Then
MsgBox(64, "Connections", $connect)
Else
MsgBox(48, "Warning", "There is no connection")
EndIf

Func
_GetNetworkConnect()
Local Const $NETWORK_ALIVE_LAN = 0x1 ;net card connection
Local Const $NETWORK_ALIVE_WAN = 0x2 ;RAS (internet) connection
Local Const $NETWORK_ALIVE_AOL = 0x4 ;AOL

Local $aRet, $iResult

$aRet
= DllCall("sensapi.dll", "int", "IsNetworkAlive", "int*", 0)

If BitAND($aRet[1], $NETWORK_ALIVE_LAN) Then $iResult &= "LAN connected" & @LF
If BitAND($aRet[1], $NETWORK_ALIVE_WAN) Then $iResult &= "WAN connected" & @LF
If BitAND($aRet[1], $NETWORK_ALIVE_AOL) Then $iResult &= "AOL connected" & @LF

Return $iResult
EndFunc
Автор: KT315E
Дата сообщения: 04.01.2009 09:30
Как получить раскладку клавиатуры? Если так, то работает если по ToolTip'у щёлкнуть (активным его сделать)...

While 1
$a = @KBLayout
ToolTip ($a, 500, 500)
Sleep (500)
WEnd
Автор: Maza Faka
Дата сообщения: 04.01.2009 11:38
KT315E

Цитата:
Как получить раскладку клавиатуры?

А для какого окна?


Цитата:
Если так, то работает если по ToolTip'у щёлкнуть

И правильно, раскладка получается по дескриптору окна и идентификатору Thread текущего процесса, в данном случае Autoit3.exe.
Автор: ViSiToR
Дата сообщения: 04.01.2009 11:48
wasmkv
Maza Faka
KT315E

Всё это есть в шапке

Добавлено:
Maza Faka 12:38 04-01-2009
Цитата:
И правильно, раскладка получается по дескриптору окна и идентификатору Thread текущего процесса

Вообще то макрос @KBLayout возвращает раскладку установленную по умолчанию в системе (в языковой панели, под «Язык ввода по умолчанию»)
Автор: Maza Faka
Дата сообщения: 04.01.2009 12:56
ViSiToR

Цитата:
Всё это есть в шапке

Я знаю.


Цитата:
макрос @KBLayout возвращает раскладку установленную по умолчанию в системе

А вот про это не знал
Автор: wasmkv
Дата сообщения: 04.01.2009 14:59
ViSiToR

Цитата:
Всё это есть в шапке

Спасибо, но читать вроде не разучился.

Maza Faka
Спасибо конечно за ответ, но предложенные тобой варианты у меня не работают нормально. По поводу
Цитата:
Попробуй так:


Код: #include <IE.au3>

$oIE = _IECreate("192.168.1.1/rebootinfo.cgi", 0, 0)
_IEQuit($oIE

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

Предыдущая тема: Quintura Search


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.