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

» AutoIT

Автор: CrazyNNM
Дата сообщения: 15.12.2008 20:28


вот мой скрин
Автор: Hackproof
Дата сообщения: 15.12.2008 21:59
Есть текстовый файл, типа статистики, в котором записаны числа от 1 до 26. Мне нужно подсчитать, сколько раз в нем встречается каждое число (это не проблема), и как-то это графически изобразить. Вот как сие можно устроить, желательно в виде гистограммы?
Автор: ViSiToR
Дата сообщения: 15.12.2008 22:06
levelxxx 19:13 15-12-2008
Цитата:
Вопросы

Неверные вопросы - Нужно сначала спросить (а точнее в справке посмотреть), как работает FileOpen().

По вопросам...

1) Можно:


Код: #include <Misc.au3>

;Выход из скрипта при нажатии "1"
HotKeySet("1", "MyExit")

Global $sFile = @ScriptDir & "\Test.txt"

;Получеам текущее содержимое б.обмена
Global $sOld_ClipContent = ClipGet()

;Цикл отслеживает изменение б.обмена
While True
$sNew_ClipContent = ClipGet()

;Возврат буфера обмена в переменную $sOld_ClipContent
If $sNew_ClipContent <> $sOld_ClipContent Then
$sOld_ClipContent = $sNew_ClipContent

$iAsk
= MsgBox(4, "Вопрос", _
"СОДЕРЖИМОЕ БУФЕРА ОБМЕНА ИЗМЕНИЛОСЬ:" & @CRLF & @CRLF & _
StringLeft($sNew_ClipContent, 1024) & _Iif(StringLen($sNew_ClipContent) > 1024, ".....", "") & @CRLF & @CRLF & _
StringFormat("ЗАПИСАТЬ В ФАЙЛ (%s)?", StringRegExpReplace($sFile, "^.*\\", "")))

If $iAsk = 6 Then FileWriteLine($sFile, $sNew_ClipContent)
EndIf

Sleep(10)
WEnd

Func
MyExit()
Exit
EndFunc
Автор: theHelg
Дата сообщения: 16.12.2008 01:23
Подскажите, пожалуйста, как можно реализовать следующию вещь.
Мне нужно пройтись по всей памяти приложения, чтобы найти адрес переменной по текущему значению для дальнейшего отслеживания значения переменной. Так как менять уже существующее приложение для вывода некоего интерфейса весьма проблематично, так как приложение писалось давно и часть знания утрачено (да и несколько лень туда копать )

Есть такая программа, как ArtMoney, которая для запущенного приложения умеет искать в памяти ячейки с заданным значением.

Собственно вопрос.
Как можно реализовать подобное?
Как я понимаю, эта задача делится на две подзадачи:
1. Определить объем памяти (то есть границы) для данного приложения.
2. Понять, что лежит по конкретному адресу - тип и значение ячейки (int, string, long...)

Какие есть идеи - в какую степь копать? может быть какие-то ключевые слова для поиска, или пример из встроенного хелпа...
Автор: timsky
Дата сообщения: 16.12.2008 03:14
Нашел глюк в работе со строковыми переменными:

Код: #include <IE.au3>
$ie = _IECreate('http://google.com')
$html = _IEDocReadHTML($ie)

$text = StringReplace($html, '<meta http-equiv="content-type"', '')
$numreplacements = @extended
_IEQuit($ie)

MsgBox(0, '', $numreplacements)

If StringInStr($html, '<meta http-equiv="content-type"') Then MsgBox(0, '', 'String Found')
Автор: Maza_Faka
Дата сообщения: 16.12.2008 06:41
theHelg

Цитата:
Мне нужно пройтись по всей памяти приложения

Ищи на офф. форуме NomadMemory UDF.

timsky
Функцию _INetGetSource пробовал использовать?
Автор: KChernov
Дата сообщения: 16.12.2008 07:11
timsky

Цитата:
Оказывается функции _IEBodyReadHTML, _IEDocReadHTML дергают совсем другой текст. Открыл в ИЕ и Опере - текст одинаковый, сдампил Автоитом - нет кавычек в тегах типа этого: <meta http-equiv=content-type
Почему???

Можно искать регэкспом с опциональными скобками
Автор: SNAKE92
Дата сообщения: 16.12.2008 09:05

Цитата:
См. функции _IE* в справке.

Как полностью функция называется, а то у меня с анлийским плохо
Автор: gal7
Дата сообщения: 16.12.2008 09:17
SNAKE92:

