WPF アプリケーションで Flash コンテンツをホストし、透過性を使用するにはどうすればよいでしょうか?

StackOverflow https://stackoverflow.com/questions/67151

  •  09-06-2019
  •  | 
  •  

質問

WPF フォーム内で Flash コンテンツをホストしながら、WPF ウィンドウで透明性/アルファを使用するにはどうすればよいですか?WinForms フラッシュ コントロールをホストする場合、これは許可されません。

役に立ちましたか?

解決

Flash コンテンツの表示に使用するコントロールが WPF に組み込まれていない限り、これらの「空域」の問題に遭遇することになります。Win32 から WinForms までのすべての表示テクノロジは「内部で」HWND を使用していましたが、WPF は DirectX を使用しました。ただし、Windows のウィンドウ マネージャーは依然として HWND しか理解できないため、WPF アプリには 1 つのトップレベルの HWND ベースのウィンドウがあり、その下にあるすべてのウィンドウが DirectX で実行されます (実際には、コンテキスト メニューやツールヒントなどにもトップレベルの HWND があります)。 。Adam Nathan は、WPF 相互運用性について非常にわかりやすく説明しています。 この記事.

他のヒント

私はまだ実行していませんが、WPF 3.5 sp1 にある WebBrowser コントロールを使用して、WPF 内で Flash コンテンツをラップすることができるでしょう。ただし、透明度にどのような影響があるのか​​はわかりません。

Expression を使用して Flash コンテンツを XAML に変換できますか?これを行うツールが社内または外部にあると思います。

メインウィンドウで「透明性を許可」を有効にすると、アプリケーションが実行されるとFlashが表示されなくなるため、WPFをアップロードしてFlashを表示できるようにする方法と同じ問題に苦労しています。

1) WebBrowser Controlを使用してFlash(.swf)ファイルを再生しました。これらは私の PC 上にありますが、インターネットまたはホストしている場所ならどこからでも再生できます。C# でアクセスするには、WebBrowser コントロールに名前を付けることを忘れないでください。

 private void Window_Loaded(object sender, RoutedEventArgs e)
 {   
    MyHelper.ExtendFrame(this, new Thickness(-1));    
    this.MyBrowser.Navigate(@"C:\Happy\Download\flash\PlayWithMEGame.swf");         
 }

2) 次に透明性についてです。WPFで「透明性を許可」に「false」を設定し、「ウィンドウスタイル」を「なし」に設定しました。その後、私はからの情報を使用しました ここ そして ここ そして、MainWindow で透明性を許可し、同時に Flash を実行するという望ましい効果を生み出す次のコードを作成しました。これが私のコードです。

public class MyHelper
{
    public static bool ExtendFrame(Window window, Thickness margin)
    {
        IntPtr hwnd = new WindowInteropHelper(window).Handle;
        window.Background = Brushes.Transparent;
        HwndSource.FromHwnd(hwnd).CompositionTarget.BackgroundColor = Colors.Transparent;
        MARGINS margins = new MARGINS(margin);
        DwmExtendFrameIntoClientArea(hwnd, ref margins);
        return true;
    }
    [DllImport("dwmapi.dll", PreserveSig = false)]
    static extern void DwmExtendFrameIntoClientArea(IntPtr hwnd, ref MARGINS margins);
}

 struct MARGINS
    {
        public MARGINS(Thickness t)
        {
            Left = (int)t.Left;
            Right = (int)t.Right;
            Top = (int)t.Top;
            Bottom = (int)t.Bottom;
        }
        public int Left;
        public int Right;
        public int Top;
        public int Bottom;
    }

そして、それをWindow_Loaded()から呼び出しました。「DllImport」が機能するには、「以下」の行が必要です。

using System.Runtime.InteropServices;
using System.Windows.Interop;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top