既定のアプリケーションの管理

コンピューターごとの既定値を管理するために、 プログラム アクセスとコンピューターの既定値の設定 (SPAD) 機能が Windows XP 以降のバージョンの Windows に追加されました。 SPAD に加えて、Windows Vista では、ユーザーごとの既定のアプリケーションの概念と、コントロール パネルの [既定のプログラム] 項目が導入されました。

重要

このトピックは、Windows 10には適用されません。 Windows 10で既定のファイルの関連付けが機能する方法が変更されました。 詳細については、この記事「既定のアプリWindows 10処理する方法の変更」のセクションを参照してください。

 

ユーザーごとの既定の設定は、システム上の個々のユーザー アカウントに固有です。 ユーザーごとの既定の設定が存在する場合は、そのアカウントの対応するコンピューターごとの既定値よりも優先されます。 Windows 8の時点では、ファイルの種類とプロトコルの既定値の拡張システムは厳密にユーザーごとであり、コンピューターごとの既定値は無視されます。 SPAD は、Windows 8でユーザーごとの既定値を設定するようにも変更されました。

  • Windows 8より前のバージョンの Windows を実行しているシステムでは、新しく作成されたユーザー アカウントは、ユーザーごとの既定値が確立されるまでコンピューターごとの既定値を受け取ります。 Windows Vista 以降では、ユーザーはコントロール パネルの [既定のプログラム] 項目を使用して、ユーザーごとの既定値を設定または変更できます。 さらに、アプリケーションを初めて実行する場合は、「 Application First Run and Defaults 」セクションのガイドラインに従って、ユーザーごとの既定値を設定できます。
  • Windows 8を実行しているシステムでは、新しく作成されたユーザー アカウントは最初からユーザーごとの既定値に依存し、「アプリケーションの初回実行と既定値」セクションで説明されているように、最初の実行時にこれらの既定値の設定はサポートされなくなりました。

アプリケーションは、WINDOWS Vista 以降の既定のプログラムとして提供される SPAD と既定のプログラム機能の両方に登録する必要があります。

このトピックでは、独立系ソフトウェア ベンダー (ISV) に、Windows Vista 以降でアプリケーションの既定値を登録および管理するために必要な手順のクイック ガイドを提供します。 各セクションのトピックに関する詳細な記事へのリンクが提供されています。

コントロール パネルの既定のプログラム項目

既定のプログラムは、Windows Vista で導入された機能で、[スタート] メニューとコントロール パネルから直接アクセスできます。 これは、標準のユーザー特権 (昇格されていない) で動作する新しいインフラストラクチャを提供し、ユーザーとアプリケーションがユーザーごとの既定値を管理できるように設計されています。 ユーザーの場合、既定のプログラムは、システム上のすべてのアプリケーションの既定値、ファイルの関連付け、自動再生の設定を管理するための統一された、簡単にアクセスできる方法を提供します。 アプリケーションの場合、既定のプログラム API によって提供されるユーザーごとのスコープを使用すると、次の利点があります。

  • 昇格なし

    アプリケーションは、既定値を要求するために特権を昇格する必要はありません。

  • 良い市民権

    複数ユーザー コンピューターでは、各ユーザーが異なる既定のアプリケーションを選択できます。

  • 既定の管理

    既定のプログラム API は、レジストリに直接書き込むことなく、既定の状態を自己チェックし、失われた設定を再利用するための信頼性の高い一貫性のあるメカニズムを提供します。 ただし、Windows 8の時点では、アプリケーションは既定の設定を変更できなくなったため、アプリケーションが既定の状態を照会することはお勧めしません。これらの変更はユーザーのみが行うことができます。

アプリケーションで既定値を効果的に管理できるようにするには、アプリケーションを既定のプログラムとして登録する必要があります。 既定のプログラム API の登録と使用の詳細については、「既定の プログラム」を参照してください。

