[Архив - Часть 1.3] AutoIt скрипты

Ответить
 • Просмотры: 3
Аватара пользователя
Creat0R

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Creat0R »

Respect


Цитата:



необходим универсальный способ



Такого как мне кажется, в Аутоите, для этой задачи, увы нет Изображение .




Цитата:



как переключать раскладку клавиатуры, не применяя эмуляцию нажатия клавиш ?



См. в шапке
AutoIt скрипты - введение и FAQ
(Как с помощью AutoIt сменить раскладку клавиатуры).



Diamond


Цитата:



все шли вместе с дистрибутивом v3.2.2.0



Интересно, я установил эту версию, но поверх старой (v3.2.0.1), неужели файлы справки в таком случае не заменяются? Изображение (в самих справках написанно v3.2.0.1).




Цитата:



проверяется путь "C:\test\nul" и возвращается True, хотя на самом деле такого пути не существует - мистика.



Ну это не совсем мистика, просто видимо Nul, интерпритируется как “Ничто” (также как и при проверке If FileExists("") ... ), т.е учитывается только путь до Nul (в случае с FileExists("") это путь к скрипту, ну или к рабочему каталогу).




Цитата:



использовал этот способ в батниках - как единственно возможный



Кстати, в батниках тоже можно “атрибутным” (почти) способом проверять Изображение :





Код:

Код: Выделить всё

@echo off
Set Dir=c:\D
If Not Exist "%Dir%" Goto ExitMsg
Attrib %Dir% > "%temp%\~6456t56iu.tmp"
For /f "delims= " %%a in (%temp%\~6456t56iu.tmp) Do If /i %%a==%Dir% (
Echo "%Dir%" Is a folder!  ---^> Exit in 7 seconds ;-^) ) Else (
Echo "%Dir%" Is Not a folder!  ---^> Exit in 7 seconds ;-^) )
Goto Exit
:ExitMsg
Echo This file ^ was not found  ---^> Exit in 7 seconds ;-)
:Exit
ping -n 7 localhost > nul
Del "%temp%\~6456t56iu.tmp"

Хотя тоже не очень наджёжно, но это уже другая тема, сорри за офтоп Изображение
Аватара пользователя
Diamond

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Diamond »

borzoy

Я отправил вам оповещение, что ваша тема [autoit] Fraps и Punpad Shell4, с просьбой помочь создать скрипт, перенесена в созданную вами же тему
Помогите с тихой установкой Fraps и Runpad Shell
, в которой уже начато обсуждение.

Зачем создавать одинаковые темы?
ОПК
- пункт 2.1

(Тема переименована в [autoit] Fraps и Runpad Shell, ни один пост не удалён)
Аватара пользователя
DenchikK

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение DenchikK »

Хочется узнать, как бы сделать так, чтоб скрипт искал файл qip.exe во

всём каталоге Program Files, и если таковой найдется - возвратил бы

тот каталог, в котором он лежит и запихнул бы в реестр полный путь к

катлогу (не к файлу). Это вообще осуществимо?

Заранее спасибо!
Аватара пользователя
Creat0R

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Creat0R »

Diamond


Цитата:



Можно ли как-то заставить GUI, игнорировать (установленый в системе по умолчанию) стиль Windows XP



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




Цитата:



Сущесвует ли какой нибудь простой способ претаскивания окна стиля $WS_POPUP



Есть стил $GUI_WS_EX_PARENTDRAG, его нужно “вешать” например на GuiCtrlCreateLabel, и тогда можно перетаскивать окно тягая этот контроль:





Код:

Код: Выделить всё