Код: #include <IE.au3>
$IE = ...;Здесь надо будет получить объект браузера с помощью _IEAttach() или _IECreate()
$url = _IEPropertyGet($IE, "locationurl")
Автор: SNAKE92
Дата сообщения: 16.12.2008 11:58
gal7
Пойдет, спосибо
Автор: NORIO
Дата сообщения: 16.12.2008 15:04
Возможно ли из autoit-скрипта управлять total commander`ом ?

добавлено:
нашёл отличную прогу
http://en.totalcmd.pl/download/add/Add/TC_Multiple_Commands
с её помощью можно програмно посылать тоталу его внутренние комманды
например CM2017 - скопировать имена выделенных файлов в буфер обмена
CM префикс а цифры это номер команды

вот пример:


Код: ShellExecuteWait ( "c:\Program Files\total commander\plugins\_temp\addAdd_TC.Multiple.Commands_0.12\TCMC.exe" _
, "CM2017" , "c:\Program Files\total commander\plugins\_temp\addAdd_TC.Multiple.Commands_0.12\" )
Автор: matanN
Дата сообщения: 16.12.2008 15:27
Как получить информацию о нажатии клавиш или кнопки мыши
Неважно в каком приложении, и что куда нажато,
Хочу написать для себя скрипт отслеживающий активность пользователя

P.S. А можно ли проводить поиск по отдельным темам форума. 129 страниц однако.
Автор: levelxxx
Дата сообщения: 16.12.2008 17:08
ViSiToR

Спасибо за скрипты! Буду пробовать.
Автор: Loopback
Дата сообщения: 16.12.2008 20:43

Цитата:
Возможно ли из autoit-скрипта управлять total commander`ом ?
добавлено:
нашёл отличную прогу
http://en.totalcmd.pl/download/add/Add/TC_Multiple_Commands
с её помощью можно програмно посылать тоталу его внутренние комманды
например CM2017 - скопировать имена выделенных файлов в буфер обмена
CM префикс а цифры это номер команды

Имхо, всё это гораздо красивее можно сделать средствами Autoit без костылей в виде внешних файлов. В примере ниже используется функция для получения хэндла активной копии (взял готовую из своего скрипта), но при желании можно получать его другим способом.

Код: $nCommand = 2017
$hWnd = _TCHGetActiveInstance()
DllCall("user32.dll", "hWnd", "SendMessage", "hWnd", $hWnd, "int", 0x433, "int", $nCommand, "int", 0)

; Функция для получения активной копии Тотала
Func _TCHGetActiveInstance()
Local $aList = WinList("[CLASS:TTOTAL_CMD]")
For $i = 1 To $aList[0][0]
If WinActive($aList[$i][1]) Then Return $aList[$i][1]
Next
Return
0
EndFunc
Автор: NORIO
Дата сообщения: 16.12.2008 21:52
Loopback
Я тоже не люблю связки в стиле игры crazy mashine
главная проблема для меня была из скрипта заставить тотал выполнять внутренние комманды.

А что это за значение, код какой то команды?

Цитата:
DllCall("user32.dll", "hWnd", "SendMessage", "hWnd", $hWnd, "int",0x433, "int", $nCommand, "int", 0)
Автор: Maza_Faka
Дата сообщения: 17.12.2008 07:19
matanN

Цитата:
Как получить информацию о нажатии клавиш

Клавиатура
Клавиатура + мышь

Добавлено:
NORIO

Цитата:
А что это за значение, код какой то команды?

Угу, код сообщения:
Google
Автор: theHelg
Дата сообщения: 17.12.2008 12:44
Сейчас, когда у меня есть одно запущенное приложение, я его ищу вот так:

Код: $windowHNWD = _WinAPI_FindWindow("Untitled - Notepad", "Notepad")
Автор: theHelg
Дата сообщения: 17.12.2008 19:48
Или может даже такой вопрос,
как по ID процесса - найти его главное окно, точнее указатель на него?
$pid = ProcessExists("calc.exe")

$hwnd = ...($pid)???
Автор: timsky
Дата сообщения: 17.12.2008 20:34
Maza_Faka

Цитата:
Функцию _INetGetSource пробовал использовать?

Мне необходимо получать сорс внутри веб-интерфейса почтового сервиса, например. Ну, впринципе, теперь я знаю, почему я раньше не мог заставить эти ф-и работать. Теперь просто для пробы заставляю Автоит тупо слить сорс, а потом его уже ковыряю.

KChernov

Цитата:
Можно искать регэкспом с опциональными скобками