既定のプログラムには、次の 2 つの機能も用意されています。

  • 再利用可能な既定値の UI

    プログラムの既定値 (既定のプログラムの設定) とファイルの関連付け (ファイルの種類またはプロトコルをプログラムに関連付ける) の両方の UI を再利用し、アプリケーション内から呼び出すことができます。 これにより、アプリケーションは既定値を管理するための標準的なユーザー エクスペリエンスを提供し、ISV がカスタムまたは同等の UI を開発する必要をなくします。

  • URL とマーケティング情報の含める

    コントロール パネルの [既定のプログラム] 項目の [既定のプログラムの設定] ページの一部として、アプリケーションはマーケティング情報とベンダーの Web サイトへのリンクを提供できます。 この URL は、アプリケーションが署名された Authenticode 証明書から派生します。 これにより、このリンクの誤用と未承認の置き換えが防止されます。 アプリケーションに、埋め込み URL を含む Authenticode 証明書がある場合、Windows UI にその埋め込み URL が表示されます。 ISV は、この機能を利用して、更新プログラムやその他のダウンロードのためにユーザーを Web サイトに誘導する必要があります。

プログラム アクセスとコンピューターの既定値を設定する

プログラム アクセスとコンピューターの既定値 (SPAD) を設定すると、管理者は、そのコンピューターのすべての新しいユーザーによって継承されるコンピューター全体の既定値を管理できます。 Windows 8より前の SPAD では、システムからプログラムが削除されたときにファイルの関連付けが壊れた場合に、管理者がファイルの関連付けを修復することも可能でした。 ただし、Windows 8時点では、SPAD はユーザー固有の既定値にのみ影響します。

SPAD でのアプリケーションの登録の詳細については、「 Set Program Access and Computer Defaults (SPAD) の使用」およびクライアントの種類を使用したプログラムの登録」を参照してください。 具体的な変更と新しい推奨事項については、以下のセクションで説明します。

SPAD での既定値の設定

ユーザーごとの既定値は、コンピューターごとの既定値をオーバーライドします。

  • Windows 8前: SPAD で設定された既定値 (コンピューターごと) は、対応するユーザーごとの既定値が設定されている場合、ユーザーには表示されません。 ユーザーがユーザーごとの既定値を設定していない場合、システムは対応するコンピューターの既定値を使用します。 コンピューター上の新しいユーザー アカウントは、最初にコンピューターの既定値を継承します。 ユーザーが初めてアプリケーションを実行する場合、アプリケーションはユーザーごとに既定値を割り当てるようユーザーに求めるメッセージを表示する必要があります。 「 アプリケーションの初回実行」と「既定値」を参照してください
  • Windows 8時点: すべての既定値はユーザーごとであり、コンピューターごとの既定の設定はすべて無視されます。 アプリケーションは既定の選択肢を設定できなくなったため、ユーザーがそれらの既定値を割り当てる手順を実行できなくなります。

Windows 8前のアプリケーションが SPAD で既定として設定を実装する場合は、次のガイドラインに従う必要があります。

  • アプリケーションでは、SPAD を介してコンピューター レベルの既定値のみを要求する必要があります。
  • アプリケーションでは、SPAD を使用してユーザーごとの既定値を要求 しないでください

Windows 8 アプリケーションが SPAD で既定として設定を実装する場合、SPAD で使用されているのと同じアプリケーション名を使用して、ファイルの種類とプロトコルを既定のプログラムに登録する必要があります。 これにより、SPAD の変更は、現在のユーザーの対応する既定のプログラム エントリの変更として反映されます。

SPAD でアクセスを非表示にする

SPAD で使用可能な各既定値の [アクセスの非表示] オプションには、次の 2 つの方法のいずれかでアクセスできます。

  • 既定値の [Microsoft 以外 ] カテゴリを選択すると、すべての Microsoft の既定値へのアクセスが削除されます。
  • [カスタム] カテゴリを選択し、[このプログラムへのアクセスを有効にする] チェックボックスをオフにします。

以前は、これらのアクションのいずれかを実行すると、システム上の適切なアプリケーションへのすべてのエントリ ポイントが削除されました。 この状況の具体的なガイドラインでは、次の場所からショートカットとアイコンを削除するとします。

  • デスクトップ
  • [スタート] メニュー
  • サイド リンク バー (Windows Vista 以前のみ)
  • [通知] 領域
  • ショートカット メニュー
  • フォルダー タスク バンド

ベンダーは、アプリケーションの Hide Access コールバック関数にこれらのガイドラインを実装することをお勧めします。

SPAD の代替非表示アクセス方法

一部のレガシ アプリケーションでは、Hide Access の完全な実装が実用的でない場合があります。 同じ効果を実現するが、ユーザーが簡単に元に戻すことはできない別の方法は、アプリケーションをアンインストールすることです。 これを実装するサンプルの動作とコード例を次に示します。

