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

» AutoIT

Автор: ViSiToR
Дата сообщения: 09.01.2009 21:22
araneon 19:54 09-01-2009
Цитата:
А значки прог ни как нельзя приделать туда

Можно, нужно использовать специальную библиотеку для этого (тема на оф. форуме), из архива взять только ModernMenuRaw.au3:


Код: #NoTrayIcon
#include
<ModernMenuRaw.au3>

$hTrayIcon = _TrayIconCreate("My Tray App")

_TrayIconSetClick(-1, 16)
_TrayIconSetState()

$nTrayMenu = _TrayCreateContextMenu()

$Calc_TrayItem = _TrayCreateItem("Калькулятор")
_TrayItemSetIcon(-1, "calc.exe", 0)

$Notepad_TrayItem = _TrayCreateItem("Блокнот")
_TrayItemSetIcon(-1, "notepad.exe", 0)

$CmdLine_TrayItem = _TrayCreateItem("Коммандная строка")
_TrayItemSetIcon(-1, "cmd.exe", 0)

$MSPaint_TrayItem = _TrayCreateItem("MSPaint")
_TrayItemSetIcon(-1, "mspaint.exe", 0)

_TrayCreateItem("")
_TrayItemSetIcon(-1, "", 0)

$Exit_TrayItem = _TrayCreateItem("Выход")
_TrayItemSetIcon(-1, "shell32.dll", 28)

_SetTrayIconBkColor(0xC46200)
_SetTraySelectBkColor(0x087272)
_SetTraySelectTextColor(0xFFFFFF)

While 1
Switch GUIGetMsg()
Case $Calc_TrayItem
Run("Calc.exe")
Case $Notepad_TrayItem
Run("Notepad.exe")
Case $CmdLine_TrayItem
Run("Cmd.exe")
Case $MSPaint_TrayItem
Run("MSPaint.exe")
Case $Exit_TrayItem
_TrayIconDelete($hTrayIcon)
Exit
EndSwitch
WEnd
Автор: araneon
Дата сообщения: 09.01.2009 21:45
Великодушное спасибо
Автор: ynbIpb
Дата сообщения: 09.01.2009 22:13
Уважаемые, посоветуйте как реализовать:
Необходимо через FileOpenDialog выбрать много файлов сразу (около 60)
и вписать их все в ini файл типа:
[files]
1=file1
2=file2
3=file3
и тд...
и ещё знать их количество, тоже в ini запишу потом.
вот мой набросок, который нужно дописать:


Код: #include <GUIConstants.au3>
#include <file.au3>
#NoTrayIcon
If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)
If Not FileExists(@ScriptDir&"\files.ini") Then ;если файл не существует, то
_FileCreate (@ScriptDir&"\files.ini") ;создаём ini файл
$Fileini = FileOpen (@ScriptDir&"\files.ini",1)
FileWrite ( $Fileini,"[files]")
FileClose ($Fileini)
EndIf
$Form1 = GUICreate("Form1", 137, 84, 193, 125)
$Button1 = GUICtrlCreateButton("Open", 32, 24, 75, 25, 0)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case
$Button1 ;если нажата кнопка "Open"
$allfiles = FileOpenDialog ("Select all files",@ScriptDir&"\system\", "Все файлы (*.*)",1+4)
$filecount = StringRegExp ( $allfiles, "|",1)
;вот чего-то тут надо додумать )
IniWrite (@ScriptDir&"\files.ini","files","тут порядковый номер","тут имя файла")
EndSwitch
WEnd
Автор: araneon
Дата сообщения: 09.01.2009 22:22
Вот это, просто МЕГА СУПЕР даже больше чем я хотел. ПРИОГРОМНЕШЕЕ ВАМ РЕБЯТА СПАСИБО и РЕСПЕКТ
Автор: Loopback
Дата сообщения: 09.01.2009 22:30

Цитата:

вот мой набросок, который нужно дописать:

Например вот так:

Код: Case $Button1 ;если нажата кнопка "Open"
$allfiles = FileOpenDialog ("Select all files",@ScriptDir&"\system\", "Все файлы (*.*)",1+4)
$aFiles = StringSplit($allfiles, "|")
$filecount = $aFiles[0]-1
For $i=2 To $aFiles[0]
IniWrite (@ScriptDir&"\NoFileCheck.ini","files", $i-1, $aFiles[$i])
Next
Автор: ViSiToR
Дата сообщения: 09.01.2009 23:17
Loopback 23:30 09-01-2009
Цитата:
Это если быть стопроцентно уверенным, что будет выбрано >1 файла. Иначе я бы еще добавил проверку и обработку случая с 1 файлом (в этом случае возвращается полный путь к файлу, и из него нужно выделить имя).

Я кстати на эту тему давненько сделал функцию:


Код: $aAllFiles = _FileOpenDialogEx("Select all files", @ScriptDir & "\system\", "Все файлы (*.*)", 1+4)

If Not @error Then
$iFileCount = $aAllFiles[0]

For $i = 1 To $aAllFiles[0]
IniWrite(@ScriptDir & "\NoFileCheck.ini", "files", $i, $aAllFiles[$i])
Next
EndIf


;$iReturnMode = -1 (default) - Return array of selected files
;$iReturnMode = 1 (default) - Return string of selected files (all files returned as full file pathes)

Func _FileOpenDialogEx($sTitle, $sInitDir, $sFilter, $iOptions=0, $iReturnMode=-1, $sDefaultName='', $hWnd=0)
Local $sFOD_Ret = FileOpenDialog($sTitle, $sInitDir, $sFilter, $iOptions, $sDefaultName, $hWnd)
If @error Then Return SetError(@error, @extended, $sFOD_Ret)

Local $sRet = ''
Local $aSplit_Str = StringSplit($sFOD_Ret, '|')

If @error Or $aSplit_Str[0] < 2 Then
If
$iReturnMode > 0 Then Return $sFOD_Ret
Return $aSplit_Str
EndIf

Local
$sInit_Path = StringRegExpReplace($aSplit_Str[1], '([^\\])\\*$', '\1')

For $i = 2 To $aSplit_Str[0]
$sRet &= $sInit_Path & '\' & $aSplit_Str[$i] & '|'
Next

$sRet = StringRegExpReplace($sRet, '\|+$', '')
If $iReturnMode > 0 Then Return $sRet

Return StringSplit($sRet, '|')
EndFunc
Автор: ynbIpb
Дата сообщения: 09.01.2009 23:22
Loopback, То что надо. Спасибо.
Туго у меня с массивами.
По поводу проверок вот думаю...
Нужно учесть что юзер может выбрать 1, а может и часть файлов, чтоб они не спутались в ini файле.
Сложновато, может сделать запрет на выбор только одного файла (обязательно мультиселект), но где гарантия, что юзер выделит сразу все.

------------
зы
ViSiToR, спасибо за функцию.
как я понял или строку или массив возвращает, надо подумать)))
Автор: Loopback
Дата сообщения: 09.01.2009 23:28

Цитата:
Я кстати на эту тему давненько сделал функцию:

Полезная вещь, сохраню. Жаль все же, что это изначально в Autoit не унифицировали. Было бы куда удобнее, если бы функция при установке флага 4 всегда возвращала бы результат в едином формате.
Автор: diamondxxx
Дата сообщения: 10.01.2009 00:13
сделал скрипт авто согласия на установку драйверов - работает
Скрипт проверяет существует ли окно, если да. то закрывает его.
товарищи подскажите:
хочу чтобы по истечении определенного интервала времени с момента запуска скрипта\ или с момента бездействия (то есть, если никакое окно подходящее под условие не появилось в течение 3 минут) скрипт сам себя перезапускал 1 раз. Т.е. визуально процесс должен убить сам себя и запустить вновь в идеале.

Вопрос: как такое реализовать??
Автор: Maza Faka
Дата сообщения: 10.01.2009 05:25
ViSiToR

Цитата:
Что именно в ней не работает?

Запускаются несколько копий программы

Добавлено:
diamondxxx

Цитата:
хочу чтобы по истечении определенного интервала времени с момента запуска скрипта\ или с момента бездействия (то есть, если никакое окно подходящее под условие не появилось в течение 3 минут) скрипт сам себя перезапускал 1 раз.

Пример:

Код: MsgBox(0, "Debug", "Script running")

If WinWait("[CLASS:Notepad]", "", 3) = 0 Then ;Ждём появление окна блокнота 3 секунды
Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & @ScriptFullPath & '"')
Exit
EndIf
Автор: zmei2009
Дата сообщения: 10.01.2009 10:17
Здравствуйте.
Кто может подсказать скрипт для AutoIt3.Скрипт нужен для игры MU.
Скрипт должен выполнять такие функции:
Нажать и удерживать LCtrl. Включит скилл 1 кликнуть на mouse2,потом включить скилл 2 кликнуть на mouse2, потом скилл 3 кликнуть на mouse2 и всё занова (всё это автоматически) и на колёсик мыши поставить скорость выполнения.
(Получается Combo удар у чара DK,BK)

