WPF アプリケーションで Flash コンテンツをホストし、透過性を使用するにはどうすればよいでしょうか?
質問
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;