首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 實現媒體播放器背景播放:桌面、記事本等任意視窗渲染

     編輯:Delphi

TMediaPlayer 顯示機制與 Handle 重導向原理

TMediaPlayer.Display 屬性為 TWinControl,播放器利用其 Handle 繪製影片。TWinControl.Handle 唯讀且 GetHandle 為靜態方法,要重導向需兩種方式:修改 VCL 原始碼(不推薦)或繼承並隱藏 GetHandle。採用第二種方式並微調 TMediaPlayer.SetDisplay 以支援新類別。

核心類別設計

type
  TSurpriseDisplay = class(TWinControl)
  protected
    function GetHandle: HWND; virtual;
  public
    property Handle: HWND read GetHandle;
  end;

  TMediaPlayer = class(Vcl.MPlayer.TMediaPlayer)
  protected
    procedure SetDisplay(Value: TWinControl); override;
  end;

修改後的 SetDisplay:

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;
    // 關鍵:若為 TSurpriseDisplay 子類則呼叫其虛擬 GetHandle
    if Value is TSurpriseDisplay then
      Wnd := TSurpriseDisplay(Value).Handle
    else
      Wnd := Value.Handle;
    AWindowParm.Wnd := Longint(Wnd);
    // ... 其餘原始邏輯
  end;
end;

應用場景實作

1. 桌面背景播放:

桌面背景播放影片效果
function TSurpriseDisplay.GetHandle: HWND;
begin
  Result := GetDesktopWindow; // 返回桌面視窗控制代碼
end;

MediaPlayer1.Display := TSurpriseDisplay.Create(Self);

2. 記事本視窗播放:

記事本視窗播放影片效果
type
  TNotepadDisplay = class(TSurpriseDisplay)
  private FWnd: HWND;
  protected
    function GetHandle: HWND; override;
  end;

function TNotepadDisplay.GetHandle: HWND;
begin
  if FWnd = 0 then
  begin
    WinExec('notepad.exe', SW_SHOW);
    FWnd := FindWindow('Notepad', '無標題 - 記事本'); // 繁體中文視窗標題
  end;
  Result := FWnd;
end;

MediaPlayer1.Display := TNotepadDisplay.Create(Self);

3. 其他視窗播放: 同理繼承 TSurpriseDisplay,覆寫 GetHandle 返回目標視窗 Handle(如計算機、畫圖、瀏覽器等)。

其他視窗播放效果示意

技術要點總結

  • GetHandle 宣告為 virtual 允許多層繼承覆寫
  • SetDisplay 中的 is 判斷確保相容原有 TWinControl 用法
  • 目標視窗必須存在且可見,否則播放區域為黑畫面
  • 此技巧展示 Delphi 物件導向特性靈活擴展 VCL 元件行為的能力
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved