Windows 10通知をWinRT APIを使ってVCLアプリから行う

By: Embarcadero Japan

Abstract: Delphi向けWinRT APIヘッダがGetItで入手可能になりました。そして、以下は、VCL Win32アプリケーションで、Windows 10通知を使用する例です。

この記事は、エンバカデロでプロダクトマネージャを務めるMarco Cantuのブログ記事(https://blog.marcocantu.com/blog/2015-june-windows10-notifications-vcl-winrt.html)の抄訳です。

Delphi向けWinRT APIヘッダがGetItで入手可能になりました。そして、以下は、VCL Win32アプリケーションで、Windows 10通知を使用する例です。

    Windows 10 Webセミナー

昨日、マイクロソフトからゲストを迎え、私たちスタッフ(私、David I、Jim McKeeth、JT)とで、Windows 10にフォーカスしたWebセミナーを行い、Windows 10について、そして、来るべきWindowsの新バージョンに対するRAD Studio XE8でのサポートについて紹介しました。見逃した方には、まもなくビデオが公開される予定です。このWebセミナーでご覧いただいたのは、いくつかの典型的なデモのほかに、Windows 10上の通知機能を使ったVCLアプリケーションのデモでした。この機能は、従来のWin32 APIでは用意されておらず、新しいWinRT APIでのみ利用可能なものです。

これらのAPIのヘッダをどのように入手するのか、またどこからデモを入手できるのか?詳しくは、以下をお読みください。

    Delphi WinRT Headers for Windows 10はGetItに

はじめに、GetItにWinRT API向けのヘッダを公開したことを紹介しておきます。これは、DelphiまたはRAD Studio XE 8を利用するすべての開発者向けのものです(C++を直接サポートするヘッダは、現時点ではありません)。XE8でGetItを開き、以下に示すエントリをクリックしてください。

このコードは、Windows 10 preview 向けであることに注意してください。APIおよびそのDelphi版ヘッダファイルは、これから数ヵ月の間に修正される可能性があります。そのため、将来、コードに修正を加える必要が生じるかもしれませんが、現時点でXE8によって、WinRTクラスを対象に開発ができることは素晴らしいことです。

    WinRT通知デモ

WinRTだけで利用できる興味深い機能の一例として、このデモでは、「トースト」通知と呼ばれる、新しい通知に注目しました。さて、APIが利用可能になったといっても、すぐに使用できるコンポーネントには、まだカプセル化されていません。コードは簡単とはいいがたいので、ここでは通知に関係する重要な箇所だけをリストすることにします。

このコードは、通知を作成するためのコードの一部です。推測いただけるように、WinRTクラスは、基本的には、COMオブジェクトのように利用され、コアアーキテクチャは共通です。オブジェクトの作成に、CoClass(またはクラスファクトリ)は使用せず、もう少し複雑なコードが必要です。

    if Succeeded(RoGetActivationFactory(LString, TGUID.Create('{50AC103F-D235-4598-BBEF-98FE4D1A3AD4}'), LCreated)) then
    begin
      LINotificationManagerStatics := LCreated as IToastNotificationManagerStatics;
      if Succeeded(WindowsCreateString(PWideChar(Edit1.Text), Length(Edit1.Text), LString2)) then
      begin
        LToastNotifier := LINotificationManagerStatics.CreateToastNotifier(LString2);
        LXMLTemplate := LINotificationManagerStatics.GetTemplateContent(ToastTemplateType.ToastText02);
        if Succeeded(WindowsCreateString(PWideChar(SToastNotification), Length(SToastNotification), LString)) then
        begin
          if Succeeded(RoGetActivationFactory(LString, TGUID.Create('{04124B20-82C6-4229-B109-FD9ED4662B53}'), LCreated)) then
          LToastFactory := LCreated as IToastNotificationFactory;
          LToast := LToastFactory.CreateToastNotification(LXMLTemplate);
          LAccepted := TAcceptedEventHandler.Create;
          LToast.add_Activated(LAccepted);
          LToastNotifier.Show(LToast);
        end;

TAcceptedEventHandlerクラスには、コールバック呼び出しメソッドがあり、ここでは、メモに処理が実行されたことを示すログを出力します(あまりよいコードではありませんが)。以下がそのコードです。

procedure TAcceptedEventHandler.Invoke(sender: IToastNotification; args: IInspectable);
begin
  Form51.Memo1.Lines.Add ('You clicked on the notification!');
end; 

フォームを直接参照するのが美しい書き方ではないことは分かっていますが、全体のコードは、間接的な記述をするのを避けたくなるほど複雑です。そのように記述したいでしょうか?さて、完全なデモは、dl.dropboxusercontent.com/u/133855/WinRTCheck.zip からダウンロードできます。おそらく今後もアップデートしていくでしょう。さらに、WinRTの他のいくつかの領域をカバーするデモをいくつか作成すると思います。

    Windows 10 がまもなく登場

...そして、Windows 10は、大変重要なバージョンですので、ぜひ、今すぐWindows 10 Previewを入手し、XE8を使ってVCL(およびFireMonkey)アプリケーションを統合するテストを行うことをお勧めします。

Server Response from: ETNASC02