この代替手段に推奨されるユーザー エクスペリエンスは次のとおりです。

  • ユーザーが SPAD の [ このプログラムへのアクセスを有効にする ] ボックスをオフにすると、次の UI が表示されます。

    プログラムへのアクセスの非表示に関する vista ダイアログ ボックス

  • ユーザーが [OK] をクリックすると、ユーザーがアプリケーションをアンインストールできるように、コントロール パネルの [プログラムと機能] 項目が表示されます。

  • Windows XP ユーザーには、次のダイアログ ボックスが表示されます。

    プログラムへのアクセスを非表示に関するWindows XPダイアログボックス

  • Windows XP ユーザーが [OK] をクリックすると、ユーザーがアプリケーションをアンインストールできるように、コントロール パネルの [プログラムの追加と削除] 項目が表示されます。

次のコードは、前に説明したように、Access の非表示機能の再利用可能な実装を提供します。 Windows XP、Windows Vista、Windows 7 で使用できます。

#include <windows.h>
#include <shlwapi.h>
#include <strsafe.h>

PCWSTR c_pszMessage1 = L"To hide access to this program, you need to uninstall it by ";
PCWSTR c_pszMessage2 = L"using\n%s in Control Panel.\n\nWould you like to start %s?";
PCWSTR c_pszApplicationName  = L"Sample App";

int _tmain(int argc, WCHAR* argv[])
{
    OSVERSIONINFO version;
    version.dwOSVersionInfoSize = sizeof(version);

    if (GetVersionEx(&version))
    {
        PCWSTR pszCPLName = NULL;

        if (version.dwMajorVersion >= 6)
        {
            // Windows Vista and later
            pszCPLName = L"Programs and Features";
        }
        else if (version.dwMajorVersion == 5 &&
                 version.dwMinorVersion == 1)
        {
            // XP
            pszCPLName = L"Add/Remove Programs";
        }

        if (pszCPLName != NULL)
        {
            WCHAR szMessage[256], szScratch[256];
            if (SUCCEEDED(StringCchPrintf(szScratch, 
                                          ARRAYSIZE(szScratch), 
                                          c_pszMessage2, 
                                          pszCPLName, 
                                          pszCPLName)))
            {
                if (SUCCEEDED(StringCchCopy(szMessage, 
                                            ARRAYSIZE(szMessage), 
                                            c_pszMessage1)))
                {
                    if (SUCCEEDED(StringCchCat(szMessage, 
                                               ARRAYSIZE(szMessage), 
                                               szScratch)))
                    {
                        if (IDOK == MessageBox(NULL, 
                                               szMessage, 
                                               c_pszApplicationName, 
                                               MB_OKCANCEL))
                        {
                            ShellExecute(NULL, 
                                         NULL, 
                                         L"appwiz.cpl", 
                                         NULL, 
                                         NULL, 
                                         SW_SHOWNORMAL);
                        }
                    }
                }
            }
        }
    }
    return 0;
}

アプリケーション エントリ ポイントの登録

アプリケーションには、オペレーティング システム内に多数のエントリ ポイントを含めることができます。 エントリ ポイントに推奨される場所を次に示します。

  • デスクトップ
  • [スタート] メニュー
  • サイド リンク バー (Windows Vista 以前のみ)
  • [通知] 領域
  • ショートカット メニュー
  • フォルダー タスク バンド

このセクションでは、次の特定の領域に焦点を当てます。

[ファイルを開くアプリケーションの選択]

[ ファイルを開く ] ショートカット メニューを使用すると、ユーザーは特定のファイルの種類を処理できるアプリケーションを選択できます。 [で開く] を使用すると、アプリケーションでファイルを 1 回開くことができますが、そのファイル名拡張子の既定値を設定するためにも使用できます。 そのため、アプリケーションは常に Open With に登録して、ユーザーがそのアプリケーションを選択肢として表示するようにする必要があります。 アプリケーションでは、 Open With のファイルの種類とプロトコルの両方を登録できます。 既定のプログラム フレームワークにプロトコルを登録するアプリケーションは、プロトコルの [Open With ] オプションに自動的に追加されます。

Open With への登録の詳細については、「ファイルの関連付けの概要」を参照してください。

スタート メニューとサイド リンク バー

