Lync 2013 (Preview) でアドレス帳が同期できない

Lync Server 2013 のプレビュー版に関する記事です。正式リリース時には変更される可能性がありますので、ご注意ください。

Lync 2010 の頃からですが、アドレス帳が同期できず、ユーザーが検索できないという現象によくぶつかります。こういうメッセージ、見たことあります?

Lync Server は、24 時間ごとに 1 回、バックエンドの SQL サーバーの内容からアドレス帳を更新します。また、Lync (クライアント) は起動してから最大 1 時間以内にサーバーのアドレス帳との同期を行います。つまり、単純に待っていれば解決するケースもあります。

こういうケースでは、強制的にアドレス帳の更新とクライアントの同期処理を行わせることもできます。 Lync Server では Update-CsAddressBook コマンドレットを実行し、クライアントではキャッシュを削除することで、強制的に同期させることができます。

ちなみに、クライアント側のキャッシュの場所は以下。フォルダーごと削除すれば OK です。 Lync 2010: %LOCALAPPDATA%MicrosoftCommunicatorsip_<username@domain> Lync 2013: %LOCALAPPDATA%MicrosoftOffice15.0Lync

詳しくは以下の記事を。 Updating the Lync 2010 Address Book


WCF HTTP Activation サービス

前述の方法で解決すれば簡単なのですが、今回私が Lync Server 2013 (Preview) の環境を作っていたときは、これだけでは同期できませんでした。

TechNet のフォーラムで、同様の現象にぶつかった方々の議論があります。 それによると、.NET Framework 4.5 の機能で、WCF HTTP Activation サービスを有効にしなければならないようです。

サーバー マネージャーから、以下の機能を追加しましょう。

機能を追加したら、Lync Server を再起動し、前述の方法でアドレス帳の強制同期をします。 私の環境では、これでアドレス帳が同期され、ユーザーを検索できるようになりました。

Twitter にヘッダー画像を設定できると聞いて

いつからかわかりませんが (最近?)、Twitter でヘッダー画像を設定できるようになったと聞きまして。 さっそく現実逃避しました試しました。

[設定] > [デザイン] から、[ヘッダーを変更する] で画像を選びましょう。

適正サイズは 1252 x 626 ピクセルのようで。 9/21 追記: いつの間にか「推奨サイズ 1200 x 600」に変わっていました。。。

それより小さい画像を指定すると縦横比無視で引き伸ばされてしまうのでよろしくない感じ。 それより大きい画像の場合は縦横どちらかが適正サイズになるように縮小されるようです。

あとは、位置とサイズを指定しておわり。

でこんな感じになりました (PC / iPhone)。

API とか提供されてるんでしょうかね?

以上現実逃避でした。

Lync Server 2013 (Preview) でフロントエンド サービスが開始できない

Lync Server 2013 のプレビュー版に関する記事です。正式リリース時には変更される可能性がありますので、ご注意ください。

今月末の某勉強会に向けて、自宅に Lync 環境をせかせか構築する日々でございますが。 私はインフラ エンジニアではないので (言い訳)、AD 環境の構築やら Lync Server の展開やらいろいろ四苦八苦しております。

で、その最中に題記の現象に出くわしました。

私が作っている環境は Lync Server 2013 (Preview) の Standard Edition サーバーですので、フロントエンド サービス、音声ビデオ会議サービス、アプリケーション共有サービスなどなど、全てのサービスが単一のサーバー内で動作しています。

そのなかで、下の画像のように RtcSrv (Lync Server フロントエンド) サービスが [開始中] となったままうんともすんとも言わなくなりました (挙句、停止もできなくなりサーバーのシャットダウンもままならず)。これは困った。

調べてみると、どうやらトポロジ ビルダーでサーバーの証明書を更新したのが原因のようでした。 ズバリ、Microsoft による対処方法がここに。 Release Notes for Lync Server 2013 Preview

Installation > Front End Servers will not function correctly if the certificate assignment changes for Front End Servers (2992411)