Вариант, но все-таки интересно знать, почему Автоит так меняет сорс.
Автор: ViSiToR
Дата сообщения: 17.12.2008 22:03
theHelg 20:48 17-12-2008
Цитата:
как по ID процесса - найти его главное окно, точнее указатель на него?

Функцией _ProcessGetWindow():


Код: $sWindow = _ProcessGetWindow("Calc.exe", 1)
ConsoleWrite($sWindow & @CRLF)

Func _ProcessGetWindow($iPID, $iRet=-1)
Local $aWinList = WinList()
Local $aRet[2]

If IsString($iPID) Then $iPID = ProcessExists($iPID)

For $i = 1 To UBound($aWinList)-1
If WinGetProcess($aWinList[$i][1]) = $iPID Then
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle

If $iRet = 0 Then Return $aRet[0]
If $iRet = 1 Then Return $aRet[1]

Return $aRet
EndIf
Next

Return
SetError(1, 0, $aRet)
EndFunc
Автор: Luffy3761
Дата сообщения: 17.12.2008 23:07
У меня вопрос по поводу библиотечной функции _INetSmtpMailCom.
Если возникает ошибка отправки письма то и возникает ошибка компиляции , как сделать чтобы возвращалось значение @error при ошибке, а не завершался скрипт?
Автор: ViSiToR
Дата сообщения: 18.12.2008 00:06
Luffy3761 00:07 18-12-2008
Цитата:
как сделать чтобы возвращалось значение @error при ошибке, а не завершался скрипт?

Скрипт не должен завершаться, какая версия функции используется, эта?
Автор: Luffy3761
Дата сообщения: 18.12.2008 05:39
ViSiToR
Нет у меня другая была, спасибо за помощь
Автор: theHelg
Дата сообщения: 18.12.2008 11:10

Цитата:

ViSiToR
Функцией _ProcessGetWindow():


