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

» AutoIT

Автор: ViSiToR
Дата сообщения: 22.12.2008 12:42
Maza_Faka 07:22 22-12-2008
Цитата:
Мой вариант

Неплохо . Я кстати тоже об этом думал, но почему то казалось что оно будет сильно тормозить скрипт... И ещё кстати, в справке написано кое-что по этому поводу:

http://www.autoitscript.com/autoit3/docs/functions/GUIRegisterMsg.htm

Цитата:
Warning: blocking of running user functions which executes window messages with commands such as "Msgbox()" can lead to unexpected behavior, the return to the system should be as fast as possible !!!


Так что если в Test2() будет нечто блокирующее (типа ещё одного цикла), то могут быть непредсказуемые последствия .

Я бы ещё в твоём примере завершал цикл в первой функции, он конечно и так приостанавливается на время выполнения второй, но всё же продолжает после её завершения...


Код: #include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <MenuConstants.au3>
;

Opt("GUIOnEventMode", 1)

Global $iEndFunction = False

$hGUI = GUICreate("OnEvent Interloper Functions", 180, 100)

$Button1 = GUICtrlCreateButton("B1", 50, 50, 70, 20)
GUICtrlSetOnEvent(-1, "Test1")

$Button2 = GUICtrlCreateButton("B2", 50, 80, 70, 20)

GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

GUISetState()

While 1
Sleep(100)
WEnd

;Отслеживаем уведомление SC_CLOSE (пользователь закрыл окно)
Func WM_SYSCOMMAND($hWmd, $Msg, $wParam, $lParam)
If $wParam = $SC_CLOSE Then _Exit()
Return $GUI_RUNDEFMSG
EndFunc

;Отслеживаем уведомление от кнопки
Func WM_COMMAND($hWmd, $Msg, $wParam, $lParam)
Local $nID = BitAND($wParam, 0x0000FFFF)
Local $nCode = BitShift($wParam, 16)

Switch $nCode
Case $BN_CLICKED
Switch $nID
Case $Button2
$iEndFunction
= True
Test2()
EndSwitch
EndSwitch

Return $GUI_RUNDEFMSG
EndFunc

Func Test1()
TrayTip("", "", 1)

$iEndFunction = False
Local $iCounter = 1

While 1
Sleep(10)

ConsoleWrite("Loop1 in process... " & $iCounter & @CRLF)
$iCounter += 1

If $iEndFunction Then ExitLoop
WEnd
EndFunc

Func Test2()
TrayTip("Test", "Test", 1)
EndFunc

Func _Exit()
Exit
EndFunc
Автор: Maza_Faka
Дата сообщения: 22.12.2008 14:23
ViSiToR

Цитата:
И ещё кстати, в справке написано кое-что по этому поводу

Знаю

Цитата:
Так что если в Test2() будет нечто блокирующее (типа ещё одного цикла), то могут быть непредсказуемые последствия

Абсолютно верно, поэтому лучше сделать так:

Код: #include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <MenuConstants.au3>
;

Opt("GUIOnEventMode", 1)

Global $iEndFunction = False

$hGUI = GUICreate("OnEvent Interloper Functions", 180, 100)
GUISetOnEvent(-3, "_Exit")

$Button1 = GUICtrlCreateButton("B1", 50, 50, 70, 20)
GUICtrlSetOnEvent(-1, "Test1")

$Button2 = GUICtrlCreateButton("B2", 50, 80, 70, 20)
GUICtrlSetOnEvent(-1, "Test2")

GUIRegisterMsg($WM_SYSCOMMAND, "WM_SYSCOMMAND")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

GUISetState()

While 1
Sleep(100)
WEnd

;Отслеживаем уведомление SC_CLOSE (пользователь закрыл окно)
Func WM_SYSCOMMAND($hWmd, $Msg, $wParam, $lParam)
If $wParam = $SC_CLOSE Then $iEndFunction = True

Return
$GUI_RUNDEFMSG
EndFunc ;==>WM_SYSCOMMAND

;Отслеживаем уведомление от кнопки

Func WM_COMMAND($hWmd, $Msg, $wParam, $lParam)
Local $nID = BitAND($wParam, 0x0000FFFF)
Local $nCode = BitShift($wParam, 16)

Switch $nCode
Case $BN_CLICKED
Switch $nID
Case $Button2
$iEndFunction
= True
EndSwitch
EndSwitch

