(57)【特許請求の範囲】
【請求項１】
状態プロパティ変化に応答してクライアントに通知を提供するための方法であって、
通知ブローカが状態プロパティに関連付けられた変化に応答して通知を受け取る通知要求を１または複数のクライアントから受け取ることと、
通知ブローカまたはクライアントがデバイス内の異なるコンポーネントによって更新される複数の状態プロパティを含むデータストアに前記通知要求を登録することと、
通知ブローカが前記データストア内の状態プロパティが変化したことを判定することと、
通知ブローカが前記判定に応答して前記状態プロパティ変化の通知を受け取るべきクライアントを判定することと、
通知ブローカが前記判定されたクライアントが前記状態プロパティ変化の通知を受け取るべきときを判定することと、
通知ブローカが前記判定されたときに前記状態プロパティ変化を前記判定されたクライアントに通知することと
を備えることを特徴とする方法。
【請求項２】
クライアントがＡＰＩを利用して前記状態プロパティに関わるアクションを行うことができるようにすることをさらに備え、前記アクションは、状態プロパティを登録すること、前記状態プロパティを照会すること、および前記状態プロパティを設定することのうちの少なくとも１つを含むことを特徴とする請求項１に記載の方法。
【請求項３】
通知ブローカが前記判定されたクライアントが通知を受け取るべきときを判定することは、前記状態プロパティに条件式を適用することと、前記条件が満たされたときに前記状態プロパティを前記判定されたクライアントに通知することとを備えることを特徴とする請求項２に記載の方法。
【請求項４】
前記条件式は、「すべて」、「等しい」、「等しくない」、「超えている」、「以上」、「以下」、「未満」、「含む」、「で始まる」、および「で終わる」の条件のうちの少なくとも１つを含むことを特徴とする請求項３に記載の方法。
【請求項５】
通知ブローカが状態プロパティ変化およびスケジュールされたイベントのうちの少なくとも１つに応答して前記クライアントを起動することをさらに備えることを特徴とする請求項２に記載の方法。
【請求項６】
前記クライアントによって定義されたスケジュールに応答して前記クライアントに通知することをさらに備えることを特徴とする請求項２に記載の方法。
【請求項７】
通知ブローカが前記データストア内の状態プロパティが変化したことを判定することは、所定の期間内に生じた前記状態プロパティの変化に関してバッチ操作を行うことをさらに備えることを特徴とする請求項２に記載の方法。
【請求項８】
通知ブローカが状態プロパティに関連付けられた変化に応答して通知を受け取る通知要求をクライアントから受け取ることは、前記要求に関連付けられた識別子が状態プロパティのカテゴリを判定すると、前記クライアントからの前記通知要求を状態プロパティのグループに関連付け、前記状態プロパティは前記データストア内で階層的に構成されていることをさらに備えることを特徴とする請求項１に記載の方法。
【請求項９】
デバイスの再起動を越えて前記通知要求を永続化することをさらに備えることを特徴とする請求項２に記載の方法。
【請求項１０】
状態管理および通知のためのシステムであって、
状態プロパティに関係する情報を格納するように構成されたデータストアであって、前記状態プロパティの少なくともいくつかが異なるコンポーネントによって変更されるデータストアと、
前記状態プロパティに関係する操作を行うように構成されたＡＰＩと、
通知要求を登録し、登録した状態プロパティの変化に応答して通知を受け取るように構成された１または複数のクライアントであって、前記通知要求は前記状態プロパティに関連付けられた変化に応答して前記クライアントが通知を受け取るべきときを示すクライアントと、
前記通知を受け取るように登録されているクライアントを記憶するように構成された通知リストと、
前記データストア、前記通知リストおよび前記クライアントに結合された通知ブローカであって、
少なくとも１つのクライアントを前記通知リストに追加する通知要求を受け取ることと、
前記少なくとも１つのクライアントを前記通知リストに追加することと、
登録された状態プロパティが変化したときを判定し、前記状態プロパティが変化したとき、通知を受け取るべきクライアントを判定し、前記判定されたクライアントに前記状態プロパティ変化を通知することと
を含むアクションを行うように構成された通知ブローカと
を備えたことを特徴とするシステム。
【請求項１１】
前記ＡＰＩは、状態プロパティを登録すること、状態プロパティを照会すること、および状態プロパティを設定することのうちの少なくとも１つを行うようにさらに構成されたことを特徴とする請求項１０に記載のシステム。
【請求項１２】
前記通知を受け取るべきクライアントを判定することは、前記状態プロパティに条件式を適用することと、前記条件が満たされたときに前記クライアントに前記状態プロパティを通知することとを備えたことを特徴とする請求項１１に記載のシステム。
【請求項１３】
前記条件式は、「すべて」、「等しい」、「等しくない」、「超えている」、「以上」、「以下」、「未満」、「含む」、「で始まる」、および「で終わる」の条件のうちの少なくとも１つを含むことを特徴とする請求項１２に記載のシステム。
【請求項１４】
状態プロパティ変化およびスケジュールされたイベントのうちの少なくとも１つに応答して前記クライアントを起動することをさらに備えたことを特徴とする請求項１１に記載のシステム。
【請求項１５】
前記クライアントによって定義されたスケジュールに応答して前記クライアントに通知することをさらに備えたことを特徴とする請求項１１に記載のシステム。
【請求項１６】
前記状態プロパティが変化したときを判定することは、所定の期間内に生じた前記状態プロパティの変化に関してバッチ操作を行うことをさらに備えたことを特徴とする請求項１１に記載のシステム。
【請求項１７】
前記状態プロパティは、階層的に構成されたことを特徴とする請求項１０に記載のシステム。
【請求項１８】
前記データストア内のコンテンツは、デバイスの再起動を越えて永続化することを特徴とする請求項１０に記載のシステム。
【請求項１９】
請求項１から９のいずれかに記載の各動作をコンピュータに行わせる実行可能命令を有するコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、状態変化をアプリケーションに通知するための柔軟性のあるアーキテクチャの方法およびシステムに関する。
【背景技術】
【０００２】
今日、モバイルデバイスは、様々なアプリケーションを実行し、ユーザに最新情報を提供するように設計されている。これらデバイスのいくつかには、パーソナルデジタルアシスタント、無線電話機および電子メールデバイスが含まれる。モバイルデバイスは、現在、様々な手段を介してインターネットおよびその他のネットワークに接続することができ、そのため、ネットワークを介して情報を交換している。これらのモバイルデバイスは、アプリケーションを更新し、電子メール、電子メールの添付ファイルおよびＷｅｂページコンテンツなどの情報を送受信することができる。
【発明の開示】
【発明が解決しようとする課題】
【０００３】
こうした機能のすべてを提供するには、新規の電子メールがあったとき、デバイスのスクリーンがアクティブ化されたとき、電話のコールが受信されたときなど、様々なイベントについて、モバイルデバイス上のアプリケーションに通知する必要がある。しかし、デバイスに関連付けられた様々な状態変化のすべてにアクセスするのは困難である。
【課題を解決するための手段】
【０００４】
簡単に説明すると、本発明は、複数のデバイスにわたって状態−通知アーキテクチャを統一することを対象とする。
【０００５】
本発明の一態様によれば、クライアントが状態プロパティの変化についての通知を受け取るように通知ブローカ（ｂｒｏｋｅｒ）に登録する。登録された状態プロパティが変化すると、通知ブローカは、どのクライアントにその状態変化を通知するかを判定し、その変化に関する通知をそのクライアントに提供する。例えば、クライアントは、バッテリ強度、ネットワーク接続、メモリ使用率などの変化に関する通知を受け取るように登録することができる。これらの登録された状態プロパティの１つが変化したときはいつでも、通知ブローカが通知メッセージをクライアントに送る。
【０００６】
本発明の別の態様によれば、状態が変化したときはいつでも、または状態変化が所定の条件を満たすとき、またはスケジュールに基づいてクライアントに通知することができる。
【０００７】
本発明のさらに別の態様によれば、状態変化またはスケジュールに応答してアプリケーションを起動することができる。例えば、クライアントは、モバイルデバイスが起動されるべきアプリケーションに向けられたメッセージを受信するなど、あるイベントが生じたとき、アプリケーションを開始するように登録することができる。また、アプリケーションは、クライアントによって構成されたスケジュールに基づいて開始することもできる。
【０００８】
本発明のさらに別の態様によれば、デバイス内の様々なコンポーネントにわたって状態変化情報にアクセスする統一された方法を提供することを対象とするアプリケーションプログラミングインタフェース（ＡＰＩ）が提供される。例えば、アプリケーションは、同じ関数コールを使用して、デバイス内の様々なコンポーネントによって設定された状態プロパティにアクセスすることができる。
【０００９】
本発明のさらに別の態様によれば、登録された状態プロパティは、デバイスの再起動を越えて永続化することができる。
【発明を実施するための最良の形態】
【００１０】
簡単に説明すると、本発明は、デバイス状態、アプリケーション状態、およびサービス状態を格納するための統一されたメカニズム、ならびに豊かな通知仲介アーキテクチャについての方法およびシステムを提供することを対象とする。一般に、クライアントは、ある状態プロパティが変化したときに通知を受け取るように通知ブローカに登録する。登録された状態プロパティが変化すると、通知ブローカは、どのクライアントにその状態変化を通知するかを判定し、そのクライアントにその変化に関する通知を提供する。クライアントは、状態が変化したときにはいつでも、または状態変化が所定の条件を満たすとき、またはスケジュールに基づいて通知を受けることができる。また、状態変化またはスケジュールに応答してアプリケーションを起動することもできる。また、デバイス内の異なるコンポーネントにわたって状態変化情報にアクセスする統一された方法を提供することを対象とするアプリケーションプログラミングインタフェース（ＡＰＩ）も提供される。
【００１１】
本明細書および特許請求の範囲を通して、以下の用語は、文脈によって別の意味であることが明らかでない限り、少なくとも以下に明示的に関連付けられた意味をもつ。下記に特定された意味は、これら用語を限定するものではなく、用語の解説的な例を提供するに過ぎない。「ある（“ａ”，“ａｎ”）」および「この（“ｔｈｅ”）」には、複数を指す場合も含まれ、「中の（“ｉｎ”）」には「中の（“ｉｎ”）」および「上の（“ｏｎ”）」が含まれる。
【００１２】
「状態プロパティ」という用語は、保持通知および変化通知のために通知システムに登録および格納された「ステータス」変数を指す。
【００１３】
「通知要求」という用語は、クライアントからの状態変化の通知を受ける要求を指す。
【００１４】
「通知リスト」という用語は、状態プロパティ変化通知のために登録しているクライアントの集合を指す。
【００１５】
「通知ブローカ」という用語は、データストアとの間でデータの追加、更新および削除を担う基礎となるドライバを指す。
【００１６】
「状態変化コンポーネント」という用語は、データストアの中で状態プロパティを追加するか、更新するか、または概ね保持する任意のコンポーネントを指す。
【００１７】
「クライアント」という用語は、状態プロパティ変化通知のための登録をする任意のクライアントを指す。クライアントが状態変化コンポーネントであることも、状態変化コンポーネントがクライアントであることもある。
【００１８】
「状態プロパティ識別子」という用語は、状態プロパティの「フレンドリな」文字列（名前）表現を指す。この識別子は、階層的であってよく、固有である。
【００１９】
「条件付き通知」という用語は、状態プロパティが変化し、その状態プロパティが通知要求において指定された条件を満たすときに送られる通知を指す。
【００２０】
（例示的な動作環境）
図１を参照すると、本発明を実施するための例示的なシステムが、コンピューティングデバイス１００のようなコンピューティングデバイスを含んでいる。コンピューティングデバイス１００は、クライアントまたはサーバとして構成することができる。非常に基本的な構成では、コンピューティングデバイス１００は、通常、少なくとも１つの処理装置１０２およびシステムメモリ１０４を含む。コンピューティングデバイスのはっきりした構成およびタイプに応じて、システムメモリ１０４は、揮発性（ＲＡＭなど）、不揮発性（ＲＯＭ、フラッシュメモリなど）、またはこの２つの何らかの組み合わせとすることができる。システムメモリ１０４は、通常、オペレーティングシステム１０５、１つまたは複数のプログラムモジュール１０６を含み、プログラムデータ１０７を含むことがある。この基本的な構成は、図１に破線１０８内のコンポーネントによって例示されている。
【００２１】
コンピューティングデバイス１００は、追加の特徴または機能を有することがある。例えば、コンピューティングデバイス１００は、例えば、磁気ディスク、光ディスク、またはテープなどの付加的なストレージデバイス（リムーバブルおよび／または非リムーバブル）を含むこともある。このような付加的なストレージは、図１にリムーバブルなストレージ１０９およびリムーバブルでないストレージ１１０によって例示されている。コンピュータ記憶メディアには、コンピュータ可読命令、データ構造、プログラムモジュール、またはその他のデータなどの情報を格納するために任意の方法または技術で実装された揮発性および不揮発性、リムーバブルおよび非リムーバブルのメディアを含むことがある。システムメモリ１０４、リムーバブルなストレージ１０９およびリムーバブルでないストレージ１１０はすべて、コンピュータ記憶メディアの例である。コンピュータ記憶メディアには、ＲＡＭ、ＲＯＭ，ＥＥＰＲＯＭ、フラッシュメモリもしくはその他のメモリ技術、ＣＤ−ＲＯＭ、デジタル多用途ディスク（ＤＶＤ）もしくはその他の光ストレージ、磁気カセット、磁気テープ、磁気ディスクストレージもしくはその他の磁気記憶装置、または所望の情報を格納するのに使用することができ、コンピューティングデバイス１００によってアクセスすることができる他の任意の媒体が含まれるが、これらには限定されない。任意のそのようなコンピュータ記憶メディアが、デバイス１００の一部であることがある。コンピューティングデバイス１００は、キーボード、マウス、ペン、音声入力デバイス、タッチ入力デバイスなどの入力デバイス１１２を有することもある。また、ディスプレイ、スピーカ、プリンタなどの出力デバイス１１４を含むこともある。
【００２２】
コンピューティングデバイス１００は、デバイスがネットワークなどを介して他のコンピューティングデバイス１１８と通信できるようにする通信接続１１６を収容する。通信接続１１６は、通信メディアの一例である。通信メディアは、通常、搬送波または他のトランスポートメカニズムなどの変調されたデータ信号におけるコンピュータ可読命令、データ構造、プログラムモジュールまたはその他のデータによって具体化することができ、任意の情報配信メディアが含まれる。「変調されたデータ信号」という用語は、信号に情報を符号化する形でその特性の１つまたは複数が設定または変更された信号を意味する。例として、限定としてではなく、通信メディアには、有線ネットワークまたは直接配線接続などの有線メディア、ならびに音響、ＲＦ、赤外線およびその他の無線メディアなどの無線メディアが含まれる。本明細書で使用するコンピュータ可読メディアという用語には、記憶メディアおよび通信メディアが両方ともに含まれる。
【００２３】
図２を参照すると、本発明を実施するための１つの例示的なシステムが、モバイルデバイス２００のようなモバイルデバイスを含んでいる。モバイルデバイス２００は、プロセッサ２６０、メモリ２６２、ディスプレイ２２８およびキーパッド２３２を有する。メモリ２６２には、一般に、揮発性メモリ（例えば、ＲＡＭ）および不揮発性メモリ（例えば、ＲＯＭ、フラッシュメモリなど）が両方とも含まれる。モバイルデバイス２００は、マイクロソフトコーポレイションからのＷｉｎｄｏｗｓ（登録商標）ＣＥオペレーティングシステム、またはその他のオペレーティングシステムのようなオペレーティングシステム２６４を含み、このオペレーティングシステムは、メモリ２６２の中に存在し、プロセッサ２６０上で実行される。キーパッド２３２は、プッシュボタン数字ダイヤルパッド（通常の電話機上にあるような）、マルチキーのキーボード（従来のキーボードのような）とすることができる。ディスプレイ２２８は、液晶ディスプレイ、またはモバイルデバイスにおいて一般に使用される他の任意のタイプのディスプレイとすることができる。ディスプレイ２２８は、タッチセンシティブとすることができ、その場合は、入力デバイスとしても働く。
【００２４】
１つまたは複数のアプリケーションプログラム２６６がメモリ２６２にロードされ、オペレーティングシステム２６４上で実行される。アプリケーションプログラムの例には、電話ダイヤラプログラム、電子メールプログラム、スケジューリングプログラム、ＰＩＭ（個人情報管理）プログラム、ワードプロセッシングプログラム、スプレッドシートプログラム、インターネットブラウザプログラムなどが含まれる。アプリケーションプログラム２６６は、共通のＡＰＩを使用して、デバイスに関連付けられた状態プロパティに関するアクションを行うことができる。例えば、電話ダイヤラプログラムが、信号強度、電話状態、バッテリ強度などの変化に関する通知を受け取るように通知システムに登録することが可能である。モバイルコンピューティングデバイス２００は、メモリ２６２内に不揮発性ストレージ２６８を含む。不揮発性ストレージ２６８を使用して、モバイルコンピューティングデバイス２００の電源が切れた場合に失われてはならない永続的情報を格納することができる。アプリケーション２６６は、電子メールアプリケーションによって使用される電子メールメッセージまたはその他のメッセージ、ＰＩＭによって使用されるコンタクト情報、スケジューリングプログラムによって使用される予定情報、ワードプロセッシングプログラムによって使用されるドキュメントなどの情報を使用し、ストレージ２６８に格納することができる。
【００２５】
モバイルコンピューティングデバイス２００は、１つまたは複数のバッテリとして実装することができる電源２７０を有する。電源２７０には、バッテリを補完するか、または充電するＡＣアダプタまたは給電ドッキングクレイドル（ｃｌａｄｌｅ）などの外部電源をさらに含むことができる。
【００２６】
モバイルコンピューティングデバイス２００は、ＬＥＤ（図示せず）やオーディオインタフェース２７４などの外部通知メカニズムを含むこともできる。これらのデバイスは、アクティブ化されると、プロセッサ２６０およびその他のコンポーネントがバッテリ電力を節約するためにシャットダウンされても、通知メカニズムによって決められた期間、オンのままであるように電源２７０に直接的に結合することができる。オーディオインタフェース２７４は、ユーザに可聴信号を提供し、ユーザから可聴信号を受け取るために使用される。例えば、オーディオインタフェース２７４は、電話による会話を容易にするためなど、可聴出力を提供するためのスピーカに結合し、可聴入力を受け取るためのマイクに結合することができる。
【００２７】
モバイルコンピューティングデバイス２００は、デバイスが無線ネットワークなどを介して他のコンピューティングデバイスと通信することができるようにする通信接続２４０を収容することもある。モバイルコンピューティングデバイス２００は、無線周波数通信を送受信する機能を行う無線インタフェースレイヤ２７２も含む。無線インタフェースレイヤ２７２は、通信キャリアまたはサービスプロバイダを経由してモバイルコンピューティングデバイス２００および外部世界の間の無線接続を容易にする。無線インタフェースレイヤ２７２との伝送は、オペレーティングシステム２６４の制御の下で行われる。換言すれば、無線インタフェースレイヤ２７２および通信接続２４０によって受信される通信は、オペレーティングシステム２６４経由でアプリケーションプログラム２６６に、およびその逆に伝搬することができる。
【００２８】
（例示的な状態変化通知システム）
図３は、本発明の態様による例示的な状態管理−通知システムを示している。通知システム３００は、状態変化コンポーネント３１０、クライアント３１５および３２０、通知ブローカ３３５およびデータストア３３０を含む。一実施形態によれば、通知ブローカ３３５は、通知リスト３４０、キャッシュプロパティ３４５およびスケジューラ３５０も保持する。
【００２９】
クライアント３１５または３２０のようなクライアントが、状態プロパティの変化に関する通知を受け取るように通知ブローカ３３５に登録する。一般に、クライアントは、状態プロパティが変化したときはいつでも、または変化が条件を満たすとき、またはスケジュールに基づいて通知を受け取るようにクライアントを登録する通知要求を通知ブローカ３３５に対して行うことができる。通知は、永久的なまたは一時的な通知とすることができる。
【００３０】
永久的な通知は、データストア（３３０）に保持される。一実施形態によれば、永久的な通知は、レジストリのようなバックエンドデータストアに保持され、このため、再起動を越えて「永続化」される。これらの通知は永続化されるので、これらのタイプの状態プロパティは、再起動（またはブート）時にソフトリセット（またはシャットダウン）前と同じ値を有する。一実施形態によれば、状態プロパティは、既定として永続的である。
【００３１】
一時的な通知は永久ではなく、したがって、再起動を越えて永続化されない。換言すれば、デバイスがソフトリセットされた（または再起動された）場合、通知要求は通知リスト３４０から削除される。一時的な通知を復元するために、クライアントは状態プロパティの変更に関する通知を受け取るように再登録する（別の通知要求をブローカ３３５に送る）。
【００３２】
クライアントは、状態変化の発生時および／またはスケジュールに従ってアプリケーションが起動されるように登録することもできる。一般に、通知ブローカ３３５は、状態変化が生じるか、またはスケジュールされた時刻になったときにアプリケーションが既に実行中でない場合に、クライアントによって指定されたアプリケーションを起動するコマンドを発行する。一実施形態によれば、クライアントは、アプリケーションが起動されたときにアプリケーションに渡されるべきコマンドラインパラメータを指定することができる。起動されたプロセスがウインドウを作成した場合、通知を示すメッセージがそのウインドウに送られる。ターゲットプロセスがクライアント上で既に実行中である場合、クライアントは単に通知メッセージを受け取る。
【００３３】
クライアントに送られる通知は、バッチ化することもできる。バッチ化された状態プロパティは、頻繁な値の変化を被る可能性がある状態プロパティによって使用されることが意図されている。状態プロパティ値が「安定化」し得るようにする所定の期間が設定される。一実施形態によれば、この所定の期間は、２００ミリ秒に設定される。所定の期間中に状態プロパティ値に何の変更も行われなかった場合、この通知が登録されたクライアントに送られる。バッチ化する所定の期間は、構成可能であり、データストア３３０に格納される。
【００３４】
データストア３３０は、登録された状態プロパティおよびその他の情報を格納するように構成される。一実施形態によれば、データストア３３０は、マイクロソフトコーポレイションによって提供されるＷｉｎｄｏｗｓ（登録商標）ＸＰオペレーティングシステムで提供されるレジストリのような、オペレーティングシステムで提供されるレジストリである。データストア３３０は、情報を設定およびアクセスすることができる他の任意のタイプのデータストアとすることもできる。データストア３３０は、通知システム３００内の様々な場所に保持された１つまたは複数のデータストアを含むこともできる。
【００３５】
また、データストア３３０に、クライアント３１５および３２０によってアクセスすることができる状態プロパティデータの既定のセットをあらかじめロードすることもできる。状態プロパティデータをあらかじめロードすることにより、クライアントが状態プロパティを追加する必要なく、状態プロパティの多くが利用可能になる。例えば、一実施形態によれば、以下の状態が、その状態を登録することなくクライアントに利用可能になる。これらの状態は、ディスプレイの向き（解像度、明るさ）、未破棄のリマインダ（カウント、件名、日付、時刻、場所）、未破棄のアラーム（カウント、説明、日付、時刻）、バッテリ（残量％、状態）、バックアップバッテリ（残量％、状態）、メモリ（プログラムメモリの空き、使用中のプログラムメモリ、記憶メモリの空き、使用中の記憶メモリ）、メモリカード（総メモリの空き、使用中の総メモリ）、ハードウェア（折りたたみ式電話の状態（開／閉）、キーボード有効、Ｗｉｆｉ有効、Ｂｌｕｅｔｏｏｔｈ有効、ヘッドホンあり、カメラあり）、メッセージング（未読カウント、合計カウント、下書きカウント、送信トレイカウント）、タスク（最優先カウント、本日期限カウント、期限超過カウント）、カレンダ（次の予定、名前、場所、日付、時刻、ＰＯＯＭ  ＩＤ）、全日予定（名前、場所、日付、時刻、ＰＯＯＭ  ＩＤ）、現在の予定（名前、場所、日付、時刻、ＰＯＯＭ  ＩＤ）、現在の空き／ビジーステータス、インスタントメッセンジャー（ステータス、オンラインコンタクトカウント、オフラインコンタクトカウント）、接続（速度、Ｗｉｆｉ、アクセスポイント、信号強度、接続名、接続先（職場、インターネット）、ステータス）、メディアプレーヤー（ステータス、再生リスト（名前、モード（繰り返し、シャッフル）、トラックカウント、合計時間）、トラック（タイプ（オーディオ、ビデオ）、名前、アルバム、アーティスト、トラック番号、ジャンル、年、長さ、再生位置、ファイル名、ビットレート））、同期ステータス、電話（オペレータ、信号強度、電話状態、プロファイル、ローミング、無線状態）、アクティブなコール（発呼者名、発呼者番号）、不在着信カウント、ＳＩＭツールキットメッセージである。理解されうるように、状態は多くの異なるアプリケーションにわたる。
【００３６】
一実施形態によれば、状態プロパティデータは、階層に編成される。階層により、クライアントが、親を参照することによって状態プロパティのグループを指定できるようになる。状態プロパティは、文字列、整数、浮動などのデータタイプに設定することができる。
【００３７】
クライアントは、状態プロパティの「フレンドリな」文字列（名前）表現によって状態プロパティを特定することができる。例えば、「ｂａｔｔｅｒｙ＼ａ」は、「ｂａｔｔｅｒｙ」という親の下の状態プロパティ「ａ」を指し、同様に、同じ親の下の状態プロパティ「ｂ」である「ｂａｔｔｅｒｙ＼ｂ」が存在することができる。共通の親の下にある状態プロパティのグループを参照するとき、親識別子を使用することができる。例えば、バッテリ状態のすべての変化に基づいて通知を受け取るのに、登録に「ｂａｔｔｅｒｙ」を提供し、単一の名前を使用してバッテリ状態プロパティのすべてを参照する。
【００３８】
ブローカ３３５は、データストア３３０内の状態プロパティタイプを設定／調整／削除することに対するアクセスを制御するように構成することができる。例えば、状態プロパティに規制を課して、通知システムからのプロパティの削除を所定のリストのクライアントだけに限定することができる。状態プロパティが削除されると、そのプロパティに関する通知のための登録をしたクライアントは、プロパティの削除の通知を受ける。
【００３９】
前述したとおり、クライアント３１５および３２０は、状態プロパティが変化したときに通知を受け取ることに関心がある状態プロパティについて登録する。クライアントは、登録した状態が変化したときはいつでも、状態値に適用される条件付け（ｃｏｎｄｉｔｉｏｎａｌ）が条件を満たすとき、または所定のスケジュールに基づいて、通知を受け取るように登録することができる。条件付き通知は、多くの異なる条件に基づくことができる。一実施形態によれば、条件付けには、「すべての」、「等しい」、「等しくない」、「超えている」、「以上」、「以下」、「未満」、「含む」、「〜で始まる」および「〜で終わる」が含まれる。例えば、クライアント３１５は、不在着信カウント状態プロパティが１５を「超えている」場合、および発呼者名が「Ｊａ」を「含む」場合、通知を受け取るように通知ブローカ３３５に登録することができる。条件付けにより、クライアントは、関心のない状態変化情報を処理する必要なく、関心のある状態変化情報を受け取ることができるようになる。
【００４０】
状態プロパティの変化に関する通知を受け取るように登録したクライアントは、通知リスト３４０の中で保持される。通知ブローカ３３５は、通知リスト３４０にアクセスして、登録された状態プロパティが変化したときに通知を受け取るべきクライアントを特定する。
【００４１】
スケジュールに基づいてクライアントに通知し、および／またはクライアントをアクティブ化するようにスケジューラ３５０を構成することができる。スケジュールされたアクティブ化通知モードにより、クライアントが通知ブローカ３３５に登録された簡略化された反復スケジュールに基づいて通知を受け取ることができるようになる。スケジュールは、秒、分、時間、日、週、または月のスケールなど、任意の間隔で生じるように構成することができる。一実施形態によれば、スケジュールは、最初の発生の日付／時刻、および発生と発生の間の時間によって定義される。さらに、スケジュールは、反復間隔なしに定義することもできる。反復の間隔が何ら与えられない場合、通知は１回だけ送られ、そして通知リストからその登録が削除される。さらに、通知が着信したとき、指定されたアプリケーションパス（通知要求中に提供される）を見つけることができない場合、スケジュールされた通知登録が、通知リスト３４０から削除される。
【００４２】
状態変化コンポーネント３１０は、状態が変化したときにデータストア３３０内の状態プロパティの値を更新する。状態変化コンポーネント３１０は、データストア３３０の中で状態を直接的に更新したり、または通知ブローカ３３５を介して更新したりすることができる。状態がデータストア３３０を介して更新されると、データストア３３０は、その変更を通知ブローカ３３５に伝達する。状態が通知ブローカ３３５を介して更新されるとき、通知ブローカ３３５がデータストア３３０の中の状態を更新する。いずれの場合も、通知ブローカ３３５が、状態変化に基づいてどのクライアントが通知を受けるべきかを判定する。通知ブローカ３３５は、通知リスト３４０を解析し、その状態変化に関する通知のために登録しているクライアントを判定する。通知ブローカ３３５は、変化した状態プロパティの値に条件付けを適用し、条件付けが満たされるとクライアントに通知する。状態変化に関連する条件付けが存在しない場合、クライアントは、その状態変化について通知を受ける。
【００４３】
クライアント３１５やクライアント３２０のようなクライアントが、通知ブローカ３３５から通知を受け取ると、クライアントは、共通のＡＰＩ（以下の説明を参照）内の関数をコールして、状態プロパティの新たな状態を取り出すことができる。あるいは、プロパティ情報は、通知とともにクライアントに直接に配信されてもよい。クライアントは、特定の状態プロパティに関係する通知を受け取ることにもはや関心がない場合、その状態プロパティに関連する変化通知を受け取ることから自らを登録解除することができる。クライアント３１５および３２０は、共通のＡＰＩを使用して、いつでもブローカ３３５に直接に照会を行い、状態プロパティの状態を知ることもできる。
【００４４】
また、状態プロパティ値は、通知ブローカ３３５によってキャッシュプロパティ３４５にキャッシュすることもできる。状態プロパティ値は、多くの異なる理由でキャッシュすることができる。例えば、状態プロパティ値は、状態プロパティの前の値を状態プロパティの現在の値と比較することができるようにキャッシュすることができる。さらに、キャッシュは、状態プロパティの値を要求する迅速な繰り返しルックアップを容易にするのに役立つ可能性がある。
【００４５】
一実施形態によれば、通知システム３００は、ストアならびに変化通知登録への両方の追加のために、．ＮＥＴ（管理された）クライアントをサポートする。
【００４６】
以下は、状態管理通知システム３００をさらに明らかにするいくつかの例示的なシナリオである。
【００４７】
例１：ＩＳＶサービス
初心者ノームが、今シーズンの野球統計（例えば、チーム、プレーヤー、得点、統計など）の完全なデータベースを保持するＣ＃アプリケーションを構築している。彼は、スポーツウェブサイトに接続して、更新された日々の統計をプルダウンすることができる簡単なＸＭＬウェブサービスも構築している。このアプリケーションが格納するデータの量は比較的大きいため、ノームは、「太いパイプ（ｆａｔ  ｐｉｐｅ）」（例えば、８０２．１ｘ）がデバイス（例えば、ＰＰＣ）上で利用できるときにだけ、自身のアプリケーションがデータを同期することを望んでいる。次に、ノームは、高帯域幅接続が利用可能なときに通知のための通知要求を通知ブローカ３３５に送ることにより、自身のアプリケーションを登録する。ノームは、高帯域幅接続が利用可能なときに自身のアプリケーションを起動するように通知要求の中でさらに指定する。接続に関連付けられた状態変化コンポーネントが接続の状態を更新する際、その状態により接続が高速接続であることが示されるとき、通知ブローカ３３５はノームのアプリをアクティブ化する。
【００４８】
例２：企業ＬＯＢ（取扱商品（Ｌｉｎｅ  ｏｆ  Ｂｕｓｉｎｅｓｓ））アプリケーション
企業開発者エルフが、保険査定人の使用のためのフィールドサービスのフォームベースのＶＢ．Ｎｅｔアプリケーションを構築している。このアプリケーションは、保険査定人がパーツ番号および費用を調べたり、ノートを取ったり、自動車の図面を取り出したりすることができるようにする。毎日、保険査定人は、自身のモバイルコンピューティングデバイスをフィールドで携行して、顧客にサービスを提供する。アプリケーションは、本日の作業についてのデータのすべてをデータストアにローカルで保存する。エルフは、デバイスがクレイドルにドッキングされるたびに、アプリケーションが、オフラインストアを会社のメインサーバと同期させることを望む。それゆえ、エルフは、同期クレイドルイベントに関する通知のために自身のアプリケーションを登録する。デバイスがクレイドルにドッキングされたときはいつでも、アプリケーションは通知を受け、そのデータを同期させる。
【００４９】
例３：電話ゲーム
電話ゲーム開発者ゴーレムが、電話機のための次世代マルチプレーヤーＲＰＧを構築している。彼は、ゲームが非常に人気を博して、一度に数週間にも、数ヶ月にもわたって続けられることを予期している。ゴーレムの重要な関心事の１つは、ユーザの介入なしにゲームの状態を維持することである。このゲームの巧妙な特徴の１つは、電話機のバッテリが尽きる直前に、現在の状態を保存し、ユーザが何らのデータも決して失わないことを確実にすることができることである。ゴーレムは、デバイスのバッテリが尽きる前にゲーム情報が保存されることを確実にするために、自身のアプリケーションを登録して、バッテリ低下通知を受け取る。
【００５０】
例４：デバイス管理クライアント
新進の企業管理クライアント開発者エリックが、クライアント更新、ウイルススキャン、ポリシー実施、その他を扱うことができる次世代のモバイルコンピューティングデバイスおよび電話管理クライアントを作成することを目指している。Ｃ＃を使用して、彼は、サーバ駆動のコマンドに基づいて要求を扱うことができるパワーデバイス側クライアントを構築している。毎晩午前３時に、エリックは、更新されたポリシー、ウイルススキャナシグニチャなどのためにサーバにコンタクトすることができるように、自身のアプリケーションが「ウェークアップ」することを望んでいる。これを達するために、彼は、単に、スケジュールされた通知（毎日午前３時）について、自身のアプリケーションを通知ブローカ３３５に登録する。これでエリックは、自身のアプリが指定された時刻に稼働するであろうことを保証される。
【００５１】
図４は、本発明の態様による状態変化通知システムのプロセスを示している。開始ブロックの後、プロセス４００は、ブロック４１０に進み、クライアントが少なくとも１つの状態プロパティの変化について通知を受けるように登録する。その状態プロパティが、別のクライアントによって既にモニタされてはいない場合、状態プロパティは、利用可能な状態プロパティのリストに追加される。前述したとおり、利用可能なプロパティのリストは、通知システムにあらかじめロードされる。クライアントは、プロパティに対してなされたすべての変化、条件を満たす変化に関する通知を受け取るように登録することができ、スケジュールに従って通知を受けることもできる。
【００５２】
ブロック４２０に進むと、変化が登録された状態プロパティに対してなされたとき、通知システムにその変化について知らせるように、コールバックが通知システムに登録される。一実施形態によれば、通知ブローカは、状態プロパティ値に対してなされる変化について、コールバックをオペレーティングシステムレジストリに登録する。
【００５３】
ブロック４３０に進むと、クライアントは、状態プロパティに関係する通知メッセージを受け取るように通知リストに追加される。通知リストに含まれるクライアントが、登録された状態プロパティの変化に関する通知を受け取る。
【００５４】
ブロック４４０に移行すると、登録された状態プロパティのいずれかに変化がなされたとき、コールバックが受信される。一実施形態によれば、コールバックは、状態プロパティ変化および状態プロパティの現在の値を特定する識別子を含む。
【００５５】
ブロック４５０に移動すると、状態変化情報が処理される。一般に、状態変化情報を処理することには、何らかの条件付け、スケジュール、バッチまたはアプリケーション起動条件が、変化した状態プロパティについて登録されたクライアントのそれぞれに適用されるかどうかを判定することが含まれる（図５および関連する説明を参照）。
【００５６】
図５は、本発明の態様による状態変化情報を処理するためのプロセスを示している。開始ブロックの後、プロセス５００は、ブロック５１０に進み、変化した状態プロパティについて状態変化に関する通知を受け取るために登録されたクライアントにアクセスが行われる。一実施形態によれば、通知リストにアクセスして、変化した状態プロパティについて登録されているクライアントを判定する。
【００５７】
判定ブロック５２０に移動すると、クライアントに通知する前に状態プロパティに適用されるべき何らかの条件付けをクライアントが指定しているかどうかの判定が行われる。
【００５８】
条件式が通知要求に関連付けられている場合、プロセスは判定ブロック５３０に進み、その条件が満たされるかどうかの判定が行われる。条件が満たされる場合、またはクライアントが何ら条件付けを指定していない場合、プロセスは判定ブロック５４０に進み、クライアントが状態プロパティの変化に応答してアプリケーションを起動するように指定しているかどうかの判定が行われる。クライアントがアプリケーションを起動するように指定している場合、プロセスはブロック５５０に移動し、アプリケーションが既に実行中でない場合、アプリケーションが起動される。クライアントがアプリケーションを起動するように指定していない場合、またはアプリケーションがブロック５５０で起動されている場合、プロセスはブロック５６０に移動し、クライアントが状態変化について通知を受ける。
【００５９】
次に、プロセスは判定ブロック５７０に進み、状態プロパティの変化に関する通知を受け取るように登録されているさらなるクライアントが存在するかどうかの判定が行われる。別のクライアントが存在する場合、プロセスはブロック５１０に戻る。他のクライアントが存在しない場合、プロセスは終了ブロックに進み、他のアクションを処理することに戻る。
【００６０】
（状態プロパティのタイプおよびモデル）
本発明の一実施形態によれば、２つのＡＰＩを使用して、通知システムにおける状態情報にアクセスすることができる。ネイティブ、つまり基礎となるＡＰＩが提供され、管理されたＡＰＩが、クライアントに提供される。管理されたＡＰＩは、ネイティブＡＰＩにアクセスしてその操作を行う。
【００６１】
以下は、本発明の態様による例示的なネイティブＡＰＩである。
#define E_ALREADY_REGISTERED      ERROR_ALREADY_REGISTERED
#define E_DATATYPE_MISMATCH       ERROR_DATATYPE_MISMATCH
#define E_INSUFFICIENT_BUFFER     ERROR_INSUFFICIENT_BUFFER
#define E_INVALID_HANDLE          ERROR_INVALID_HANDLE
#define E_NOT_FOUND               ERROR_NOT_FOUND
#define E_NOT_READY               ERROR_NOT_READY
DECLARE_HANDLE(HREGNOTIFY);//一時的な通知ハンドル
//***********************************************************
//列挙名：REG_COMPARISONTYPE
//目的：条件付き変化通知について、状態プロパティ値が目標値とどのように比較される
//べきかを定義するために使用。REG_COMPARISONTYPEを実行する際、変化した値が、ｌ値
//として使用される、つまり、REG_CT_LESSは、変化した値が目標値より小さい場合、
//通知を発することを意味する。
//
//説明：
//以下は、比較が行われた場合にどのステートメントが真となるかを示す。大文字と小文
//字を区別しないCompareStringを使用してストリングを比較そ、以下の情報を使用して
//REG_COMPARISONTYPE値のインテントを明確にする。
//「cv」が、変化した値を表し、「psz」または「dw」が、NOTIFICATIONCONDITION構造の
//中で指定されたTargetValueを表すものとする。「1」が、psz(wcslen(psz))において指
//定された文字列の長さを表し、「cvl」が、変化した値(wcslen(cv))の文字列長を表す
//ものとする。
//                            REG_SZ              REG_DWORD
// REG_CT_EQUAL                |(0==strcmp(cv,psz))      |(cv==dw)|
// REG_CT_NOT_EQUAL            |(0!=strcmp(cv,psz))      |(cv!=dw)|
// REG_CT_GREATER              |(0<strcmp(cv,psz))       |(cv>dw)|
// REG_CT_GREATER_OR_EQUAL     |(0<=strcmp(cv,psz))      |(cv>=dw)|
// REG_CT_LESS                 |(0>strcmp(cv,psz))       |(cv<dw)|
// REG_CT_LESS_OR_EQUAL        |(0>=strcmp(cv,psz))      |(cv<=dw)|
// REG_CT_CONTAINS             |(0!=strstr(cv,psz))      |N/A|
// REG_CT_STARTS_WITH          |(0==strncmp(cv,psz,1))    |N/A|
// REG_CT_ENDS_WITH            |(0==strcmp(cv+cvl-1,psz)) |N/A|
//**********************************************
typedef enum tagREG_COMPARISONTYPE
{
REG_CT_EQUAL,
REG_CT_NOT_EQUAL,
REG_CT_GREATER,
REG_CT_GREATER_OR_EQUAL,
REG_CT_LESS,
REG_CT_LESS_OR EQUAL,
REG_CT_CONTAINS,
REG_CT_STARTS_WITH,
REG_CT_ENDS_WITH
} REG_COMPARISONTYPE;
//***********************************************************
//構造名：NOTIFICATIONCONDITION
//
//目的：プロパティ状態変化通知が発せられるべき条件を定義するのに使用
//
//説明：
//REG_COMPARISONTYPE ctComparisonType - 変化した値をTargetValueにおいて指定され
//た値とどのように比較するか
//DWORD dwMask - この値が0に設定されていない場合、TargetValueは、DWORDとして解
//釈される。このマスクは、比較が行われる前に、変化したDWORD値に適用され、このマ
//スクは、TargetValueには適用されない。この値が0に設定されている場合、
//TargetValueは、文字列として解釈される。
//union TargetValue - dwMaskが0に設定されている場合、比較は、pszと変化した値の
//間で行われる。dwMaskが0以外の何らかの値に設定されている場合、比較は、dwとマス
//クされた(dwMask参照)変化した値の間で行われる。変化した値がREG_SZタイプでも、
//REG_DWORDタイプでもない場合、または変化した値がREG_DWORDタイプであり、dwMask
//が0に設定されている場合、または変化した値がREG_SZタイプであり、dwMaskが0に設定
//されていない場合、通知は無視される。変化した値が削除されており、比較がdwに対し
//て行われる場合、0が変化した値として使用され、比較は、通常どおり行われる。
//値が削除され、比較がpszに対して行われる場合、NULLが変化した値として使用され、
//REG_CT_EQUALおよびREG_CT_NOT_EQUALだけが、比較によって処理され、何らかの他の
//ctComparisonTypeが使用される場合、削除通知は無視される。
//***********************************************************
typedef struct tagNOTIFICATIONCONDITION
{
REG_COMPARISONTYPE ctComparisonType;
DWORD dwMask;
union
{
LPCTSTR psz;
DWORD dw;
}TargetValue;
} NOTIFICATIONCONDITION;
////関数プロトタイプ：REGISTRYNOTIFYCALLBACK
//
//目的：RegisterNotifyCallbackによって使用されるコールバックのプロトタイプを定義
//
//引数
//IN HREGNOTIFY hNotify - 有効なHREGNOTIFYに対するハンドル、これは、
//RegistryNotifyCallbackから戻されるのと同じハンドルである
//IN DWORD dwUserData - RegistryNotifyCallbackに渡されたユーザデータ
//IN const PBYTE pData - 値の新たな値に対するポインタ、これは、値が削除された場
//合、NULLに設定される
//IN const UNIT cbData - pDataによってポイントされるバイト数、この値は、値が削
//除された場合、0に設定されることになる
//
//説明：
//このコールバックは、RegistryNotifyCallbackを使用して通知のために登録された
//クライアントに通知するために使用。さらなる通知が要求されない場合、このコール
//バック内からRegistryCloseNotificationをコールするのが安全である。
//
//***********************************************************
typedef void(*REGISTRYNOTIFYCALLBACK)(HREGNOTIFY hNotify,
DWORD dwUserData,
const PBYTE pData,
const UINT cbData);
//***********************************************************
//関数名：RegistryGetDWORD
//
//目的：REG_DWORDレジストリ値を読み取るのに使用
//
//引数：
//IN HKEY hKey - 現在開いているキーに対するハンドル、または所定のルート値
//IN LPCTSTR pszSubKey - 値が格納されるキー（この値がNULLである場合、pszValue
//NameがhKeyにあるものと想定される）
//IN LPCTSTR pszValueName - 取り出すべき値の名前（既定値を取り出すためにNULL
//とすることができる）
//OUTDWORD*pdwData - 値に関連付けられたデータを受け取ることになるバッファに対
//するポインタ
//
//戻り値:
//HRESULT
//S_OK - データがバッファにコピーされた
//E_INVALIDARG - hKeyまたはpdwDataが無効である
//E_DATATYPE_MISMATCH - 値がREG_DWORDタイプではない
//RegOpenKeyExまたはRegQueryValueExから戻されたエラー値はFACILITY_WIN32 HRESULT
//としてラップ
//
//結果：
//SUCCEEDED - pDataが値に関連付けられたデータにポイントしている
//FAILED - 変化なし
//
//説明：
//値に関連付けられたDWORDが、pDataによってポイントされるバッファにコピーされる。
//hKey+pszSubKeyによってポイントされるキーが存在しない場合、RegistryGetDWORDは、
//キーにアクセスするのにRegOpenKeyを使用するので、失敗することになる
//
//***********************************************************
HRESULT WINAPI RegistryGetDWORD(HKEY hKey,
LPCTSTR pszSubKey,
LPCTSTR pszValueName,
DWORD * pdwData);
//***********************************************************
//関数名：RegistryGetString
//
//目的：REG_SZレジストリ値を読み取るのに使用
//
//引数：
//IN HKEY hKey - 現在開いているキーに対するハンドル、または所定のルート値
//IN LPCTSTR pszSubKey - 値が格納されるキー（この値がNULLである場合、pszValue
//NameがhKeyにあるものと想定される）
//IN LPCTSTR pszValueName - 取り出すべき値の名前（既定値を取り出すためにNULL
//とすることができる）
//OUT LPSTR pszData - 値に関連付けられたデータを受け取ることになるバッファに
//対するポインタ
//IN UNIT cchData - pDataによってポイントされるバッファの文字の長さである変数に
//対するポインタ
//
//戻り値:
//HRESULT
//S_OK - データがバッファにコピーされた
//E_INVALIDARG - hKeyまたはpszDataが無効である
//E_DATATYPE_MISMATCH - 値がREG_SZタイプではない
//E_INSUFFICIENT_BUFFER - cchDataによって判定されたpszDataによってポイントされ
//るバッファのサイズが、文字列を保持するのに十分に大きくない
//RegOpenKeyExまたはRegQueryValueExから戻されたエラー値はFACILITY_WIN32 HRESULT
//としてラップ
//
//結果：
//SUCCEEDED - pDataが値に関連付けられたデータにポイントしている
//FAILED - 変化なし
//
//説明：
//値に関連付けられた文字列が、pDataによってポイントされるバッファにコピーされる
//hKey+pszSubKeyによってポイントされるキーが存在しない場合、RegistryGetStringは
//キーにアクセスするのにRegOpenKeyを使用するので、失敗することになる
//
//***********************************************************
HRESULT WINAPI RegistryGetString(HKEY hKey,
LPCTSTR pszSubKey,
LPCTSTR pszValueName,
LPTSTR pszData,
UINT cchData);
//***********************************************************
//関数名：RegistrySetDWORD
//
//目的：REG_DWORDレジストリ値を設定するのに使用
//
//引数：
//IN HKEY hKey - 現在開いているキーに対するハンドル、または所定のルート値
//IN LPCTSTR pszSubKey - 値が格納されるキー（この値がNULLである場合、pszValue
//NameがhKeyにあるものと想定される）
//IN LPCTSTR pszValueName - 設定すべき値の名前（既定値を設定するためにNULL
//とすることができる）
//IN DWORD dwData - 新たな値
//
//戻り値:
//HRESULT
//S_OK - pszValueNameのデータ値がdwDataの中のデータに変更された
//E_INVALIDARG - hKeyが無効である
//E_DATATYPE_MISMATCH - 値がREG_DWORDタイプではない
//RegOpenKeyExまたはRegQueryValueExから戻されたエラー値はFACILITY_WIN32 HRESULT
//としてラップ
//
//結果：
//SUCCEEDED - 値に関連付けられたデータが変更された
//FAILED - 変化なし
//
//説明：
//値に関連付けられたデータが、新たな値に変更される。hKey+pszSubKeyによってポイン
//トされたキーが存在しない場合、RegistryGetDWORDは、キーにアクセスするのにRegOpe
//nKeyを使用するので、失敗することになる
//
//***********************************************************
HRESULT WINAPI RegistrySetDWORD(HKEY hKey,
LPCTSTR pszSubKey,
LPCTSTR pszValueName,
DWORD dwData);
//***********************************************************
//関数名：RegistrySetString
//
//目的：REG_SZレジストリ値を設定するのに使用
//
//引数：
//IN HKEY hKey - 現在、開いているキーに対するハンドル、または所定のルート値
//IN LPCTSTR pszSubKey - 値が格納されるキー（この値がNULLである場合、pszValue
//NameがhKeyにあるものと想定される）
//IN LPCTSTR pszValueName - 設定すべき値の名前（既定値を設定するためにNULL
//とすることができる）
//IN LPCTSTR pszData - 新たな値。この文字列はNULLで終了される
//
//戻り値：
//HRESULT
//S_OK - pszValueNameのデータ値がpszDataの中のデータに変更された
//E_INVALIDARG - hKeyまたはpszDataが無効である
//E_DATATYPE_MISMATCH - 値がREG_SZタイプではない
//RegOpenKeyExまたはRegQueryValueExから戻されたエラー値はFACILITY_WIN32 HRESULT
//としてラップ
//StringCbLengthから戻されたエラーHRESULT
//
//結果：
//SUCCEEDED - 値に関連付けられたデータが変更された
//FAILED - 変化なし
//
//説明：
//値に関連付けられたデータが、新たな値に変更される。hKey+pszSubKeyによってポイン
//トされるキーが存在しない場合、RegistrySetStringは、キーにアクセスするのにRegOp
//enKeyを使用するので、失敗することになる
//
//***********************************************************
HRESULT WINAPI RegistrySetString(HKEY hKey,
LPCTSTR pszSubKey,
LPCTSTR pszValueName,
LPCTSTR pszData);
//***********************************************************
//関数名：RegistryTestExchangeDWORD
//
//目的：条件に基づいて値をアトミック的に設定するのに使用
//
//引数：
//IN HKEY hKey - 現在開いているキーに対するハンドル、または所定のルート値
//IN LPCTSTR pszSubKey - 値が格納されるキー（この値がNULLである場合、pszValue
//NameがhKeyにあるものと想定される）
//IN LPCTSTR pszValueName - 設定すべき値の名前（既定値を設定するためにNULL
//とすることができる）
//IN DWORD dwOldValue  チェックする値
//IN DWORD dwNewValue - 条件付きで設定する値
//
//戻り値:
//HRESULT//S_OK - データがdwNewValueに変更された
//S_FALSE - pszValueNameに関連付けられたDWORDがdwOldValueに等しくなかったので、
//目標値がdwNewValueに設定されなかった
//E_INVALIDARG - ハンドルまたは渡されたポインタの１つが無効であった
//E_DATATYPE_MISMATCH - 値がREG_DWORDタイプではない
//E_NOT_FOUND - 値を指定されたキーの下で見つけることができなかった
//エラー値はFACILITY_WIN32 HRESULTとしてラップ
//
//結果：
//SUCCEEDED - pszDataに関連付けられたデータ値が、dwOLDValueであったが、現在は、
//dwNewValueである
//FAILED - 変化なし
//
//説明：
//この関数は、インターロックされた関数である。換言すれば、アトミックであると考え
//ることができる。この関数は、pszValueNameに関連付けられたDWORD値がOldValueに等
//しいかどうかをチェックする。等しい場合、この関数は、目標をNewValueに設定し、
//それ以外の場合、失敗することになる
//
//***********************************************************
HRESULT WINAPI RegistryTestExchangeDWORD(HKEY hKey,
LPCTSTR pszSubKey,
LPCTSTR pszValueName,
DWORD dwOldValue,
DWORD dwNewValue);
//***********************************************************
//関数名：RegistryNotifyApp
//
//目的：指定された値が変更されたとき、アプリケーションが起動されるか、または通知
//を受けることを要求するのに使用
//
//引数：
//IN HKEY hKey - 現在開いているキーに対するハンドル、または所定のルート値
//IN LPCTSTR pszSubKey - 値が格納されるキー（この値がNULLである場合、pszValue
//NameがhKeyにあるものと想定される）
//IN LPCTSTR pszValueName - 変化通知が要求される値の名前（既定値を示すために
//NULLとすることができる）
//IN LPCTSTR pszName - この通知要求を表すユーザ定義の文字列。この文字列は、通知
//がもはや必要とされないとき、RegistryStopNotificationに渡されなければならない
//IN LPCTSTR pszApp - 起動する実行可能ファイルへのパスである文字列に対するポイ
//ンタ
//IN LPCTSTR pszClass - 実行可能ファイルが起動されるか、または実行可能ファイル
//が、既に実行中である場合、IN LPCTSTR pszWindowというウインドウ名およびクラス
//タイプを有するウインドウがプロセスにおいて特定され、通知がそのウインドウに送
//られる。これらのパラメータの両方ともNULLである場合、この関数は、アプリケー
//ションだけを起動することになる。
//IN UINT msg - ウインドウに渡されることになるメッセージ
//IN NOTIFICATIONCONDITION * pCondition - 新たなレジストリ値に対する条件の比較が
//真である場合に変化通知が送られるべき条件（いかなる変化も通知をもたらすべきこと
//を示すためにNULLとすることができる）
//
//戻り値：
//HRESULT
//S_OK - 通知の要求が、通知リストに追加された
//E_INVALIDARG - hKey、pszAppまたはpszNameが無効である
//E_ALREADY_REGISTERED  pszNameによって指定された名前に等しい名前を有する通知
//が既に存在する
//エラー値はFACILITY_WIN32 HRESULTとしてラップ
//
//結果：
//SUCCEEDED - これでこの値の変更が行われるたびに、呼び出し元が通知を受けること
//になる。
//FAILED - 変化なし
//
//説明：
//通知要求が通知リストに追加される。呼び出し元がRegistryStopNotificationをコール
//して、さらなる通知を停止する。このタイプの通知要求は、永久的である、つまり、デ
//バイスがリセットされた場合でも通知要求はアクティブである。通知時、この関数は、
//pszAPPにおいて指定された名前を有する実行可能ファイルが既に実行されているかどう
//かを、pszClassおよびpszWindowで指定されたクラス名およびウインドウ名に対して
//FindWindowを実行することにより判定し、実行中でない場合、アプリケーションを起動
//する。アプリケーションに渡されるコマンドラインは、ユーザによって指定された任意
//のコマンドラインに加えて、pszApp文字列において指定されなければならず、以下のも
//のが付加される。
//  /notify “pszName”
//  pszName - pszNameパラメータにおいて関数に渡されるハンドル文字列
//アプリケーションが起動された後、pszClassおよびpszWindowにおいて指定されたクラ
//ス名およびウインドウ名を有するウインドウを探すFindWindowが実行される。ウインド
//ウが見つかった場合、msgによって指定されたメッセージが、PostMessageを介して、
//RegistryNotifyWindowと同様にポストされる。PostMessageに対するパラメータは、
//以下のとおりである。
//  WPARAM - REG_DWORDタイプの値について、これは新たな値または値が削除された場
//合、0であり、他のすべてのタイプについて、この値は0である
//  LPARAM - 0
//msgパラメータは、クライアントが複数の通知を区別することができるように、Registr
//yNotifyAppに対する各コールに対して固有でなければならない。クライアントは、値が
//追加されたときならびに変更時に通知を受けることになる。通知が着信したとき、psz
//Appによってポイントされるアプリケーションを起動することができないか、またはpsz
//Classタイプのクラスを有するウインドウを見つけることができないか、またはPostMes
//sageが失敗した場合、通知は通知リストから削除されることになる。
//
//***********************************************************
HRESULT WINAPI RegistryNotifyApp(HKEY hKey,
LPCTSTR pszSubKey,
LPCTSTR pszValueName,
LPCTSTR pszName,
LPCTSTR pszApp,
LPCTSTR pszClass,
LPCTSTR pszWindow,
UINT msg,
NOTIFICATIONCONDITION * pCondition);
//***********************************************************
//関数名：RegistryNotifyWindow
//
//目的：指定された値が変更されたとき、ウインドウが通知を受けることを要求するのに
//使用
//
//引数：
//IN HKEY hKey - 現在開いているキーに対するハンドル、または所定のルート値
//IN LPCTSTR pszSubKey - 値が格納されるキー（この値がNULLである場合、pszValue
//NameがhKeyにあるものと想定される）
//IN LPCTSTR pszValueName - 変化通知が要求される値の名前（既定値を示すためにNUL
//Lとすることができる）
//IN HWND hWnd - メッセージが送られることになるウインドウのハンドル
//IN UINT msg - ウインドウに渡されることになるメッセージ
//IN DWORD dwUserData - 通知とともにユーザに返送されることになるユーザデータ
//IN NOTIFICATIONCONDITION * pCondition - 新たなレジストリ値に対する条件の比較が
//真であるときに変化通知が送られるべき条件（いかなる変化も通知をもたらすべきこと
//を示すためにNULLとすることができる）
//OUT HREGNOTIFY * phNotify - 通知要求に対するハンドルを受け取る。このハンドルは
//、このキーに関する通知がもはや必要とされないとき、RegistryCloseNotificationを
//使用して閉じられなければならない。
//
//戻り値：
//HRESULT
//S_OK - 通知の要求が、通知リストに追加された
//E_INVALIDARG - hKey、phNotify、またはhWndが無効である
//エラー値はFACILITY_WIN32 HRESULTとしてラップ
//
//結果：
//SUCCEEDED - これでこの値の変更が行われるたびに、呼び出し元が通知を受けること
//になる。
//FAILED - 変化なし
//
//説明：
//msgパラメータは、クライアントが複数の通知を区別することができるように、Registr
//yNotifyWindowに対する各コールに対して固有でなければならない。通知要求が、通知
//リストに追加される。呼び出し元が、RegistryCloseNotificationをコールして、さら
//なる通知を停止し、通知ハンドルを閉じる。このタイプの通知要求は、一時的である、
//つまり、デバイスがリセットされた場合、通知要求はもはや存在しないことになる。
//pszValueNameによって指定された値が変更されると、クライアントが、PostMessageを
//介して通知を受ける。PostMessageが失敗するか、またはhWndによって指定されたウイ
//ンドウがもはや有効ではない場合、通知要求が通知キューから削除され、phNotifyにお
//いて戻されたハンドルが閉じられる。
//PostMessage上で渡されるパラメータは、以下のとおりである。
//  WPARAM - REG_DWORDタイプの値について、これは新たな値または値が削除された場
//合、0であり、他のすべてのタイプについて、この値は0である
//  LPARAM  dwUserData上で渡される値
//RegistryNotifyWindowに対するコールの時点で値が存在しない場合、クライアントは、
//値が追加されたときに通知を受けることになる。
//
//***********************************************************
HRESULT WINAPI RegistryNotifyWindow(HKEY hKey,
LPCTSTR pszSubKey,
LPCTSTR pszValueName,
HWND hWnd,
UINT msg,
DWORD dwUserData,
NOTIFICATIONCONDITION * pCondition,
HREGNOTIFY * phNotify);
//***********************************************************
//関数名：RegistryNotifyMsgQueue//
//目的：指定された値が変更されたときにメッセージキューが通知を受けるように要求す
//るのに使用
//
//引数：
//IN HKEY hKey - 現在開いているキーに対するハンドル、または所定のルート値
//IN LPCTSTR pszSubKey - 値が格納されるキー（この値がNULLである場合、pszValue
//NameがhKeyにあるものと想定される）
//IN LPCTSTR pszValueName - 変化通知が要求される値の名前（既定値を示すためにNUL
//Lとすることができる）
//IN LPCTSTR pszMsgQueue - 通知すべきメッセージキューの名前である文字列に対する
//ポインタ。このメッセージキューがまだ作成されていない場合、RegistryNotifyMsgQue
//ueがそのキューを作成することになる。
//IN DWORD dwUserData - 通知とともにユーザに返送されることになるユーザデータ
//IN NOTIFICATIONCONDITION * pCondition - 新たなレジストリ値に対する条件の比較が
//真である場合に変化通知が送られるべき条件（いかなる変化も通知をもたらすべきこと
//を示すためにNULLとすることができる）
//OUT HREGNOTIFY * phNotify - 通知要求に対するハンドルを受け取る。このハンドルは
//、このキーに関する通知がもはや必要とされないとき、RegistryCloseNotificationを
//使用して閉じられなければならない。
//
//戻り値：
//HRESULT
//S_OK - 通知の要求が、通知リストに追加された
//E_INVALIDARG - hKey、phNotify、またはpszMsgQueueが無効である
//エラー値はFACILITY_WIN32 HRESULTとしてラップ
//
//結果：
//SUCCEEDED - これでこの値の変更が行われるたびに、呼び出し元が通知を受けること
//になる。
//FAILED - 変化なし
//
//説明：
//通知要求が、通知リストに追加される。呼び出し元が、RegistryCloseNotificationを
//コールして、さらなる通知を停止し、通知ハンドルを閉じる。このタイプの通知要求は
//、一時的である。つまり、デバイスがリセットされた場合、通知要求はもはや存在しな
//いことになる。クライアントは、メッセージキューを介して変更について通知されるこ
//とになる。クライアントが通知を受けると、ReadMsgQueue関数を使用して変更されたキ
//ーに関する情報を取り出すことができる。戻されるデータは、以下のフォーマットであ
//る。
//|HREGNOTIFY hNotify|DWORD dwUserData|UINT byte count|BYTE[] new value|
//hNotify - phNotifyにおいて戻されるのと同じhNotify
//dwUserData - dwUserDataとして渡されるユーザデータ
//byte count - 後に続くバイトの数（削除の場合、この値は0）
//new value - pszValueNameの新たな値
//RegistryNotifyMsgQueueに対するコールの時点で値が存在しない場合、クライアントは
//、値が追加されたときに通知を受けることになる。
//
//***********************************************************
HRESULT WINAPI RegistryNotifyMsgQueue(HKEY hKey,
LPCTSTR pszSubKey,
LPCTSTR pszValueName,
LPCTSTR pszMsgQueue,
DWORD dwUserData,
NOTIFICATIONCONDITION * pCondition,
HREGNOTIFY * phNotify);
//***********************************************************
//関数名：RegistryNotifyCallback
//
//目的：指定された値が変更された場合、コールバックが通知を受けるように要求するの
//に使用
//
//引数：
//IN HKEY hKey - 現在開いているキーに対するハンドル、または所定のルート値
//IN LPCTSTR pszSubKey - 値が格納されるキー（この値がNULLである場合、pszValue
//NameがhKeyにあるものと想定される）
//IN LPCTSTR pszValueName - 変化通知が要求される値の名前（既定値を示すためにNUL
//Lとすることができる）
//IN REGISTRYNOTIFYCALLBACK pfnRegistryNotifyCallback - 通知が着信したときに
//コールバックされることになる関数に対するポインタ
//IN DWORD dwUserData - 通知とともにユーザに返送されることになるユーザデータ
//IN NOTIFICATIONCONDITION * pCondition -新たなレジストリ値に対する条件の比較が
//真である場合に変化通知が送られるべき条件（いかなる変化も通知をもたらすべきこと
//を示すためにNULLとすることができる）
//OUT HREGNOTIFY * phNotify - 通知要求に対するハンドルを受け取る。このハンドルは
//、このキーに関する通知がもはや必要とされないとき、RegistryCloseNotificationを
//使用して閉じられなければならない。
//
//戻り値：
//HRESULT
//S_OK - 通知の要求が、通知リストに追加された
//E_INVALIDARG - hKey、phNotify、またはpfnRegistryNotifyCallbackが無効である
//エラー値はFACILITY_WIN32 HRESULTとしてラップ
//
//結果：
//SUCCEEDED - これでこの値の変更が行われるたびに、呼び出し元が通知を受けること
//になる。
//FAILED - 変化なし
//
//説明：
//通知要求が、通知リストに追加される。呼び出し元が、RegistryCloseNotificationを
//コールして、さらなる通知を停止し、通知ハンドルを閉じる。このタイプの通知要求は
//、一時的である。つまり、デバイスがリセットされた場合、通知要求はもはや存在しな
//いことになる。クライアントは、コールバックを介して変更について通知されることになる。RegistryNotifyCallbackに対するコールの時点で値が存在しない場合、クライアン
//トは、値が追加されたときに通知を受けることになる。
//
//***********************************************************
HRESULT WINAPI RegistryNotifyCallback(HKEY hKey,
LPCTSTR pszSubKey,
LPCTSTR pszValueName,
REGISTRYNOTIFYCALLBACK pfnRegistryNotifyCallback,
DWORD dwUserData,
NOTIFICATIONCONDITION * pCondition,
HREGNOTIFY * phNotify);
//***********************************************************
//関数名：RegistryCloseNotification
//
//目的：通知の要求を通知リストから削除し、通知ハンドルを閉じるのに使用
//
//引数：
//IN HREGNOTIFY hNotify - 有効なHREGNOTIFYに対するハンドル、RegistryNotify*関数
//の１つが戻されていなければならない
//
//戻り値：
//HRESULT
//S_OK - 通知要求がリストから削除された
//E_INVALID_HANDLE - hNotifyが無効である
//エラー値はFACILITY_WIN32 HRESULTとしてラップ
//
//結果：
//SUCCEEDED - 通知要求が削除され、これで、hNotifyは無効なハンドルである
//FAILED - 変化なし
//
//説明：
//hNotifyに対する参照について通知リストを探索し、見つかった場合、キューから削除
//され、hNotifyに関連付けられたメモリが解放される。クライアントにまだ発送されて
//いないあらゆる通知は、失われることになる。
//
//***********************************************************
HRESULT WINAPI RegistryCloseNotification(HREGNOTIFY hNotify);
//***********************************************************
//関数名：RegistryStopNotification
//
//目的：永久的通知の要求を通知リストから削除するのに使用
//
//引数：
//IN LPCTSTR pszName - 既に登録されている永久的通知を表す文字列
//
//戻り値：
//HRESULT
//S_OK - 通知要求がリストから削除された
//E_INVALIDARG - pszNameが無効である
//エラー値はFACILITY_WIN32 HRESULTとしてラップ
//
//結果：
//SUCCEEDED - 通知要求が削除された
//FAILED - 変化なし
//
//説明：
//通知に対する参照について通知リストを探索し、見つかった場合、キューから削除され
//る。クライアントにまだ発送されていないあらゆる通知は、失われることになる。
//
//***********************************************************
HRESULT WINAPI RegistryStopNotification(LPCTSTR pszName);
//***********************************************************
//関数名：RegistryBatchNotification//
//目的：頻繁に発生する通知をバッチ化するのに使用
//
//引数：
//IN HREGNOTIFY hNotify - RegistryNotify*関数の１つが戻された有効なHREGNOTIFYに
//対するハンドル
//IN DWORD dwMillisecondsIdle - 通知が発せられる前に値が一定でなければならない
//ミリ秒数
//IN DWORD dwMillisecondsMax - 最初の変化が生じた時と通知が送られた時の間の最大
//ミリ秒数
//
//戻り値：
//HRESULT
//S_OK - 通知要求がリストから削除された
//E_INVALIDARG - dwMillisecondsIdleがINFINITEに設定される
//E_INVALID_HANDLE - hNotifyが無効である
//エラー値はFACILITY_WIN32 HRESULTとしてラップ
//
//結果：
//SUCCEEDED - 新たなバッチ時刻が設定された
//FAILED - 変化なし
//
//説明：//値が変更されると、通知システムは、dwMillisecondsIdleミリ秒間待ち、その後、通知
//を送る。その待ち時間中に別の変化が生じた場合、タイマがリセットされ、通知システ
//ムは、通知を送るのにさらにdwMillisecondsIdleミリ秒間待つことになる。dwMillisec
//ondsIdleにより、通知がずっと送られるのを妨げられることがないようにするため、
//dwMillisecondsMaxが使用される。dwMillisecondsMaxは、最初の通知が着信した時と通
//知が送られた時から経過しうる最大ミリ秒数である。dwMillisecondsMaxが、INFINITE
//に設定された場合、通知は、値がアイドルになるまでバッチ化される。DwMilliseconds
//は、INFINITEとすることはできない。
//
//***********************************************************
HRESULT WINAPI RegistryBatchNotification(HREGNOTIFY hNotify,
DWORD dwMillisecondsIdle,
DWORD dwMillisecondsMax);
HRESULT WINAPI RegistryScheduleNotifications(SYSTEMTIME * pstStart,
DWORD dwIntervalMinutes,
RSN_BEHAVIOR rsnBehavior,
LPCTSTR pszName,
LPCTSTR pszApp,
LPCTSTR pszClass,
LPCTSTR pszWindow,
UINT msg);
【００６２】
（管理されたＡＰＩ）
以下は、例示的な管理されたＡＰＩである。
namespace A.Mobile
{
///デバイスがスタンバイ状態にある間にイベントが生じたときに、何が発生するべきか
///を指定するのに使用
public enum StandbyBehavior
{
///イベントを全く生じさせない
Ignore,
///デバイスをスタンバイ状態から戻し、イベントを生じさせる
Wake,
///別の何らかによってデバイスがウェークアップされると、イベントを生じさせる
Delay
}
public interface IAppLaunchable
{
///この通知の固有名
public string appLaunchId{get;}
///特定の実行可能ファイルおよびコマンドラインパラメータについてこの通知を登録する
///これがコールされるまで、通知はアクティブでない
///<param name=“appLaunchId”>
///この通知の固有識別子
///アプリケーションが閉じた／再起動したときに、バックアップで開くのに使用される
///このＩＤが既に使用中である場合、例外がスローされる
///</param>
///<param name=“filename”>
///通知が生じたときに起動するアプリケーション
///NULLまたは空である場合、呼び出し実行可能ファイルが使用される
///</param>
///<param name=“parameters”>アプリケーションに送るコマンドライン</param>
void EnableAppLaunch(string appLaunchId, string filename, string parameters);
///コマンドラインパラメータなしで特定の実行可能ファイルについてこの通知を登録する
///これがコールされるまで、通知はアクティブではない
///<param name=“appLaunchId”>
///この通知の固有識別子
///アプリケーションが閉じた／再起動したときに、バックアップで開くのに使用される
///このＩＤが既に使用中である場合、例外がスローされる
///</param>
///<param name=“filename”>通知が生じたときに起動するアプリケーション</param>
void EnableAppLaunch(string appLaunchId, string filename);
///パラメータなしで呼び出し実行可能ファイルについてこの通知を登録する
///これがコールされるまで、通知はアクティブではない
///
///これが、EXEではなくDLLからコールされた場合、例外がスローされる
///DLLは、その他のオーバーロードの１つをコールする必要がある
///<param name=“appLaunchId”>
///この通知の固有識別子
///アプリケーションが閉じた／再起動したときに、バックアップで開くのに使用される
///このＩＤが既に使用中である場合、例外がスローされる
///</param>
void EnableAppLaunch(string appLaunchId);
///この通知を登録解除する
///通知が発せられるのを止めるのに使用される
void DisableAppLaunch();
}
///スケジュールベースで生じる通知
public class ScheduledNotification : ILaunchable
{
//この通知の次の発生が、いつ生じるようにスケジュールされるか
public DateTime NextOccurrence{get;set;}
///この通知の発生と発生の間にどれだけの時間が経過するか
///秒およびミリ秒が無視される
public TimeSpan Interval{get;set;}
///発生中にデバイスがスタンバイ状態にあるとき、この通知がどのように働くか
///無視する、デバイスをウェークする、他の何かがデバイスをウェークするまで待つ
///既定値は、Wakeである
public StandbyBehavior StandbyBehavior{get;set;}
///名前付き通知が登録されているかどうかを判定する
///<param name=“appLaunchId”>通知の名前</param>
///<returns>通知が登録されている場合、真</returns>
public static bool AppLaunchIdExists(string appLaunchId){}
public event EventHandler Occurred;
///所与の名前を有する新たな永続的通知を作成する
///<param name=“nextOccurrence”>次の発生がいつであるか</param>
///<param name=“interval”>発生と発生の間がどれだけの期間か。秒およびミリ秒が無視される</param>
public ScheduledNotification(DateTime nextOccurrence,TimeSpan interval){}
///以前に登録された通知にロードするコンストラクタ
///<param name=“existingAppLaunchId”>以前に登録された通知の名前</param>
public ScheduledNotification(string existingAppLaunchId)
{
if(!AppLaunchIdExists(name))
throw new ArgumentException();
}
}
}
namespace A.Mobile.Status
{
///新たな値が所望の値とどのように比較されるべきかを指定する条件付き変化通知に使用される
public enum StateComparisonType
{
///値にかかわらずイベントが生ぜられる。これが既定である
All,
Equal,
NotEqual,
Greater,
GreaterOrEqual,
LessOrEqual,
Less,
Contains,
StartsWith,
EndsWith
}
///照会を行い、リッスンすることができるシステム状態のすべてを表す列挙
public abstract class StateBase : ILaunchable
{
///条件付き通知について、新たな値をどのようにTargetValueと比較するか
public ComparisonType ComparisonType{get;set;}
///新たな値を何と比較するか。比較が真である場合にだけ、通知が生じる
public object ComparisonValue{get;set;}
///このシステムプロパティの現在の値
public object CurrentValue{get;}
public event ChangeNotificationEventHandler Changed;
}
///システム定義のプロパティが変化したときに生じる一時的通知
public class SystemState : StateBase
{
///指定されたシステムプロパティの値を取得する
///<param name=“property”>値を取得するプロパティ</param>
///<returns></returns>
public static object GetValue(SystemProperty property){}
///モニタするシステムプロパティ
public SystemProperty Property{get;}
///名前付き通知が登録されているかどうかを判定する
///<param name=“appLaunchId”>通知の名前</param>
///<returns>通知が登録されている場合、真</returns>
public static bool AppLaunchIdExists(string appLaunchId){}
///条件付けなしのコンストラクタ（常にイベントが生ぜられる）
///<param name=“property”></param>
public SystemState(SystemProperty property){}
///イベントが生ぜられるべきときの条件付けを設定するコンストラタ
///<param name=“property”>監視すべきプロパティ</param>
///<param name=“comparisonType”>どのように比較するか</param>            ///<param name=“comparisonValue”>何と比較するか</param>
public SystemState(SystemProperty property,ComparisonType comparisonType,object comparisonValue){}
///以前に登録された通知にロードするコンストラクタ
///<param name=“existingAppLaunchId”>以前に登録された通知の名前</param>
public SystemState(string existingAppLaunchId)
{
if(!AppLaunchIdExists(name))
throw new ArgumentException();
}
}
///レジストリ値が変化したときに生じる一時的通知
public class RegistryValue : StateBase
{
///モニタすべきレジストリ値
public RegistryKey Key{get;}
///モニタすべきレジストリキーにおける値の名前
public string ValueName{get;}
///名前付き通知が登録されているかどうかを判定する
///<param name=“appLaunchId”>通知の名前</param>
///<returns>通知が登録されている場合、真</returns>
public static bool AppLaunchIdExists(string appLaunchId){}
///条件付けなしのコンストラクタ（常にイベントが生ぜられる）
///<param name=“key”>監視すべきレジストリキー</param>
///<param name=“valueName”>監視すべきキーにおけるレジストリ値の名前</param>
public RegistryValue(RegistryKey key,string valueName){}
///イベントが生ぜられるべきときの条件付けを設定するコンストラクタ
///<param name=“key”>監視すべきレジストリキー</param>
///<param name=“valueName”>監視すべきキーにおけるレジストリ値の名前</param>
///<param name=“comparisonType”>どのように比較するか</param>
///<param name=“comparisonValue”>何と比較するか</param>
public RegistryValue(RegistryKey key,string valueName,
ComparisonType comparisonType,object comparisonValue){}
///以前に登録された通知にロードするコンストラクタ
///<param name=“existingAppLaunchId”>以前に登録された通知の名前</param>
public RegistryValue(string existingAppLaunchId)
{
if(!AppLaunchIdExists(name))
throw new ArgumentException();
}
}
public delegate void ChangeNotificationEventHandler(object sender,
ChangeNotificationEventArgs e);
public class ChangeNotificationEventArgs : EventArgs
{
public object CurrentValue{get;}
}
}
【００６３】
（管理されたＡＰＩの使用例）
//システムプロパティを照会する
int signal=SystemState.PhoneSignalStrength;
//または．．．
int signal=(int)SystemState.GetValue(SystemProperty.PhoneSignalStrength);
//または．．．
SystemState state=new SystemState(SystemProperty.PhoneSignalStrength);
int signal=(int)state.CurrentValue;
――――――――――――――――――――――――――――――――――――――――
//一時的通知の登録
SystemState state=new SystemState(SystemProperty.PhoneSignalStrength);
state.Changed+=new ChangeNotificationEventHandler(...);
――――――――――――――――――――――――――――――――――――――――//条件付けを有する永続的通知の登録
SystemState state;
if(SystemState.AppLaunchIdExists("MyApp.GoodSignal"))
{
state=new SystemState("MyApp.GoodSignal");
}
else
{
state=new SystemState(SystemProperty.PhoneSignalStrength,
ComparisonType.Greater,75);
state.EnableAppLaunch("MyApp.GoodSignal");
}
state.Changed+=new ChangeNotificationEventHandler(...);
――――――――――――――――――――――――――――――――――――――――//スケジュールされた通知の登録
ScheduledNotification daily;
if(ScheduledNotification.AppLaunchIdExists("MyApp.Daily"))
{
daily=new ScheduledNotification("MyApp.Daily");
}
else
{
daily=new ScheduledNotification(DateTime.Now,new TimeSpan(24,0,0));
daily.EnableAppLaunch("MyApp.Daily");
}
daily.Occurred+=new EventHandler(...);
【００６４】
上記の明細、例およびデータは、本発明の構成の製造および使用の完全な説明を提供している。本発明の多くの実施形態は、本発明の趣旨および範囲を逸脱することなく、実施することができるので、本発明は、本明細書に添付された特許請求の範囲に存する。
【図面の簡単な説明】
【００６５】
【図１】例示的なコンピューティングデバイスを示す図である。
【図２】例示的なモバイルデバイスを示す図である。
【図３】例示的な状態管理−通知システムを示す図である。
【図４】状態変化通知システムのプロセスを示す図である。
【図５】本発明の態様による、状態変化情報を処理するためのプロセスを示す図である。
【符号の説明】
【００６６】
１００  コンピューティングデバイス
１０２  処理装置
１０４  システムメモリ
１０５  オペレーティングシステム
１０６  プログラムモジュール
１０７  プログラムデータ
１０９  リムーバブルなストレージ
１１０  リムーバブルでないストレージ
１１２  入力デバイス
１１４  出力デバイス
１１６  通信接続
１１８  他のコンピューティングデバイス
２００  モバイルデバイス
２２８  ディスプレイ
２３２  キーパッド
２４０  通信接続
２６０  プロセッサ
２６２  メモリ
２６６  アプリケーション
２６８  ストレージ
２７０  電源
２７２  無線インタフェースレイヤ
２７４  オーディオインタフェース
３００  通知システム
３１０  状態変化コンポーネント
３１５  クライアント
３２０  クライアント
３３０  データストア
３３５  通知ブローカ
３４０  通知リスト
３４５  キャッシュプロパティ
３５０  スケジューラ
【図１】
0004790245.tif 000002
【図２】
0004790245.tif 000003
【図３】
0004790245.tif 000004
【図４】
0004790245.tif 000005
【図５】
0004790245.tif 000006