WPF でフルスクリーンモードの画面の上に表示するウィンドウを作る(参考程度の情報)。

フルスクリーンのゲーム画面の上にオーバーレイ表示するアプリを作る方法の参考となる情報です。

具体的には FFXIV で試した方法です。参考のソースは以下を参照してください。

別のゲーム(シャドウ・オブ・ウォー)で同じ方法を試したところ上手く行かなかったので参考程度の情報となる点に注意してください。

それでも解決策を探すための糸口ぐらいにはなるかもしれません。

タイトルにある通り WPF で作った場合の事例です。WPF の機能だけでは実現できず Win32 API を駆使します。

FFXIV のフルスクリーンモードの画面の上にオーバーレイ表示するための必要最小限の条件は以下の通りでした。

  • Window に以下の属性を設定する。この処理を指定しないとゲーム画面の上に表示されない。
    • WindowStyle="None"
    • AllowsTransparency="true"
    • Topmost="true"
    • SourceInitialized="Window_SourceInitialized"
  • Window_SourceInitialized で以下の処理を実行する。この処理は表示したウィンドウがゲームのウィンドウからフォーカスを奪わないために指定する。
    • Windows API の SetWindowLong 関数を使って対象のウィンドウに WS_EX_NOACTIVATE を追加する。
  • Window の InitializeComponent 処理の後、任意のタイミングで Windows API の SetWindowPos を使って対象のウィンドウを最上部に表示するため第二引数に HWND_TOP を指定して呼び出す。この処理の呼び出しは必ずゲーム画面がフォーカスを持った状態で行う。

最後の SetWindowPos の呼び出しについて補足します。

HWND_TOP 指定の SetWindowPos は、実行タイミングが重要です。これは1度呼び出したらずーっと上に表示してくれるというものではなく、その「時点」で最上部に表示するという処理です。

従って、ゲーム画面がフォーカスを持った状態で行う必要があります。どのタイミングで実行するかは作るアプリ次第での工夫になると思います。

サンプルでは実行後、Application_Startup で 5 秒のスリープ後にウィンドウを表示するという実装になっています。

ウィンドウが表示されるまでにフルスクリーンのゲーム画面にフォーカスを移動してください。

ウィンドウが表示された後にゲーム画面にフォーカスを移動しても、ウィンドウは最上部に表示されないことも確認できます。