ユーザーが見つけやすくなるため、アプリケーションは Windows のさまざまな場所にショートカットを追加できます。 ショートカットを追加する最も一般的な場所は、[ スタート ] メニューです。 Windows Vista 以降では、アプリケーションによって隠しフォルダー %ProgramData%\Microsoft\Windows\Start Menu\Programs にショートカットが作成され、すべてのユーザーの [スタート ] メニューのプログラムの一覧に表示されます。 通常、アプリケーションはショートカットを含むサブフォルダーを追加します。

ブラウザーおよび電子メール プログラムの場合、Windows Vista の [スタート] メニューには、 正規のインターネット電子メールというタイトルのプログラムリストの外部に 2 つの専用リンクも表示されます。 アプリケーションがこれらのカテゴリに登録されると、既定のプログラム フレームワークは、これらのリンクを使用して起動される内容を管理できます。

注意

インターネット電子メール専用のスタート メニューリンクは、Windows 7 の時点では存在しなくなりました。

 

検出可能性をさらに高めるために、アプリケーションはデスクトップとサイド リンク バーにショートカットを追加することもできます。 アプリケーションでは、 スタート メニュー、デスクトップ、またはサイド リンク バーにアイコンを追加する前に、(通常はインストール中または初回実行時に) アクセス許可をユーザーに要求する必要があります。

注意

クイック起動バーは、Windows 7 以降では使用できません。 Windows 7 の代替手段は、アプリケーションをタスク バーにピン留めすることですが、厳密にはユーザーの選択であるため、プログラムでピン留めすることはできません。

 

詳細については、以下のトピックを参照してください。

アプリケーションのインストールと既定値

Windows XP 以降、アプリケーションのインストール手順は根本的に変更されていません。ただし、Windows 8よりも古いバージョンの Windows を実行しているシステムの新しいガイドラインを除き、インストール時にはコンピューターごとの既定値を使用しますが、ユーザーが最初にアプリケーションを実行するまで、ユーザーごとの既定値は設定されません。 (「 アプリケーションの最初の実行」と「既定値」を参照してください)。アプリケーションのインストール時にユーザーごとの既定値を設定しないでください。アプリケーションをインストールするユーザーが意図したユーザーではない場合があるためです。 Windows 8の時点では、コンピューターごとの既定値はサポートされておらず、アプリケーションはユーザーごとの既定の設定を変更できません。

インストール時に、アプリケーションはバイナリをハード ディスクにコピーし、その ProgID をレジストリに書き込む必要があります。 また、アプリケーションは、処理する候補であるすべてのファイル関連付けに対して、この時点で既定のプログラムと Open With に登録する必要があります。 アプリケーションでは、 OpenWithProgIds サブキーを使用して Open With に登録できます。

詳細については、以下のトピックを参照してください。

アプリケーションのアップグレードと既定値

多くのアプリケーションには、時間の経過と同時に自分自身をアップグレードする機能があります。 このアップグレード手順では、ユーザーに予期しない変更が発生するため、ユーザーごとの既定値の状態を変更しないでください。 ただし、アプリケーションでコンピューター レベルのファイルの関連付けをチェックし、破損している場合は修復できます。

アプリケーションの初回実行と既定値

注意

Windows 8時点では、システムはすべてのアプリケーションに代わってこの手順を処理します。 アプリケーション自体は、クエリを実行したり、既定値を変更したりできなくなります。 ユーザーのみがこれを行うことができます。 そのため、アプリケーションでは、現在の既定値のクエリを実行したり、メカニズムを使用してその既定値を変更したりしないでください。 ただし、アプリケーションは、IApplicationAssociationRegistrationUI インターフェイスの LaunchAdvancedAssociationUI メソッドを呼び出すことによって、コントロール パネルの既定のプログラムへのエントリ ポイントを提供できます。

 

Windows Vista ではユーザーごとの既定値が導入されているため、一般的なファイル名拡張子を競うアプリケーションはすべて、これらの拡張機能を要求するための一般的なユーザー エクスペリエンスを提供することが重要です。 これらの既定値はユーザーのコンテキストで設定されるようになったため、ユーザーがインストール後にプログラムを実行する場合にのみ、既定の可能性として自身を提示する必要があります。

ユーザーごとの既定値を確立するためのガイドラインは次のとおりです。特定のユーザーに対してアプリケーションを初めて実行する場合、そのアプリケーションは、それ自体の既定値とファイルの関連付けのユーザー設定を要求する必要があります。