Return
$GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND

Func Test1()
TrayTip("", "", 1)

Local $iCounter = 1

While Not $iEndFunction
Sleep(10)

ConsoleWrite("Loop1 in process... " & $iCounter & @CRLF)
$iCounter += 1
WEnd

$iEndFunction = False
EndFunc
;==>Test1

Func Test2()
TrayTip("Test", "Test", 1)
EndFunc ;==>Test2

Func _Exit()
Exit
EndFunc
;==>_Exit
Автор: volmaxxx
Дата сообщения: 23.12.2008 13:43
Добрый день!
Есть ли какие-нибудь варианты расширить PixelSearch?
Т.е. осуществлять поиск не 1 пикселя, а заранее заданного шаблона (например, нужно найти все фото, где встречается заданный шаблон из 10*10 пикселей).
Автор: Hackproof
Дата сообщения: 23.12.2008 20:28
Есть такая мозголомная проблема:
Код: Opt("GUIOnEventMode", 1)
$Form1 = GUICreate("Form1", 500, 300, 300, -1)
$se=GUICtrlCreateButton("Выбрать заявку",50,50,90,20)
GUICtrlSetOnEvent($se,"selecting")

$Tab1 = GUICtrlCreateTab(16, 16, 470, 280)
$TabSheet1 = GUICtrlCreateTabItem("Заявки в работе")
$zainwork = GUICtrlCreateListView ("Дата, время|Заявка|Кто дал заявку|Принял|Состояние", 32, 80, 400, 200)
GUICtrlCreateListViewItem("bla|bla|bla|bla",$zainwork)
GUICtrlCreateListViewItem("bla|bla|bla|bla",$zainwork)
GUICtrlCreateListViewItem("bla|bla|bla|bla",$zainwork)

$TabSheet2 = GUICtrlCreateTabItem("Выполненные заявки")
$zadone = GUICtrlCreateListView ("Дата, время|Заявка|Кто дал заявку|Принял|Состояние", 32, 80, 400, 200)
GUICtrlCreateListViewItem("qqq|www|eee|r",$zadone)
GUICtrlCreateListViewItem("qqq|www|eee|r",$zadone)

$TabSheet3 = GUICtrlCreateTabItem("Переданные заявки")
$zaleft = GUICtrlCreateListView ("Дата, время|Заявка|Кто дал заявку|Принял|Состояние", 32, 80, 400, 200)
GUICtrlCreateListViewItem("123|123|123|123",$zaleft)
GUISetState(@sw_show)

while 1
sleep(100)
WEnd

Func
selecting()
$sel="Чему оно должно быть равно?"
msgbox(0,"Выбрана заявка №",$sel)
EndFunc
Автор: ViSiToR
Дата сообщения: 23.12.2008 22:23
Hackproof 21:28 23-12-2008
Цитата:
Как можно узнать номер строки, выделенной в данный момент?

Так:


Код: #include <GuiConstantsEx.au3>
#include <GuiListView.au3>
;

$Form1 = GUICreate("Form1", 500, 300, 300, -1)
$Select_Button = GUICtrlCreateButton("Выбрать заявку", 50, 50, 90, 20)

$Tab1 = GUICtrlCreateTab(16, 16, 470, 280)

$TabSheet1 = GUICtrlCreateTabItem("Заявки в работе")

$ZaInWork = GUICtrlCreateListView("Дата, время|Заявка|Кто дал заявку|Принял|Состояние", 32, 80, 400, 200)
GUICtrlCreateListViewItem("bla|bla|bla|bla", $ZaInWork)
GUICtrlCreateListViewItem("bla|bla|bla|bla", $ZaInWork)
GUICtrlCreateListViewItem("bla|bla|bla|bla", $ZaInWork)

$TabSheet2 = GUICtrlCreateTabItem("Выполненные заявки")

$ZaDone = GUICtrlCreateListView("Дата, время|Заявка|Кто дал заявку|Принял|Состояние", 32, 80, 400, 200)
GUICtrlCreateListViewItem("qqq|www|eee|r", $ZaDone)
GUICtrlCreateListViewItem("qqq|www|eee|r", $ZaDone)

$TabSheet3 = GUICtrlCreateTabItem("Переданные заявки")

