Code Recipeの逆引きサンプルコードにWindows 7のタスクバー関連のコードを掲載しました

マイクロソフトの田中達彦です。10月くらいに連載していたWindows API Code Packの内容の一部を、Code Recipeの逆引きサンプルコードとしてまとめ、公開しました。 [C#] Windows API Code Pack を使用して、Windows 7 タスクバー上の縮小表示 (サムネイル) にツール バーを追加するhttp://msdn.microsoft.com/ja-jp/windows/gg494958 [VB] Windows API Code Pack を使用して、Windows 7 タスクバー上の縮小表示 (サムネイル) にツール バーを追加するhttp://msdn.microsoft.com/ja-jp/windows/gg494959 [C#] Windows API Code Pack を使用して、Windows 7 タスクバー上にタブ コントロールに対応した縮小表示 (サムネイル) を表示するhttp://msdn.microsoft.com/ja-jp/windows/gg494960 [VB] Windows API Code Pack を使用して、Windows 7 タスクバー上にタブ コントロールに対応した縮小表示 (サムネイル) を表示するhttp://msdn.microsoft.com/ja-jp/windows/gg494961 [C#] Windows API Code Pack を使用して、Windows…


Windows API Code Packによるアプリ開発 番外編5 ~コードレシピでアイコン オーバーレイのコードを公開~

マイクロソフトの田中達彦です。MSDNオンラインのCode Recipeの逆引きサンプルに、Windows API Code Packを使用したアイコン オーバーレイの記事を載せました。 ブログの連載のときにはなかった、Visual Basicのコードも掲載しています。 VB編 : http://msdn.microsoft.com/ja-jp/windows/gg412557.aspxC#編 : http://msdn.microsoft.com/ja-jp/windows/gg412556.aspx 前回のプログレスバーのときと同様、驚くほどコードをシェイプアップさせました。コンソールアプリケーションで、アイコンだけオーバーレイさせています。 こちらをお試しいただき、Window 7 アプリ投稿キャンペーンにもぜひご応募ください。 マイクロソフト田中達彦


Windows API Code Packによるアプリ開発 番外編4 ~コードレシピでVBのコードを公開~

マイクロソフトの田中達彦です。好評をいただいていたWindows API Code Packの連載が、MSDNオンラインのCode Recipeの逆引きサンプルコードに登場しました。今回は、進行状況バー (プログレスバー) の実装方法をCode Recipeで公開しました。 ブログでの連載と違う部分は、Code Recipeの条件に以下のものがあるので、それに応じているという点です。- Code Recipeに載せるプログラムは、なるべくシェイプアップしたコード量の少ないものでないといけない。- なるべくVisual BasicとC#の両方のコードを掲載しなければならない。 では具体的にどこが違うかというと、ブログでの連載時にはWindowsフォームを使用していたところを、Code Recipeではコンソール アプリケーションに変えてしまった点と、VBのコードを用意した点です。 Visual Studio上で試す場合は、まずコンソール アプリケーションのプロジェクトを作成し、Code Recipeにあるように参照を追加します。そして、もともとのコードをCode Recipeにあるコードに置き換えてビルドします。これで、試すことができます。 記事はこちらからどうぞ。Visual Basic編 : http://msdn.microsoft.com/ja-jp/windows/gg317722.aspxC#編 : http://msdn.microsoft.com/ja-jp/windows/gg317721.aspx Windows API Code Packの連載はこちらからhttp://blogs.msdn.com/b/ttanaka/archive/2010/10/25/teched-windows-api-code-pack.aspx ぜひCode Recipeの逆引きサンプルコードもご参照いただき、Windows 7 アプリ投稿キャンペーンにもご参加ください。http://msdn.microsoft.com/ja-jp/windows/jpwin7cp01.aspx マイクロソフト田中達彦


Windows API Code Packによるアプリ開発 番外編3 ~WPF 4でのプログレスバーの実装方法~

マイクロソフトの田中達彦です。今までWindows API Code Packの説明ということで、主に.NET Framework 3.5以前のWindowsフォームを元に説明していました。.NET Framework 4のWPFはWindows 7のタスクバーの機能をサポートしていますので、その方法を紹介します。 [WPF 4での実装方法]WPF 4でプログレスバーを使うには、以下のように実装します。 System.Windows.Shell.TaskbarItemInfo myTaskbar = new System.Windows.Shell.TaskbarItemInfo(); // 色を緑に指定myTaskbar.ProgressState = System.Windows.Shell.TaskbarItemProgressState.Normal;// 値を0.5(アイコン表示領域の半分)にするmyTaskbar.ProgressValue = 0.5; TaskbarItemInfo = myTaskbar; ここでAPI Code Packと違う点は、ProgressValueを設定するときに、0から1までの間の数値を設定するという点です。 [試してみるには]簡単な実験を行うときには、以下のようにします。1. Visual Studio 2010を立ち上げ、新規プロジェクトでWPFアプリケーションを選択します。その際、.NET Frameworkのバージョンは4を選択しておきます。 2. フォーム上にSliderを貼り付けます。 3. 貼り付けたSliderをダブルクリックし、生成されたイベントハンドラに以下のコードを記述します。 private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e){    System.Windows.Shell.TaskbarItemInfo myTaskbar = new System.Windows.Shell.TaskbarItemInfo();     // 色を黄色に指定    myTaskbar.ProgressState =…


Windows API Code Packによるアプリ開発 総集編 / ブログ ビューワー

Windows API Code Packによるアプリ開発 [TechED2010 ポストセッション]総集編 / ブログ ビューワーマイクロソフトの田中達彦です。Windows API Code Packの連載をWebブラウザ上で確認していくのはめんどうだと思われる方のために、タブをクリックするだけで記事を見ることができるブログ ビューワーを作成しました。 このブログ ビューワーを使うと、見たい記事を一発で見られるようになります。環境にあわせて、以下の3種類を用意しました。.NET Framework 4のWPFを使用したWPF4版.NET Framework 3.5のWPFを使用したWPF版.NET Framework 2.0のWindowsフォームを使用したWinForm版ファイルをダウンロードして展開し、起動するだけです。起動時にインターネットから情報を読み込むために少し時間がかかります。回線の速度が遅い環境だと、表示までに時間がかかることがあります。一度情報を読み込んでしまえば、あとはサクサク見ることができます。WPF版とWinForm版の両方を使用すると、WPFとWindowsフォームのタブコントロールの仕様の違いもよく分かります。ぜひご活用ください。 マイクロソフト田中達彦 BlogViewerAPICodePack.zip


[TechEdポストセッション] Windows API Code Pack 連載一覧

マイクロソフトの田中達彦です。連載第1弾の「Windows API Code PackによるWindowsアプリ開発」の連載を、無事終えることができました。本連載の記事をまとめ、一覧にしました。 Windows API Code PackによるWindowsアプリ開発 [TechEDポストセッション] 第1回 : Windows API Code PackとはWindows API Code Packについての概要を説明しています。 第2回 : アプリケーションの再起動と修復 その1第3回 : アプリケーションの再起動と修復 その2予期せぬクラッシュに遭遇したときに、入力中のデータを自動的に保存することができます。その方法を説明しています。第4回 : 電源の状況の把握電源がACアダプターから供給されているのかバッテリーで供給されているのか、バッテリーの残量はどれくらいあるのかを検知することができます。 第5回 : Windows 7 タスクバー ~アイコン オーバーレイ~タスクバー上に表示されているアイコンに、さらに小さいアイコンを重ねて表示させる方法を説明しています。 第6回 : Windows 7 タスクバー ~進行状況バー (プログレス バー)~タスクバー上に、アプリケーションの処理の進行状況を示すバーを表示させる方法を説明しています。 第7回 : Windows 7 タスクバー ~サムネイルツールバー その1~第8回 : Windows 7 タスクバー ~サムネイルツールバー その2~タスクバーのアイコン上にマウスカーソルを移動させると、サムネイルと呼ばれる縮小表示が表示されます。そのサムネイルの下に、特定の動作をさせるツールバーを表示させることができます。…


Windows API Code Packによるアプリ開発 第17回 Windows 7 タスクバー ~ジャンプリストの実装方法~

Windows API Code Packによるアプリ開発 [TechED2010 ポストセッション]第17回 Windows 7 タスクバー ~ジャンプリストの実装方法~ Windows API Code Packによるアプリ開発も、いよいよ最終回です。 [実装前にやること]既存のプロジェクトに、ジャンプリストの機能を実装するという前提で進めます。ここでは、Visual Studio 2008とC#を使用したプロジェクトを想定しています。 最初に、.NET Framework 2.0をご使用の場合は、メニューの[プロジェクト]-[(プロジェクト名)のプロパティ]を選択して、対象のフレームワークを.NET Framework 3.5に変更してください。 次に、メニューの[プロジェクト]-[参照の追加]を選択し、表示される参照の追加ダイアログの[参照]タブをクリックして、インストールしているMicrosoft.WindowsAPICodePack.Shell.dllへの参照を追加してください。 プログラムの最初のほうにあるusingが並んでいるところには、以下の2文を追加しておきます。 using Microsoft.WindowsAPICodePack.Taskbar;using Microsoft.WindowsAPICodePack.Shell;さらに、Form1クラスなどの機能を実装するクラスに、以下の定義を追加します。 private JumpList myJumpList;これで、ジャンプリストの機能を実装できるようになりました。 [JumpTaskの実装]特定のアプリケーションを起動させるJumpTaskの実装を行います。まずフォームの何も貼り付けていない部分をダブルクリックし、自動的に生成されるForm1_Shownの中に、以下のコードを記述してください。 myJumpList = JumpList.CreateJumpList();ここでジャンプリストを生成し、そこにJumpTaskに表示させるタスクを追加します。例えばメモ帳を表示させる場合、Form1_Shownの中に以下のコードを書きます。 string systemFolder = Environment.GetFolderPath(Environment.SpecialFolder.System); myJumpList.AddUserTasks(new JumpListLink(System.IO.Path.Combine(systemFolder, “notepad.exe”), “メモ帳を起動する”){    IconReference = new IconReference(System.IO.Path.Combine(systemFolder, “notepad.exe”), 0)    // コマンドラインオプションを追加するときは、以下のように行う    , Arguments = “c:\\autoexec.bat”});コマンドラインオプションを追加しない場合は、Argumentsが含まれる行を削除してください。なおこの例では、1行まるまる削除すればいいように、カンマをこの行の冒頭につけています。コマンドラインオプションを指定する際は、このカンマを前の行末につけたほうが見栄えがいいです。 [JumpPathの追加]JumpPathの追加も、基本はJumpTaskの追加と方法は変わりません。指定するファイルを、実行可能形式ファイルである.exeのファイルから、他のファイルに変えるだけです。例えばスクリーンセーバーのバブルを表示される場合は、以下のように実装します。…


Windows API Code Packによるアプリ開発 第15回 Windows 7 タスクバー ~見られては困るサムネイル~

Windows API Code Packによるアプリ開発 [TechED2010 ポストセッション]第15回 Windows 7 タスクバー ~見られては困るサムネイル~ [マル秘アプリケーション]サムネイルとして、実行中のアプリケーションの縮小画面が表示されることは、利便性の面から考えると便利な機能です。しかし、会社内の人事考課のアプリケーションなど、他の人に見られたら困るアプリケーションもあります。机に座って人事考課のアプリケーションを起動していたとします。そのときに、後ろに人の気配がして、とっさに別のアプリケーションをクリックして人事考課のアプリケーションを隠します。そのような状況でも、タスクバーの上にマウスを持ってきてしまうと、サムネイルとして人事考課のアプリケーションのサムネイルが表示されてしまうのです。さらに、サムネイルの上にマウスカーソルが載ってしまうと、アプリケーションそのものが表示され、本来隠していたものが表に出てきてしまいます。そのようなマル秘アプリケーションを起動させた時でも、サムネイルに縮小表示させない方法を紹介します。 [特定の画像の表示例]この画像は、あるアプリケーションを起動させて、そのサムネイルを表示させている例です。 アプリケーションの見た目とサムネイルで表示されている内容が全く異なります。本連載第13回の記事を読まれた方は、ピンッと来ていらっしゃるかもしれません。第13回の記事中のコードに、以下のものがあります。 // プレビューに、タブ上に表示されているイメージを設定するBitmap previewImage = TabbedThumbnailScreenCapture.GrabWindowBitmap(    tabControl1.SelectedTab.Handle, tabControl1.SelectedTab.Size);preview.SetImage(previewImage); ここでは、指定したタブのスクリーンショットを撮り、それをサムネイルのイメージとして表示させるという処理を行っています。わざわざサムネイル用にスクリーンショットを撮影しているということは、その部分で別の画像を用意しておけば、その画像になるのです。特定の写真を表示させる場合は、以下のようなコードを書くと、指定したフォルダにある写真をサムネイルとして表示します。 Bitmap photo = new Bitmap(“c:\\tmp\\photo\\neko1.jpg”);preview.SetImage(photo);このコードは特定のファイルを使用していますが、リソースに画像を登録して、そのリソースを使う方法のほうがスマートです。 [サムネイルを使用したプレビューの問題]先ほど説明した、特定の画像を表示させる方法には、実は問題があります。サムネイルを表示させた状態でサムネイルの上にマウスカーソルを持ってくると、そのウィンドウだけ表示されます。そのときに、上記の方法だとこのような画面になってしまいます。サムネイルに表示させたものが、そのままアプリケーションのプレビューの上に貼り付いています。これを解決するには、サムネイルに画像を設定する部分を以下のようなコードに変更します。 Bitmap secretImage = new Bitmap(Properties.Resources.maruhi, tabControl1.SelectedTab.Size);preview.SetImage(secretImage);ファイルから直接読み込む場合はサイズの変更に対応していないため、リソースに追加されているmaruhiという画像を使用しています。このアプリケーションを実行すると、以下のようになります。 タスクバーのアイコンの上にマウスを移動させたときの画面 サムネイルの上にアイコンを移動させたときの画面 今回のように特定の画像を表示させる場合、もとのアプリケーションのサイズを変えたときなどのサムネイルの再描画は自動的に行われませんので、リサイズ等に対応した処理を追加する必要があります。 次回は、ジャンプリストについて説明します。 [参考資料]TechEDでのビデオとスライドhttp://msdn.microsoft.com/ja-jp/events/ff973814.aspx内容を早く知りたい方や、デモを確認されたい方は、ビデオをご覧ください。 [Windows API Code Packのダウンロード]http://code.msdn.microsoft.com/WindowsAPICodePackこのページの右上にある、「Current Release」と書かれた部分のすぐ下にあるリンクをクリックすると、ダウンロードページに飛びます。 [Windows API Code PackによるWindowsアプリ開発 / TechEDポストセッション]第1回 : Windows API Code Packとは第2回 :…


Windows API Code Packによるアプリ開発 第14回 Windows 7 タスクバー ~画面の一部だけをサムネイルする~

Windows API Code Packによるアプリ開発 [TechED2010 ポストセッション]第14回 Windows 7 タスクバー ~画面の一部だけをサムネイルする~ [サムネイルのクリッピング]Windows 7のタスクバーのサムネイルには、アプリケーションの一部のみを縮小表示させる機能があります。この図は、同じアプリケーションを2つ起動し、片方はページ全体を縮小表示させ、もう片方はページの一部分のみを表示させています。このように、アプリケーション側で任意の部分をサムネイルとして縮小表示させることができます。このことをクリッピングと呼びます [クリッピングの実装]クリッピングの機能を実装するには、どのサムネイルに対してクリッピングを行うかを選択し、クリッピングさせる範囲を指定するだけです。ボタンをクリックしたときにクリッピングを行うこともできますし、テキストボックスを複数使用しているアプリケーションの場合は、テキストボックスへの入力のイベントハンドラでクリッピングを行うことにより、入力中のテキストを表示させることもできます。実装は、以下のように行います。実装前に、第5回の[タスクバー関連の機能を使う前に]をご参照ください。 // どのサムネイルをクリッピングするかを選択TabbedThumbnail preview =     TaskbarManager.Instance.TabbedThumbnail.GetThumbnailPreview(tabControl1.SelectedTab);// クリッピングさせる範囲を指定 (x座標, y座標, 幅, 高さ)preview.ClippingRectangle = new Rectangle(35, 100, 200, 119); [Windows API Code Packとクリッピング]Windows API Code Packでサポートしているクリッピングは、タブ コントロールを使用するTDIアプリケーションに限られます。TDIアプリケーションでないアプリケーションは、Windows API Code Packを使用してもクリッピングを行うことができません。タブ コントロールに対して自前でサムネイルを用意するときは、再描画なども自前で行う必要があります。その詳細については、第13回の記事をご参照ください。 次回は、サムネイルの機能の応用について説明します。 [参考資料]TechEDでのビデオとスライドhttp://msdn.microsoft.com/ja-jp/events/ff973814.aspx内容を早く知りたい方や、デモを確認されたい方は、ビデオをご覧ください。本連載は、Code Packのバージョン1.1を元に説明しています。TechEDでは、当時の最新バージョンである1.01を元に説明しました。内容はほぼ同じですが、クラス名など一部に小さな違いがあることがあります。 [Windows API Code Packのダウンロード]http://code.msdn.microsoft.com/WindowsAPICodePackこのページの右上にある、「Current Release」と書かれた部分のすぐ下にあるリンクをクリックすると、ダウンロードページに飛びます。[Windows API Code PackによるWindowsアプリ開発 / TechEDポストセッション]第1回…


Windows API Code Packによるアプリ開発 第13回 Windows 7 タスクバー ~タブ サムネイルのイベント処理~

Windows API Code Packによるアプリ開発 [TechED2010 ポストセッション]第13回 Windows 7 タスクバー ~タブ サムネイルのイベント処理~ タブ サムネイルの実装には、サムネイルの数を増やすなどの見た目の部分の実装以外に、各サムネイルをクリックしたときなどのイベントに対応した処理の実装が必要になります。 前回の「タブ サムネイルの実装」では、見た目の部分の実装を行いました。前回の実装で、一見サムネイルの追加に成功したように見えます。しかし、サムネイルに対する操作を行うと、対応するコードを用意していないため、動きが変になってしまいます。今回は、イベントに対応する実装方法を紹介します。 [イベントの種類]タブ サムネイルを作成したとき、タブ サムネイルに対して発生する可能性があるイベントは、以下の5つのイベントです。TabbedThumbnailActivated : サムネイルがクリックされたときに発生TabbedThumbnailClosed : サムネイルの右上にある赤い X ボタンがクリックしたときに発生TabbedThumbnailMaximized : サムネイル上で右クリックしたときに表示されるコンテキストメニューの[最大化]を選択したときに発生TabbedThumbnailMinimized : サムネイル上で右クリックしたときに表示されるコンテキストメニューの[最小化]を選択したときに発生TabbedThumbnailBitmapRequested : タブ サムネイルを最初に表示したときなどに発生 これらのイベントに対応するイベントハンドラを用意しない場合は、ユーザーが該当する操作を行っても、アプリケーションは反応しません。 [イベントハンドラの実装]ここでは、TabbedThumbnailActivatedとTabbedThumbnailClosedのイベントに対応する処理を実装します。まずは、これらの2つに対応するイベントハンドラを実装しましょう。 // サムネイルをクリックしたときのイベントハンドラvoid preview_TabbedThumbnailActivated(object sender, TabbedThumbnailEventArgs e){    foreach (TabPage page in tabControl1.TabPages)    {        if (page.Handle == e.WindowHandle)        {            // クリックされたサムネイルに該当するタブを選択された状態にする            tabControl1.SelectedTab = page;           …