Что нового

Запуск из папки случайного видеофайла

Grell

Новичок
Сообщения
127
Репутация
0
Версия AutoIt: 3.3.14.0

Описание:
Добрый день, уважаемые программисты.

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

Примечания:
Координаты расположения плеера: 100,200 (примерно левый верхний угол).
Размеры окна (плеера по-умолчанию) 200х150.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Повторяться файлы могут ?
 
Автор
G

Grell

Новичок
Сообщения
127
Репутация
0
ra4o, да - файлы могут повторяться.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Попробуйте так :
Код:
#include <file.au3>

$sPath = 'C:\1'
$sExt = '*.avi'
$iX = 100
$iY = 200
$iH = 200
$iW = 150

$aFiles = _FileListToArray($sPath, $sExt)
$iRandomFile = Random(1, $aFiles[0], 1)
$iRun=Run( 'C:\Program Files (x86)\Windows Media Player\wmplayer.exe  '& $sPath&'\'&$aFiles[$iRandomFile])
WinWait('Проигрыватель Windows Media')
$hWnd = WinGetHandle('Проигрыватель Windows Media')
WinMove ( $hWnd ,'', $iX, $iY,$iH,$iW )
 
Автор
G

Grell

Новичок
Сообщения
127
Репутация
0
ra4o, не работает.

Не распознает имена файлов - написанные кириллицей с пробелами
 
A

Alofa

Гость
Код:
#include <File.au3>
#include <WinAPIReg.au3>
#include <WinAPIProc.au3>

Local $sDir = 'D:\КЛИПЫ' ; Папка
Local $sFileType = '.mp4' ; Расширение файлов для поиска
Local $aPos[4] = [100, 200, 200, 150] ; Координаты окна плеера
Local $hWnd, $aFiles, $sRunProgram, $iPID, $hTimer, $aProgWindows

$aFiles = _FileListToArray($sDir, '*' & $sFileType, $FLTA_FILES, True)
If @error Then Exit -1

$sRunProgram = _WinAPI_AssocQueryString($sFileType, $ASSOCSTR_EXECUTABLE) ; Редактор по умолчанию, ассоциированный в ОС с данным типом
If @error Or StringRight($sRunProgram, 4) = '.dll' Then Exit -2

$iPID = Run('"' & $sRunProgram & '" "' & $aFiles[Random(1, $aFiles[0], 1)] & '"')
If Not $iPID Then Exit -3

$hTimer = TimerInit()
Do ; Некоторые плееры доооолго запускаются
	$aProgWindows = _WinAPI_EnumProcessWindows($iPID)
	If Not @error Then
		For $i = 1 To $aProgWindows[0][0]
			If WinActive($aProgWindows[$i][0]) Then
				$hWnd = $aProgWindows[$i][0]
				$aProgWindows = ''
				ExitLoop 2
			EndIf
		Next
		Sleep(200)
	EndIf
Until TimerDiff($hTimer) > 5000 ; Ждем ~ 5 секунд
If Not $hWnd Then Exit -4

WinMove($hWnd, '', Default, Default, $aPos[2], $aPos[3])
If Not WinMove($hWnd, '', $aPos[0], $aPos[1]) Then Exit -5
 
Автор
G

Grell

Новичок
Сообщения
127
Репутация
0
Alofa, а как добавить в скрипт три формата видеофайлов (mp4,avi,mpg), вместо одного ?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Grell [?]
а как добавить в скрипт три формата видеофайлов (mp4,avi,mpg), вместо одного ?
использовать функцию
Код:
_FileListToArrayRec
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Grell
случайный видеофайл, открыть его программой по умолчанию
Код:
#include <File.au3>

$Folder = "C:\папка с видео\"

$aFiles = _FileListToArray($Folder, "*", 1, True)
If @error Then Exit MsgBox(0, "Error", "Ошибка поиска файлов")

ShellExecute($aFiles[Random(1, $aFiles[0], 1)])

Sleep(1111)
WinMove("", "", 100, 200, 200, 150)
 
Автор
G

Grell

Новичок
Сообщения
127
Репутация
0
joiner , подскажите как в скрипт

Код:
#include <File.au3>
#include <WinAPIReg.au3>
#include <WinAPIProc.au3>

Local $sDir = 'D:\КЛИПЫ' ; Папка
Local $sFileType = '.mp4' ; Расширение файлов для поиска
Local $aPos[4] = [100, 200, 200, 150] ; Координаты окна плеера
Local $hWnd, $aFiles, $sRunProgram, $iPID, $hTimer, $aProgWindows

$aFiles = _FileListToArray($sDir, '*' & $sFileType, $FLTA_FILES, True)
If @error Then Exit -1

$sRunProgram = _WinAPI_AssocQueryString($sFileType, $ASSOCSTR_EXECUTABLE) ; Редактор по умолчанию, ассоциированный в ОС с данным типом
If @error Or StringRight($sRunProgram, 4) = '.dll' Then Exit -2

$iPID = Run('"' & $sRunProgram & '" "' & $aFiles[Random(1, $aFiles[0], 1)] & '"')
If Not $iPID Then Exit -3

$hTimer = TimerInit()
Do ; Некоторые плееры доооолго запускаются
    $aProgWindows = _WinAPI_EnumProcessWindows($iPID)
    If Not @error Then
        For $i = 1 To $aProgWindows[0][0]
            If WinActive($aProgWindows[$i][0]) Then
                $hWnd = $aProgWindows[$i][0]
                $aProgWindows = ''
                ExitLoop 2
            EndIf
        Next
        Sleep(200)
    EndIf
Until TimerDiff($hTimer) > 5000 ; Ждем ~ 5 секунд
If Not $hWnd Then Exit -4

WinMove($hWnd, '', Default, Default, $aPos[2], $aPos[3])
If Not WinMove($hWnd, '', $aPos[0], $aPos[1]) Then Exit -5

Добавить функцию FileListToArrayRec, чтобы распознавалось три конкретных формата видеофайлов (mp4,avi,mpg), вместо одного ?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Код:
#include <File.au3>
#include <WinAPIProc.au3>

Local $Folder = 'D:\КЛИПЫ'

Local $aFiles = _FileListToArrayRec($Folder, "*.mp4;*.avi;*.mpg", 1, 0, 0, 2)
If @error Then Exit MsgBox(0, "Error", "Ошибка поиска файлов")

Local $iPID = ShellExecute($aFiles[Random(1, $aFiles[0], 1)])
Local $aProgWindows
$hTimer = TimerInit()
Do
	$aProgWindows = _WinAPI_EnumProcessWindows($iPID)
Until TimerDiff($hTimer) > 5000 ; Ждем ~ 5 секунд
If $iPID = 0 Or IsArray($aProgWindows) = 0 Then Exit
WinMove($aProgWindows[1][0], '', 100, 200, 200, 150)


минус вот в чем - нужно ждать, пока плеер запустит видео файл, а потом перемещать окно плеера. почему? потому что плеер автоизменяет свое окно под разрешение видео, оно может быть на весь экран или меньше. а сколько нужно ждать? ну тут кто его знает. к тому же, некоторые (или все) плееры имеют ограничение на уменьшение окна
 
A

Alofa

Гость
Grell сказал(а):
... добавить в скрипт три формата ...
Код:
#include <File.au3>
#include <WinAPIReg.au3>
#include <WinAPIProc.au3>

Local $sDir = @ScriptDir ; Папка
Local $sFileType = '*.mp4;*.avi;*.mpg' ; Расширения файлов для поиска
Local $aPos[4] = [100, 200, 200, 150] ; Координаты окна плеера
Local $hWnd, $aFiles, $sRunProgram, $iPID, $hTimer, $aProgWindows, $sRunFile

$aFiles = _FileListToArrayRec($sDir, $sFileType, $FLTA_FILES, $FLTAR_NORECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH)
If @error Then Exit -1

$sRunFile = $aFiles[0] > 1 ? $aFiles[Random(1, $aFiles[0], 1)] : $aFiles[1]

$sRunProgram = _WinAPI_AssocQueryString(StringRight($sRunFile, 4), $ASSOCSTR_EXECUTABLE) ; Редактор по умолчанию, ассоциированный в ОС с данным типом
If @error Or StringRight($sRunProgram, 4) = '.dll' Then Exit -2

$iPID = Run('"' & $sRunProgram & '" "' & $sRunFile & '"')
If Not $iPID Then Exit -3

$hTimer = TimerInit()
Do ; Некоторые плееры доооолго запускаются
    $aProgWindows = _WinAPI_EnumProcessWindows($iPID)
    If Not @error Then
        For $i = 1 To $aProgWindows[0][0]
            If WinActive($aProgWindows[$i][0]) Then
                $hWnd = $aProgWindows[$i][0]
                $aProgWindows = ''
                ExitLoop 2
            EndIf
        Next
        Sleep(200)
    EndIf
Until TimerDiff($hTimer) > 5000 ; Ждем ~ 5 секунд
If Not $hWnd Then Exit -4

WinMove($hWnd, '', Default, Default, $aPos[2], $aPos[3])
If Not WinMove($hWnd, '', $aPos[0], $aPos[1]) Then Exit -5
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Grell

Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Alofa
в твоем коде лишнее _WinAPI_AssocQueryString, так как shellexecut и так запускает плеер по умолчанию. да и не всегда работает функция _WinAPI_AssocQueryString. говорю исходя из тестов
и окно не перемещается как надо
выше я уже отметил, что нужно подождать запуска видеоконтента. потом перемещать окно
это не ради спора, а ради точности выполнения функции
 
A

Alofa

Гость
OffTopic:
joiner сказал(а):
... в твоем коде лишнее _WinAPI_AssocQueryString, так как shellexecut...
Если бы ShellExecute() возвращала PID, то так бы и было. Вы же поняли идею скрипта....

joiner сказал(а):
... это не ради спора...
Я и не спорю. Тут с концовкой еще нужно повозиться.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
ага. не успел ответить )))
из справки 3.3.12.0
Return Value
Success: the PID of the process that was launched. Or -1 if there was no PID available.
Failure: 0 and sets the @error flag to non-zero.
и не только это.
важный глюк это изменение окна. пока проигрыватель не загрузит файл менять окно нельзя


Добавлено:
Сообщение автоматически объединено:

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