マイクロソフト株式会社

セッション ID: T7-401
Windows API Code Pack による
アプリケーション開発
~より便利な Windows 7 対応アプリを
構築するには~
マイクロソフト株式会社
デベロッパー & プラットフォーム統括本部
デベロッパー エバンジェリスト
田中達彦
セッションの目的とゴール
Session Objectives and Takeaways
セッションの目的
Windows API Code Pack により、
既存のアプリケーションに Windows 7 の
機能を簡単に追加できることをご理解いただく
セッションのゴール
既存アプリケーションに Windows 7 の
機能を追加できるようになる
既存アプリケーションの生産性を、
Code Pack を使用して高められるようになる
3
アジェンダ
Windows API Code Pack とは
Code Pack による機能追加
アプリケーションの再起動と修復
電源処理
タスク バーの活用
まとめ
4
アジェンダ
Windows API Code Pack とは
Code Pack による機能追加
アプリケーションの再起動と修復
電源処理
タスク バーの活用
まとめ
5
Windows API Code Pack とは?
.NET Framework 3.5 でサポートしていない
Windows 7 の機能を使用するための
ライブラリ
.NET Framework 3.5
6
Win32 API
WPF
WCF
タスク バー
ASP.NET
ADO.NET
センサー
WF
その他
その他
Code Pack と .NET Framework
.NET Framework のアプリケーション
Windows API Code Pack
ライブラリ
public void SetProgressState(TaskbarProgressBarState state) {
CoreHelpers.ThrowIfNotWin7();
TaskbarList.SetProgressState(OwnerHandle, (TBPFLAG)state);
}
COM ラッパー
[ComImportAttribute()]
[GuidAttribute("c43dc798-95d1-4bea-9030-bb99e2983a1a")]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
internal interface ITaskbarList4 {
[PreserveSig]
void SetProgressState(IntPtr hwnd, TBPFLAG tbpFlags);
Win32 API
7
HRESULT SetProgressState(
HWND hwnd,
TBPFLAG tbpFlags
);
API Code Pack の対象開発者
.NET Framework 2.0/3.0/3.5 をお使いの方
上記の .NET Framework で提供していない
Windows 7 の機能を実装可能
会社の方針で .NET Framework 4 を
まだ使用できない方
ランタイムの配布の許可が下りない場合など
Visual Studio 2010 + .NET Framework 2.0
+ API Code Pack という組み合わせも可能
8
API Code Pack の入手方法
以下の Web サイトにて提供
http://code.msdn.microsoft.com/windowsapicodepack/
API Code Pack に含まれるもの
ライブラリのソース コード
サンプルプログラム (C# と Visual Basic)
9
API Code Pack の内容
アプリケーション サービス
コントロール
ダイアログ
拡張言語サービス
ネットワーク
センサー
シェル
タスク バー
DirectX
10
API Code Pack の内容
アプリケーション サービス
アプリケーションの再起動と修復
予期せぬエラーの発生時に、未保存のデータを
修復する
バッテリーの状態の検知
電源管理
11
API Code Pack の内容
コントロール
エクスプローラー ブラウザー
ダイアログ
コモン ダイアログ
タスク ダイアログ
12
API Code Pack の内容
拡張言語サービス
中国語の簡体字と繁体字などの相互変換
广东气象台
廣東氣象臺
ネットワーク
ネットワーク接続の検知
ネットワーク ID やドメイン タイプなどの
取得
13
API Code Pack の内容
センサー
利用可能なセンサーの取得
繋がったセンサーの状態変更取得
特定のセンサーの取り出し
現在値の取得
14
API Code Pack の内容
シェル
機知のフォルダーの取得
検索
ストック アイコン
WPF グラス ウインドウ
タスク バー
サムネイル
ジャンプ リスト
15
API Code Pack の内容
DirectX
Direct 2D
Direct 3D 10/11
※ DirectX SDK が必要
16
アジェンダ
Windows API Code Pack とは
Code Pack による機能追加
アプリケーションの再起動と修復
電源処理
タスク バーの活用
まとめ
17
アプリケーションの再起動と修復
予期せぬエラーによりクラッシュしたとき、
入力していたデータを修復
18
修復の仕組み
実行
再起動用コードの登録
修復用メソッドの登録
クラッシュ
修復用メソッド
による
データの保存
19
再起動
再起動か
どうかの判定
(再起動の場合)
データの復元
アプリケーション実行時の流れ
アプリケーションの起動
システムによる再起動か
どうかの判定
NO
YES
データの復元
アプリケーションの実行
再起動用コードの登録
修復用メソッドの登録
20
コマンド ライン
オプション使用し、
再起動かどうかを
判別する
ファイルに
保存しておいた
データを復元する
アプリケーション実行時の流れ
クラッシュ
修復用メソッドが
自動的に呼び出される
システムにより
再起動される
21
フィールドに
保持されている
データを保存する
注: テキスト ボックス
などのコントロールが
保持しているデータは
保存できない
アプリケーションの
再起動と修復
修復用メソッドの登録
C#
Windows Error Reporting の機能を使用
そもそもはアプリケーションのエラーを
作成元に伝える仕組み
予期せぬエラーの発生時に、
修復用メソッドを呼び出すように指定できる
RecoveryData data = new RecoveryData(new
RecoveryCallback(RecoveryProcedure), null);
RecoverySettings settings =
青い字のコードは
API Code Pack で
new RecoverySettings(data, 0);
提供している機能
ApplicationRestartRecoveryManager.RegisterForApp
licationRecovery(settings);
23
再起動用コードの登録
C#
ApplicationRestartRecoveryManager.RegisterForApp
licationRestart(
new RestartSettings("/restart",
RestartRestrictions.NotOnReboot |
RestartRestrictions.NotOnPatch));
再起動時の
コマンド ライン
オプション
24
再起動のオプション
(この例ではリブート等の
場合には再起動しない)
再起動時の判別
C#
if(System.Environment.GetCommandLineArgs().Length > 1
&& System.Environment.GetCommandLineArgs()[1]
== "/restart")
{
RecoverLastSession();
}
コマンド ライン オプションの値によって
通常起動か再起動かを判別する
25
再起動/修復時の注意事項
アプリケーション起動後
60 秒間は再起動しない
テキスト ボックスなどの
コントロールに保持されている
データは保存できない
デバッガーから起動した場合は
再起動できない
26
再起動/修復のタスク一覧
再起動用コードの登録
修復用メソッド (コールバック ルーチン)
の作成
修復用メソッドの登録
起動時の再起動かどうかの判断
再起動時にデータを修復するコードの作成
27
アジェンダ
Windows API Code Pack とは
Code Pack による機能追加
アプリケーションの再起動と修復
電源処理
タスク バーの活用
まとめ
28
電源管理
バッテリー駆動の判別や、バッテリーの
残量を検知
バッテリーの残量が少ない場合の対処例
自動保存の機能の追加
データのアップデート等を減らす
CD/DVD へのアクセスを減らす
バックグラウンドのタスクを減らす
不必要なタスクを実行しない
29
バッテリーの残量
C#
バッテリーで稼働しているかどうかの検知
if (PowerManager.PowerSource == PowerSource.Battery)
{
// バッテリーで稼働している場合
}
バッテリー残量の検知
if (PowerManager.BatteryLifePercent < 20)
{
// バッテリー残量が 20% 未満の場合
}
30
バッテリーの検知
アジェンダ
Windows API Code Pack とは
Code Pack による機能追加
アプリケーションの再起動と修復
電源処理
タスク バーの活用
まとめ
32
タスク バーの進化
ITaskbarList
ITaskbarList2
ITaskbarList3
ITaskbarList4
33
タスク バーの進化
ITaskbarList
ITaskbarList2
フル スクリーンの検知
ITaskbarList3
サムネイルの表示
プログレス バー
オーバーレイ アイコン
ジャンプ リスト
ITaskbarList4
34
タブ プロパティ
Windows 7 のタスク バー
サムネイル
サムネイル
ツール バー
ジャンプ リスト
アクティブ
35
非実行
実行
複数実行
プログレス バー
作業の進捗をアイコン上に展開
作業の状態に合わせ、緑、黄色、赤の
プログレス バーをアイコンに表示
進捗状態はアプリケーション側で指定
36
プログレス バーの実装
C#
// 色を指定
TaskbarManager.Instance.SetProgressState(
TaskbarProgressBarState.Normal);
// 値を指定
TaskbarManager.Instance.SetProgressValue(
CPUtime, 100);
TaskbarProgressBarState.Normal
TaskbarProgressBarState.Paused
TaskbarProgressBarState.Error
37
オーバーレイ アイコン
アイコン上に別の小さなアイコンを表示
アプリケーションの状態が変化した時など
に使用
メールが届いたとき
時間のかかる処理が終了したとき
タスク バー上で状態の変化を知ることが
できる
Windows Live
Messenger の例
サインアウト
38
オンライン
取り込み中
退席中
オーバーレイ アイコンの実装
C#
if (mailcount == 0) {
windowsTaskbar.SetOverlayIcon(Handle, null, "");
}
else {
windowsTaskbar.SetOverlayIcon(Handle,
this.Icon, "未読メールあり");
}
指定した
アイコンを表示
39
アイコンを表示
しないとき
プログレス バーと
オーバーレイ アイコン
サムネイル
タスク バーのアイコン上
にマウスを合わせたとき、
アプリケーションの
縮小画面を表示
MDI/TDI の
アプリケーションにも
対応させることができる
41
サムネイル ツール バー
アプリケーションを
直接操作できるアイコン
アイコンを 7 つまで
設定することが可能
42
サムネイルのクリッピング
サムネイルに、
特定の部分のみを
表示させる機能
アプリケーション全体を
表示させたくない時にも
使用できる
43
クリッピングの実装
C#
TabbedThumbnail preview = TaskbarManager.Instance.
TabbedThumbnail.GetThumbnailPreview(
tabControl1.SelectedTab);
preview.ClippingRectangle = new Rectangle(
thumbX, thumbY, 200, 119);
44
サムネイルとクリッピング
ジャンプ リスト
最近使ったもの/
よく使うもの
• 項目自体を表示
させないことも可能
• デフォルトでは、
いつも表示と
最近使ったものを
表示する
JumpPath
JumpTask
• カスタマイズを
開発者が行う
46
JumpTask の実装
C#
jumpList = JumpList.CreateJumpList();
jumpList.AddUserTasks(
new JumpListLink(Path.Combine(systemFolder,
"notepad.exe"), "メモ帳を開く")
{
IconReference = new IconReference(
Path.Combine(systemFolder, "notepad.exe"), 0),
Arguments = "c:\\autoexec.bat"
});
コマンド ライン オプションを指定し、
特定の機能を起動させること可能
47
ジャンプ リスト
アジェンダ
Windows API Code Pack とは
Code Pack による機能追加
アプリケーションの再起動と修復
電源処理
タスク バーの活用
まとめ
49
まとめ
アプリケーションの再起動と修復
予期せぬエラーが発生してしまっても、
データがなくならない
電源管理
バッテリーが少なくなってもあわてない
タスク バーの活用
サムネイルやジャンプリストを活用し、
生産性の向上を実現
簡単に実装できます
アプリケーションの価値が上がります
50
Appendix
Windows のバージョン チェック
Visual Basic のソース コード
.NET Framework 4 でのサポート
51
Windows のバージョンチェック
C#
Windows 7 以上で動作させる場合
if(Environment.OSVersion.Version.Major > 6) ||
(Environment.OSVersion.Version.Major == 6 &&
Environment.OSVersion.Version.Minor >= 1))
{ // Windows 7 のバージョンは 6.1
}
Windows Vista 以上で動作させる場合
if (Environment.OSVersion.Version.Major >= 6)
{ // Windows Vista のバージョンは 6
}
52
Appendix
Windows のバージョン チェック
Visual Basic のソース コード
.NET Framework 4 でのサポート
53
修復用メソッドの登録
VB
p23
Windows Error Reporting の機能を使用
そもそもはアプリケーションのエラーを
作成元に伝える仕組み
予期せぬエラーの発生時に、情報を修復する
ためのメソッドを呼び出すように指定できる
Dim data As New RecoveryData(New _
RecoveryCallback(AddressOf RecoveryProcedure), _
Nothing)
Dim settings As New RecoverySettings(data, 0)
ApplicationRestartRecoveryManager.RegisterForAppli
cationRecovery(settings)
54
青い字のコードは API Code Pack で提供している機能
再起動用コードの登録
VB
p24
ApplicationRestartRecoveryManager.RegisterForApp
licationRestart(New RestartSettings("/restart",
RestartRestrictions.NotOnReboot Or
RestartRestrictions.NotOnPatch))
再起動時の
コマンド ライン
オプション
55
再起動のオプション
(この場合はリブート等の
場合には再起動しない)
再起動時の判別
VB
p25
If System.Environment.GetCommandLineArgs().Length _
> 1 AndAlso _
System.Environment.GetCommandLineArgs()(1) = _
"/restart" Then
RecoverLastSession()
End If
コマンド ライン オプションの値によって
通常起動か再起動かを判別する
56
バッテリーの残量
VB
p30
バッテリーで稼働しているかどうかの検知
If PowerManager.PowerSource = PowerSource.Battery _
Then
' バッテリーで稼働している場合
End If
バッテリー残量の検知
If PowerManager.BatteryLifePercent < 20 Then
' バッテリー残量が 20% 未満の場合
End If
57
プログレス バーの実装
VB
p37
' 色を指定
TaskbarManager.Instance.SetProgressState(
TaskbarProgressBarState.Normal)
' 値を指定
TaskbarManager.Instance.SetProgressValue(
CPUtime, 100)
TaskbarProgressBarState.Normal
TaskbarProgressBarState.Paused
TaskbarProgressBarState.Error
58
オーバーレイ アイコンの実装
If mailcount = 0 Then
windowsTaskbar.SetOverlayIcon( _
Me.Handle, Nothing, Nothing)
Else
windowsTaskbar.SetOverlayIcon(Me.Handle, _
Me.Icon, "未読メールあり")
End If
指定した
アイコンを表示
59
アイコンを表示
しないとき
VB
p39
クリッピングの実装
VB
p44
Dim preview As TabbedThumbnail = _
TaskbarManager.Instance.TabbedThumbnail. _
GetThumbnailPreview(tabControl1.SelectedTab)
preview.ClippingRectangle = New Rectangle( _
thumbX, thumbY, 200, 119);
60
JumpTask の実装
VB
p47
jumpList = JumpList.CreateJumpList()
jumpList.AddUserTasks( _
New JumpListLink(Path.Combine(systemFolder, _
"notepad.exe"), "メモ帳を開く") With _
{ _
.IconReference = New IconReference( _
Path.Combine(systemFolder, "notepad.exe"), 0), _
.Arguments = "c:\autoexec.bat" _
})
コマンド ライン オプションを指定し、
特定の機能を起動させること可能
61
Windows のバージョンチェック
VB
Windows 7 以上で動作させる場合
p52
If Environment.OSVersion.Version.Major > 6 OrElse _
Environment.OSVersion.Version.Major = 6 AndAlso _
Environment.OSVersion.Version.Minor >= 1 Then
' Windows 7 のバージョンは 6.1
End If
Windows Vista 以上で動作させる場合
If Environment.OSVersion.Version.Major >= 6 Then
' Windows Vista のバージョンは 6
End If
62
Appendix
Windows のバージョン チェック
Visual Basic のソース コード
.NET Framework 4 でのサポート
63
.NET Framework 4 でのサポート
System.Windows.Shell 名前空間
JumpList クラス、JumpTask クラス等による
ジャンプ リストの操作
System.Windows 名前空間
TaskbarItemInfo プロパティによる
タスク バーの状態の取得
64
Windows 7 の最新機能を
実装したアプリケーションを
大募集!!
投稿いただいたアプリケーションは
マイクロソフトサイトでご紹介
詳しくは、9月2日に”
”上に公開される
キャンペーンページをチェック!
関連セッション
T7-302: Windows Presentation Foundation 4
~ ビジュアル ステートを使った カスタム コントロールの作り方 ~
T6-302: Visual Studio 2010 の 新しいテスト機能による
ソフトウェア品質の向上
T6-304: Expression Blend 4 でデザインする
Silverlight 4 アプリケーション
T6-310: ユーザー エクスペリエンス デザイン
~ UX をデザインする手法とプロセス ~
66
リファレンス
どうして Windows 7 を選ぶのか?
http://windows.microsoft.com/ja-JP/windows7/products/why-choose/
Windows API Code Pack
http://code.msdn.microsoft.com/windowsapicodepack/
.NET 開発コード サンプル集 Code Recipe
http://msdn.microsoft.com/ja-jp/samplecode.recipe.aspx
67
ご清聴ありがとうございました。
T7-401
アンケートにご協力ください。
© 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.
The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should
not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS,
IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.