Спасибо!
Заработало!
Автор: NORIO
Дата сообщения: 18.12.2008 18:32
есть скрипт распаковывающий zip архивы он использует udf
от KXM`а
http://www.autoitscript.com/forum/index.php?showtopic=17727&hl=xzip.dll&st=0

но я его немного переработал.

[more=udf]
Код: ; ======================================================================================
; Zip UDFs based on standared fileOpen()/fileClose() system
; Based on other people's work.
;
; Only the more basic function of XZip are represnted (poorly)
;
; Requires: XZip.dll:
; http://xstandard.com/printer-friendly.asp?id=C9891D8A-5390-44ED-BC60-2267ED6763A7
; ======================================================================================

#include-once
#include
<array.au3>
#include <file.au3>

Global $oXZip_UDFGlobal, $sZipPath_UDFGlobal, $oComError_UDFGlobal, $sDllLoc_UDFGlobal, $iRegDelay_UDFGlobal
; ============================================================================
; Turned off COM erroring
; I don't think it's needed if the scripter is not directly interacting with
; the object, plus it causes an error with my choosen exit(_ZipClose) method
; ============================================================================
;$oComError_UDFGlobal = ObjEvent("AutoIt.Error", "__XZip_COM_Error")

;===============================================================================
;
; Description: :Open ZIP file, and load XZip.dll as a service
; Parameter(s): :Archive path, (Opt)XZip.dll path (default to @ScriptDir),
; (opt)Delay between regsrv, and objcreate (default 150 ms)
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :True/False (error #)
; User CallTip: :_ZipOpen(ArchivePath, XZipDllPath, Delay in MS)
;
;===============================================================================
;

Func __ZipOpen($sNewArchivePath, $sDllPath = '', $iDelay = 200)

If $sDllPath = '' Then $sDllPath = @ScriptDir & '\XZip.dll'

;some error checking
If Not FileExists($sDllPath) Then
SetError(1)
Return False
ElseIf Not
IsInt($iDelay) Then
SetError(2)
Return False
EndIf


;set the globals
$sZipPath_UDFGlobal = $sNewArchivePath
$sDllLoc_UDFGlobal
= $sDllPath
$iRegDelay_UDFGlobal
= $iDelay

___DOSStart('regsvr32 /s "' & $sDllLoc_UDFGlobal & '"')

Sleep($iRegDelay_UDFGlobal) ;needs a sec when loaded silent.

$oXZip_UDFGlobal = ObjCreate('XStandard.Zip')

If IsObj($oXZip_UDFGlobal) Then ;make sure it's opened
Return True
Else

SetError(3)
Return False
EndIf
EndFunc
;==>_ZipOpen

;===============================================================================
;
; Description: :List items in given Zip file
; Parameter(s): :None (see _ZipOpen)
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :Array contaning archive contents
; User CallTip: :_ZipContents()
;
;===============================================================================
;

Func __ZipContents() ;this func needs some more work
Local $oItem
Local $aRet[1]

If Not IsObj($oXZip_UDFGlobal) Then
SetError(1)
Return False
EndIf

For
$oItem In $oXZip_UDFGlobal.Contents ($sZipPath_UDFGlobal)
_ArrayAdd($aRet, $oItem.Path & $oItem.Name)
Next

$aRet[0] = UBound($aRet)
Return $aRet
EndFunc ;==>_ZipContents

;===============================================================================
;
; Description: :Add items to opened Zip file
; Parameter(s): :Array contaning item paths, (opt)Retain dir structure
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :True/False (error #)
; User CallTip: :_ZipPack(array of item paths, Bool)
;
;===============================================================================
;

Func __ZipPackGroup(ByRef $aItems, $bKeepPath = True) ;this func needs some more work
If Not IsObj($oXZip_UDFGlobal) Then
SetError(1)
Return False
EndIf

Local
$x
For $x = 0 To UBound($aItems) - 1
If Not FileExists($aItems[$x]) Then
SetError(2)
SetExtended($aItems[$x])
Return False
EndIf


$oXZip_UDFGlobal.Pack ($aItems[$x], $sZipPath_UDFGlobal, $bKeepPath)
Next

Return True
EndFunc
;==>_ZipPackGroup

;===============================================================================
;
; Description: :Add all items in a dir to opened Zip file
; Parameter(s): :String dir path
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :True/False (error #)
; User CallTip: :_ZipPackDir(DirPath)
;
;===============================================================================
;

Func __ZipPackDir($sDirPath) ;this is the one that I needed, so it works well
Local $aFiles, $x, $i, $aDirs[1], $sStartDir, $sWorkingDir, $sNewDirPath, $iInsert, $sDirInZip

If Not IsObj($oXZip_UDFGlobal) Then
SetError(1)
Return False
ElseIf Not
StringInStr(FileGetAttrib($sDirPath), 'D') Then
SetError(2)
Return False
EndIf


$sStartDir = $sDirPath
$aDirs
[0] = $sDirPath
$i
= 0

; ===========================================================
; This loop might have some unneeded code, because it took a
; lot of trys to get it right. Also some error more checking,
; optimization and clean couldn't hurt. But it works! ;)
; ===========================================================

Do
$sWorkingDir = $aDirs[$i] & '\'
$aFiles = _FileListToArray ($aDirs[$i])

For $x = 1 To UBound($aFiles) - 1

If StringInStr(FileGetAttrib($aFiles[$x]), 'D') Then
$sNewDirPath = $sDirPath & '\' & $aFiles[$x]
$iInsert = $i + 1
_ArrayInsert($aDirs, $iInsert, $sNewDirPath)

Else
$sDirInZip = StringReplace($sWorkingDir, $sDirPath, '')
$oXZip_UDFGlobal.Pack ($sWorkingDir & $aFiles[$x], $sZipPath_UDFGlobal, 1, $sDirInZip)

EndIf

Next


$i = $i + 1
$aFiles = ''

Until UBound($aDirs) = $i

Return True
EndFunc
;==>_ZipPackDir

;===============================================================================
;
; Description: :Unpack a zip file
; Parameter(s): :String: Path to extract Zip file to
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :True/False (error #)
; User CallTip: :_ZipUnpack(ExtractPath)
;
;===============================================================================
;

Func __ZipUnpack($sDestPath)
If Not IsObj($oXZip_UDFGlobal) Then
SetError(1)
Return False
EndIf

If Not
FileExists($sDestPath) Then DirCreate($sDestPath)

$oXZip_UDFGlobal.UnPack ($sZipPath_UDFGlobal, $sDestPath)

Return True
EndFunc
;==>_ZipUnpack

;===============================================================================
;
; Description: :Close ZIP file, and unload XZip.dll as a service
; Parameter(s): :None, based on _ZipOpen globals
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :True/False (error #)
; User CallTip: :_ZipClose(XZipDllPath, Delay in MS)
;
;===============================================================================
;

Func __ZipClose()
;some error checking
If Not FileExists($sDllLoc_UDFGlobal) Then
SetError(1)
Return False
EndIf


___DOSStart('regsvr32 /s /u "' & $sDllLoc_UDFGlobal & '"')

Sleep($iRegDelay_UDFGlobal) ;needs a sec when unloaded silently.

; =====================================================
; This way of checking will cause a COM error
; but I like to confirm that the object's been closed
; =====================================================

$oXZip_UDFGlobal = ObjCreate('XStandard.Zip')

If Not IsObj($oXZip_UDFGlobal) Then ;make sure it's closed

;reset globals, for next call

$sZipPath_UDFGlobal = ''
$sDllLoc_UDFGlobal = ''
$iRegDelay_UDFGlobal = 0
$oXZip_UDFGlobal = ''
Return True
Else

SetError(2)
Return False
EndIf

EndFunc
;==>_ZipClose

;helper functions

Func ___XZip_COM_Error()
Local $hNumber = Hex($oComError_UDFGlobal.number, 8)

;blantly stolen from SvenP (We'll call it a 'port')
MsgBox(0, 'XZip Com Error', 'There was COM Error!' & @CRLF & @CRLF & _
'description is: ' & @TAB & $oComError_UDFGlobal.description & @CRLF & _
'windescription:' & @TAB & $oComError_UDFGlobal.windescription & @CRLF & _
'number is: ' & @TAB & $hNumber & @CRLF & _
'lastdllerror is: ' & @TAB & $oComError_UDFGlobal.lastdllerror & @CRLF & _
'scriptline is: ' & @TAB & $oComError_UDFGlobal.scriptline & @CRLF & _
'source is: ' & @TAB & $oComError_UDFGlobal.source & @CRLF & _
'helpfile is: ' & @TAB & $oComError_UDFGlobal.helpfile & @CRLF & _
'helpcontext is: ' & @TAB & $oComError_UDFGlobal.helpcontext _
)


SetError(1)
EndFunc ;==>__XZip_COM_Error

Func ___DOSStart($sStart)
Run(@ComSpec & ' /c start ' & $sStart, '', @SW_HIDE)

WHILE 1
IF RegRead ( 'HKEY_CLASSES_ROOT\CLSID\{13D6BDE3-46AA-4FF2-A622-EBC43110D95C}', "" ) <> "" THEN ExitLoop
Sleep(10)
WEnd

EndFunc
;==>__DOSStart

#cs UserCalltips
_ZipOpen($sNewArchivePath, $sDllPath = '', $iDelay = 150)
_ZipContents()
_ZipPackGroup(ByRef $aItems, $bKeepPath = True) ;this func needs some more work
_ZipPackDir(DirPath)
_ZipUnpack($sDestPath)
_ZipClose($sDllPath = '', $iDelay = 150)
#ce
Автор: Maza_Faka
Дата сообщения: 19.12.2008 06:43
NORIO

Цитата:
Подскажите пожалуйста решение ликвидации этого бага.

А не проще будет спросить у автора этой UDF?


Цитата:
но будет здорово даже если удасться её обработать в скрипте без его завершения

Попробуй отлавливать ошибку:
Пример:

Код: Dim $objWMIService, $objItem, $colItems, $strComputer = "."

$oAutoitError = ObjEvent("AutoIt.Error", "ErrorFunc")

$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
$colItems = $objWMIService.ExecQuery("Select * from Win32_DiskDrive ")

For $objItem In $colItems
ConsoleWrite("Availability: " & $objItem.Availability1 & @LF & _
"Caption: " & $objItem.Caption & @LF)
Next

Func
ErrorFunc()
MsgBox(0, "COM Error", "Error windescription: " & @TAB & $oAutoitError.windescription)
SetError(1)
EndFunc
Автор: Nikkorot
Дата сообщения: 19.12.2008 07:45
Добрый день!
Подскажите пожалуйста, возможно ли получить ID окна по его заголовку и тексту?
Автор: Maza_Faka
Дата сообщения: 19.12.2008 08:03
Nikkorot

Цитата:
получить ID окна по его заголовку и тексту?

Имеется в виду handle?
WinGetHandle("Title", "Text")
Автор: Nikkorot
Дата сообщения: 19.12.2008 08:36
Maza_Faka
Нет, handle при каждом перезапуске программы получается разный. а вот ID,который в AutoIt Info на вкладке control также и обозначается как ID, постоянный.
Автор: babaytugur
Дата сообщения: 19.12.2008 09:40
Всем доброго дня
подскажите как получить путь до файла по имени просесса?
в справке не нашел

Блин сорри в шапке не увидел, ведь все есть ))))

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

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


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