更新前の証明書の設定を参照しようとしてしまうため、サーバーの証明書を更新したら FabricPackageFileName という環境変数をリセットする必要があります。

管理者特権のコマンド プロンプトを起動して、以下のコマンドを実行しましょう。 setx /m FabricPackageFileName "

これで、RtcSrv (Lync Server フロントエンド) サービスを再起動すれば、正常に開始されるようになります。

Windows 7 の意外と知られてなさそうなショートカット キーとか

Windows で使えるショートカット キーは結構あります。 F2 (名前変更)、Ctrl + X (切り取り)、Ctrl + C (コピー)、Ctrl + V (貼り付け)、Ctrl + A (すべて選択)、Ctrl + Z (元に戻す)、Ctrl + Y (やり直し) などは、アプリケーション共通で使えるショートカット キーとして有名ですよね。

最近なぜか Twitter でこの手の話題を見かけるような気がする…ので、(n 番煎じもいいところですが) 意外と知られてなさそうなショートカット キーで、自分がよく使うものなどまとめてみました。

※ Windows 7 または Windows 8 RP のものです。それ以前の Windows は知りません。


Windows キー組み合わせ

Windows キー (以下 Win) と組み合わせるものです。

Win + 数字 タスク バーにピン留めされたアプリケーションの起動 Windows キーと数字の n (1 ~ 9) を押すと、タスク バーの左から n 番目のアプリケーションが起動します。
Win + E コンピューター (XP でいうマイ コンピュータ)
Win + R ファイル名を指定して実行
Win + T タスク バーにフォーカスを移す
Win + U コントロール パネルの [コンピューターの簡単操作センター] を開く
Win + P プレゼンテーション表示モードの選択 こんなのが出ます。
Win + D デスクトップの表示 (タスク バーの右端 (または下端) をクリックしたときと同じ)
Win + F F3 検索
Win + L コンピューターのロック
Win + X Windows モビリティ センターの表示 ※ たぶんラップトップ PC だけだと思います
Win + M すべてのウィンドウを最小化
Win + Shift + M [Win + M] で最小化したウィンドウを元に戻す
Win + B 隠れているインジケーターの表示 こんな感じで ▲ ボタンにフォーカスが移るので、そのまま Enter キーを押すと隠れているインジケーターが表示されます。
Win + Pause [システム] の表示 (システムのプロパティ)
Win + ↑ ウィンドウの最大化
Win + Shift + ↑ ウィンドウの縦サイズのみ最大化
Win + ↓ (ウィンドウが最大表示、または両端にスナップしている場合) ウィンドウを通常に戻す (ウィンドウが通常表示の場合) ウィンドウの最小化
Win + ← Win + → ウィンドウを左右に寄せる (Aero スナップで画面端に寄せる) 繰り返すとディスプレイ間を移動 マウス操作と違い、マルチ ディスプレイ環境でデスクトップの端になっていない箇所でも使えるので便利。 [Win + ←] と [Win + →] で、ウィンドウをディスプレイの左右にキレイに並べることができます。
Win + Shift + ← Win + Shift + → 隣のディスプレイにウィンドウを移動
Win + ; (+) 拡大 拡大鏡が起動され、拡大率が 1 つ上がります。
Win + – 縮小 拡大鏡の拡大率が 1 つ下がります。
Win + Space デスクトップの表示 押している間、ウィンドウが透明になってデスクトップが表示されます。

文字入力

文字入力中、カタナカに変換するとき F7 キーを使う方も多いと思いますが、Ctrl のショートカット キーで同じことができるのをご存じでしたでしょうか。 個人的には、こちらの方がホーム ポジションを崩さずに入力できるので好みです。

※ Windows 標準の Microsoft IME (または Microsoft Office IME) のものです。他の IME の場合は効かないかも。

F6 Ctrl + U ひらがなに変換
F7 Ctrl + I カタカナに変換
F8 Ctrl + O 半角カタカナまたは半角アルファベットに変換 (入力中の文字が日本語の場合は半角カタカナに、英語の場合は半角アルファベットになります)
F9 Ctrl + P 全角アルファベットに変換
F10 半角アルファベットに変換

