アプリ ウィンドウの管理

Windows App SDK には、以前の使いやすい Windows を進化させるappwindowクラスが用意されています。UI.windowmanagement. appwindow previewクラスを使用すると、Win32、WPF、WinForms など、すべての Windows アプリで使用できるようになります。

このバージョンのappwindowでは、以前の appwindow preview の主要なフィードバックに対処する機会があります。 Windows app SDK で最も重要なのは、 非同期パターンに依存せず、API 呼び出しが成功したかどうかに関係なく、アプリにすぐにフィードバックを提供することです。

Windows App SDK ウィンドウ表示 api は、新機能の導入、Windows UX との統合、新しいウィンドウシナリオの実現を目的としています。 そのため、これらの Api を使用してウィンドウ操作を開始するには、すべてのアプリをお勧めします。

前提条件

Windows App SDK でウィンドウ api を使用するには、次のようにします。

  1. Windows App SDK の最新リリースをダウンロードしてインストールします。 詳細については、開発者ツールのインストールに関する記事をご覧ください。
  2. 手順に従って、Windows App SDK を使用した新しいプロジェクトを作成するか、既存のプロジェクトで Windows App SDK を使用します。

AppWindow

appwindowは、Windows のユーザーエクスペリエンスとその他のアプリとの統合を可能にする、使いやすいウィンドウ化のシナリオを可能にする、高度なウィンドウ API です。

Appwindow は、アプリのコンテンツのシステム管理コンテナーの高レベルの抽象化を表します。 これは、コンテンツがホストされているコンテナーであり、ユーザーが画面上でアプリのサイズを変更したり移動したりするときに、ユーザーが操作するエンティティを表します。 Win32 に精通している開発者にとっては、の AppWindow 高度な抽象化と考えることができ HWND ます。 UWP を使い慣れている開発者にとって、 AppWindowAppWindow//Windows の代わりとしてを見ることができ //。

このバージョンの Appwindow では、トップレベルのをサポートしてい ます (と最上位レベルの間に1:1 のマッピングがあり AppWindowHWND ます)。

の有効期間 AppWindow は、の場合と同じです HWND 。つまり、 AppWindow ウィンドウが作成された直後にオブジェクトが使用可能であり、ウィンドウを閉じると破棄されます。

提供者

Appwindow には、 appwindowプレゼンター (プレゼンター) が適用されています。 Windows を操作した UWP 開発者にとって。UI.WindowManagement. AppWindow以前は、これは使い慣れていますが、機能と動作の1:1 マッピングではありません。 Win32 アプリケーションモデルの新しい概念として、ウィンドウの状態とスタイルの組み合わせと同じように似ていますが、同じではありません。 一部のプレゼンターには、従来のウィンドウの状態やスタイルのプロパティ (たとえば、自動非表示のタイトルバーなど) から inspectable ない UX 動作も定義されています。

既定では、プレゼンターはシステムによって作成され、作成時に Appwindow に適用されます。 Windows App SDK 1.0 では、Windows Desktop ではOverlappedPresenterです。 別のプレゼンターを適用した後にウィンドウの既定のプレゼンターに "戻る" ために、アプリが一時退避したり、参照を保持したりする必要はありません。 システムは、このプレゼンターが作成されたの有効期間にわたって、このプレゼンターの同じインスタンスを保持 AppWindow します。また、アプリケーションは、パラメーターとしてAppwindowpresenterkindを使用してAppWindowメソッドを呼び出すことによって再適用できます。

プレゼンターは、一度に1つのウィンドウにのみ適用できます。 2番目のウィンドウにプレゼンターを適用しようとすると、例外がスローされます。 これは、複数のウィンドウがあり、それぞれを特定のプレゼンテーションモードに切り替える必要がある場合に、同じ種類の複数のプレゼンターを作成し、それぞれを独自のウィンドウに適用する必要があることを意味します。

一部のプレゼンターには、ユーザーがアプリ所有者コントロールの外部で変更を行うことができる機能があります。 このような変更が発生すると、影響を受けるAppwindowで、 DidPresenterChangeイベント arg プロパティがに設定されている変更イベントによって、アプリに通知され ます。 次に、アプリは、適用されたプレゼンターのプロパティを調べて、変更内容を確認する必要があります。

適用されたプレゼンターはライブオブジェクトです。 Appwindow. プレゼンターオブジェクトのプロパティを変更すると、すぐに有効になります。

プレゼンターは、ウィンドウに適用されている間は破棄できません。 プレゼンターオブジェクトを破棄するには、最初に別のプレゼンターをウィンドウに適用して、破棄するプレゼンターがウィンドウから削除されるようにする必要があります。 これを行うには、別の特定のプレゼンターをウィンドウに適用するか、 Setpresenter メソッドを引数として使用し ます。 これにより、システムによって作成された既定のプレゼンターがウィンドウに再適用されます。 システムで作成されたプレゼンターへの参照をウィンドウに保持している場合は、この時点で有効になります (つまり、ウィンドウ用に最初に作成されたのと同じインスタンスが再適用されます)。

利用可能なプレゼンター

次のプレゼンターは、現在のリリースで提供されており、このリリースでサポートされているすべての OS バージョンで使用できます。

  • OverlappedPresenter -システムによって "既定の" プレゼンターが作成されました。これにより、アプリは、最小化/最大化/復元操作と状態変更を要求し、対応することができます。
  • Fullscreenpresenter -ウィンドウが全画面表示 UX に入ることを許可します。
  • CompactOverlayPresenter -16:9 の縦横比を使用して、固定サイズの "always on top" ウィンドウを作成し、画像のようなエクスペリエンスを可能にします。

