找回密码
 加入
搜索
查看: 309|回复: 10

[系统综合] 【已解决】求助A大,WMPlayer.OCX 如何改变画面大小?

[复制链接]
发表于 2024-7-28 17:44:55 | 显示全部楼层 |阅读模式
本帖最后由 顽固不化 于 2024-7-29 09:58 编辑

每次启动播放就是全尺寸,有些视频幅度超过屏幕了,目的是让尺寸超过屏幕的缩小一下。如果a大有暇,帮我看看,确诊一下问题出在哪。十分感谢!

$VideoURL = "B:\影视音乐\音乐\哥已不是当年的哥.mp4"  
$obj = ObjCreate("WMPlayer.OCX")
$Gui = GUICreate("视频播放器", @DesktopWidth / 2, @DesktopHeight / 2) 
$VideoPlayer = GUICtrlCreateObj($obj, 0, 0, @DesktopWidth / 2, @DesktopHeight / 2)  
GUISetState(@SW_SHOW) 
$obj.AllowChangeDisplaySize = 1   ;允许自由设置播放图象大小
$obj.DisplaySize = 6        ;'MpOneFourthScreen'  ;6 = 屏幕大小的1/4,没效果
$obj.Settings.autoStart = True ;自动播放
$obj.uiMode = 'None'             ;只显示画面     
$obj.url=$VideoURL               ;播放视频路径
While $obj.playState <> 3         ;等待开始播放
        Sleep(100)
WEnd
;播放后修改 也没效果
$obj.Width =100
$obj.Height=@DesktopHeight / 2
While 1
        If GUIGetMsg() =-3 Then exit
        Sleep(100)
WEnd

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2024-7-28 18:36:30 | 显示全部楼层
播放后设置 $obj.fullScreen = True 试试~
 楼主| 发表于 2024-7-28 19:04:40 | 显示全部楼层
afan 发表于 2024-7-28 18:36
播放后设置 $obj.fullScreen = True 试试~

谢谢a大,播放后用这句是可以全屏的,等同于双击的效果。我想把视频禁锢到一个窗口之中,不知怎么弄了。
 楼主| 发表于 2024-7-28 21:09:40 | 显示全部楼层
本帖最后由 顽固不化 于 2024-7-28 21:10 编辑
afan 发表于 2024-7-28 18:36
播放后设置 $obj.fullScreen = True 试试~

a大,似乎找到一个办法,让画面固定到窗口播放,就是在显示窗口后加$obj.windowlessVideo=True,但又发现问题了,一是不能暂停,暂停就失效,而是播放中丢帧,卡卡巴巴的,不得要领。测试代码如下:

$VideoURL = "B:\影视音乐\音乐\哥已不是当年的哥.mp4"  
$obj = ObjCreate("WMPlayer.OCX")
$Gui = GUICreate("视频播放器", @DesktopWidth /2, @DesktopHeight / 2) 
$VideoPlayer = GUICtrlCreateObj($obj, 0, 0, @DesktopWidth / 2, @DesktopHeight / 2)  
$obj.Settings.autoStart = True ;自动播放
$obj.uiMode = 'None'             ;只显示画面     
$obj.url=$VideoURL               ;播放视频路径
While $obj.playState <> 3         ;等待开始播放
        Sleep(100)
WEnd
GUISetState(@SW_SHOW) 
$obj.windowlessVideo=True
Sleep(10000) ;播放10秒后暂停
$obj.controls.pause
Sleep(3000)   ;暂停3秒后播放
$obj.controls.play

While 1
        If GUIGetMsg() =-3 Then exit
        Sleep(100)
WEnd

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2024-7-29 00:04:06 | 显示全部楼层
本帖最后由 afan 于 2024-7-29 00:05 编辑
顽固不化 发表于 2024-7-28 21:09
a大,似乎找到一个办法,让画面固定到窗口播放,就是在显示窗口后加$obj.windowlessVideo=True,但又发现 ...

用 WMPlayer.OCX 播放视频我还是几年前玩过,记得肯定是可以缩放大小的,不过不是你这个方式,是用 ObjCreateInterface 对相关接口的操作,具体代码不记得,找了一圈没找到…… 因为早改用 ffplay、mplayer 之类的做内核播放器了,强大多了。
WMPlayer.OCX 个人认为只适合简单单一的操作。
 楼主| 发表于 2024-7-29 09:58:16 | 显示全部楼层
afan 发表于 2024-7-29 00:04
用 WMPlayer.OCX 播放视频我还是几年前玩过,记得肯定是可以缩放大小的,不过不是你这个方式,是用 ObjCre ...

好的a大,在研究一下你说的ObjCreateInterface,我也不折腾了,累,哈哈,,,
 楼主| 发表于 2024-7-30 22:33:55 | 显示全部楼层
