Тема: AHK: Воспроизведение AVI в окне GUI
Нарыл на буржуйском форуме скрипт для воспроизведения AVI в окне GUI, немножко его переделал и получилось вот что:
AVI_CreateControl(_guiHwnd, _x, _y, _w, _h, _aviRef, _aviDLL="", _style="")
{
local aviHwnd, aviInstance, style
local msg, r, c
msg = Создание '%_aviRef%' AVI нарушено:
If (_aviDLL = "")
_aviDLL = Shell32.dll ; Lot of standard AVIs in there
If _aviRef is digit
{
aviInstance := DllCall("LoadLibrary", "Str", _aviDLL)
If (aviInstance = 0)
{
msg = %msg% Не загружается '%_aviDLL%' DLL
Return msg
}
}
style := 0
If (_style != "")
{
If _style contains transparent
style |= 2 ; ACS_TRANSPARENT
If _style contains center
style |= 1 ; ACS_CENTER
If _style contains autoplay
style |= 4 ; ACS_AUTOPLAY
If _style contains all ; Simpler defaut...
style |= 7
}
; WS_CHILD | WS_VISIBLE
style := 0x50000000 | style
aviHwnd := DLLCall("CreateWindowEx"
, "UInt", 0 ; Style
, "Str", "SysAnimate32" ; Class Name
, "UInt", 0 ; Window name
, "UInt", style ; Window style
, "Int", _x ; X position
, "Int", _y ; Y position
, "Int", _w ; Width
, "Int", _h ; Height
, "UInt", _guiHwnd ; Handle of parent
, "UInt", 0 ; Menu
, "UInt", 0 ; hInstance, unneeded with User32 components
, "UInt", 0) ; User defined style
If (ErrorLevel != 0 or aviHwnd = 0)
{
msg = %msg% AVI control не создан (%ErrorLevel%/%A_LastError%)
Gosub AVI_CreateControl_CleanUp
Return msg
}
If _aviRef is digit
{
SendMessage 1124, aviInstance, _aviRef, , ahk_id %aviHwnd%
}
Else
{
SendMessage 1124, 0, &_aviRef, , ahk_id %aviHwnd%
}
If (ErrorLevel = "FAIL" or ErrorLevel = 0)
{
msg = %msg% Не удалось открыть AVI (%ErrorLevel%)
Gosub AVI_CreateControl_CleanUp
Return msg
}
Return aviHwnd
AVI_CreateControl_CleanUp: ; Ничего не делать в случае ошибки
Return
}
; WM_USER := 0x400 ; 1024
;Старт или продолжение воспроизведения
AVI_Play(_aviHwnd)
{
; wParam: Число раз проигрывания видео. При -1 проигрывается бесконечно
; lParam: MAKELONG(wFrom, wTo)
; wFrom: Нулевое положение фрейма, откуда начать воспроизведение. Должна быть менее 65,536.
; Если 0, то начинает с первого фрейма.
; wTo: Нулевое положение фрейма, где надо закончить воспроизведение.
; Должна быть менее 65,536. Если -1, заканчивает последним фреймом AVI клипа.
; ACM_PLAY := WM_USER + 101
PostMessage 1125, 1, -1, , ahk_id %_aviHwnd%
}
AVI_Play_Cycle(_aviHwnd)
{
PostMessage 1125, -1, -1, , ahk_id %_aviHwnd%
}
;Остановка или пауза воспроизведения
AVI_Stop(_aviHwnd)
{
; ACM_STOP := WM_USER + 102
PostMessage 1126, 0, 0, , ahk_id %_aviHwnd%
}
; Вероятно дополнительный, автоматически на закрытии сценария
AVI_DestroyControl(_aviHwnd)
{
If (_aviHwnd != 0)
DllCall("DestroyWindow", "UInt", _aviHwnd)
}
AVI_Shell32 =
( Join|
000 - File
150 - Search flashlight
151 - Search documents
152 - Search computer
160 - Move files
161 - Copy files
162 - Delete files
163 - Empty trash
164 - Empty folder
165 - Check files
166 - Search internet
167 - Move files
168 - Copy files
169 - Empty folder
170 - Download files
)
AVI_MSGina = 2413 - Ctrl+Alt+Delete
AVI_SyncUI = 133 - Sync|134 - Compare
AVI_WIADefUI =
( Join|
1000 - Camera connect
1001 - Scanner connect
1002 - Camcorder connect
1003 - Camcorder copy
1004 - Scanner copy
1005 - Camera copy
1006 - Camera and scanner connect
)
AVI_XPSP2 = 140 - Search flashlight|160 - Network connect
Gui +LastFound
guiID := WinExist()
width := 300
;h1 := AVI_CreateControl(guiID, 20, 10, width, 130, A_ScriptDir . "\Eject.avi")
;If h1 is not integer
; MsgBox %h1%
Gui Add, Button, x10 y450 w50 v11 gControl_AVI_Control, Start
Gui Add, Button, x70 yp w50 gControl_AVI_Cicle, Cicle
Gui Add, Button, x130 yp w50 v01 gControl_AVI_Control, Stop
Gui Add, Button, x190 yp w50 gControl_AVI_Exit, End
Gui Add, Button, x250 yp w50 gControl_AVI_Select, Select
Gui Show, w560, AVI Demo
Return
Control_AVI_Control:
StringLeft action, A_GuiControl, 1
StringRight control, A_GuiControl, 1
If (action = 1)
AVI_Play(h%control%)
Else If (action = 0)
AVI_Stop(h%control%)
Return
Control_AVI_Cicle:
AVI_Play_Cycle(h%control%)
Return
GuiClose:
Control_AVI_Exit:
ExitApp
Guidropfiles:
AVIfile= %A_GuiEvent%
goto SelectFile
Control_AVI_Select:
AVIfile=
FileSelectFile,AVIfile,1,,Выбрать AVI,*.avi
if AVIfile=
Return
if errorlevel= 1
Return
SelectFile:
ControlGet,aviHwnd,Hwnd,,SysAnimate321,AVI Demo
h1 := AVI_DestroyControl(aviHwnd)
h1 := AVI_CreateControl(guiID, 20, 10, width, 130, AVIfile)
If h1 is not integer
MsgBox %h1%
Return
Такой скрипт может отображать AVI только определенного вида, те, которые обычно использует система. Например, как тот, что приложен в архиве.
Если кто в состоянии настроить его на воспроизведение и других AVI, создайте ветку в разделе "Разработка".