Если можно то ещё чтобы нажимались клавижи "Q -Hp банки,W -SD" скорость нажатия 0,5 милсек

Start=F5
Stop=F6
Exit=F7

Помогите плз.

Автор: ynbIpb
Дата сообщения: 10.01.2009 11:12

Цитата:
Т.е. визуально процесс должен убить сам себя и запустить вновь в идеале.

наверное батником, такие методы я видел у троянов (самоуничтожение)
Автор: ViSiToR
Дата сообщения: 10.01.2009 13:49
Maza Faka 06:25 10-01-2009
Цитата:
Запускаются несколько копий программы

Это в скомпилированном скрипте? если нет, то как запускается программа? и как используется функция?
Автор: Maza Faka
Дата сообщения: 10.01.2009 14:25
ViSiToR

Цитата:
Это в скомпилированном скрипте? если нет, то как запускается программа? и как используется функция?

А без разницы, и в компилированном и некомпилированном скрипте:

Код:
#include <Misc.au3>

_Singleton("MyScript")

MsgBox(0, "Debug", "Test message")
Автор: ViSiToR
Дата сообщения: 10.01.2009 15:28
Maza Faka
Странно, а выявить причину неработоспособности можешь? и ещё, какая у тебя система? может каких компонентов нехватает?
Автор: Zloy_Gelud
Дата сообщения: 10.01.2009 22:17
Помогите есче, пожалста. Как обрабатывать наведение курсора мышки на объект? И как создать пустой одномерный массив, чтоб потом в него можно было добавлять данные?

Добавлено:
Имеется ли UDF по работе с XML?
Автор: ViSiToR
Дата сообщения: 11.01.2009 02:04
Zloy_Gelud 23:17 10-01-2009
Цитата:
Как обрабатывать наведение курсора мышки на объект?

Какой объект? в GUI? возможно поможет _GUICtrlSetOnHover UDF?


Цитата:
как создать пустой одномерный массив

Dim $aArray[1]


Цитата:
Имеется ли UDF по работе с XML?

XML DOM wrapper (COM)?
Автор: Maza Faka
Дата сообщения: 11.01.2009 08:02
ViSiToR

Цитата:
Странно, а выявить причину неработоспособности можешь? и ещё, какая у тебя система? может каких компонентов нехватает?

Ну в общем-то я и сам удивляюсь, как она раньше работала, может функция _Singleton в ранних версиях была другой? Я не понимаю, как эта функция работает, функции OpenMutex там и в помине нет, как тогда проверять был ли уже создан mutex-объект? Система WinXP SP3, недавно переустановил. В общем проверяю так:

Код: ;Prevent from secondary run
If _OpenMutex(@ScriptName) Then Exit MsgBox(48, "@ScriptName", @ScriptName & " is already running!")
_CreateMutex(@ScriptName)

MsgBox(0, "Debug", "Test message")

Func _OpenMutex($sUnicName)
Local Const $MUTEX_ALL_ACCESS = 0x1F0001
Local $aRet = DllCall("kernel32.dll", "hwnd", "OpenMutex", _
"int", $MUTEX_ALL_ACCESS, _
"int", False, _
"str", $sUnicName)
Return $aRet[0]
EndFunc ;==>_OpenMutex

Func _CreateMutex($sUnicName)
DllCall("kernel32.dll", "hwnd", "CreateMutex", _
"int", 0, _
"int", False, _
"str", $sUnicName)
EndFunc ;==>_CreateMutex
Автор: gal7
Дата сообщения: 11.01.2009 13:31
Помогите, пожалуйста, сделать посылку сигнала по CTRL+C (не просто нажать это сочетание, а именно послать сигнал с помощью GenerateConsoleCtrlEvent -
это важно) определенному консольному окну.

Создание процесса я взял отсюда (во втором посте):
http://www.autoitscript.com/forum/index.php?showtopic=76607&hl=_WinAPI_CreateProcess

Способ отправки ctrl+c взял отсюда (почти в самом конце):
http://news.rsdn.ru/Forum/message/1158887.flat.aspx

Все консольные функции windows здесь:
http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx

Такой винегрет из всего этого у меня получился (не работает):