エクスプローラーでマウスと組み合わせ

キーボード ショートカットではありませんが、一緒に紹介。 タスク バーやスタート メニューで使えるものです。マウスのクリックと組み合わせて使います。

Shift + タスク バー ボタン右クリック 本来のメニューの表示 起動していないアプリケーションに対してはショートカットとしてのメニューが、起動済みのアプリケーションに対してはシステム メニューがそれぞれ表示されます。  
Shift + タスク バー ボタン左クリック アプリケーションの起動 既に起動されているアプリケーションでも複数起動されます。割と便利。  
Ctrl + Shift + タスク バー ボタン左クリック 管理者として実行 上記と同じですが、こちらは UAC が表示され管理者特権で実行されます。
Ctrl + Shift + スタートメニューの項目 管理者として実行 タスク バー ボタンだけでなく、スタート メニューの項目に対しても同様です。管理者特権でアプリケーションを起動できます。
Shift + フォルダー右クリック 通常のコンテキスト メニュー (ただの右クリックで出す場合) に以下のメニューが追加 [新しいプロセスで開く] [コマンド ウィンドウをここで開く] [パスとしてコピー]
Shift + ファイル右クリック 通常のコンテキスト メニュー (ただの右クリックで出す場合) に以下のメニューが追加 [パスとしてコピー] 更に、実行ファイル以外の場合は以下も追加 [スタート メニューに表示する]

その他 便利なもの

Ctrl + Shift + Esc タスク マネージャーの起動 これ一発で起動できます。[Ctrl + Alt + Delete] を押したり、タスク バーを右クリックしたりする必要はありません。
Ctrl + ← Ctrl + → キャレット位置のジャンプ テキスト ボックス内で [Ctrl + 十字キー (左右)] を押すと、キャレット位置を次の単語までジャンプします。 たとえばエクスプローラーのパスでこれをやると、 以下のように階層ごとにキャレット位置をジャンプできます。
Alt + Tab Alt + Esc ウィンドウの切り替え [Alt + Tab] の場合は切り替えウィンドウが出ますが、[Alt + Esc] の場合は出ません。
Alt + PrintScreen ウィンドウのスクリーン ショット ただの PrintScreen ではデスクトップ全体のスクリーン ショットになりますが、Alt キーと一緒に押すと現在アクティブなウィンドウのみのスクリーン ショットになります。

 


以上、思いつく限り挙げてみました。 言葉だけでは挙動がわかりづらいものもあると思いますので、実際に動かしてみて頂けるといいかも…しれません。 他に思いついたら更新します。ご参考までに。

どうでもいいですが F1 キーをヘルプに割り当てた人を私は赦さない

ちなみに、 Windows 8 Release Preview では更に多くのショートカット キーが追加されています。 Windows 8 RP で使えるショートカットキー: 世の中は不思議なことだらけ

Windows 8、8/15 から開発者向けに配布開始ですね。楽しみです。

C# で使う TaskDialog の注意点

過去 3 回 (その 1その 2その 3)、Windows API Code Pack による TaskDialog について紹介してきました。 最後に、私が TaskDialog を弄ってて気付いた注意点をいくつか。


コントロールの併用

これまでいろいろ紹介してきた TaskDialog のコントロールですが、併用できるものとできないものがあります。

標準ボタン (StandardButtons プロパティで設定できるもの) と TaskDialogButton の併用はできません。同じように、TaskDialogButton と TaskDialogCommandLink も併用できません。両方を Controls に追加して Show() しようとすると怒られます。

ただし、標準ボタンと TaskDialogCommandLink は併用できます。ので、こんな TaskDialog を作ることはできます。が、ユーザーに何をさせたいのかわからなくなるのでやめましょう。


Enabled = false にしても…

TaskDialogButtonBase クラスには Enabled プロパティがあるため、コントロールを非活性化することができます。が、なんと UI 上でグレーアウトしません。