$ZaLeft = GUICtrlCreateListView("Дата, время|Заявка|Кто дал заявку|Принял|Состояние", 32, 80, 400, 200)
GUICtrlCreateListViewItem("123|123|123|123", $ZaLeft)

GUISetState(@SW_SHOW)

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case
$Select_Button
Switch GUICtrlRead($Tab1) ;Проверяем какой таб активен (чтобы знать какой список проверять)
Case 0
$hLV = $ZaInWork
Case 1
$hLV = $ZaDone
Case 2
$hLV = $ZaLeft
Case Else
$hLV = $ZaInWork
EndSwitch

$iSelIndex = _GUICtrlListView_GetSelectedIndices($hLV)

If $iSelIndex <> "" Then
$iSelIndex = "Выбрана заявка №" & Number($iSelIndex) + 1
Else
$iSelIndex = "Нет выбранных заявок в текущем списке."
EndIf

MsgBox(64, "Выбрана заявка...", $iSelIndex, 0, $Form1)
EndSwitch
WEnd
Автор: Hackproof
Дата сообщения: 23.12.2008 23:34
Блин, смотрел же эту функцию. Как смотрел - непонятно... Спасибо.
Автор: NORIO
Дата сообщения: 24.12.2008 01:27
volmaxxx
вот комплект ImageSearch

Ищет участок изображения совпадающий с заданным образцом и выдаёт его координаты, если находит.
Автор: timsky
Дата сообщения: 24.12.2008 03:04
Функция InetGet использует AutoIt в качестве User Agent. Можно это как-нить поправить?
Автор: ViSiToR
Дата сообщения: 24.12.2008 03:59
timsky 04:04 24-12-2008
Цитата:
Можно это как-нить поправить?

Jon вроде намекал на то что возможно в будущем это будет опционально (параметр $sUserAgent как я понял). Я добавил там коммент, посмотрим добавят ли... А пока можно использовать TCP-функции (см. библиотеку Http на оф. форуме).
Автор: volmaxxx
Дата сообщения: 24.12.2008 07:38
NORIO
Спасибо! Будем смотреть...

Добавлено:

Цитата:
вот комплект ImageSearch

Ищет участок изображения совпадающий с заданным образцом и выдаёт его координаты, если находит.

Насколько я понял, ImageSearch осуществляет поиск шаблона в графическом файле. А как осуществлять поиска шаблона по экрану? Т.е. в текущем активном окне?

Так, вроде почитал тот топик, разобрался. Все-таки он вроде ищет шаблон просто на экране, т.е. то, что нужно мне
Но пока не получается скачать Не вижу ссылки...
Автор: NORIO
Дата сообщения: 24.12.2008 14:28
volmaxxx

Цитата:
Так, вроде почитал тот топик, разобрался. Все-таки он вроде ищет шаблон просто на экране, т.е. то, что нужно мне

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


Цитата:
Но пока не получается скачать Не вижу ссылки...

Наверно незарегистрированным форум не выдаёт ссылки.
Перепощу сюда.
imagesearch.zip
Автор: hunter19
Дата сообщения: 24.12.2008 14:50
Подскажите пожалуйста, можно ли перенести ListViewItem из одного ListView в другой?
Автор: Hackproof
Дата сообщения: 24.12.2008 15:18
#Include <GuiListView.au3>

_GUICtrlListView_CopyItems($откуда,$куда)
Правда, это весь список скопировать...
Автор: timsky
Дата сообщения: 24.12.2008 23:56
ViSiToR
Спасибо, я до сих пор как-то игнорировал эту либу. Чувствую, скоро придется с ней разбираться
Автор: ViSiToR
Дата сообщения: 25.12.2008 00:54
Новая версия AutoIt 3.3.0.0. История версии (Англ.).
Автор: timsky
Дата сообщения: 26.12.2008 00:23
...и тишина
Автор: Maza Faka
Дата сообщения: 26.12.2008 05:51
timsky

Цитата:
...и тишина

Ну почему же, changelog радует обилием фиксов
Автор: spqrspqr
Дата сообщения: 26.12.2008 10:44
Добрый день народ, помогите пожалуйста начинающему пользователю AutoIt. Вопрос так, на одном компе работает скрипт, на другом нет. Не работает собственно комбинация ctrl+o(как собственно и другие связанные с сtrl пример Send(""^o) ), другие использованные эмуляции нажатия клавиш отрабатывают нормально. В чем может быть дело?