Код: #Include <WinAPI.au3>
#Include <Constants.au3>
#Include <NamedPipes.au3>

Local $kernel = DllOpen("kernel32.dll")
Local $iBytes, $sData, $hReadPipe, $hWritePipe, $tBuffer, $tProcess, $tSecurity, $tStartup
$sCmd = "perl";Какая-нибудь коммандная строка где может срабатывать закрытие окна по ctrl+c у меня это perl
$sWorkingDir = @ScriptDir
$state = @SW_SHOW
Local Const $STARTF_USESHOWWINDOW = 0x1
Local Const $STARTF_USESTDHANDLES = 0x100
$tSecurity = DllStructCreate($tagSECURITY_ATTRIBUTES)
DllStructSetData($tSecurity, "Length", DllStructGetSize($tSecurity))
DllStructSetData($tSecurity, "InheritHandle", True)
_NamedPipes_CreatePipe($hReadPipe, $hWritePipe, $tSecurity)
$tProcess = DllStructCreate($tagPROCESS_INFORMATION)
$tStartup = DllStructCreate($tagSTARTUPINFO)
DllStructSetData($tStartup, "Size", DllStructGetSize($tStartup))
DllStructSetData($tStartup, "Flags", BitOR($STARTF_USESTDHANDLES, $STARTF_USESHOWWINDOW))
DllStructSetData($tStartup, "StdOutput", $hWritePipe)
DllStructSetData($tStartup, "StdError", $hWritePipe)
DllStructSetData($tStartup, "ShowWindow", $state)
DllCall($kernel, "int", "AllocConsole")
_WinAPI_CreateProcess('', $sCmd, 0, 0, False, 'CREATE_NEW_PROCESS_GROUP', 0, 0, DllStructGetPtr($tStartup), DllStructGetPtr($tProcess))
$ProcessID = DllStructGetData($tProcess, "ProcessID")
sleep(1000)
$r = DllCall($kernel, "int", "GenerateConsoleCtrlEvent", "dword", 'CTRL_C_EVENT', "dword", $ProcessID)
$t = _WinAPI_GetLastErrorMessage()

$hThread = DllStructGetData($tProcess, "hThread")
$hProcess = DllStructGetData($tProcess, "hProcess")
_WinAPI_CloseHandle($hThread)
_WinAPI_CloseHandle($hProcess)
DllCall($kernel, "int", "FreeConsole")
MsgBox(0,$t,$r)
DllClose($kernel)
Автор: ViSiToR
Дата сообщения: 11.01.2009 13:33
Maza Faka 09:02 11-01-2009
Цитата:
может функция _Singleton в ранних версиях была другой?

Точно была другой...


