|
アセンブリ: | Microsoft.WindowsAPICodePack.dll、および |
Microsoft.WindowsAPICodePack.Shell.dll |
なお、このソリューションの既定である Debug 版のビルドをここでは行いましたが、運用環境で使用するならば、Release 版用のビルドを行うことになります。
演習で使用する付属のソース プログラム (サンプル プログラム) のインストール方法
演習で使用するソース プログラムには、特別なインストール方法はありません。入手されたソース プログラムのフォルダー「HOLShell」全体を、任意のパスにコピーしてください。たとえば、C:\ にコピーすれば、演習で作業を行うソース プログラムのパスは、次のようになります。
例 1. C:\HOLShell
なお、演習の本文では、ソース プログラム等の位置を示す際、次のように、ソース プログラムのルート フォルダーに対する相対パスで表記しています。
例 2. Ex1_Starter\Ex1_Starter.sln
この場合、ソース プログラムのフォルダーが例 1 の場所であるなら、絶対パスは次の意味になります。
例 3. C:\HOLShell\Ex1_Starter\Ex1_Starter.sln
なお、演習作業の中で、ソース プログラムに書き込む場合もあるので、作業を行うユーザー アカウントには、ソース プログラムに対して、書き込み可能なアクセス許可を与えてください。
Windows API Code Pack の演習のための準備
この演習では、この後の作業を行いやすくするため、Windows API Code Pack が提供するライブラリを別の場所にコピーしておくことにします。
-
演習用フォルダー HOLTaskbar の中に、dependencies サブフォルダーがあることを確認します。たとえば、演習用フォルダーが C:\ にあれば、dependencies サブフォルダーは次のパスになります。
C:\HOLTaskbar\dependencies
- 前述のパスに、次に挙げるファイルをすべてコピーします。
-
Microsoft.WindowsAPICodePack.dll、Microsoft.WindowsAPICodePack.Shell.dll
(ライブラリの本体の一部であり、「Windows API Code Pack 1.0 の基本的な準備」でビルドしたアセンブリです。)
なお、このアセンブリを Visual Studio のプロジェクトから使用するには、個別にアセンブリへの参照の追加が必要になります。これは、演習の手順の中で行います。
演習の目的
このハンズオンでは、次に挙げた事項を含む、プログラムからライブラリを制御する方法を学びます。
- 任意のロケーションに、ライブラリを新規作成する
- 既存のライブラリを開く
- ライブラリにフォルダーを追加し、削除する
- ライブラリの既定の保存フォルダーを設定する
- ライブラリのプロパティを設定する (たとえば、フォルダーの種類、アイコン、ナビゲーション ペインに常に表示させるなど)
- 管理用のダイアログ ボックスを表示する
ページのトップへ
2. 練習 1: ライブラリ操作ツールの作成
この練習で作成する「ライブラリ操作ツール」(SLUtil) は、既定のライブラリのディレクトリに対して、ライブラリの管理を行うコマンド ライン ツールです。たとえば、コマンド ラインから、次のようにコマンドを実行して、ライブラリに対して、参照や編集を行います。
SLUtil Create LibraryName
SLUtil AddFolder LibraryName FolderPath
SLUtil RemoveFolder LibraryName FolderPath
SLUtil ShowInfo [LibraryName]
SLUtil FolderType LibraryName [Documents|Pictures|Music|Videos]
SLUtil SaveFolder LibraryName [FolderPath]
SLUtil NavPanePinnedState LibraryName [TRUE|FALSE]
SLUtil Icon LibraryName [Icon]
SLUtil ManageUI Videos
SLUtil ? [CommandName]
ページのトップへ
タスク 1 - SLUtil プロジェクトを準備する
- Visual Studio 2008 を起動して、プロジェクトを新規に作成するため、メニュー バーから、[ファイル]、[新規作成]、[プロジェクト] の順にクリックします。(エディションによって、多少操作が異なる場合があります。)
- [新しいプロジェクト] ダイアログ ボックスが表示されたら、次に示す各項を指定し、Visual C# のプロジェクトを新規作成します。
- プロジェクト テンプレート: コンソール アプリケーション
- プロジェクト名: SLUtil
- 場所: (演習用のフォルダー、たとえば、C:\HOLShell)
- 最初に行うべき手順は、Windows API Code Pack 1.0 に含まれるライブラリを使用できるようにするため、必要なアセンブリへの参照を、プロジェクトに追加することです。次の要領で行います。
- 演習用フォルダーの中の dependencies サブフォルダー (HOLShell\dependencies) に、次のアセンブリがあることを確認します。(既に「Windows API Code Pack 1.0 の基本的な準備」の項の手順に基づいて、dependencies サブフォルダーに配置してあるはずです。)
- Microsoft.WindowsAPICodePack.dll
- Microsoft.WindowsAPICodePack.Shell.dll
- ソリューション エクスプローラー上で、SLUtil プロジェクト内の [参照設定] ノードを右クリックして、[参照の追加] メニューをクリックします。
- [参照の追加] ダイアログ ボックスが表示されたら、[参照] タブをクリックします。
-
前述の dependencies サブフォルダーにある Microsoft.WindowsAPICodePack.dll および Microsoft.WindowsAPICodePack.Shell.dll の 2 つのアセンブリを選択します。
- [OK] をクリックし、[参照の追加] ダイアログ ボックスを閉じます。
-
ソリューション エクスプローラーの [参照設定] ノードの配下に、前述の 2 つのアセンブリが追加されたことを確認します。
- 次に、この練習用に予め用意されたサンプル ソース ファイルを、SLUtil プロジェクトに追加します。次の要領で行ってください。
- ソリューション エクスプローラーの SLUtil プロジェクトを右クリックして、ショートカット メニューを表示させ、[追加]、[既存の項目] の順にクリックします。
-
[既存項目の追加] ダイアログ ボックスが表示されたら、次のパスのソース ファイルを選択し、[追加] ボタンをクリックします。
\Ex1_Starter\CommandLineInterpreter.cs
-
次図のように、SLUtil プロジェクトに CommandLineInterpreter.cs が追加されたことを確認します。
Note: このソース ファイルのクラスは、コマンド プロンプトで利用者が入力したコマンドライン引数を解析して、解説結果に基づいて、特定の Command 属性が付いた静的メソッドを実行するユーティリティ クラスです。 - このコマンドラインを解析実行するクラスを使用するために、次のソース コードのように、Program.cs の中にある Main メソッドに追加するほか、ソース コードの他の using ディレクティブの下に、このクラスを使用するための using ディレクティブも追加します。(黄色の部分)
- using ShellLibraryExercise;
- CommandLineInterpreter cli = new CommandLineInterpreter(args);
cli.Execute();
...
using ShellLibraryExercise;
namespace SLUtil { class Program { static void Main(string[] args) { CommandLineInterpreter cli = new CommandLineInterpreter(args); cli.Execute(); } } }
- このソリューションをビルドするため、[ビルド] メニューの [ソリューションのビルド] をクリックします。
-
アプリケーションの現状の動作を確認するため、実行時のコマンドライン引数を追加します。そのためには、プロジェクト デザイナー (プロジェクト プロパティ) を開き、[デバッグ] タブをクリックして、コマンドライン引数の欄に、「?」を入力します。
- 再びビルドします。
-
このアプリケーションを実行するため、[デバッグ] メニューの [デバッグなしで開始] をクリックします。コマンド プロンプトに次のように出力されることを確認します。
SLUtil ? [CommandName]
続行するには何かキーを押してください . . . - 確認が済んだら、コマンド プロンプトを閉じて、アプリケーションを終了します。
ページのトップへ
タスク 2 - ライブラリ新規作成のコマンドを追加する
Windows 7 のシェルから認識できる 1 つのライブラリを制御するには、Windows API Code Pack に含まれる ShellLibrary クラスのインスタンスを使用します。また、new キーワードを使用して、ShellLibrary のインスタンスを新規作成することは、ライブラリ自体を新規作成することを意味します。
また、この ShellLibrary クラスは、IDispose インターフェイスを実装しています。ShellLibrary クラスの内部で使用されている Library API の COM オブジェクトを解放するためには、このインターフェイスの Dispose メソッドを呼び出すことが重要です。
よって、このライブラリのオブジェクトを使用する C# での基本的な実装パターンは、次のように using ステートメント ブロックを使用することになります。
using (ShellLibrary library = new ShellLibrary(name, true)) {
}
- ここで、このユーティリティのコマンドを実装するクラスを新規追加するため、次の要領でプロジェクトにファイルを追加します。
- ソリューション エクスプローラーの SLUtil プロジェクトを右クリックして、ショートカット メニューを表示させ、[追加]、[クラス] の順にクリックします。
- [新しい項目の追加] ダイアログ ボックスが表示されたら、ファイル名として、「ShellCommands.cs」を指定して、[追加] ボタンをクリックします。
- SLUtil プロジェクトに ShellCommands.cs が追加されるほか、このファイルがコード エディター上に開くことを確認します。
- この ShellCommands.cs ファイルに記述された ShellCommands クラスのインスタンスは不要なので、クラスの先頭に static 修飾子を付けて、静的クラスにします。
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace SLUtil { static class ShellCommands { } }
- ファイル ShellCommands.cs に、次に示す using ディレクティブを追加します。
using Microsoft.WindowsAPICodePack.Shell;
using ShellLibraryExercise;
- コマンド プロンプトから特定のコマンド オプションを付けて、このユーティリティを実行すると、ライブラリを新規作成するように、次に示す CreateLibrary メソッドを ShellCommands クラスの中に追加します。
[Command(
Name = "Create",
Usage = "SLUtil Create LibraryName",
Info = "Create a new library",
Example = "SLUtil Create MyLib")]
public static void CreateLibrary(string name)
{
using (ShellLibrary library = new ShellLibrary(name, true))
{
}
}
- ビルドして、コンパイル エラーがないことを確認します。
-
プロジェクト プロパティのコマンドライン引数を、「?」から「Create MyLib」に変更して、「MyLib」という名前のライブラリを作成するようにします。
- ビルドして、アプリケーションを一旦実行した後、コマンド プロンプトを閉じます。
-
エクスプローラーを開き、ライブラリに「MyLib」が追加されたことを確認します。
ページのトップへ
タスク 3 - フォルダー追加とフォルダー削除のコマンドを追加する
次に、ライブラリに対して、フォルダーの追加と削除を行うコマンドを追加することにします。この処理には、ShellLibrary インスタンスの Add メソッドと Remove メソッドを使用します。ただし、ShellLibrary インスタンスを new キーワードで作成すると、その都度、ライブラリを新規作成する意味があるので、作成済みのライブラリにアクセスする場合は、ShellLibrary.Load メソッドを使用してインスタンスを作成します。
- 次のコードを ShellCommands クラスに追加します。
[Command( Name = "AddFolder", Usage = "SLUtil AddFolder LibraryName FolderPath", Info = "Add a folder to a library", Example = @"SLUtil AddFolder Documents C:\Docs")] public static void AddFolder(string name, string folderPath) { using (ShellLibrary library = ShellLibrary.Load(name, false)) { library.Add(folderPath); } }
[Command( Name = "RemoveFolder", Usage = "SLUtil RemoveFolder LibraryName FolderPath", Info = "Remove a folder from a library", Example = @"SLUtil RemoveFolder Documents C:\Docs")] public static void RemoveFolder(string name, string folderPath) { using (ShellLibrary library = ShellLibrary.Load(name, false)) { library.Remove(folderPath); } }
- ビルドを行い、次のように動作結果を確認します。
-
コマンド プロンプトを開き、ディリクトリの移動 (CD コマンド) を行い、SLUtil.exe が存在するパスまで移動します (プロジェクト内の bin\debug\SLUtil.exe)。たとえば、次のように入力します (プロジェクトを作成した場所よって異なります)。
CD C:\HOLShell\SLUtil\SLUtil\bin\Debug
-
コマンド ラインから、次のように、SLUtil のコマンドをいくつか実行します。
SLUtil ?
SLUtil Create NewLibrary
SLUtil AddFolder NewLibrary C:\Users
SLUtil RemoveFolder NewLibrary C:\Users
SLUtil AddFolder NewLibrary C:\HOLShell -
特に、5 番目のコマンドを実行して、NewLibrary に C:\HOLShell をフォルダーとして追加した後、エクスプローラーで NewLibrary を表示すると、C:\HOLShell がブラウズできることを確認します。
ページのトップへ
タスク 4 - 保存フォルダー、ナビゲーション ペインでの表示状態、アイコン、およびフォルダーの種類に関するコマンドを追加する
タスクの表題の 4 つのコマンドは、よく利用される機能です。これらの機能を実装するにあたり、順に、ShellLibrary インスタンスの、DefaultSaveFolder プロパティ、IsPinnedToNavigationPane プロパティ、IconResourceId プロパティ、および、LibraryType プロパティを使用します。
- 4 つのコマンドにあたるメソッドを ShellCommands クラスに次の要領で追加します。(4 つのメソッドの完成コードは次にあります。)
- SaveFolder メソッドは、ライブラリにファイルを保存する際の、既定の保存フォルダーの名前を調べたり、指定されたフォルダーを既定の保存フォルダーに設定したりするために使用します。引数に渡されたフォルダー パスが空の場合は、保存フォルダーは現状のままです。
- NavPanePinnedState コマンドは、指定されたライブラリが、エクスプローラーのナビゲーション ペインに表示されるか否かの状態を調べたり、設定したりするために使用します。
- Icon コマンドは、アイコンのリソース名を調べたり、設定したりするために使用します。このプロパティは空の場合があります。
- LibraryFolderType コマンドでは、ライブラリのフォルダーの種類を調べたり、設定したりするために使用します。種類によって、ライブラリ ウィンドウがどう表示されるかが決まります。それぞれの種類には、種類を表す相応の Guid (LibraryTypeId プロパティ) があります。
[Command( Name = "SaveFolder", Usage = "SLUtil SaveFolder LibraryName [FolderPath]", Info = "Set or get the library's save folder path", Example = @"SLUtil SaveFolder Documents C:\Docs")] public static void SaveFolder(string name, string folderPath) { using (ShellLibrary library = ShellLibrary.Load(name, false)) { if (string.IsNullOrEmpty(folderPath)) { string path = "(none)"; try { path = library.DefaultSaveFolder; } catch { } Console.WriteLine("Save folder: {0}", path); } else { library.DefaultSaveFolder = folderPath; } } }
[Command( Name = "NavPanePinnedState", Usage = "SLUtil NavPanePinnedState LibraryName [TRUE|FALSE]", Info = "Set or get the library's Pinned to navigation pane state", Example = @"SLUtil NavPanePinnedState MyLib TRUE")] public static void NavPanePinnedState(string name, string stateText) { using (ShellLibrary library = ShellLibrary.Load(name, false)) { bool state;
if (bool.TryParse(stateText, out state)) { library.IsPinnedToNavigationPane = state; } else { Console.WriteLine( "The library {0} is{1}pinned to the navigation pane.", name, library.IsPinnedToNavigationPane ? " " : " not "); } }
}
[Command( Name = "Icon", Usage = "SLUtil Icon LibraryName [Icon]", Info = "Set or get the library's icon", Example = @"SLUtil Icon MyLib imageres.dll,-1005")] public static void Icon(string name, string icon) { using (ShellLibrary library = ShellLibrary.Load(name, false)) { if (string.IsNullOrEmpty(icon)) { Console.WriteLine("Icon: {0}", library.IconResourceId.ReferencePath); } else { library.IconResourceId = new IconReference(icon); } } }
[Command( Name = "LibraryFolderType", Usage = "SLUtil LibraryFolderType LibraryName " + "[Generic|Documents|Pictures|Music|Videos]", Info = "Set or get the library's folder type", Example = @"SLUtil MyLib Documents")] public static void LibraryFolderType(string name, string folderType) { using (ShellLibrary library = ShellLibrary.Load(name, false)) { if (string.IsNullOrEmpty(folderType)) { string libraryTypeName = "-"; string libraryTypeId = "-"; try { libraryTypeName = library.LibraryType.ToString(); libraryTypeId = library.LibraryTypeId.ToString(); } catch { } Console.WriteLine("Folder type: {0}, {1}", libraryTypeName, libraryTypeId); } else { try { LibraryFolderType libraryType; libraryType = (LibraryFolderType)Enum.Parse( typeof(LibraryFolderType), folderType, true); library.LibraryType = libraryType; } catch { } } } }
- ビルドを行い、次のように動作結果を確認します。
-
コマンド プロンプトを開き、ディリクトリの移動 (CD コマンド) を行い、SLUtil.exe が存在するパスまで移動します (プロジェクト内の bin\debug\SLUtil.exe)。たとえば、次のように入力します (プロジェクトを作成した場所よって異なります)。
CD C:\HOLShell\SLUtil\SLUtil\bin\Debug
-
コマンド ラインから、次のように、SLUtil のコマンドをいくつか実行します。
SLUtil Create MyLib2
SLUtil AddFolder MyLib2 C:\HOLShell
SLUtil SaveFolder MyLibs
SLUtil AddFolder NewLibrary C:\HOLShell
SLUtil NavPanePinnedState MyLib2
SLUtil Icon MyLib2 imageres.dll,-1005
SLUtil LbraryFolerType MyLib2 -
特に、6 番目のアイコンを設定するコマンドを実行では、コマンド プロンプトだけでなく、エクスプローラー上で MyLib2 のアイコンが変化することを確認します。
ページのトップへ
タスク 5 - 情報表示コマンドを追加する
次に実装する ShowInfo コマンドは、ライブラリについてのあらゆる情報を表示します。
- 以下のコードを、ShellCommands クラスに追加します。
[Command( Name = "ShowInfo", Usage = "SLUtil ShowInfo LibraryName", Info = "Show Library information.", Example = @"SLUtil ShowInfo Documents")] public static void ShowInfo(string name) { using (ShellLibrary library = ShellLibrary.Load(name, true)) { ShowInformation(library); } }
private static void ShowInformation(ShellLibrary library) { Console.WriteLine("\nShowing information of {0} library", library.Name); Console.WriteLine("\tIs pinned to navigation pane: {0}", library.IsPinnedToNavigationPane); string saveFolder = library.DefaultSaveFolder; Console.WriteLine("\tSave folder: {0}", saveFolder); try { Console.WriteLine("\tIcon: {0}", library.IconResourceId.ReferencePath); } catch { } Console.WriteLine("\tLibrary Folder type: {0}", library.LibraryType);
Console.WriteLine("\tFolder list:"); foreach (ShellFileSystemFolder folder in library) { Console.WriteLine("\t\t{0} {1}", folder.Name, saveFolder == folder.Name ? "*" : ""); }
}
- ビルドを行い、次のように動作結果を確認します。
- コマンド プロンプトを開き、ディリクトリの移動 (CD コマンド) を行い、SLUtil.exe が存在するパスまで移動します (プロジェクト内の bin\debug\SLUtil.exe)。たとえば、次のように入力します (プロジェクトを作成した場所よって異なります)。
CD C:\HOLShell\SLUtil\SLUtil\bin\Debug
-
コマンド ラインから、次のように、SLUtil のコマンドを実行し、結果を確認します。
SLUtil ShowInfo MyLib2
(実行結果)
Showing information of MyLib2 library
Is pinned to navigation pane: True
Save folder: C:\HOLShell
Icon: imageres.dll,-1005
Library Folder type: Generic
Folder list:
HOLShell
ページのトップへ
タスク 6 - 管理用 UI の表示コマンドを追加する
SLUtil ツールを完成させる最後のコマンドは、ManageUI コマンドです。このコマンドは、次図のようなライブラリを管理するウィンドウを表示させます。
- 以下のコードを、ShellCommands クラスに追加します。
[Command(
Name = "ManageUI",
Usage = "SLUtil ManageUI LibraryName",
Info = "Show the Shell Library management UI",
Example = @"SLUtil ManageUI Documents")]
public static void ManageUI(string name)
{
ShellLibrary.ShowManageLibraryUI(name,
IntPtr.Zero, null, null, true);
}
- ビルドを行い、次のように動作結果を確認します。
-
コマンド プロンプトを開き、ディリクトリの移動 (CD コマンド) を行い、SLUtil.exe が存在するパスまで移動します (プロジェクト内の bin\debug\SLUtil.exe)。たとえば、次のように入力します (プロジェクトを作成した場所よって異なります)。
CD C:\HOLShell\SLUtil\SLUtil\bin\Debug
-
コマンド ラインから、次のように、SLUtil のコマンドを実行し、前述の管理するウィンドウが表示されるか確認します。
SLUtil MangeUI MyLib2
この練習の完成品は、演習フォルダーの Ex1_Solution サブフォルダーの中にあります。
ページのトップへ
3. まとめ
この演習では、ライブラリを操作するために、ネイティブ API をラップした Windows API Code Pack を使用して、.NET アプリケーションから利用する方法について確認しました。ライブラリの使用方法について、さらに調べたい場合は、Windows API Code Pack として提供されているソース コードを参照することをお勧めします。
ページのトップへ