UI フレームワークと HWND 相互運用機能

Appwindowクラスは、アプリ内の任意の最上位レベルで使用でき ます。 これは、UI フレームワークを使用しているときに、ウィンドウを作成してそのコンテンツを添付するために、そのフレームワークのエントリポイントを引き続き使用できることを意味します。ウィンドウを作成したら、Windows App SDK で提供されるウィンドウ相互運用機能を使用して、対応する AppWindow メソッド、プロパティ、イベントにアクセスできます。 相互運用機能は、 Microsoftで定義されています。 これらの関数の .NET ラッパーは、名前空間でも使用でき Microsoft.UI.Win32Interop ます。

AppWindow既存のウィンドウの HWND が指定されたオブジェクトを取得するには、 AppWindow interop 関数を使用します。 [WinUI 3] ウィンドウでこれを実行する方法を示す例については、この記事の「 サンプル 」セクションを参照してください。 これらのサンプルでは、ネイティブと .NET の相互運用メソッドの両方を使用する方法を示します。

UI フレームワークを使用する場合でも、 Appwindow を使用すると、次のような利点があります。

  • Windows 11 UX エクスペリエンス (丸いコーナー、スナップグループポップアップ) を既定で保持する、簡単なタイトルバーのカスタマイズ
  • システムが全画面表示と CompactOverlay (画像内) エクスペリエンスを提供します。
  • 基本的な Win32 ウィンドウ概念の一部である WinRT API サーフェイス。

制限事項

  • 現在、このリリースの Appwindow は、Win32 アプリ (パッケージ化とアンパッケージの両方) でのみ使用できます。
  • 現在、Windows App SDK には、に UI フレームワークコンテンツをアタッチするためのメソッドが用意されていません AppWindowHWNDこの記事の「HWND」で説明されている相互運用アクセスメソッドの使用に制限されています。

サンプル

次のコード例は、[WinUI 3] ウィンドウから Appwindow を取得する方法を示しています。 の使用方法の詳細につい AppWindow ては、「 AppWindow」を参照してください。

WinUI 3 ウィンドウの AppWindow を取得するための C++ のサンプル

// The include- and using-statements below are in addition to the ones you need for WinUI 3
// You can add these to your pch.cpp file in order to not have to include them in each xaml.cpp file
// where you need to access windowing APIs.
#include <winrt/Microsoft.UI.h>
#include <winrt/Microsoft.UI.Windowing.h>
#include "microsoft.ui.windowing.core.interop.h"
// For access to WindowId
#include <Microsoft.UI.h>
// For access to hwnd interop methods
#include <Microsoft.UI.Interop.h>
// For the WinRT windowing APIs
#include <Microsoft.UI.Windowing.h>

// This include file is needed for the XAML Native Window Interop.
#include "microsoft.ui.xaml.window.h"

namespace winrt
{
    using namespace Microsoft::UI::Windowing;
    using namespace Microsoft::UI;
}

namespace winrt::SampleApp::implementation
{

    MainWindow::MainWindow()
    {
        InitializeComponent();
        m_appWindow = GetAppWindowForCurrentWindow();
    }

    winrt::AppWindow MainWindow::GetAppWindowForCurrentWindow()
    {
        winrt::AppWindow appWindow = nullptr;
        
        //Get the HWND for the XAML Window
        HWND hWnd;
        Window window = this->try_as<Window>();
        window.as<IWindowNative>()->get_WindowHandle(&hWnd);

        // Get the WindowId for the HWND
        winrt::WindowId windowId;
        if(SUCCEEDED(GetWindowIdFromWindow(hWnd, &windowId))
        {
            // Get the AppWindow for the WindowId
            appWindow = winrt::AppWindow::GetFromWindowId(windowId);
        }
        return appWindow;
    }

    void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&)
    {
        winrt::AppWindow appWindow = GetAppWindowForCurrentWindow();

        // Check to see that we indeed got an AppWindow.
        if(appWindow)
        {
            // You now have an AppWindow object and can call its methods to manipulate the window.
            // Just to do something here, let's change the title of the window...
            appWindow.Title("WinUI ❤️ AppWindow");
        }
    }
}

WinUI 3 ウィンドウの AppWindow を取得するための C# のサンプル

using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Controls.Primitives;
using Microsoft.UI.Xaml.Data;
using Microsoft.UI.Xaml.Input;
using Microsoft.UI.Xaml.Media;
using Microsoft.UI.Xaml.Navigation;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using WinRT;
// Needed for WindowId
using Microsoft.UI;
// Needed for AppWindow
using Microsoft.UI.Windowing;
// Needed for XAML hwnd interop
using WinRT.Interop;

namespace SampleApp
{
    /// <summary>
    /// An empty window that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainWindow : Window
    {
        private AppWindow m_appWindow;

        public MainWindow()
        {
            this.InitializeComponent();
            // Get the AppWindow for our XAML Window
            m_appWindow = GetAppWindowForCurrentWindow();
            if (m_appWindow != null)
            {
                // You now have an AppWindow object and can call its methods to manipulate the window.
                // Just to do something here, let's change the title of the window...
                m_appWindow.Title = "WinUI ❤️ AppWindow";
            }
        }

        private AppWindow GetAppWindowForCurrentWindow()
        {
            IntPtr hWnd = WinRT.Interop.WindowNative.GetWindowHandle(window);
            WindowId myWndId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(hWnd);
            return AppWindow.GetFromWindowId(myWndId);
        }
   }
}