用Delphi轻松实现背景播放

回头看帖

回头看帖

2016-01-29 14:27

用Delphi轻松实现背景播放,用Delphi轻松实现背景播放
  如果我们把Handle指向桌面,哪TMediaPlay将会在桌面播放。与TCanvas不同的是,TWinControl的Handle的属性是只读的,并且GetHandle方法是静态方法,这说明,我们要Handle指向桌面只有两种方法

  修改TWinControl,让Handle可写。

  建立TWinControl子类,并隐藏TWinControl.GetHandle方法,在新方法中返回桌面句柄。

  其中第二种方法比较好.

TSurpriseDisplay=class(TWinControl)
protected
function GetHandle:HWnd;virtual;
public
property Handle: HWnd read GetHandle;
end;
  其中GetHandle被定义为virtual,这样可以方便继承。因为这里只是隐藏了TWinControl.GetHandle方法,所以当把这个子类赋给TMediaPlay.Display时,它会被强制转换成父类,并调用其GetHandle方法,这样达不到我们的目的。所以我对TMediaPlay作了一点修改,增强其功能,修改后的TMediaPlay完全与原来的兼容.

  原代码:

{setting a TWinControl to display video devices output}
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);

................

end;
  修改后

{setting a TWinControl to display video devices output}
procedure TMediaPlayer.SetDisplay( Value: TWinControl );
var
AWindowParm: TMCI_Anim_Window_Parms;
wnd:HWND;
begin
if (Value <> nil) and MCIOpened and FHasVideo then
begin
FFlags := mci_Wait or mci_Anim_Window_hWnd;
//************************************************************
if Value is TSurpriseDisplay then
wnd:=TSurpriseDisplay(Value).Handle
else
wnd:=Value.Handle;
//************************************************************
AWindowParm.Wnd := Longint(wnd);

............

end;
  虽然这种修改并不优美,但能最大限度地保证兼容。别一种修改方法是把TMediaPlay.Display改成TSurpriseDisplay类型,这样可以保证安全。

  使用方法:

  使用桌面播放



  只要在GetHandle中返回桌面句柄,并赋值给Display.

function TSurpriseDisplay.GetHandle:HWnd;
begin
Result:=GetDesktopWindow;
end;

mp.Display:=TSurpriseDisplay.Create(self);
  用记事本播放

  记得我在TSurpriseDisplay的GetHandle中声明为virtual吗,现在开始发挥它的威力了,写一个类继承自TSurpriseDisplay,覆盖GetHandle方法,返回记事本句柄。

TNotepadDisplay=class(TSurpriseDisplay)
private
wnd:Hwnd;
protected
function GetHandle:HWnd;override;
end;

function TNotepadDisplay.GetHandle:HWnd;
begin
if wnd=0 then
begin
Winexec(notepad.exe,1);
wnd:=FindWindow(Notepad,无标题 - 记事本);
end;
result:=wnd;
end;

mp.Display:=TNotepadDisplay.Create(self);


  类似地还可以实现各种播放方式。

展开更多 50%)
分享

猜你喜欢

用Delphi轻松实现背景播放

Delphi
用Delphi轻松实现背景播放

delphi编程实现播放背景音乐

编程语言 网络编程
delphi编程实现播放背景音乐

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

用Delphi实现壁纸更换

编程语言 网络编程
用Delphi实现壁纸更换

用Delphi实现打印功能

Delphi
用Delphi实现打印功能

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

用Delphi实现文件关联

Delphi
用Delphi实现文件关联

用Java实现音频播放

编程语言 网络编程
用Java实现音频播放

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

《暴走草帽团》古代兵器详细解析

《暴走草帽团》古代兵器详细解析

基于mysql的bbs设计(五)

基于mysql的bbs设计(五)
下拉加载更多内容 ↓