おわかり頂けただろうか… わかりませんよね。はい。 2 つめの CommandLink は Enabled プロパティに false を指定しているため、押しても反応しません。が、UI がグレーアウトしないため、Enabled の true/false の区別がつきません。どうしてこんな仕様なのか…

いずれ修正される可能性はありますが、現時点の最新版 (v1.1) ではこのような見た目になってしまいます。Enabled プロパティはあまり使わない方がよさそうですね。。。


以上、TaskDialog を紹介してきました。 CommandLink など活用すれば、下手な MessageBox 出すよりよほどわかりやすいダイアログになりますので、個人的にはもっと流行って欲しいと思っていたり。。。

上記のような注意点もありますが、是非使ってみて下さい。

C# で TaskDialog を使う (3)

いきなり投稿が一ヶ月半開くという体たらく… 仕事が忙しいせいです私のせいじゃありません

前々回前回の続きになります。


TaskDialog が使用できるかどうか判定するには

本当は 1 回目で書いておくべきでしたが、すっかり忘れていたためここで紹介します。 TaskDialog は Windows Vista 以降でしかサポートされていません。ですので、実行時に TaskDialog が使用できるかどうかを確かめ、使用できれば TaskDialog を使用、できなければ代替 UI を… などという状況が想像できます。

そんなときは、TaskDialog クラスに用意されている次の静的プロパティを使用すると便利です。

ズバリ、動作している環境が TaskDialog を使用できるかどうかを示す bool 値を返してくれます (と言っても、中身は Environment.OSVersion.Version.Major >= 6 してるだけですが…)。


TaskDialogRadioButton

その名の通り、ラジオ ボタンを表示できます。 ただし、TaskDialog 上でラジオ ボタンを使って何かを選択させる UI は今まで見たことないので、使いどころは少ないかもしれません。と言うより、ユーザーにアクションを選択させたいのであれば、後述の CommandLink を使うべきです。

そして、前回も乗せたこの図を見るとおわかり頂けると思いますが、TaskDialogRadioButton は TaskDialogButtonBase を継承しています。そして、新しいメンバーは何もありません。。。

ですので、そのまま使うと System.Windows.Controls.RadioButton のように IsChecked プロパティからチェック状態を判定… などということができません。やはり使いどころはあまりなさそう。

result などという変数を用意して、ラジオ ボタンがクリックされたらその名前を result に突っ込むという苦肉の策。これで、ダイアログが閉じたときにどのラジオ ボタンが選択されていたのか判定できますが…

やっぱり CommandLink の方がいいです。私はたぶん使わないです、TaskDialogRadioButton。


TaskDialogProgressBar

続いて、プログレス バーです。

TaskDialogProgressBar のコンストラクター引数は、順に最小値、最大値、現在値です。 例では、最小値 0、最大値 50、現在値 0 で初期化、TaskDialog が開かれたら 100 ミリ秒ごとに現在値を 1 ずつ追加しています (ついでに、最大値になるまでボタンを無効化していたり)。

また、例では TaskDialogProgressBar を TaskDialog クラスの ProgressBar プロパティに設定していますが、他のコントロールと同様に TaskDialog.Controls.Add() メソッドで追加することもできます。 ただし、TaskDialog 上に表示できる ProgressBar は 1 つだけです。2 つ以上 Add することはできますが、後から追加した ProgressBar しか UI 上に表示されませんのでご注意ください。


TaskDialogCommandLink

そして、TaskDialog と言ったらコレ、TaskDialogCommandLink です。