#include <Guiconstants.au3>
Opt("GUIOnEventMode",1)
$test=GUICreate("",400,300,-1,-1,$WS_POPUP+$WS_BORDER)
GUISetBkColor(0xBEFFBE)
GUISetOnEvent($GUI_EVENT_CLOSE,"ExitGui")
$Closed_button=GUICtrlCreateButton("X",377,4,18,18)
GUICtrlSetFont(-1,10,700,0,"Tahoma")
GUICtrlSetOnEvent(-1,"ExitGui")
$Mim_button=GUICtrlCreateButton("-",337,4,18,18)
GUICtrlSetFont(-1,13,700,0,"Arial Black")
GUICtrlSetOnEvent(-1,"MimimizeGui")
$Max_button=GUICtrlCreateButton(CHR(152),357,4,18,18)
GUICtrlSetFont(-1,9,700,0,"Tahoma")
GUICtrlSetState(-1,$GUI_DISABLE)
$text=GUICtrlCreateLabel("Manual GUI Drag",5,5,325,18, $SS_Center, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetFont(-1,12,700,0,"Courier New")
GUICtrlSetColor(-1,0xBEFFBE)
GUICtrlSetBkColor(-1,0x000000)
DllCall("User32.dll","long","AnimateWindow","hwnd",$test,"long",300,"long",0x10)
GUISetState()
While 1
      Sleep(100)
WEnd
Func MimimizeGui()
      GUISetState(@SW_MINIMIZE)
EndFunc
Func ExitGui()
      DllCall("User32.dll","long","AnimateWindow","hwnd",$test,"long",300,"long",0x10+0x10000)
      Exit
EndFunc




Цитата:



либо они обновили дистрибутив уже после того как ты его скачал



Ладно, спасибо, попробую ещё раз перекачать и установить.
Аватара пользователя
Creat0R

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Creat0R »

DenchikK


Цитата:



чтоб скрипт искал файл qip.exe во

всём каталоге Program Files, и если таковой найдется - возвратил бы

тот каталог, в котором он лежит и запихнул бы в реестр полный путь к

катлогу (не к файлу).



Вот рабочий пример, путь в реестре куда писать, поменяешь у переменной $RegKey, а имя значения у переменной $RegValueName:





Код:

Код: Выделить всё

#include <File.au3>
#include <Array.au3>
$PathForSearch = @ProgramFilesDir
$FileToFind = "Qip.exe"
$RegKey = "HKEY_CURRENT_USER\Software\QIP"
$RegValueName = "Path"
ProgressOn("Please wait...", "Getting Folders Structure...", $PathForSearch, -1, -1, 16)
$SearchResults = _FileFind($PathForSearch, $FileToFind)
ProgressOff()
If $SearchResults <> -1 Then
      RegWrite($RegKey, $RegValueName, "REG_SZ", $SearchResults)
      MsgBox(262144+64, "Done!", "File <" & $FileToFind & "> was found in this path <" & $SearchResults & ">, and the path was writen to registry key <" & $RegKey & "> under <" & $RegValueName & "> valuename.")
Else
      MsgBox(262144+48, "Attention!", "File <" & $FileToFind & "> was not found on <" & $PathForSearch & "> and it subfolders." & @CR & @CR & "OK ---> EXIT")
EndIf
Func _FileFind($Path, $FileToFind)
      Local $RetPath = $Path
      If FileExists($Path & "\" & $FileToFind) Then Return $Path
      $SubFoldersArr = _DirListToArray($Path)
      If IsArray($SubFoldersArr) Then
            $PrgrsDelim = 100 / $SubFoldersArr[0]
            $Prgrrs = $PrgrsDelim
            ProgressSet($Prgrrs, $Path, "Search for <" & $FileToFind & "> is in process...")
            For $iF = 1 To $SubFoldersArr[0]
                  ProgressSet($Prgrrs, $SubFoldersArr[$iF])
                  $Prgrrs = $Prgrrs + $PrgrsDelim
                  If FileExists($SubFoldersArr[$iF] & "\" & $FileToFind) Then
                        $RetPath = $SubFoldersArr[$iF]
                        ExitLoop
                  EndIf
            Next
      EndIf
      If $RetPath <> $Path Then
            Return $RetPath
      Else
            Return -1
      EndIf
EndFunc
Func _DirListToArray ($sPath)
    Local $i, $j, $rlist[1]=[0], $blist, $alist=_FileListToArray ($sPath, '*', 2)
    If IsArray ($alist) Then
       For $i=1 To $alist [0]
            _ArrayAdd ($rlist, $sPath & "\" & $alist [$i])
            $blist = _DirListToArray ($sPath & "\" & $alist [$i])
            If $blist[0] > 0 Then
                  $PrgrsDelim = 100 / ($blist[0] + $alist[0])
                  $Prgrrs = $PrgrsDelim
                  For $j=1 To $blist[0]
                        ProgressSet($Prgrrs, $blist[$j])
                        $Prgrrs = $Prgrrs + $PrgrsDelim
                        _ArrayAdd ($rlist, $blist[$j])
                  Next
            EndIf
        Next
    EndIf
    $rlist [0] = UBound ($rlist) - 1
    Return $rlist
EndFunc

Если ненужен вывод прогресса, просто убери строчки связанные с Progress Изображение
Аватара пользователя
Diamond

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Diamond »

DenchikK

Creat0R

К сожалению, а может и к радости, мне не удалось найти уже готового решения и я решил написать функцию поиска сам.

А сейчас захожу на форум и, вот тебе раз, опоздал... Ну да ладно... как вам такой вариант, вроде бы тоже ничего? Изображение

P.S. Есть ещё перебор через VBScript с помощью ObjCreate(). Если интересно - выложу. Изображение



Код:

Код: Выделить всё

$ret = find(@ProgramFilesDir,"qip.exe")
If Not $ret=0 Then
	MsgBox(0,"",$ret)
	; Записываем значение $ret в реестр...
Else
	MsgBox(0,"","Файл не найден.")
EndIf
;=================================
; $Path - Путь поиска. ( Не должен заканчиваться слэшем!!! )
; $FileName - Имя искомого файла.
; Возвращает полный путь к каталогу (не к файлу), если файл осутствует возвращает 0
Func find($Path,$FileName)
If Not IsDeclared("GetPath") Then
	Global $GetPath=0
EndIf
$ModPath=$Path & "\*" ; Формирую строку поиска (толко для инициализации)
$file=FileFindFirstFile($ModPath) ; Инициализация поиска
While 1
	$get=FileFindNextFile($file) ; Поиск...
	If @error Then ExitLoop
	$string=$Path & "\" & $get ; Формирую новый путь
	If Not StringInStr(FileGetAttrib($string),"D") Then ;Если не является папкой тогда:
		If $get=$FileName Then
			$GetPath=$Path
			ExitLoop
		EndIf
	Else
		find($string,$FileName) ; Запуск подфункции для поиска в подпапке
	EndIf
WEnd
FileClose($file) ;Завершение инициализации
Return $GetPath
EndFunc

Исправлено!
Аватара пользователя
Creat0R

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Creat0R »

Такой вопрос:

-Возможно ли получить иконку из файла, в случае если расширение файла не зарегистрированно в системе? Т.е мне нужно сделать GuiCtrlSetImage(), и указать так, чтобы та иконка которая отображается на файле, была считана для контроля ($CtrlID).

К примеру, есть файл Program.exe, известно что далеко не все исполняемые файлы (и другие) содержат иконку, и нужно каким то образом определить, содержит ли этот файл иконку, если не содержит, то естественно путь к иконке можно указать к Shell32.dll, 2 (где 2 это ID иконки для екзешников не содержащих иконки), если содержит, то к самому файлу, и как ID ставить 0. А если файл не исполняемы, то можно по расширению читать из реестра путь к иконке.



Вобщем-то сам вопрос - Как узнать, содержит ли файл иконку? и по возможности, получить путь к иконке для не зарегистрированных типов файлов.
Аватара пользователя
Creat0R

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Creat0R »

Подскажите, как с помощью WinApi поменять частоту обновления экрана?

В интернете есть множество примеров с использованием библиотеки: user32.dll функция: ChangeDisplaySettingsA, но как реализовать это в AutoIt совершенно не представляю. Очень надо!!!
Аватара пользователя
Creat0R

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Creat0R »

Diamond

А функция не работает то Изображение - нужно Global $GetPath = 0 ставить вне функции, т.к каждый вызов подфункции, вне зависимости от того найден ли файл, задаёт переменной $GetPath значение 0, таким образом цикл не прирывается, и пока не проверяются все файлы функция действует...



Вот немного изменил её (сорри если что), а также добавил в неё определение файла в корневом каталоге (в $Path):





Код:

Код: Выделить всё

Global $GetPath=0
$ret = find(@ProgramFilesDir,"qip.exe")
If Not $ret=0 Then
	MsgBox(0,"",$ret)
	; Записываем значение $ret в реестр...
Else
	MsgBox(0,"","Файл не найден.")
EndIf
;=================================
; $Path - Путь поиска. ( Не должен заканчиваться слэшем!!! )
; $FileName - Имя искомого файла.
; Возвращает полный путь к каталогу (не к файлу), если файл осутствует возвращает 0
Func find($Path,$FileName)
$ModPath=$Path & "\*" ; Формирую строку поиска (толко для инициализации)
$file=FileFindFirstFile($ModPath) ; Инициализация поиска
While 1
; Условие для прерывания всех циклов - чтобы быстро выйти из функции
	If $GetPath  0 Then ; Если нужный нам файл уже найден тогда
		ExitLoop ; Прерываю циклы всех подфункций
	EndIf
	$get=FileFindNextFile($file) ; Поиск...
	If @error Then ExitLoop
	$string=$Path & "\" & $get ; Формирую новый путь
	If Not StringInStr(FileGetAttrib($string),"D") Then ;Если не является папкой тогда:
		If $get=$FileName Then
			$GetPath=$Path
			ExitLoop
		EndIf
	Else
		find($string,$FileName) ; Запуск подфункции для поиска в подпапке
	EndIf
WEnd
FileClose($file) ;Завершение инициализации
Return $GetPath
EndFunc

Файл в корневом каталоге и раньше определялся (если убрать Global $GetPath = 0 из функции), но так быстрее Изображение

P.S. всё изменённое выделенно.
Аватара пользователя
Creat0R

Re: [Архив - Часть 1.3] AutoIt скрипты

Сообщение Creat0R »

Diamond

Немного “гуинизировал” твою функцию для поиска файла Изображение - в первом поле задаём путь в котором нужно искать, а в нижнем запрос (имя файла) - неверно набранный путь (если не существует или содержит слеш на конце) определяется, а также определяется если набранное имя файла содержит непозволенные символы (< > | ? : * / \ "):



Код: Выделить всё

Opt("GuiOnEventMode", 1)
Global $Progress = 0.1, $GetPath = 0
$PathForSearch = @ProgramFilesDir
$FileToFind = "FileName.exe"
$Gui = GUICreate("File Finder", 300, 170, -1, -1, -1, 0x00000088)
GUISetOnEvent(-3, "ExitScript")
GUICtrlCreateLabel("Path to search on:", 20, 30)
$PathInput = GUICtrlCreateInput($PathForSearch, 20, 50, 270)
GUICtrlCreateLabel("File to find:", 20, 90)
$FileNameInput = GUICtrlCreateInput($FileToFind, 20, 110, 270)
$SearchButton = GUICtrlCreateButton("Search", 70, 140, 60, 20)
GUICtrlSetOnEvent(-1, "SearchButton")
$CancelButton = GUICtrlCreateButton("Cancel", 180, 140, 60, 20)
GUICtrlSetOnEvent(-1, "ExitScript")
GUISetState()
While 1
    Sleep(100)
WEnd
Func _FindFile($Path, $FileName)
    $ModPath = $Path & "\*" ; Формирую строку поиска (толко для инициализации)
    $File = FileFindFirstFile($ModPath) ; Инициализация поиска
    While 1
        ; Условие для прерывания всех циклов - чтобы быстро выйти из функции
        If $GetPath <> 0 Then ExitLoop ; Прерываю циклы всех подфункций
        $Get = FileFindNextFile($File)
        If @error Then ExitLoop
        $String = $Path & "\" & $Get ; Формирую новый путь
        ProgressSet($Progress, $Path & @CR & $Get)
        $Progress = $Progress + 0.1
        If $Progress >= 100 Then $Progress = 0.1
        If Not StringInStr(FileGetAttrib($String), "D") Then ;Если не является папкой тогда:
            If $Get = $FileName Then
                $GetPath = $Path
                ExitLoop
            EndIf
        Else
            _FindFile($String, $FileName) ; Запуск подфункции для поиска в подпапке
        EndIf
    WEnd
    FileClose($File) ;Завершение инициализации
    Return $GetPath
EndFunc
Func SearchButton()
    If Not FileExists(GUICtrlRead($PathInput)) Then
        _MsgBox(16, "Error", "You must type an existing path", $Gui)
    ElseIf StringRight(GUICtrlRead($PathInput), 1) = "\" Then
        _MsgBox(48, "Attention!", "The path must not have a slash (\) at the end of it.", $Gui)
    ElseIf GUICtrlRead($FileNameInput) = "" Then
        _MsgBox(16, "Error", "You must type a file name", $Gui)
    ElseIf Not _IsFileName(GUICtrlRead($FileNameInput)) Then
        _MsgBox(16, 'Error', 'The file name include an invalid characters' & @CR & '< > | ? : * / \ "', $Gui)
    Else
        $PathForSearch = GUICtrlRead($PathInput)
        $FileToFind = GUICtrlRead($FileNameInput)
        GUISetState(@SW_HIDE, $Gui)
        ProgressOn("Please wait...", "Search is in progress...", $PathForSearch, -1, -1, 16)
        $SearchResults = _FindFile($PathForSearch, $FileToFind)
        ProgressOff()
        If Not $SearchResults = 0 Then
            MsgBox(262144+64, "Done!", "File <" & $FileToFind & "> was found in this path <" & $SearchResults & ">.")
        Else
            MsgBox(262144+48, "Attention!", "File <" & $FileToFind & "> was not found on <" & $PathForSearch & "> and it subfolders." & @CR & @CR & "OK ---> EXIT")
        EndIf
        GUISetState(@SW_SHOW, $Gui)
    EndIf
EndFunc
Func _IsFileName($Test)
    If StringRegExp($Test, '[<>|?:"*/\\]') <> 0 Then
        Return False
    Else
        Return True
    EndIf
EndFunc
Func _MsgBox ($MsgBoxType, $MsgBoxTitle, $MsgBoxText, $mainGUI=0)
    $ret = DllCall ("user32.dll", "int", "MessageBox", _
            "hwnd", $mainGUI, _
            "str", $MsgBoxText , _
            "str", $MsgBoxTitle, _
            "int", $MsgBoxType)
    Return $ret [0]
EndFunc
Func ExitScript()
    Exit
EndFunc
Ответить

Вернуться в «AutoIt»