Добавлено:
Send("^o") ) *
Автор: Maza Faka
Дата сообщения: 26.12.2008 14:25
spqrspqr
Раскладки клавиатуры какие?
Автор: spqrspqr
Дата сообщения: 26.12.2008 14:47
Без разницы, пробовал и rus и en
Автор: ViSiToR
Дата сообщения: 26.12.2008 15:55
spqrspqr 11:44 26-12-2008
Цитата:
на одном компе работает скрипт, на другом нет. Не работает собственно комбинация ctrl+o(как собственно и другие связанные с сtrl    пример Send(""^o)  )

Возможно проблема в зажатом Ctrl? А если так попробовать (это кстати решение для отсылания сочетании клавиш без залипания спец. кнопок (Ctrl, Shift, и Alt))...


Код: #include <Misc.au3>

_SendEx("^o")

Func _SendEx($sSend_Data)
Local $hUser32DllOpen = DllOpen("User32.dll")

While _IsPressed("10", $hUser32DllOpen) Or _IsPressed("11", $hUser32DllOpen) Or _IsPressed("12", $hUser32DllOpen)
Sleep(10)
WEnd

Send($sSend_Data)

DllClose($hUser32DllOpen)
EndFunc
Автор: araneon
Дата сообщения: 26.12.2008 17:06
Помогите с раскладкой клавы, недагоню никак, как сделать так, чтобы при запуске скрипа раскладка клавиотуры автоматом выставлялась как руская ???
Автор: ViSiToR
Дата сообщения: 26.12.2008 17:23
araneon 18:06 26-12-2008
Цитата:
чтобы при запуске скрипа раскладка клавиотуры автоматом выставлялась как руская ?



Код: $hLayout_Wnd = WinGetHandle("[Active]")

_SetKeyboardLayout(419, $hLayout_Wnd)

Func _SetKeyboardLayout($sLayoutID, $hWnd)
Local $WM_INPUTLANGCHANGEREQUEST = 0x50

If StringLen($sLayoutID) <= 3 Then $sLayoutID = "00000" & $sLayoutID
Local $aRet = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)

DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $aRet[0])
EndFunc
Автор: Leagnus
Дата сообщения: 27.12.2008 17:39
Пусть это похоже на изобретение велосипеда, но я пишу твикер, у которого каждый твик – отдельным файлом-плагином, в котором содержится вся инфа о контролах.
Я так понимаю: все контролы всех плагинов должны быть считаны и созданы, и только потом нужно загружать основной гуй и кликами тоглить их видимость? Кто-нибудь слышал об обходном пути создания контролов "на лету", после того, как гуй создан и отображён?
Автор: gal7
Дата сообщения: 27.12.2008 17:44
Можно ли как-нибудь получать рисунок из окна IE, чтобы потом его можно было изменять, сохранять и т.д.? Можно получить любой объект рисунка, а дальше нужно как-то получить его hwnd, остальное уже дело техники. Как получить hwnd изображения? В библиотеке IE естественно для этого ничего нет, получить hwnd стандартным путем не получается (не знаю почему, может там элементы как-нибудь вложены несколько раз?), а как получить hwnd объекта не знаю. Кто-нибудь такое совершал?
Автор: araneon
Дата сообщения: 27.12.2008 20:59

Цитата:
ViSiToR

Код:$hLayout_Wnd = WinGetHandle("[Active]")

_SetKeyboardLayout(419, $hLayout_Wnd)

Func _SetKeyboardLayout($sLayoutID, $hWnd)
Local $WM_INPUTLANGCHANGEREQUEST = 0x50

If StringLen($sLayoutID) <= 3 Then $sLayoutID = "00000" & $sLayoutID
Local $aRet = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)

DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $aRet[0])
EndFunc


СУПЕР, РЕСПЕКТ ТЕБЕ И УВАЖУХА;););)
ВЫРУЧИЛ
Автор: ViSiToR
Дата сообщения: 27.12.2008 21:28
Leagnus 18:39 27-12-2008
Цитата:
Кто-нибудь слышал об обходном пути создания контролов "на лету", после того, как гуй создан и отображён?

Я не слышал, но ведь можно и самому что нибудь придумать

Например, создать обработчик комманд в главном скрипте (тот что с GUI), таким образом чтобы он умел воспринимать координаты и имена комманд.

