690 likes | 1.6k Views
セッション ID: T7-401. Windows API Code Pack による アプリケーション開発 ~より便利な Windows 7 対応アプリを 構築 するには~. マイクロソフト株式会社 デベロッパー & プラットフォーム統括本部 デベロッパー エバンジェリスト 田中達彦. セッションの目的 Windows API Code Pack により、 既存のアプリケーションに Windows 7 の 機能を簡単に追加できることをご理解 いただく セッションのゴール 既存アプリケーションに Windows 7 の 機能を追加できるようになる
E N D
セッション ID: T7-401 Windows API Code Pack によるアプリケーション開発~より便利な Windows 7 対応アプリを構築するには~ マイクロソフト株式会社 デベロッパー & プラットフォーム統括本部 デベロッパー エバンジェリスト 田中達彦
セッションの目的 WindowsAPICodePack により、既存のアプリケーションに Windows 7 の機能を簡単に追加できることをご理解いただく セッションのゴール 既存アプリケーションに Windows7 の機能を追加できるようになる 既存アプリケーションの生産性を、CodePack を使用して高められるようになる セッションの目的とゴールSessionObjectives and Takeaways
アジェンダ • Windows APICodePack とは • CodePack による機能追加 • アプリケーションの再起動と修復 • 電源処理 • タスク バーの活用 • まとめ
アジェンダ • Windows APICodePack とは • CodePack による機能追加 • アプリケーションの再起動と修復 • 電源処理 • タスク バーの活用 • まとめ
.NET Framework 3.5 でサポートしていない Windows 7 の機能を使用するためのライブラリ WindowsAPICodePackとは? .NET Framework 3.5 Win32 API WPF WCF タスク バー ASP.NET ADO.NET センサー WF その他 その他
CodePack と .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(IntPtrhwnd, TBPFLAG tbpFlags); Win32 API HRESULT SetProgressState( HWND hwnd, TBPFLAG tbpFlags );
.NET Framework 2.0/3.0/3.5 をお使いの方 上記の .NET Framework で提供していないWindows7 の機能を実装可能 会社の方針で .NET Framework 4 をまだ使用できない方 ランタイムの配布の許可が下りない場合など Visual Studio 2010 + .NET Framework 2.0+ API Code Pack という組み合わせも可能 APICodePack の対象開発者
以下の Web サイトにて提供 http://code.msdn.microsoft.com/windowsapicodepack/ APICodePack に含まれるもの ライブラリのソース コード サンプルプログラム (C# と Visual Basic) APICodePack の入手方法
APICodePack の内容 アプリケーション サービス コントロール ダイアログ 拡張言語サービス ネットワーク センサー シェル タスク バー DirectX
APICodePack の内容 アプリケーション サービス • アプリケーションの再起動と修復 • 予期せぬエラーの発生時に、未保存のデータを修復する • バッテリーの状態の検知 • 電源管理
APICodePack の内容 コントロール • エクスプローラー ブラウザー • コモン ダイアログ • タスク ダイアログ ダイアログ
APICodePack の内容 拡張言語サービス • 中国語の簡体字と繁体字などの相互変換 • ネットワーク接続の検知 • ネットワーク ID やドメイン タイプなどの取得 廣東氣象臺 广东气象台 ネットワーク
APICodePack の内容 センサー • 利用可能なセンサーの取得 • 繋がったセンサーの状態変更取得 • 特定のセンサーの取り出し • 現在値の取得
APICodePack の内容 シェル • 機知のフォルダーの取得 • 検索 • ストック アイコン • WPF グラス ウインドウ • サムネイル • ジャンプ リスト タスク バー
APICodePack の内容 DirectX • Direct 2D • Direct 3D 10/11 ※DirectXSDK が必要
アジェンダ • Windows APICodePack とは • CodePack による機能追加 • アプリケーションの再起動と修復 • 電源処理 • タスク バーの活用 • まとめ
予期せぬエラーによりクラッシュしたとき、入力していたデータを修復予期せぬエラーによりクラッシュしたとき、入力していたデータを修復 アプリケーションの再起動と修復
修復の仕組み 実行 再起動用コードの登録 再起動 修復用メソッドの登録 再起動かどうかの判定 (再起動の場合) データの復元 クラッシュ 修復用メソッドによる データの保存
アプリケーション実行時の流れ アプリケーションの起動 コマンド ライン オプション使用し、再起動かどうかを判別する システムによる再起動かどうかの判定 YES NO データの復元 ファイルに保存しておいたデータを復元する アプリケーションの実行 再起動用コードの登録 修復用メソッドの登録
アプリケーション実行時の流れ クラッシュ フィールドに保持されているデータを保存する 注: テキスト ボックスなどのコントロールが保持しているデータは保存できない 修復用メソッドが 自動的に呼び出される システムにより 再起動される
DEMO アプリケーションの再起動と修復
WindowsErrorReporting の機能を使用 そもそもはアプリケーションのエラーを作成元に伝える仕組み 予期せぬエラーの発生時に、修復用メソッドを呼び出すように指定できる C# 修復用メソッドの登録 RecoveryDatadata = new RecoveryData(new RecoveryCallback(RecoveryProcedure), null); RecoverySettingssettings = newRecoverySettings(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 APICodePack とは • CodePack による機能追加 • アプリケーションの再起動と修復 • 電源処理 • タスク バーの活用 • まとめ
バッテリー駆動の判別や、バッテリーの残量を検知バッテリー駆動の判別や、バッテリーの残量を検知 バッテリーの残量が少ない場合の対処例 自動保存の機能の追加 データのアップデート等を減らす CD/DVD へのアクセスを減らす バックグラウンドのタスクを減らす 不必要なタスクを実行しない 電源管理
バッテリーで稼働しているかどうかの検知 バッテリー残量の検知 C# バッテリーの残量 if (PowerManager.PowerSource==PowerSource.Battery) { // バッテリーで稼働している場合 } if (PowerManager.BatteryLifePercent< 20) { // バッテリー残量が 20% 未満の場合 }
DEMO バッテリーの検知
アジェンダ • Windows APICodePack とは • CodePack による機能追加 • アプリケーションの再起動と修復 • 電源処理 • タスク バーの活用 • まとめ
タスク バーの進化 ITaskbarList ITaskbarList2 ITaskbarList3 ITaskbarList4
タスク バーの進化 ITaskbarList ITaskbarList2 フル スクリーンの検知 ITaskbarList3 サムネイルの表示 プログレス バー オーバーレイ アイコン ジャンプ リスト ITaskbarList4 タブ プロパティ
Windows7 のタスク バー サムネイル サムネイル ツール バー ジャンプ リスト アクティブ 非実行 実行 複数実行
作業の進捗をアイコン上に展開 作業の状態に合わせ、緑、黄色、赤のプログレス バーをアイコンに表示 進捗状態はアプリケーション側で指定 プログレス バー
C# プログレス バーの実装 // 色を指定 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# クリッピングの実装 TabbedThumbnailpreview = TaskbarManager.Instance. TabbedThumbnail.GetThumbnailPreview( tabControl1.SelectedTab); preview.ClippingRectangle = new Rectangle( thumbX, thumbY, 200, 119);
DEMO サムネイルとクリッピング
最近使ったもの/ • よく使うもの • 項目自体を表示させないことも可能 • デフォルトでは、いつも表示と最近使ったものを表示する ジャンプ リスト • 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 APICodePack とは • CodePack による機能追加 • アプリケーションの再起動と修復 • 電源処理 • タスク バーの活用 • まとめ
アプリケーションの再起動と修復 予期せぬエラーが発生してしまっても、データがなくならない 電源管理 バッテリーが少なくなってもあわてない タスク バーの活用 サムネイルやジャンプリストを活用し、生産性の向上を実現 まとめ 簡単に実装できます アプリケーションの価値が上がります