推奨される UI では、次の 2 つの明確な選択肢をユーザーに提供する必要があります。

  1. アプリケーションが要求するすべての既定値を受け入れます。 このオプションでは、プライバシーや自動更新の設定など、アプリケーションの他の既定のプロパティを設定することもできます。 このオプションを使用すると、アプリケーションは登録されているすべての既定値を要求できます。
  2. 既定の選択とプログラム設定を個別に受け入れるか、受け入れないようにしてカスタマイズします。 このオプションは、ユーザーが既定のオプションを詳細に選択できるようにする追加の UI を示します。

詳細については、「 既定のプログラム」を参照してください。

注意

これは、Windows 8時点ではサポートされていません。

 

アプリケーションが Windows Vista 以降の既定のプログラムに登録されると、特定の API がアプリケーションで使用できるようになります。 たとえば、アプリケーションが既定のプログラムであるかどうかをチェックする必要がある場合があります。 IApplicationAssociationRegistration インターフェイスには、これを行うメソッドが用意されています。

既定値を要求するアプリケーションは、最初にユーザーに要求し、アクセス許可なしで既定値を要求しないようにする必要があります。 ユーザーは、アプリケーションを既定にするか、現在の既定値のままにするかを確認する必要があります。 また、ユーザーが選択した後に、この質問をもう一度行わないオプションも必要です。

詳細については、「 既定のプログラム」を参照してください。

アプリケーションの互換性に関するヒント

このセクションでは、Windows の既定のプログラム エクスペリエンスに関連するいくつかのアプリケーション互換性のヒントを提供します。

Per-User仮想化のトリガーを回避する

ユーザー アカウント制御 (UAC) 環境では、最適なカスタマー エクスペリエンスを実現するために、アプリケーションは常に標準のユーザー権限のみを使用して実行する必要があります。 セキュリティ上の理由から、標準のユーザー特権レベルのアプリケーションは、レジストリの特定の部分と特定のシステム ファイルへの書き込みをブロックされます。 Windows Vista 以降のバージョンの Windows では、アプリケーションの移行に役立つ一時的なアプリケーション互換性 (AppCompat) レイヤーが提供されます。 レジストリまたはシステム ファイルへの書き込みがブロックされた場合、アプリケーションは引き続き実行されますが、システムの機密性の高い領域は変更されません。 ただし、アプリケーションは、長期的なソリューションとして AppCompat テクノロジに依存しないでください。 代わりに、アプリケーションでは、使用可能な多くのツールを使用して、標準のユーザー権限で正常に実行できることを確認する必要があります。 これを実現するにはアプリケーションの再プログラミングが必要な場合がありますが、長期的な互換性のために行う必要があります。

プログラム互換性アシスタントからの AppCompat の警告またはブロックの回避

プログラム互換性アシスタント (PCA) は、Windows Vista 以降で提供されています。 その目的は、互換性の問題を含む古いプログラムをより適切に動作させる自動化された方法を提供することです。 PCA は、既知の問題がないかプログラムを監視します。 問題が検出された場合は、ユーザーに問題を通知し、ユーザーがプログラムを再度実行する前に効果的な解決策を適用するように提供します。 これらの警告やブロックが表示されないようにするには、ISV で使用可能な多くのツールを使用して、アプリケーションが Windows Vista、Windows 7 以降と互換性があることを確認する必要があります。

以前の Windows オペレーティング システム バージョンのサポート

既定のプログラム インフラストラクチャは、Windows Vista より前の Windows オペレーティング システムでは使用できません。 そのため、アプリケーションが新しい既定のプログラム インフラストラクチャに移行する場合は、古いバージョンの Windows との互換性を維持するために、古いアプリケーションの既定のコードを保持する必要があります。 実行するアプリケーションの既定のコードを決定するには、アプリケーションのインストールの一部としてオペレーティング システムのバージョンチェックを実行する必要があります。

Windows XP から Windows Vista 以降へのアップグレードをサポートするには、アプリケーションが Windows XP を実行しているコンピューターにインストールされている場合でも、既定のプログラムに必要なすべてのレジストリ エントリを追加する必要があります。 登録は Windows XP を実行しているコンピューターには影響しませんが、後でコンピューターがアップグレードされた場合、アプリケーションは既に登録され、フレームワークを利用できます。

詳細については、「 OSVERSIONINFO」を参照してください。

その他のリソース

ファイルの関連付けのベスト プラクティス

ファイル関連付けのサンプル シナリオ

既定のプログラム

Set Program Access と Computer Defaults (SPAD) の使用