OS が表示する TaskDialog でも、CommandLink のものはよく見かけますね。 使い方は簡単で、表示するテキストを指定して初期化、TaskDialog.Controls.Add() メソッドで追加するだけです。 上記の例では、3 つめの CommandLink を Default に指定しています (青枠出てるのわかります?) ので、この状態で Enter キーを押すとコンピューターを窓から投げ捨てることになります (

また、CommandLink に表示できるのはテキストのみではなく、詳しい説明なども表示できたりします。

コンストラクターのオーバーロードで、第 3 引数に説明用のテキストを指定できます。また、TaskDialogButton と同様に UseElevationIcon プロパティで UAC の特権昇格アイコンも表示できます。

ユーザーにアクションを選択させるときに役立ちますので、是非活用して頂きたいです。

C# で TaskDialog を使う (2)

前回の続きになります。今回は、TaskDialog をもう少しカスタマイズしてみます。


TaskDialog のコントロール

TaskDialog の要素には、前回紹介した Text、InstructionText、StandardButtons など、予め使える形で用意されているものもありますが、より複雑な要素を追加することができます。TaskDialog の Controls プロパティです。

TaskDialogControl の派生クラスをコレクションに追加すると、そのコントロールを TaskDialog 上に表示できます。TaskDialogControl とその派生クラスは以下の図のようになります。

この中で、Controls コレクションに追加し TaskDialog 上に表示できるコントロールは

  • 図中の青のクラス
  • 図中の青のクラスから派生したクラス
  • 図中の赤のクラスから派生したクラス

となります。

そのため、例えば TaskDialogButton を継承したオリジナルのクラスを作成し、TaskDialog 上に表示することもできます (ただし、派生クラスと言っても外観まで作り込めるわけではありませんので、使いどころは多くないかもしれませんが)。

ちなみに、上記条件以外のクラス (例えば TaskDialogBar クラス) のインスタンスを Controls コレクションに追加すると、TaskDialog.Show() したときに InvalidOperationException がスローされます。

これから、図中の青のクラスを中心に、TaskDialog 上で使用できるコントロールを紹介してきます。


TaskDialogButton で独自のボタンを配置する

TaskDialog には StandardButtons プロパティがあり、一般的なメッセージ ダイアログで使用される [OK] [キャンセル] [はい] [いいえ] [再試行] [閉じる] ボタンを組み合わせて表示することができます (TaskDialogStandardButtons 列挙値)。 大抵の場合はこれで事足りるかと思いますが、独自の文言を持つボタンを用意したい場合や、クリックされたときに何らかの処理を行いたい場合は、TaskDialogButton クラスを使用することでそれらを実現できます。

早速ですが、コードの例を示します。

contractButton、cancelButton という 2 つのボタンを作成し (元ネタはお察しください)、TaskDialog クラスの Controls コレクションに追加しました。

Text プロパティでボタンの文言を指定できます。 Default プロパティに true を指定すると既定のボタンになります。当然ですが、複数のボタンの Default プロパティを true にすると InvalidOperationException がスローされますのでご注意ください。

ボタンがクリックされると、Click イベントが発生します。クリック時に実行したい処理はここに書きましょう。今回の例ではダイアログを閉じる処理だけですが。。。

また、TaskDialogButton の話から外れますが、TaskDialog の Close メソッドは結果を指定することができます。プログラムから TaskDialog を閉じる場合は、Close メソッドの引数で結果 (TaskDialogResult 列挙値) を与えると、Show メソッドの戻り値としてその結果を受け取ることができます。 もちろん、結果を指定せずに (= 引数を指定せずに) 閉じることもできます。その場合、Show メソッドの戻り値は TaskDialogResult.Cancel です。


さらにカスタマイズ

TaskDialogButton クラスは、TaskDialogButtonBase クラスを継承しています。これらを継承し、独自のボタン クラスを作ることもできます。 (上でも言いましたが、UI をカスタマイズできるわけではないので、あまり使いどころはないかもしれません)

これを利用し、先ほどの contractButton を以下のように置き換えることができます。

この程度であれば何の意味もありませんが、ボタンのクリック時に複雑な処理を実行したい場合などでは、この方法の方が綺麗に作れるかと思います。

ちなみに、TaskDialogButton クラスと TaskDialogButtonBase クラスの違いは、UseElevationIcon プロパティがあるかないかだけです。UseElevationIcon プロパティに true を指定すると、以下のように UAC の特権昇格を示す盾のアイコンが表示されます。

そしてもう一点、これまた TaskDialogButton クラスと直接関係ありませんが、[×] ボタンには注意が必要です。上記例ではダイアログに [×] ボタンが無いのにお気付きでしたでしょうか?

StandardButtons プロパティを使用せず、TaskDialogButton クラスをはじめとしたコントロールを使用する場合、既定ではダイアログの [×] ボタンが表示されません。表示させたい場合は、TaskDialog.Cancelable プロパティに true を指定しましょう。


今回は、TaskDialogControl についてと、その派生クラスのひとつである TaskDialogButton を紹介しました。次回は… TaskDialogRadioButton 辺りを。たぶん。

WPF でシステムメニューのないウィンドウを作る

システムメニューというのは、ウィンドウ左上のアイコンをクリックしたとき、またはタスクバーを Shift + 右クリック (Windows 7 以前は右クリックのみ) したときに出るメニューです。

最近、このシステムメニューを表示したくないという要件に遭遇しました。 WindowStyle プロパティを None に、ShowInTaskbar プロパティを false にすれば表示できなくなるように見えますが、実は Alt + Space キーでバッチリ表示されてしまいます。

今回は、WPF のウィンドウからこのシステムメニューを消してみます。


Win32API

ズバリ、Win32API が必要のようです。使うのは、次のふたつの関数。

GetWindowLong 関数でウィンドウ スタイルを取得し、WS_SYSMENU を抜いたウィンドウ スタイルを SetWindowLong 関数で設定する、という流れになります。


作ってみた

今回は、上記の処理を「アタッチ可能な機能」としてビヘイビアーで作りました。

} [/crayon]