afan 发表于 2024-7-29 00:04
用 WMPlayer.OCX 播放视频我还是几年前玩过,记得肯定是可以缩放大小的,不过不是你这个方式,是用 ObjCre ...

a大,很有意思。这也能曲线救国?~~~
$VideoURL = "B:\影视音乐\音乐\哥已不是当年的哥.mp4"  
$obj = ObjCreate("WMPlayer.OCX")
$Gui = GUICreate("视频播放器", @DesktopWidth /2, @DesktopHeight / 2) 
$VideoPlayer = GUICtrlCreateObj($obj, 0, 0, @DesktopWidth / 2, @DesktopHeight / 2)  
$obj.Settings.autoStart = True ;自动播放
$obj.uiMode = 'None'             ;只显示画面 (必须在创建控件后设置)    
$obj.url=$VideoURL               ;播放视频路径
While $obj.playState <> 3         ;等待开始播放
        Sleep(100)
WEnd
GUISetState(@SW_SHOW) 
$obj.windowlessVideo=True            ;(必须在窗口显示后设置)

Sleep(5000) ;播放5秒后暂停
GUICtrlCreateObj($obj, 0, 0,0,0)      ;暂停命令的前后各创建一次控件
$obj.controls.pause
GUICtrlCreateObj($obj, 0, 0,0,0)

Sleep(5000)   ;暂停5秒后播放
$obj.controls.play
GUICtrlCreateObj($obj, 0, 0,0,0)      ;继续命令的后面创建一次控件   
While 1
        If GUIGetMsg() =-3 Then exit
        Sleep(100)
WEnd
发表于 2024-7-30 23:50:11 | 显示全部楼层
官网的例子,不知道是不是你要的效果。

#include <Constants.au3>
#include <StructureConstants.au3>
#include <GUIConstants.au3>

Local $hGui = GUICreate("WMPlayer", 400, 300)
Local $oPlayer = ObjCreate("WMPlayer.OCX")
If Not IsObj($oPlayer) Then Exit MsgBox($MB_SYSTEMMODAL, "WMPlayer.OCX", "Cannot create a WMP object.", 5)
GUICtrlCreateObj($oPlayer, 0, 0, 400, 300)

With $oPlayer
  .URL = "B:\影视音乐\音乐\哥已不是当年的哥.mp4" 
  .uiMode = "none"
  .settings.mute = False
EndWith

While $oPlayer.playState = 9
  Sleep(50)
WEnd

GUISetState()
ResizeOCX($oPlayer, 0, 0, 400, 300)

While $oPlayer.playState = 3     
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      Exit
  EndSwitch
WEnd

Func ResizeOCX($oObject, $iLeft, $iTop, $iRight, $iBottom)
  Local Const $tagIOleInPlaceObj = _
      "ContextSensitiveHelp none(int); " & _
      "GetWindow none(ptr); " & _
      "InPlaceDeactivate none(); " & _
      "ReactivateAndUndo none(); " & _
      "SetObjectRects none(ptr; ptr;); " & _
      "UIDeactivate none();"
  Local $oIInPlace = ObjCreateInterface($oObject, "{00000113-0000-0000-C000-000000000046}", $tagIOleInPlaceObj)
  Local $tRect = DllStructCreate($tagRECT)
  $tRect.Left = $iLeft
  $tRect.Top = $iTop
  $tRect.Right = $iRight
  $tRect.Bottom = $iBottom
  Local $pRect = DllStructGetPtr($tRect)
  $oIInPlace.SetObjectRects($pRect, $pRect)
EndFunc   ;==>ResizeOCX

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +80 贡献 +10 收起 理由
顽固不化 + 80 + 10 很给力!

查看全部评分

 楼主| 发表于 2024-7-31 10:35:38 | 显示全部楼层
lpxx 发表于 2024-7-30 23:50
官网的例子,不知道是不是你要的效果。

a大上次说的可能就是用这个ObjCreateInterface。
非常非常的感谢您,正是我需要的,向您致敬!。
发表于 2024-7-31 10:51:51 | 显示全部楼层
顽固不化 发表于 2024-7-30 22:33
a大,很有意思。这也能曲线救国?~~~

这都被你研究出来了,厉害~!
虽然不记得具体代码,但 lpxx 的代码应该就是我所指的操作接口的方式~
 楼主| 发表于 2024-7-31 15:10:53 | 显示全部楼层
afan 发表于 2024-7-31 10:51
这都被你研究出来了,厉害~!
虽然不记得具体代码,但 lpxx 的代码应该就是我所指的操作接口的方式~ ...

喜欢折腾。
现在明白这个接口意义了,看来以后得重写《播放器》代码,现在改起来有点麻烦。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-10-25 11:24 , Processed in 0.082154 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表