Код: Func _Singleton($occurenceName, $flag = 0)
Local $ERROR_ALREADY_EXISTS = 183
$occurenceName = StringReplace($occurenceName, "\", "") ; to avoid error
; Local $handle = DllCall("kernel32.dll", "int", "CreateSemaphore", "int", 0, "long", 1, "long", 1, "str", $occurenceName)

Local $handle = DllCall("kernel32.dll", "int", "CreateMutex", "int", 0, "long", 1, "str", $occurenceName)
Local $lastError = DllCall("kernel32.dll", "int", "GetLastError")
If $lastError[0] = $ERROR_ALREADY_EXISTS Then
If
$flag = 0 Then
Exit
-1
Else
SetError($lastError[0])
Return 0
EndIf
EndIf
Return
$handle[0]
EndFunc
Автор: Zloy_Gelud
Дата сообщения: 11.01.2009 20:25
ViSiToR -- да-да..все то, что надо. Спасибо.


У меня опять вопросы, извините, если они покажутся вам глупыми, но в доках ответа я на них не нашел...
1. Применить маску к GUI и соответственно чтобы не было панельки (?) с кнопоками свернуть, развернуть, закрыть, ну и конечно чтоб GUI (проект) можно было перемещать?
2. Можно ли использовать в качестве маски фоновый рисунок?
3. (Этот вопрос скажу честно еще сам не разбирал, но надеюсь вы поможите ) При наведении на Label появлялся прямоугольник (имеющий определенную толщину границы и цвет), имеющий размеры как и у объекта Label и такую же позицию? Нужно это как бы для сигнализации наведения на объект.
Автор: ViSiToR
Дата сообщения: 11.01.2009 23:10
Zloy_Gelud 21:25 11-01-2009
Цитата:
Применить маску к GUI и соответственно чтобы не было панельки (?) с кнопоками свернуть, развернуть, закрыть, ну и конечно чтоб GUI (проект) можно было перемещать?


Пример:


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

Global $GUI = GUICreate("Drag using any place on GUI - Demo", -1, -1, -1, -1, _
BitOR($WS_POPUPWINDOW, $WS_THICKFRAME), $WS_EX_CLIENTEDGE)

$Menu = GUICtrlCreateMenu("Menu")
$Exit_MenuItem = GUICtrlCreateMenuItem("Exit Item", $Menu)

GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")

GUISetState()

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $Exit_MenuItem
Exit
EndSwitch
WEnd

Func
WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
If $hWnd <> $GUI Or $iMsg <> $WM_NCHITTEST Then Return $GUI_RUNDEFMSG

Local $iRet = _WinAPI_DefWindowProc($hWnd, $iMsg, $iwParam, $ilParam)
If $iRet = 1 Then Return 2

Return $iRet
EndFunc
Автор: Zloy_Gelud
Дата сообщения: 12.01.2009 00:39
ViSiToR -- еще раз спасибо! Выручаешь.

Цитата:
Какой маски?

Имеется .BMP рисунок (собственно маска). Вот ее и надо (можно ли?) применить к главному окну проекта? Типа чтоб контуры окна проекта имели такие же как и в рисунке (маске).
Автор: Maza Faka
Дата сообщения: 12.01.2009 07:28
ViSiToR

Цитата:
Точно была другой...

Ты будешь смеяться, но и она не работает


Цитата:
Ты бы проверил на каком месте проблема, ведь если она не работает, то нужно разработчикам доложить, чтобы поправили.

А незнаю в каком месте она не работает (Мой вариант меня вполне устраивает)


Цитата:
Такой вариант у тебя работает?

Конечно работает, ведь там используется функция OpenMutex, а вот этот огород вроде бы не нужен:

Код:
Local Const $MUTEX_ALL_ACCESS = 0x1F0001
Local Const $SECURITY_DESCRIPTOR_REVISION = 1
Local $handle, $lastError, $pSecurityAttributes = 0

If BitAND($iFlag, 2) Then
; The size of SECURITY_DESCRIPTOR is 20 bytes. We just
; need a block of memory the right size, we aren't going to
; access any members directly so it's not important what
; the members are, just that the total size is correct.
Local $structSecurityDescriptor = DllStructCreate("dword[5]")
Local $pSecurityDescriptor = DllStructGetPtr($structSecurityDescriptor)
; Initialize the security descriptor.
Local $aRet = DllCall("advapi32.dll", "int", "InitializeSecurityDescriptor", _
"ptr", $pSecurityDescriptor, "dword", $SECURITY_DESCRIPTOR_REVISION)

If Not @error And $aRet[0] Then
; Add the NULL DACL specifying access to everybody.
$aRet = DllCall("advapi32.dll", "int", "SetSecurityDescriptorDacl", _
"ptr", $pSecurityDescriptor, "int", 1, "ptr", 0, "int", 0)

If Not @error And $aRet[0] Then
; Create a SECURITY_ATTRIBUTES structure.
Local $structSecurityAttributes = DllStructCreate("dword;ptr;int")
; Assign the members.
DllStructSetData($structSecurityAttributes, 1, DllStructGetSize($structSecurityAttributes))
DllStructSetData($structSecurityAttributes, 2, $pSecurityDescriptor)
DllStructSetData($structSecurityAttributes, 3, 0)
; Everything went okay so update our pointer to point to our structure.
$pSecurityAttributes = DllStructGetPtr($structSecurityAttributes)
EndIf
EndIf
EndIf
Автор: Zloy_Gelud
Дата сообщения: 12.01.2009 11:26
Maza Faka -- здорово. Буду разбирать.
З.Ы. А чем различаются пример 2 и пример 3?
Автор: ViSiToR
Дата сообщения: 12.01.2009 12:53
Maza Faka 08:28 12-01-2009
Цитата:
Ты будешь смеяться, но и она не работает

Значит у тебя какая-то проблема в системе появилась.


Цитата:
А незнаю в каком месте она не работает (Мой вариант меня вполне устраивает)

Жалко что проверить не можешь, ведь раз не работает, значит бага... а значит и у других может не работать... а значит функция не надёжная...


Цитата:
этот огород вроде бы не нужен

Насколько я понимаю, этот огород для висты...

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192

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


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