Window クラスの SourceInitialized イベントでウィンドウ スタイルの設定をしています。ハイライトした部分 (28 ~ 30 行目) が、システムメニューを外すコードになります。 一般的な初期化処理で使う Initialized イベントではない理由は、Initialized イベントの時点ではウィンドウ ハンドルを取得できないからです。

加えて、今回はおまけで Alt + F4 によるウィンドウを閉じる操作も抑止してみました。WndProc メソッドでウィンドウ メッセージを受け取り、Alt + F4 キーが押されたときに「ウィンドウ メッセージを処理した」とマークすることにより、ウィンドウを閉じる処理が行われなくなります。

あとは、このビヘイビアーをウィンドウにアタッチしてあげれば完了ですね。

これで、システムメニューが表示されない (Alt + F4 で閉じない) ウィンドウができました。 (画像じゃわかるはずもありませんが。。。


そもそも何で必要?

余談ですが、そもそも何でこんなのが必要なの?というお話。

ここ最近ずっと、業務で WPF アプリケーション上で Win32 アプリケーションを動かすということをやっています。

HwndHost は、同じトップレベル ウィンドウの他の WPF 要素の上に表示されます。 ただし、ToolTip または ContextMenu で生成されるメニューは独立したトップレベル ウィンドウであるため、HwndHost で正しく動作します。

というように、WPF ウィンドウの上に Win32 アプリケーションを乗せると、必ず Win32 アプリケーションが一番上に描画されてしまい、その上に WPF コントロールを乗せることができません。ですので、Win32 アプリケーションの上に WPF コントロールを乗せたい場合、独立したトップレベル ウィンドウ (Popup クラスや Window クラス) を用意して、それっぽく見せる必要があります。

もうおわかりかと思いますが、Win32 アプリケーションの上に乗ってるコントロールとして見せるウィンドウは、Alt + Space でシステムメニューを表示されてしまっては (+勝手に移動したり閉じられてしまっては) 困るわけです。ということで、今回のようなシステムメニューを表示しないウィンドウを作ってみました。

C# で TaskDialog を使う

今更感がありますが、最近 C# で TaskDialog を作る機会があったのでメモがてら紹介を。 (もっと流行ってほしい

そも、TaskDialog は Windows Vista から登場したメッセージ ダイアログで、操作を説明する指示テキスト (青のテキスト) を表示したり、独自のメッセージを持つボタンを配置したりすることができます。従来のダイアログ (System.Windows.MessageBox) の強化版と言ったところでしょうか。

Windows 7 で出てくる例としては、こんな感じです。


準備

TaskDialog は .NET Framework 4.0 の時点では標準 API に含まれていません (.NET Framework 4.5 でも現時点では入ってないようです?)。そのため、別途 Microsoft から提供されている “Windows API Code Pack” というライブラリを使用します。以下の URL からライブラリをダウンロードしましょう。 http://archive.msdn.microsoft.com/WindowsAPICodePack/

ちなみに NuGet でも “Windows7APICodePack” と検索すれば出てくるのですが、入手できるのは上記リンクのライブラリのコア部分のみのようです (Task Dialog 使うだけならこっちでも大丈夫ですが)。お好きな方をどうぞ。

また、TaskDialog を使用するアセンブリは、アプリケーション マニフェストで comctl32.dll のバージョンを 6 以上に指定する必要があります。 Visual Studio 2010 では、プロジェクトに対する [追加] → [新しい項目] から [アプリケーション マニフェスト ファイル] を選択して作成し、最後の方にある のコメントを解除すれば OK です (コメント アウトされた形で最初から記述されています)。

これで準備は完了です。


まずは簡単なダイアログから

さっそく、TaskDialog を使って簡単なダイアログ ボックスを表示してみます。使い方は、基本的には従来のコモン ダイアログ ボックスと殆ど同じです。using Microsoft.WindowsAPICodePack.Dialogs; をお忘れなきよう。

こんな感じです (簡単! ウィンドウ タイトルの Caption プロパティ、メッセージ本文の Text プロパティのほか、指示テキストにあたる InstructionText プロパティが指定できます。ダイアログの表示は Show() メソッドですが、動きとしては ShowDialog (ユーザーがダイアログを閉じるまで待つ) です。戻り値は TaskDialogResult 列挙型で、ダイアログ上でユーザーが押したボタンが何なのかが判ります。


詳細を表示

TaskDialog では、表示 / 非表示を切り替えられる詳細情報を乗せることができます。先ほどのダイアログに、更に以下のコードを追加して表示してみます。

ダイアログ下部の領域に Expander が出現し、展開すると ExpandedText プロパティで指定したメッセージが後から表示されるようになりました。Windows エクスプローラーのファイルのコピー ダイアログ (展開すると速度などの詳細情報を表示できる) と似たようなことが実現できますね。

DetailsExpanded プロパティは、true を指定すると最初から展開された状態で表示されます。 ExpansionMode プロパティは、追加のメッセージ (DetailsExpandedText) をどこに表示するかを指定するものです。ExpandContent を指定すると上記のようなダイアログに、ExpandFooter を指定すると以下のようになります。

ちなみに、詳細表示を有効にすると Icon プロパティでアイコンを指定しても表示されません。仕様なんでしょうかね。

5/27 追記: 詳細表示云々は関係なく、私の環境だと Windows API Code Pack の 1.0 (NuGet から入手できるバージョン) ではアイコンが表示されますが、1.1 (上記リンクからダウンロードできるバージョン) ではアイコンが表示されないみたいです。仕様なのかバグなのかよくわかってないです (少なくとも 1.1 のリリース ノートにはそれらしき記述がなかったので)。 情報お持ちの方いらっしゃいましたら教えていただけると嬉しいです。。。

これで、(最低限ですが) 従来のメッセージ ダイアログ (MessageBox) との差別化を図れました。 このほか、TaskDialog は冒頭の例に挙げたような独自のメッセージを持つボタンの配置など、より高度な機能を持っています。それらは次回の更新で紹介します。。。

続き: C# で TaskDialog を使う (2)

はじめました

そろそろ開発ネタで遊んだこと等アウトプットする場所が欲しいなぁということで、Blog 始めました。

WordPress 初めて触るので、いろいろ試行錯誤中。。。

1 日のほとんどを会社で過ごす残念な生活なので、更新頻度は低め。ゆるーく行きます

私について