Пример скрипта [more=Main_GUI.au3]

Код: #include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $aRecv_Ctrls_Data[2][2]

$hGUI = GUICreate("_CommandsHandler_Proc", 200, 120)

$CheckBox = GUICtrlCreateCheckbox("Some checkbox", 20, 10)

$Check_Button = GUICtrlCreateButton("Check new controls...", 20, 80, 120, 20)

GUISetState()
GUIRegisterMsg($WM_COPYDATA, "_CommandsHandler_Proc")

While 1
$nMsg = GUIGetMsg()

Switch $nMsg
Case -3
Exit
Case
$aRecv_Ctrls_Data[1][0] To $aRecv_Ctrls_Data[$aRecv_Ctrls_Data[0][0]][0]
Local $nCtrlID = $nMsg
If $nCtrlID = 0 Then ContinueLoop

;Here you can do whatever you need with the recieved control
Case $Check_Button
;Here we will check our added controls...

Local $sMsg_Data = ""

For $i = 1 To $aRecv_Ctrls_Data[0][0]
$sMsg_Data &= "CtrlID: " & $aRecv_Ctrls_Data[$i][0] & ", Data[" & $aRecv_Ctrls_Data[$i][1] & "]" & @CRLF
Next

If
$sMsg_Data = "" Then
MsgBox(48, "Info", "There is no new added controls.", 0, $hGUI)
Else
MsgBox(64, "Info", "Added controls information:" & @CRLF & @CRLF & $sMsg_Data, 0, $hGUI)
EndIf
EndSwitch
WEnd

Func
_CommandsHandler_Proc($hWnd, $iMsgID, $WParam, $LParam)
If $iMsgID <> $WM_COPYDATA Then Return $GUI_RUNDEFMSG

Local $sMSGRECVD = DllStructGetData(_AU3COM_RecvData($LParam), 1)
Local $aSplit_sMSGRECVD = StringSplit($sMSGRECVD, "|")

For $i = 1 To $aSplit_sMSGRECVD[0]
$aRecv_Ctrls_Data[0][0] += 1
ReDim $aRecv_Ctrls_Data[$aRecv_Ctrls_Data[0][0]+1][2]

$aSplit_sMSGRECVD[$i] = StringReplace($aSplit_sMSGRECVD[$i], "~~", "|")

$aRecv_Ctrls_Data[$aRecv_Ctrls_Data[0][0]][0] = Execute($aSplit_sMSGRECVD[$i])
$aRecv_Ctrls_Data[$aRecv_Ctrls_Data[0][0]][1] = $aSplit_sMSGRECVD[$i]
Next
EndFunc

Func
_AU3COM_RecvData($iCOM_LParam)
; $COM_LParam = Poiter to a COPYDATA Struct
Local $STRUCTDEF_AU3MESSAGE = "char var1[256];int"
Local $StructDef_COPYDATA = "dword var1;dword var2;ptr var3"
Local $vs_cds = DllStructCreate($StructDef_COPYDATA, $iCOM_LParam)
; Member No. 3 of COPYDATA Struct (PVOID lpData;) = Pointer to Costum Struct
Local $vs_msg = DllStructCreate($STRUCTDEF_AU3MESSAGE, DllStructGetData($vs_cds, 3))
Return $vs_msg
EndFunc
Автор: Maza Faka
Дата сообщения: 28.12.2008 06:55
gal7

Цитата:
Можно ли как-нибудь получать рисунок из окна IE

Другой способ:

Код: #include <IE.au3>

$oIE = _IECreate("http://www.autoitscript.com/", 0, 0)
$oImg = _IEImgGetCollection($oIE, 4)

$sLink = $oImg.Src
_IEQuit($oIE)

$sFile = @ScriptDir & "\" & StringRegExpReplace($sLink, "^.*/", "")

InetGet($sLink, $sFile, 1)

ShellExecute($sFile)
Автор: gal7
Дата сообщения: 28.12.2008 10:56
Да, круто, целых два варианта Ато я уж и не надеялся найти ответ... Мне видимо больше подойдет пример Maza Faka, т.к. рисунки не всегда будут видны на экране, а может окно IE вообще не будет видно. Благодарю
Автор: lll6
Дата сообщения: 28.12.2008 12:09
Как распечатать кусок строки? Например есть строка "Привет, мир", надо распечатать с 5 по 7 символы.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

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


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