如何确保MediaPlayer播放时不自己开窗口? (200分)

  • 主题发起人 主题发起人 coolqiang
  • 开始时间 开始时间
C

coolqiang

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序中需要经常播放一些视频片断,我用MediaPlayer播放时,我如下指定:
MediaPlayer.Display := pnlVideo;
MediaPlayer.DisplayRect := pnlVideo.ClientRect;
在运行时,发现有时正常,但也经常会出现MediaPlayer自动开一个新窗口进行播放的情
况,该怎样杜绝这种情况呢?
 
这是MediaPlay的一个选项
你可看一下注册表
直接改掉这个键值看行不行
 
我都是从MediaPlayer的Display属性框中选中
某一个panel,就不用播放的时候动态指定了。
从来没出问题。
如果这一句MediaPlayer.Display := pnlVideo没有执行的话
就会打开一个新的窗口了。
 
bubble说得没错.我也是这么干的,没什么问题啊.
 
我也试过你们说的那样做,没有用,还是会出现,不过几率少一些!
我现在是想从根本上杜绝,就是说连出现自开窗口的可能都没有(比如该VCL的源码)!
 
问题越来越有趣了,我想MediaPlayer自己会开窗口,肯定是因为Display为nil,于是我在
程序中加了下面的语句:
while MediaPlayer.Display = nil do
MediaPlayer.Display := pnlVideo;

我想这下应该没问题了吧!结果倒是不会自己开窗口了,到这里死循环了。这是怎么回事?
难道pnlVideo本身没有初始化,所以自身都是nil?不可能啊!哪位高手快帮我看看啊!
 
我已经仔细研究了源代码,发现这两段程序。
procedure TMediaPlayer.SetDisplay( Value: TWinControl );
var
AWindowParm: TMCI_Anim_Window_Parms;
begin
if (Value <> nil) and MCIOpened and FHasVideo then
begin
FFlags := mci_Wait or mci_Anim_Window_hWnd;
AWindowParm.Wnd := Longint(Value.Handle);
FError := mciSendCommand( FDeviceID, mci_Window, FFlags, Longint(@AWindowParm) );
if FError <> 0 then
FDisplay := nil {alternate window not supported}
else
begin
FDisplay := Value; {alternate window supported}
Value.FreeNotification(Self);
end;
end
else FDisplay := Value;
end;
procedure TMediaPlayer.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (AComponent = FDisplay) then
begin
if MCIOpened then SetOrigDisplay;
FDisplay := nil;
end;
end;

{ special case to set video display back to original window,
when FDisplay's TWinControl is deleted at runtime }
procedure TMediaPlayer.SetOrigDisplay;
var
AWindowParm: TMCI_Anim_Window_Parms;
begin
if MCIOpened and FHasVideo then
begin
FFlags := mci_Wait or mci_Anim_Window_hWnd;
AWindowParm.Wnd := mci_Anim_Window_Default;
FError := mciSendCommand( FDeviceID, mci_Window, FFlags, Longint(@AWindowParm) );
end;
end;
里面说只有当你运行的时候删除FDisplay's TWinControl
他才会SetOrigDisplay也就是另开一个窗口。

我想vcl没什么问题,你能否把你的程序发给我一份看看??
puzzledj@163.com
 
bubble:
我也觉得不是VCL的问题,我写一个小程序专门来测试MediaPlayer,根本没有这样的
问题,不论是直接在设计时指定,还是在程序中指定,怎么都不会自己开窗口,在我的程
序里却会这样。
结合我前面说的那种情况(就是上面的上面那个帖子),我怀疑是自己的程序因为东
西太多,pnlVideo没有成功初始化,自己本身都是nil,所以导致MediaPlayer自开窗口。
由于程序很大很复杂,不太方便寄给你,不过我正在尽量做一个精简的Demo,尽量模拟我
这个大程序里的操作,看能不能再现这个问题,然后就可以给你看了。不过目前还没有成
功。
 
我看你的系统出问题的可能性很大,很有可能装了一些MEDIAPLAYER8之类的东西
 
张无忌:
我的Windows Media Player版本是6.01,没装新版本啊!再说也不是每次都开新窗口,
是有时不开有时开,不确定!
 
我是新手,能否先建一个panel,然后把MediaPlayer的父属性赋给panel!这样可以吗?
 
呵呵,终于搞定了!
是因为放视频之前有放音频,但放完音频后不是用Close,而是用Stop,之后放视频就出
这个问题了。唉,被折磨了好久,还好发现了一点规律,才慢慢找出这个BUG!
多谢大家捧场了!散分!
 
多人接受答案了。
 
后退
顶部