ImageDividerをWindows7の機能に対応させてみました。 ダウンロードはこちら。
Windows7になってタスクバーのアイコンに進捗のバー(プログレスバー)を表示する機能が追加されました。 時間がかかるファイルのコピー処理などをバックグラウンドで行っていてもアイコンみるだけで進み具合がわかるので、なかなか便利です。 でも、これってアプリ側で対応しないといけないんですよね。
そんなわけで、対応させてみました。 Windows API Code PackというC#からWindows7の機能にアクセスするライブラリが公開されているので、対応は楽勝でした。 ところが、これをつかったアプリをVistaやXPで動かすと強制終了。 そんなわけで、OSを判定して必要に応じて、このライブラリを呼び出すようにしてみました。
こんな感じ
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.WindowsAPICodePack.Taskbar; using MS.WindowsAPICodePack.Internal;
namespace ImageDivider { public class TaskbarSingleton { private static TaskbarSingleton singleton = null;
public static TaskbarSingleton GetInstance() { if (singleton==null) { singleton = new TaskbarSingleton(); }
return singleton; }
public void SetProgressState(TaskbarProgressBarState state) { if (!CanUseTaskbar()) return; TaskbarManager.Instance.SetProgressState(state); }
public void SetProgressValue(int currentValue,int maximumValue) { if (!CanUseTaskbar()) return; TaskbarManager.Instance.SetProgressValue(currentValue, maximumValue); }
private bool CanUseTaskbar() { if (!CoreHelpers.RunningOnWin7) { return false; } else { return true; } }
} }
シングルトンクラスとして、実装しているので呼び出しはこんな感じ。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Microsoft.WindowsAPICodePack.Taskbar;
namespace ImageDivider { public partial class ProgressForm : Form { /// <summary> /// Windows7用進捗表示インスタンス /// </summary> TaskbarSingleton taskBar;
public ProgressForm() { InitializeComponent(); taskBar = TaskbarSingleton.GetInstance(); }
public void SetCurrnetCount(int count, int totalCount) { int per = (int)(((float)count / (float)totalCount) * 100); lblProgressCount.Text = string.Format("{0}枚中 {1}枚処理 ({2}%)", totalCount, count, per); pbProgress.Value = per;
this.Text = string.Format("{0}% ImageDividerは頑張って処理しています", per);
//ここでタスクバーに進捗表示 taskBar.SetProgressState(TaskbarProgressBarState.Normal); taskBar.SetProgressValue(per, 100); }
} }
最初の方のコードにあるCoreHelperというのでOSを判定している。これがどこにあるかわからなかったけど、MS.WindowsAPICodePack.Internalの中にあった。 Internalとついてる名前のものを使ってよいものか気になるけど、使ってみた。当然、必要なDLLへの参照設定は必要なので、試したい人はここを参照してやってみてください。 こんな感じでOSを判定して、TaskbarManager.Instanceを呼び出すかどうか制御することでWindows7以外でも強制終了しないですむみたい。
そんなわけで、久しぶりにプログラムネタでした。 さて、寝るか。