Windows API Code Pack による アプリケーション開発 ~より便利な Windows 7 対応アプリを 構築するには~ セッション ID: T7-401 Windows API Code Pack による アプリケーション開発 ~より便利な Windows 7 対応アプリを 構築するには~ マイクロソフト株式会社 デベロッパー & プラットフォーム統括本部 デベロッパー エバンジェリスト 田中達彦
セッションの目的とゴール Session Objectives and Takeaways Windows API Code Pack により、 既存のアプリケーションに Windows 7 の 機能を簡単に追加できることをご理解いただく セッションのゴール 既存アプリケーションに Windows 7 の 機能を追加できるようになる 既存アプリケーションの生産性を、 Code Pack を使用して高められるようになる
アジェンダ Windows API Code Pack とは Code Pack による機能追加 まとめ アプリケーションの再起動と修復 電源処理 タスク バーの活用 まとめ
アジェンダ Windows API Code Pack とは Code Pack による機能追加 まとめ アプリケーションの再起動と修復 電源処理 タスク バーの活用 まとめ
Windows API Code Pack とは? .NET Framework 3.5 でサポートしていない Windows 7 の機能を使用するための ライブラリ .NET Framework 3.5 Win32 API WPF WCF タスク バー ASP.NET ADO.NET センサー WF その他 その他
Code Pack と .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 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 という組み合わせも可能
API Code Pack の入手方法 以下の Web サイトにて提供 API Code Pack に含まれるもの http://code.msdn.microsoft.com/windowsapicodepack/ API Code Pack に含まれるもの ライブラリのソース コード サンプルプログラム (C# と Visual Basic)
API Code Pack の内容 アプリケーション サービス コントロール ダイアログ 拡張言語サービス ネットワーク センサー シェル タスク バー DirectX
API Code Pack の内容 アプリケーションの再起動と修復 バッテリーの状態の検知 電源管理 アプリケーション サービス 予期せぬエラーの発生時に、未保存のデータを 修復する バッテリーの状態の検知 電源管理
API Code Pack の内容 コントロール エクスプローラー ブラウザー コモン ダイアログ タスク ダイアログ ダイアログ
API Code Pack の内容 中国語の簡体字と繁体字などの相互変換 ネットワーク接続の検知 拡張言語サービス 中国語の簡体字と繁体字などの相互変換 ネットワーク接続の検知 ネットワーク ID やドメイン タイプなどの取得 广东气象台 廣東氣象臺 ネットワーク
API Code Pack の内容 利用可能なセンサーの取得 繋がったセンサーの状態変更取得 特定のセンサーの取り出し 現在値の取得
API Code Pack の内容 機知のフォルダーの取得 検索 ストック アイコン WPF グラス ウインドウ サムネイル シェル 機知のフォルダーの取得 検索 ストック アイコン WPF グラス ウインドウ サムネイル ジャンプ リスト タスク バー
API Code Pack の内容 DirectX Direct 2D Direct 3D 10/11 ※ DirectX SDK が必要
アジェンダ Windows API Code Pack とは Code Pack による機能追加 まとめ アプリケーションの再起動と修復 電源処理 タスク バーの活用 まとめ
アプリケーションの再起動と修復 予期せぬエラーによりクラッシュしたとき、 入力していたデータを修復
修復の仕組み 実行 再起動用コードの登録 再起動 修復用メソッドの登録 再起動か どうかの判定 クラッシュ データの復元 (再起動の場合) データの復元 クラッシュ 修復用メソッド による データの保存
アプリケーション実行時の流れ アプリケーションの起動 システムによる再起動か どうかの判定 データの復元 アプリケーションの実行 コマンド ライン オプション使用し、再起動かどうかを 判別する システムによる再起動か どうかの判定 NO YES データの復元 ファイルに 保存しておいた データを復元する アプリケーションの実行 再起動用コードの登録 修復用メソッドの登録
アプリケーション実行時の流れ クラッシュ 修復用メソッドが 自動的に呼び出される システムにより 再起動される フィールドに 保持されている データを保存する 注: テキスト ボックスなどのコントロールが保持しているデータは保存できない 修復用メソッドが 自動的に呼び出される システムにより 再起動される
DEMO アプリケーションの 再起動と修復
青い字のコードは API Code Pack で 提供している機能 修復用メソッドの登録 Windows Error Reporting の機能を使用 そもそもはアプリケーションのエラーを 作成元に伝える仕組み 予期せぬエラーの発生時に、 修復用メソッドを呼び出すように指定できる RecoveryData data = new RecoveryData(new RecoveryCallback(RecoveryProcedure), null); RecoverySettings settings = new RecoverySettings(data, 0); ApplicationRestartRecoveryManager.RegisterForApplicationRecovery(settings); 青い字のコードは API Code Pack で 提供している機能
(この例ではリブート等の場合には再起動しない) C# 再起動用コードの登録 ApplicationRestartRecoveryManager.RegisterForApplicationRestart( new RestartSettings("/restart", RestartRestrictions.NotOnReboot | RestartRestrictions.NotOnPatch)); 再起動時の コマンド ライン オプション 再起動のオプション (この例ではリブート等の場合には再起動しない)
再起動時の判別 C# コマンド ライン オプションの値によって 通常起動か再起動かを判別する if(System.Environment.GetCommandLineArgs().Length > 1 && System.Environment.GetCommandLineArgs()[1] == "/restart") { RecoverLastSession(); } コマンド ライン オプションの値によって 通常起動か再起動かを判別する
再起動/修復時の注意事項 アプリケーション起動後 60 秒間は再起動しない テキスト ボックスなどの コントロールに保持されている データは保存できない デバッガーから起動した場合は 再起動できない
再起動/修復のタスク一覧 再起動用コードの登録 修復用メソッド (コールバック ルーチン) の作成 修復用メソッドの登録 起動時の再起動かどうかの判断 再起動時にデータを修復するコードの作成
アジェンダ Windows API Code Pack とは Code Pack による機能追加 まとめ アプリケーションの再起動と修復 電源処理 タスク バーの活用 まとめ
電源管理 バッテリー駆動の判別や、バッテリーの 残量を検知 バッテリーの残量が少ない場合の対処例 自動保存の機能の追加 データのアップデート等を減らす CD/DVD へのアクセスを減らす バックグラウンドのタスクを減らす 不必要なタスクを実行しない
バッテリーの残量 C# バッテリーで稼働しているかどうかの検知 バッテリー残量の検知 if (PowerManager.PowerSource == PowerSource.Battery) { // バッテリーで稼働している場合 } if (PowerManager.BatteryLifePercent < 20) { // バッテリー残量が 20% 未満の場合 }
DEMO バッテリーの検知
アジェンダ Windows API Code Pack とは Code Pack による機能追加 まとめ アプリケーションの再起動と修復 電源処理 タスク バーの活用 まとめ
タスク バーの進化 ITaskbarList ITaskbarList2 ITaskbarList3 ITaskbarList4
タスク バーの進化 ITaskbarList ITaskbarList2 ITaskbarList3 ITaskbarList4 フル スクリーンの検知 ITaskbarList3 サムネイルの表示 プログレス バー オーバーレイ アイコン ジャンプ リスト ITaskbarList4 タブ プロパティ
Windows 7 のタスク バー サムネイル サムネイル ツール バー ジャンプ リスト アクティブ 非実行 実行 複数実行
プログレス バー 作業の進捗をアイコン上に展開 作業の状態に合わせ、緑、黄色、赤のプログレス バーをアイコンに表示 進捗状態はアプリケーション側で指定
プログレス バーの実装 C# TaskbarProgressBarState.Normal // 色を指定 TaskbarManager.Instance.SetProgressState( TaskbarProgressBarState.Normal); // 値を指定 TaskbarManager.Instance.SetProgressValue( CPUtime, 100); TaskbarProgressBarState.Normal TaskbarProgressBarState.Paused TaskbarProgressBarState.Error
オーバーレイ アイコン アイコン上に別の小さなアイコンを表示 アプリケーションの状態が変化した時などに使用 メールが届いたとき 時間のかかる処理が終了したとき タスク バー上で状態の変化を知ることが できる Windows Live Messenger の例 サインアウト オンライン 取り込み中 退席中
オーバーレイ アイコンの実装 C# 指定した アイコンを表示 アイコンを表示しないとき if (mailcount == 0) { windowsTaskbar.SetOverlayIcon(Handle, null, ""); } else { windowsTaskbar.SetOverlayIcon(Handle, this.Icon, "未読メールあり"); 指定した アイコンを表示 アイコンを表示しないとき
DEMO プログレス バーと オーバーレイ アイコン
サムネイル タスク バーのアイコン上 にマウスを合わせたとき、 アプリケーションの 縮小画面を表示 MDI/TDI の アプリケーションにも 対応させることができる
サムネイル ツール バー アプリケーションを 直接操作できるアイコン アイコンを 7 つまで 設定することが可能
サムネイルのクリッピング サムネイルに、 特定の部分のみを 表示させる機能 アプリケーション全体を 表示させたくない時にも使用できる
クリッピングの実装 C# TabbedThumbnail preview = TaskbarManager.Instance. TabbedThumbnail.GetThumbnailPreview( tabControl1.SelectedTab); preview.ClippingRectangle = new Rectangle( thumbX, thumbY, 200, 119);
DEMO サムネイルとクリッピング
ジャンプ リスト 最近使ったもの/ よく使うもの JumpPath JumpTask 項目自体を表示 させないことも可能 デフォルトでは、 いつも表示と 最近使ったものを 表示する ジャンプ リスト JumpPath JumpTask カスタマイズを 開発者が行う
コマンド ライン オプションを指定し、特定の機能を起動させること可能 C# JumpTask の実装 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" }); コマンド ライン オプションを指定し、特定の機能を起動させること可能
DEMO ジャンプ リスト
アジェンダ Windows API Code Pack とは Code Pack による機能追加 まとめ アプリケーションの再起動と修復 電源処理 タスク バーの活用 まとめ
まとめ アプリケーションの再起動と修復 電源管理 タスク バーの活用 簡単に実装できます アプリケーションの価値が上がります 予期せぬエラーが発生してしまっても、 データがなくならない 電源管理 バッテリーが少なくなってもあわてない タスク バーの活用 サムネイルやジャンプリストを活用し、 生産性の向上を実現 簡単に実装できます アプリケーションの価値が上がります
Appendix Windows のバージョン チェック Visual Basic のソース コード .NET Framework 4 でのサポート
Windows のバージョンチェック C# Windows 7 以上で動作させる場合 Windows Vista 以上で動作させる場合 if(Environment.OSVersion.Version.Major > 6) || (Environment.OSVersion.Version.Major == 6 && Environment.OSVersion.Version.Minor >= 1)) { // Windows 7 のバージョンは 6.1 } if (Environment.OSVersion.Version.Major >= 6) { // Windows Vista のバージョンは 6 }
Appendix Windows のバージョン チェック Visual Basic のソース コード .NET Framework 4 でのサポート
青い字のコードは API Code Pack で提供している機能 VB p23 修復用メソッドの登録 Windows Error Reporting の機能を使用 そもそもはアプリケーションのエラーを 作成元に伝える仕組み 予期せぬエラーの発生時に、情報を修復するためのメソッドを呼び出すように指定できる Dim data As New RecoveryData(New _ RecoveryCallback(AddressOf RecoveryProcedure), _ Nothing) Dim settings As New RecoverySettings(data, 0) ApplicationRestartRecoveryManager.RegisterForApplicationRecovery(settings) 青い字のコードは API Code Pack で提供している機能
(この場合はリブート等の場合には再起動しない) VB p24 再起動用コードの登録 ApplicationRestartRecoveryManager.RegisterForApplicationRestart(New RestartSettings("/restart", RestartRestrictions.NotOnReboot Or RestartRestrictions.NotOnPatch)) 再起動時の コマンド ライン オプション 再起動のオプション (この場合はリブート等の場合には再起動しない)
再起動時の判別 VB コマンド ライン オプションの値によって 通常起動か再起動かを判別する p25 If System.Environment.GetCommandLineArgs().Length _ > 1 AndAlso _ System.Environment.GetCommandLineArgs()(1) = _ "/restart" Then RecoverLastSession() End If コマンド ライン オプションの値によって 通常起動か再起動かを判別する
バッテリーの残量 VB バッテリーで稼働しているかどうかの検知 バッテリー残量の検知 p30 If PowerManager.PowerSource = PowerSource.Battery _ Then ' バッテリーで稼働している場合 End If If PowerManager.BatteryLifePercent < 20 Then ' バッテリー残量が 20% 未満の場合 End If
プログレス バーの実装 VB TaskbarProgressBarState.Normal ' 色を指定 TaskbarManager.Instance.SetProgressState( TaskbarProgressBarState.Normal) ' 値を指定 TaskbarManager.Instance.SetProgressValue( CPUtime, 100) TaskbarProgressBarState.Normal TaskbarProgressBarState.Paused TaskbarProgressBarState.Error
オーバーレイ アイコンの実装 VB 指定した アイコンを表示 アイコンを表示しないとき p39 If mailcount = 0 Then windowsTaskbar.SetOverlayIcon( _ Me.Handle, Nothing, Nothing) Else windowsTaskbar.SetOverlayIcon(Me.Handle, _ Me.Icon, "未読メールあり") End If 指定した アイコンを表示 アイコンを表示しないとき
クリッピングの実装 VB p44 Dim preview As TabbedThumbnail = _ TaskbarManager.Instance.TabbedThumbnail. _ GetThumbnailPreview(tabControl1.SelectedTab) preview.ClippingRectangle = New Rectangle( _ thumbX, thumbY, 200, 119);
コマンド ライン オプションを指定し、特定の機能を起動させること可能 VB p47 JumpTask の実装 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" _ }) コマンド ライン オプションを指定し、特定の機能を起動させること可能
Windows のバージョンチェック VB Windows 7 以上で動作させる場合 Windows Vista 以上で動作させる場合 p52 Windows 7 以上で動作させる場合 Windows Vista 以上で動作させる場合 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 If Environment.OSVersion.Version.Major >= 6 Then ' Windows Vista のバージョンは 6 End If
Appendix Windows のバージョン チェック Visual Basic のソース コード .NET Framework 4 でのサポート
.NET Framework 4 でのサポート System.Windows.Shell 名前空間 System.Windows 名前空間 JumpList クラス、JumpTask クラス等によるジャンプ リストの操作 System.Windows 名前空間 TaskbarItemInfo プロパティによる タスク バーの状態の取得
詳しくは、9月2日に”MSDNオンライン”上に公開される 【予告】9月2日よりスタート! 『Windows 7 アプリ投稿キャンペーン』 Windows 7 の最新機能を 実装したアプリケーションを大募集!! 投稿いただいたアプリケーションはマイクロソフトサイトでご紹介 抽選で素敵な 『開発快適グッズ』 もプレゼント!! 詳しくは、9月2日に”MSDNオンライン”上に公開される キャンペーンページをチェック!
関連セッション T7-302: Windows Presentation Foundation 4 ~ ビジュアル ステートを使った カスタム コントロールの作り方 ~ T6-302: Visual Studio 2010 の 新しいテスト機能による ソフトウェア品質の向上 T6-304: Expression Blend 4 でデザインする Silverlight 4 アプリケーション T6-310: ユーザー エクスペリエンス デザイン ~ UX をデザインする手法とプロセス ~
リファレンス どうして 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
ご清聴ありがとうございました。 T7-401 アンケートにご協力ください。
© 2010 Microsoft Corporation. All rights reserved © 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.