IS12T を Windows Phone 7.8 に更新

各 IT 系メディア等でも 報じられています が、日本で唯一発売されている Windows Phone IS12T が Windows Phone 7.8 に更新されました。

例によって「順次アップデート」となっているので、アップデートが可能になるタイミングは端末ごとに異なります。が、強制的にアップデート可能状態にする方法が存在し、私はその手段でアップデートしたのでご紹介 (n 番煎じですね、わかります)。


事前準備

まず、Zune がインストールされている PC (いわゆる ‘母艦’) のネットワークを切断します。 [コントロール パネル > ネットワークとインターネット > ネットワークと共有センター > アダプター設定の変更] から、以下のようにアダプターをすべて無効にしていまうのがよいです (右クリック -> 無効にする)。 ネットワーク接続

Windows Phone 側では、3G または Wi-Fi でインターネット接続できる状態にしておきましょう。ついでに、[設定 -> フライトモード] の画面を出しておきます。

あとは、PC と IS12T を接続し、Zune を起動するだけです。 (なお、PC と IS12T の接続、Zune の起動、PC のネットワーク切断 は、それぞれ順番が前後しても大丈夫です)


アップデート

さて、肝心のアップデートの方法です。 手順としては簡単で、Zune 側で [設定 -> 電話 -> 更新] とクリックし更新プログラムを確認しつつ、その最中に Windows Phone 側でフライトモードを ON にするだけです。

更新の確認 ↑ このタイミングで Windows Phone 側のフライトモードを ON に

しかし、タイミングが非常にシビアなので、おそらく何度かトライすることになると思います。 (私がやってみたところでは、) Zune が「電話は最新の状態です」と表示した場合はフライトモードを ON にするのが遅く、Zune が「現在、更新を確認できません。しばらくしてから、もう一度実行してください」と表示した場合はフライトモードを ON にするのが早い、といった感じでしょうか。

失敗した場合は、再度 Windows Phone 側でフライトモードを OFF にし、上記手順を繰り返します。

Zune が「電話の更新プログラムを利用できます」と表示した場合は成功です。 このとき、事前準備の際に無効にしたネットワーク接続を再度有効にしてから更新してください。でないと、アップデートに失敗し、再度上記の手順を繰り返す羽目になります。。。

また、Windows Phone 7.8 への強制アップデートの場合、更新は計 3 回あります。 Windows Phone 更新プログラム (OS バージョン 7.10.8779.8) Windows Phone 用更新プログラム (OS バージョン 7.10.8783.12) Windows Phone 用更新プログラム (OS バージョン 7.10.8858.136)

このうち、3 つめが Windows Phone 7.8 へのアップデートになります。ですので、 7.8 へ強制アップデートする場合は上記の手順を 3 回繰り返すことになります (私は 3 つすべて適用するのに 40 分くらいかかりました)。

強制アップデートではなく、普通にアップデート対象となった場合は 1 回で済む、…のかな?


Windows Phone 7.8 での変更点

こちらをご覧ください (丸投げ)。 http://www.microsoft.com/ja-jp/windowsphone/products/wp7.8/default.aspx

・スタート画面が Windows Phone 8 ライクになった ・テーマ カラーが 21 色になった ・ロック画面が Bing トップページと連動できるようになった ・パスワードを一定数間違えたとき、初期化させない設定ができるようになった


まとめ

と、Windows Phone 7 の強制アップデート手段を (今更になって) 書いたわけですが、Zune を使用しない Windows Phone 8 では当然この手段は使えないわけで、よくよく考えるとこれを使うのは今回が最後となる可能性が大いにあるわけですよね。。。

アップデートした IS12T そのものは、まぁ、前よりは気に入っています。Windows Phone 8 と比べてしまうと、情報量的にもデザイン的にも、スタート画面がどうしても見劣りしてしまっていたので。 しかし、当然ながら Windows Phone 8 端末が日本で発売されるのが最も望む展開ではあります。遅くなれば遅くなるほど手遅れになる気がしているのですが…

ともあれ、これでホーム画面は 8 と並べても遜色ない感じに。

みっつ

というわけで、左から IS12T ブラック、HTC 8S Red、

そして Lumia 620 Cyan  …のモック

_人人人人人_ > モック <  ̄Y^Y^Y^Y ̄

HTC 8S Red (Windows Phone 8) を購入!

2013 初 IYH!

EXPANSYS JapanHTC 8S Red が 5 台入荷されているのを見て、ポチってしまいました。

Windows Phone 8 端末は日本でリリースされるまで買わない (キリッ …などと申しておりましたが、仕事で海外出張など控えておりまして、SIM フリー端末ほしいなーなどと思ってた矢先に 8S Red の入荷を知ってしまい、あっという間に IYH と相成ったわけでございます。

オーダー

EXPANSYS Japan に注文したのが 1/7 の夕方、翌 1/8 に発送され、1/9 の午後には届きました。はやい。以下が FedEx による 8S の軌跡になります。

FedEx 追跡

開封の儀

こちらが外箱。

外箱

中身だけ取り出してみた。Red は色鮮やかでキレイですね。惚れました。

あざやかー

続いて中身。 本体のほか、microUSB ケーブル、USB アダプター、イヤホン、取説など。取説は中国語です。

なかみ なかみ (2)

本体。 電源ボタンは本体上部、右側上部にボリューム ボタン、右側下部にカメラ ボタンがあります。 大きさは、iPhone 4 よりちょっと大きいくらい (純正バンパーを装着した iPhone 4 とほぼ同じくらい)。重さは 113 g と iPhone 4 より軽く、本体の端が細くなるデザインのため、手にフィットして持ちやすいです。質感すばらしい。 ただし、(端が細くなるデザインのため) 側面のボタンはちょっと押しにくいかもしれません。

本体おもて 本体うら

本体裏、下部の蓋は取り外せます。SIM カードと microSD カードはここに差します。 説明書には親指で押し上げる風なことが書いてありますが、固くて最初に外すのには苦労しました。

本体 (裏)

続いて起動させてみたところ。

起動

Windows Phone 8 からスクリーンショットを撮れるようになっている (電源ボタンとホーム ボタンの同時押し) ので、さっそく。以下 SETTINGS のストレージ情報です。

phone strage

4 GB から OS 分が引かれるので、初期状態で空き容量は 1.46 GB 程度でした。microSD カードによるストレージ増設は必須ですね。


と、開封~本体のレポートはこのくらいで。 HTC 8S は Blue がカッコイイなーと思っておりましたが、Red も色鮮やかでキレイです。触った質感もよく、とても気に入りました。日本でまともに使えないのが惜しいですね。 先に EXPANSYS Japan で購入可能になっていた Blue の開封記事を書いている方もいらっしゃるので、購入を検討される方はそちらもお読み頂くとよいでしょう。

例によって、ご質問のある方は Twitter で投げていただければお答えできるかもしれません。

使用感のレビューもしたかったのですが、明日社外教育で朝早いのではやく寝ないといけないのにこんな時間まで何やってるの余裕があれば後日ということで。

あと、HTC は日立の略ではありませんのでお間違いなきよう。

2012 年総括++;

完全に自分向けのチラ裏ネタです。大晦日ということで、今年の振り返り + 来年やりたいことなど。

仕事

社畜キャラが決定付けられた気がします。誠に遺憾。 ただ、これでも 2011 年と比較すればだいぶマシです。ひたすら自らの技術と体力を投入していた (= がむしゃら感があった) 去年に比べ、だいぶ手を抜くことを覚えました。

…や、Twitter をご覧の方々には手を抜いているようには見えなかったかもしれませんが。 自分のやりたいこと優先で動くようになったりと、去年の反省から行動を変えた部分は結構ありました。来年もこの調子で仕事をコントロールできたらいいな~と思う 3 年目の冬。

仕事の内容は去年から変わらず WPF アプリケーション開発でしたが、だいぶ XAML 書けるようになったと思うのでこれはこれで良し。ただ、来年は開発ばかりでなく、プロジェクトのプロセス改善に手を入れたいです。アジャイルなどと言いながらまったくアジャイルできてない現状がデスマの一端を担っている気がしているので。 プロジェクトの都合で、来年からは有難いことに Visual Studio 2012 + TFS2012 環境で仕事ができそうなので、アジャイルソフトウェアエンジニアリング などじっくり読みつつ勉強したいですね。

それと、新人が入って私が OJT パートナーになったのも今年です。 今は仕事の担当の都合でパートナーらしいことをできていませんが (これは反省)、来年からは技術の継承メインで新人との絡みが増えるはずなので、「一人で何とかする」パターンからの脱却を図るいい機会として (+ 中堅社員へのステップとして?) メンバーの教育にも重点を置きたいです。

勉強会など

仕事で手を抜き始めた分、仕事以外で技術を学べる機会が増えました。 2011 年の中頃からですが、それまで Twitter では高専クラスタやふたば☆ちゃんねるクラスタで活動していたところ、技術クラスタのお世話になるようになりはじめました。勉強会に初めて参加したのが 3 月、以降は平均月 1 ペースで参加するようになりました。

勉強会はいいですね、会社に籠ってるだけでは得られない刺激があります。特にスピーカー (2 回やらせて頂きました) は、個人的な感想ですが参加者の中で一番勉強になるポジション。来年も、不定期でいいので余裕があればやらせて頂きたいところです。

勉強会に関しては、スピーカーとして推薦して頂いた @ugaya40 さん、@okazuki さん、@jz5 さん、そのほか多くの方々にお世話になりました。本当にありがとうございました。

また、もし MS 系/開発系勉強会で人手が足りないという際は、声掛けて頂ければ喜んでお手伝いさせて頂く可能性があります。よろしくお願いします。

ブログ

情報をアウトプットしたいと思ってブログを開始したのも今年です。5 月くらいから。 技術ブログにしようと思っていたのに、PV が最も伸びているのが雑記記事ばかり (スレート PC のレビューとか) という何とも言えない現状なので、もうちょっと技術方面のネタを濃くしたいと思っている今日この頃。

せっかく Lync SDK など扱ってたので、SDK の入門記事など何回かに分けて書こうかなーと考えていましたが、2013 への入れ替わりが重なって実現していません。Preview でない正式版の 2013 SDK がリリースされたら、来年の前半に実現したいです。

まとめ

仕事に忙殺されながらも、いろいろ刺激や変化があった年でした。 よく転職を勧められるんですが、まだ 3 年目の途中ですし、今の会社 (というよりは今の部署、今の仕事ですね) で学べることは多いと思っているので、今のところ基本的には考えていません (この考えを変えさせて下さる方がいらっしゃいましたら是非w)。

2013 年は、早々に 1 ヶ月の海外出張があったりと、これまた刺激的な年になりそうな予感がしています。1 月から仕事でさっそく新しいプロジェクトの開始となりますが、社内/社外でそれぞれもっと勉強していきたいです。

2012 年、お世話になった方々本当にありがとうございました。来年もよろしくお願い致します。

プロ生 #19@品川 でショートセッションしました

12/22 日本マイクロソフト品川本社で開催された、プログラミング生放送勉強会 第 19 回@品川 でショートセッションをしました。例によって Lync のネタです。

15 分程度のものでしたので、凝った開発ネタではなく、職場で使ってみた程度のユルい感じになりました。あと社蓄をネタにしすぎました。すみません。
Lync SDK を使った開発寄りのお話に興味を持っていただけた方は、9 月の RIA アーキでのセッションをご参考程度にどうぞ。

例によってデモ時に無線 LAN が切れて大慌てという酷いものでした。。。(まるで学習していない)
大人数の会場でアクセスポイントが乱立してたのも理由かもしれませんが、今後はもっと安定したデモの方法考えないといけないですね。
あと、Lync 環境を持ち出すために、発表で使った 12.1 型モバイルノート PC で、AD DC サーバー / WAC サーバー / Lync サーバー をそれぞれ Hyper-V で動かしているため結構かつかつだったのも非常にアレなので、そろそろ Lync Online にするか、外から繋げる何かを用意しないと…

とまあいろいろ反省点だらけでしたが、非常によい勉強になりました。
プロ生スタッフの皆様、そして会場と配信で聴いて下さった皆様、ありがとうございました。

Acer のスレート PC 「ICONIA W700」 買ってみた!

最近家で何してるかと言えば、やっぱりデスクトップ WPF で遊んでるんですよね。前々回/前回の投稿はその産物です (Visual Studio 2012 ライクなウィンドウで Twitter クライアント作ったり)。

でもやっぱり Windows Store apps 開発にも参入したいなーという思い (というか興味?) もあります。が、イマイチやる気が起きない… その理由は何だろうと考えてみると、最近残業が多すぎてほとんど家にいないからタッチ デバイスを持ってないからじゃないかなーと。

じゃあもう買っちゃえ、ということで買ってきました、Acer のスレート PC「ICONIA W700」です。 Acer – ICONIA W700

2012/11/22 日に発売したばかり、周りで持ってそうな人ほとんどいない。 そんなわけで、購入した動機と軽いレビューなどを。


Surface は? VAIO Duo 11 は?

そりゃ本命は Microsoft Surface Pro でしたとも。 Pro が 2013 年 1 月頃発売というのも事前に判っていたことなので、それまでは Surface RT 買って遊ぼうとか、そう考えていた時期が私にもありました。

ところが蓋を開けてみれば Surface は日本じゃいつ発売するかわからないって言うし、国内メーカー品は惨憺たる有様。しょんぼり。 …といった流れでタブレット PC は買い控えていたわけですが、前述の通りアプリ開発して遊びたいし、タブレット 1 台も持ってないってのはどうなの、なんて考えていたり、最近残業キツすぎてストレスフルだったので IYH したかったり。なので、現時点で発売されているもののなかで買ってみようかなと。

私の周りで人気だったのは、ダントツで SONY の VAIO Duo 11 でした。言わずもがなですが、非常によい PC だと思います。 ただ、私にとって問題があるとすれば、納期が遅すぎること (11 月最終週時点で Web・店頭共に約 1 ヶ月待ち (まあそれだけ人気ということで)) と、若干オーバースペックだったということです。

現在私がモバイルで使っている富士通の LIFEBOOK は、12.1 型 Core i5 に (ちょいと手を加えて) メモリ 16 GB、SSD 256 GB、加えて省電力モードなら 17 時間、Krile と Visual Studio ガンガン回しても 8 時間は持ってくれるという優等生ちゃん。勉強会やらの出先で開発するには十分な子なわけで、VAIO Duo 11 はスペック的にこの子と完全に用途が被るので見送りです。


で、結局

開発用じゃないしキーボードとか付いてなくていいので、そこそこな値段のなピュアタブレット (= スレート PC) 狙いで。だけど RT じゃ物足りなさそうだから Windows 8 で。といった感じで絞っていったところ、出会ったのが今回の ICONIA W700。

Core i3 でメモリ 4 GB とまずまずの性能、サイズは 11.6 型の 1920 x 1080 px、重さ 950 g で Surface と同程度。 価格はヨドバシカメラで 74,800 円 (ポイント 10 % 還元で、実質 67,320 円?)。Core i シリーズ載せた Windows 8 タブレットの中ではかなり安い方じゃないですか?

うん、キミに決めた。


開封の儀

それでは開封の儀の様子から。まずは外箱。 大きさは IS12T 12 台分くらい、高さはチョコパイと同じくらい。 ちなみに私はヨドバシカメラ マルチメディア横浜から普通に持って帰りました。その程度の大きさと重さです。

そして中身。 本体のほか、クレードル、ワイピングクロス、リカバリ DVD、ユーザー ガイド、AC アダプター、Micro HDMI -> VGA 変換コネクタなど。SSD 内にリカバリ領域があるのではなく、DVD として付属してきましたね。

続いて本体、アルミ削り出しボディ。かっこいいし手触りもいい感じ、また耐久性にも優れるそうです。 ただし、ヨドバシでの買物に付き合わせてしまった @Hivesbee 曰く「このタイプは落としてアルミに傷つけたときの精神的ダメージが半端ない」とのことなので要注意。

横からの写真、上から ・上面 (左から、排気口、吸気口、回転ロックスイッチ) ・底面 (左右にステレオ スピーカー、中央にリセット ボタン) ・左面 (左から、マイク穴、Micro HDMI、USB 3.0、電源) ・右面 (左から、ヘッドフォン端子、音量ボタン、電源ボタン)

キーボードは付属していません。別途 Bluetooth キーボードを買うのがよろし (というか、モバイルできるおすすめ Bluetooth キーボードがあったら教えてください)。 ただ、もしかしたら 12 月にキーボード付きの上位モデル ICONIA W700D が発売されるかもしれません (これが発表されたとき、W700 のほかに W700D というのがあった。CPU が Core i3 から Core i5 に変更、Bluetooth キーボード付属しているもの。ただし、Surface のようないわゆるドック型 (キーボードが接続できる) とかではない)。しかし、メーカーのページにも情報がなく、ヨドバシの店員も「そんな製品の情報は入ってない」とのこと。12 月という根拠は、W700/W700D と同時に発表された ICONIA W510/W510D が 12 月中旬に発売予定のため。


起動してみる

買った時点でバッテリーはほぼフル充電状態、すぐに起動しました。 11.6 型で IPS のフル HD 解像度、デスクトップはかなり細かい印象ですが、逆に Microsoft design style の方は映えますね。とてもキレイ。

付属しているクレードルは、横置き、縦置きに対応しています。横置きの場合は更に、2 段階の角度に切り替え可能。バッテリーを充電できるほか、USB 3.0 のハブ機能もついています。ただし、クレードルに置くと本体の背面カメラが隠れて使えなくなります ((( また、クレードル自体は結構大きいので、モバイルで使うものではないですね。あくまで家で使うときのもの、と思った方がいいです。   

お次は性能。システム画面と、購入直後に計測した Windows エクスペリエンス インデックス。 例によってグラフィックが足を引っ張っていますが、それでも予想より高かった。

CrystalDiskMark 3 Shizuku Edition での計測結果。十分速いですね。あと雫ちゃんかわいい。ちなみに、SSD は東芝製っぽい。   


最大の欠点、ストレージ

買う前から判っていたことですが、W700 のストレージは SSD 64 GB のみ (128 GB モデル等なし)、しかも microSD カード スロット等もないため、USB 以外でストレージの増設ができません。これはちょっと痛い。。。

肝心の 64 GB SSD ですが、買った時点では空き容量が約 40 GB。購入直後の [プログラムと機能] の一覧と C ドライブのプロパティが以下に。。   

ストア アプリのプリインストールはこんな具合。さていくつ使うだろうか。。。

とりあえず、不要そうなアプリや体験版セキュリティ ソフトはアンインストールして使ってみるつもり。とにかく容量に余裕がないので、どう運用するかがカギですね。Visual Studio 2012 入れるか悩む…


まとめ

半ば衝動買いに近い感じで購入した ICONIA W700 ですが、個人的には非常に気に入っております。 まだバッテリー関連の検証をしていないので、もうちょい使い込んでみたいところです (今のところ、普通にウェブの閲覧だけで使っていれば 8 ~ 9 時間くらいは持ってくれそう。これも好印象)。

何にせよ、これでストア アプリ開発に参入できますね。もう何も怖くない (残業から目を背けながら

購入を検討される方は、ストレージにだけはご注意を。メインで使うにはちょっと辛い容量です。きちんと用途を明確にした上で購入されることをお勧めします。 何か気になることがありましたら、Twitter で mention 飛ばして頂ければお答えできるかもしれません。

さて、これで早い段階で本命 Surface Pro が日本で発売されたらどうなるのかな… 買っちゃうのかな… でもバッテリー 4 時間なんて報道もあるので、見送りかな… Windows Phone 8 端末も欲しいし、お財布が薄くなりますね。ひゃー

Windows 8 マシンが勝手にスリープ解除される事案が発生

夜中に突然起動したり、会社から帰ってみたら起動してたりとホラーなのか何なのか。スリープ状態の PC が勝手に起動してくれやがります。

最近なんか変な設定弄ったかなーと思い返してみると、そう、これです。

例のキャンペーン で、Windows 8 に Media Center を入れてからこんな現象が起きるようになったような気がします。

イベント ビューアーを覗いてみたところ、やはりこんなのが。

今度はタスク スケジューラを覗いてみます。 Microsoft -> Windows -> Media Center と辿ってみると…

ごん、お前だったのか。 (0x0) が顔文字にしか見えない

というわけで、こいつを無効にすると勝手に PC がスリープ解除される現象は起きなくなりましたとさ。 ※ これ無効にしてどのような影響があるかは調べていません。

実は Windows 7 の頃から、テレビを観るために Media Center 使っていたのですが。 アップデートだのメンテナンスだのと何やってるのかよくわからない理由で勝手に PC 起動させてたり、録画のためにスリープ解除したのに録画終わってスリープに戻らなかったりと、まあ色々悪い思い出ばかり残っている Media Center。Windows 8 になってもその辺変わらないんだろうか…

PC が勝手に起動して困るという方はお試しを (自己責任でお願いします)。

WPF で Visual Studio 2012 のような光るウィンドウを作る

前回の続きになります。先にこちらも読んで頂ければと。
WPF で Zune のようなウィンドウを作る
というか、前回「もうすぐ公開します」的な雰囲気出しておきながら 1 ヶ月放置というアレっぷり。。

はい、気を取り直して。
前回の投稿で Zune ライクなウィンドウを作りましたが、今回は Visual Studio 2012 です。
Zune、MetroTwit、GitHub for Windows と Visual Studio 2012 の違いといえば、Visual Studio の方は端が光ってるんですよね。しかも状況に応じて色が変わる。左から、起動時、編集中、デバッグ中、非アクティブ時です。

かっこいいですね。ちなみに私は濃色テーマが好きです。

まず思いつく方法

真っ先に思いついたのは、WindowStyle=”None” と AllowsTransparency=”True” にする方法。ウィンドウのクライアント領域と実際にコンテンツを配置する領域 (いわゆる LayoutRoot 的な) にマージンを設けて、DropShadowEffect で影をつけるというもの。

あっさりできました。本物と並べてみてもまぁそっくり。

コードはこちら。Window の Background が Transparent になっていることと、8 行目の Border の Margin=”10″ がミソです。実際のウィンドウの大きさは、見た目より 10 px 大きいのです。

これでいいじゃない、という場合はこれで完成です。
ですが、個人的にはこれではダメ… 前回の投稿の最後にも書きましたが、AllowsTransparency=”True” にすると挙動が通常のウィンドウと異なるのでよろしくないですし、今回のケースではウィンドウの実際のサイズと見た目のサイズが異なるのも微妙な感じ。。。

Visual Studio 2012 はどうなってるの?

じゃあ本家 Visual Studio 様はどういう実装になっているんだろう? と思って Spy++ で見てみたところ、こんな感じの造りになっていることが明らかに。

どうやら、色がついている端の部分の 1 px と合わせて 幅 9 px の VisualStudioGlowWindow という透明なウィンドウが張り付いているらしい。

ちなみに、Office 2013 も同じです。MSO_BORDEREFFECT_WINDOW_CLASS という透明なウィンドウがいて、影をつけています。

余談ですが、同僚とこの話をしたところ「どうして Visual Studio 開発チームはそんなややこしいことまでして光らせたかったの」と。はい、私にもわかりません。でもかっこいいんだから仕方ない。

で、無謀ながらこれを目指して作ってみました。
先にネタばらししてしまうと、一応それっぽいものが出来上がります。ですが、記事 1 回で全てを解説しきれるコードの量ではなくなってしまったので、今回は要点のみ解説していきます。

完成したサンプル コードはこちら。
https://github.com/Grabacr07/MetroRadiance

GlowWindow を作る

何はともあれ、GlowWindow を作らないことには始まりません。まずは要件を整理。

  1. 幅 1 px の線と、光る影っぽい何か
  2. タスク バーに表示されない + アクティブ ウィンドウにならない
  3. アプリケーションのメイン ウィンドウの四辺に張り付き、移動とサイズ変更に追従する
  4. アプリケーションのメインウィンドウのサイズを変更させる

それぞれ順に見ていきましょう。なお、GlowWindow が張り付く先となるアプリケーションのメイン ウィンドウは、厳密には親子関係はありませんがここでは owner と呼んでいます。

幅 1 px の線と、光る影っぽい何か

これは簡単、GlowWindow の Content に Border を配置するだけです。
サンプルでは縦横どちらにも変えられる Glow というカスタム コントロールを作っていますが、中身は Border です。DropShadowEffect の Color は、Border の Background よりも明るめにした方が目立ってキレイかも。

デザイナー上で見るとこんな感じ (Zoom 800 %)。

タスク バーに表示されない + アクティブ ウィンドウにならない

「タスク バーに表示されない」ですが、Window の ShowInTaskbar=”False” です。おわり。…と思っていた時期が私にもありました。いや、間違いではないのですが。実は「アクティブ ウィンドウにならない」の実装がかなり曲者で、WPF だけでは無理と判断し、仕方なく P/Invoke することに。で、結局 GlowWindow の拡張ウィンドウ スタイルから WS_EX_APPWINDOW を外し、WS_EX_NOACTIVE を指定するので、結果的にはわざわざ ShowInTaskbar=”False” する必要はなかったのです。

というわけで XAML から。こういうウィンドウでこそ WindowStyle=”None” するべきですよね、ということで、AllowsTransparency=”True” Background=”Transparent” と指定して透明なウィンドウにしています。

次にコード ビハインド、の前に。
拡張ウィンドウ スタイルの取得と設定をするために、以下の関数を使用しています。
GetWindowLong function
SetWindowLong function

上記の関数を使用し、GlowWindow の拡張ウィンドウ スタイルを変えているのが以下のコード。
Window.SourceInitialized イベントは、Win32 との相互運用のためのイベントです。Initialized イベントの段階ではウィンドウ ハンドルを取得できませんが、SourceInitialized イベントの段階でならできます。まさに今回のような用途向け。
拡張ウィンドウ スタイルから WS_EX_APPWINDOW を外し、WS_EX_NOACTIVATE を追加しています。これで、タスク バーに表示されないウィンドウになります。

上記ソースの最後、HwndSource.AddHook メソッドの引数で指定されていた、WndProc メソッドの中身です。いわゆるウィンドウ プロシージャのようなもの。
非アクティブウィンドウ上でユーザーがマウス ボタンを押すと、WM_MOUSEACTIVATE メッセージが送られます。これを処理してあげないと、ウィンドウがアクティブになってしまいます。
WM_MOUSEACTIVATE message

これで、タスク バーに表示されず、ユーザーがクリックしてもアクティブにならないウィンドウができました。

アプリケーションのメイン ウィンドウの四辺に張り付き、移動とサイズ変更に追従する

レッツ座標計算。
サンプルでは、owner の上下左右それぞれで owner の位置とサイズを使用し GlowWindow の位置とサイズを計算する Func を作っています。計算式は割愛。
そして、計算した位置とサイズは、SetWindowPos 関数で適用します。
SetWindowPos function

この関数を使い、計算した位置とサイズ (getLeft() や this.getWidth() などの Func) を再適用するのが以下のコード。この処理を、owner の LocationChanged, SizeChanged, StateChanged イベントで呼んであげれば、その都度 GlowWindow が追従します (しかも、Z オーダーは owner のすぐ下になる…はず)。最後の引数の SWP.NOACTIVATE は、新しい位置とサイズを適用した後に、GlowWindow をアクティブにしないためのものです。

アプリケーションのメインウィンドウのサイズを変更させる

これが一番厄介でした… まず、Visual Studio 2012 の動きから。
ご覧のように、Visual Studio のウィンドウの外にサイズ変更カーソルが出ています。そう、Visual Studio 本体でなく GlowWindow 上に出てるんですよね、これ。

なので、owner のサイズ変更幅はゼロ (前回の WindowChrome クラスで言うところの WindowChrome.ResizeBorderThickness=”0″) です。GlowWindow 上でのドラッグ操作で owner のサイズ変更をさせる、という実装にする必要があります。

いろいろ考えましたが、最終的に以下の実装になりました。

まず、GlowWindow 上での LBUTTONDOWN メッセージ (左クリック)。
このメッセージを受けたら、PostMessage 関数で owner に NCLBUTTONDOWN メッセージ (非クライアント領域上の左クリック) を投げます (6 行目)。すると、owner は非クライアント領域 (ウィンドウの端) で左クリックされたと思い込み、ウィンドウのリサイズを開始してくれます。
PostMessage の 3 つめの引数では、ウィンドウのどの部分でクリックされたかを指定しています (ウィンドウ左端なら HTLEFT、左上端なら HTTOPLEFT、右下端なら HTBOTTOMRIGHT など。getHitTestValue はそれを算出する Func<Point, HitTestValues> です)。

8 行目以降の NCHITTEST メッセージに対する処理は、マウスカーソルを設定するためのものです。
マウス ポインターが GlowWindow のどの位置にいるかによって、どの方向のリサイズ カーソルを表示するのかを決定し、設定しています。

最終的にはこんな感じに。ちゃんとドラッグすればウィンドウ本体がリサイズされます。

で、最終的に

いくつかポイントを解説しましたが、完成したのが次のような感じ。
ボタンでアクセント カラーを変えられるようにしてみました。

まとめ

というわけで、Visual Studio 2012 のウィンドウかっこいいなー作りたいなーから始まったネタでしたが、蓋を開けてみれば Win32 相互運用だらけで誰も得をしないような謎記事になってしまいました。これはひどい。というか記事長すぎですね。反省。

完成したサンプル コードはこちら。”3. VS2012LikeWindow2″ が今回のプロジェクトです。それっぽい外観になっていると思います (.NET Framework 4.5 が必要です)。
https://github.com/Grabacr07/MetroRadiance

今回はあくまで例、似せてみたよ~というだけですので、本物の VisualStudioGlowWindow の動作には程遠い感じ。まともな Windows アプリケーションは .NET Framework でしか組んだことがないので、Win32 の知識不足も相まってこの有様です。もし「ここが違う」ですとか「もっとうまい方法がある」といった何かがありましたら、Twitter などでこっそり教えて頂けたら、それはとっても嬉しいなって。

WPF で Zune のようなウィンドウを作る

Visual Studio 2012 にも慣れてきた今日この頃。

Windows Azure や Windows Store apps の開発が流行る中、デスクトップ WPF アプリケーション開発を貫く私かっこいい!かっこわるい。仕事だから仕方ない。

ということで、デスクトップの WPF ネタを 1 つ。

最近、Zune Software にはじまり、MetroTwit や GitHub for Windows、そして Visual Studio 2012 など、従来の Windows のウィンドウっぽくないかっこいいウィンドウのアプリケーションがいくつも出ています (上: Zune Software / 下: Visual Studio 2012)。


(こういうウィンドウの総称ってあるんでしょうか? 「Metro ライク」などという表記は見かけますが、正式名称っぽいものを私は聞いたことがない… 誰か教えてください。。。)

で、自分のアプリケーションもこんな感じにできたらかっこいいよね、なんて思いまして。作ってみました。

Zune ライクなウィンドウ

Zune ライクと言っていますが、Zune のウィンドウについているでっかい影は見なかったことにして、とりあえずウィンドウ本体の外観のみを対象とします。Zune というよりは MetroTwit や GitHub for Windows に近いかも。

この Zune ライクなウィンドウの実装は比較的簡単、WindowChrome クラスを使えばいいのです。
WindowChrome クラス (System.Windows.Shell)

使い方の前に一点だけ注意を。WindowChrome クラスが .NET Framework 標準ライブラリに入ったのは、v4.5 からです。v4.0 までのプロジェクトで WindowChrome クラスを使いたい場合、Microsoft.Windows.Shell.dll という別のアセンブリが必要になります。
WindowChrome クラス (Microsoft.Windows.Shell)

このアセンブリは、WPF Shell Integration Library をダウンロードして入手しましょう。
ちなみに、Microsoft Ribbon for WPF などにも同梱されているので、そちらをインストール済みの方は既にアセンブリを参照できるようになっていると思います。
WPF Shell Integration Library

もちろん、.NET Framework 4.5 プロジェクトの場合は、これらのアセンブリを入手したり参照を追加したりする必要はありません。

さて使い方ですが、マークアップで Window の中に仕込むだけ。

.NET Framework 4.0 以前の場合は以下になります (Microsoft.Windows.Shell.dll への参照を追加している前提です)。

これで、以下のような真っ黒の背景 (+ グレーの縁つき) のウィンドウが出来上がります。

上記の例では、CaptionHeight プロパティと ResizeBorderThickness にシステム設定値 (SystemParameters クラスの値) を使用しましたが、もちろん自分で好きに設定して構いません。ただし、CaptionHeight プロパティ (タイトル バーの高さ) を 0 にするとウィンドウの上部を掴んでドラッグによるウィンドウ移動はできなくなりますし、ResizeBorderThickness プロパティを 0 にするとウィンドウの端を掴んでリサイズすることができなくなります。

また、GlassFrameThickness プロパティは Aero Glass 効果つきのウィンドウで非クライアント領域を広げる (= ガラス効果部分を広げる) ものです。ちなみに四辺すべてに -1 を設定すると、ウィンドウ全体がガラス効果で透明になったウィンドウができるはずですので、Windows 7 を使っていて興味のある方は試してみてください (手元に Windows 7 がないので、私は試しておりません…)。

キャプション バーを作る

このままではダメなので、最小化、最大化、閉じるボタンなど最低限のボタンを乗せてみます。

横方向の StackPanel にボタンを 4 つ並べています。上から 最小化、最大化、元のサイズに戻す、閉じる のボタンです。実行するとこんな感じに。

ボタンの Content に 0 とか 1 とかを設定しているのは、ボタンの FontFamily に Marlett というフォントを指定しているためです。もちろん Path や画像を使って実装しても構いませんが、手っ取り早くシステムのボタンを実装したいときは、このフォントを使うとよいでしょう。

参考までに、Marlett フォントと割り当てられている英数字の一覧を。

ボタンのスタイルのサンプルも載せておきます。長いので後半は読み飛ばして頂いて構いません。重要なのはハイライトした部分 (4 行目、10 行目) です。Window のリソースに張り付ければ、そのまま動くはず。

4 行目は先ほどの Marlett フォントの指定ですが、10 行目は特に重要です。
通常、ウィンドウの非クライアント領域 (キャプション バーやウィンドウのふちの部分) に要素を置いても、ヒット テストが発生しません。今回の例では、ウィンドウの上端から WindowChrome.CaptionHeight プロパティで指定した高さの領域は非クライアント領域であり、その領域に置かれたボタンに対してヒット テストが発生しないので、押すことができません。

WindowChrome.IsHitTestVisibleInChrome 添付プロパティで true を指定すると、その要素は非クライアント領域上でもヒット テストが発生するようになります。ですので、最小化、最大化、閉じるボタンなど、キャプション バー上に配置し、ユーザーのクリック操作などに反応する必要がある要素では、IsHitTestVisibleInChrome 添付プロパティを true に設定しておきましょう。

これらのボタンのクリック処理については簡単なので書きませんが、ひとつだけ。
Microsoft.Windows.Shell.dll から WindowChrome クラスが .NET Framework 標準ライブラリ入りしたのと同時に、SystemCommands クラスも標準ライブラリに入っています。
SystemCommands クラス (System.Windows)

.NET 4.0 以前の場合はこちら。
SystemCommands クラス (Microsoft.Windows.Shell)

ウィンドウの最小化、最大化、復元、閉じるなどの各操作の RoutedCommand と、ウィンドウを操作する静的メソッドが提供されていますので、ご参考までに。

ウィンドウ全体でドラッグ可能に

GitHub for Windows だと、ウィンドウのどこ掴んでもドラッグできますよね。簡単です。ウィンドウの MouseLeftButtonDown イベントで DragMove メソッドを呼ぶだけ。

こうしてしまえば、キャプション バー以外でもドラッグできるようになるので、WindowChrome.CaptionHeight プロパティは 0 にしても問題ないかも。

まとめ

ということで、Zune ライクなウィンドウの作り方でした。WindowChrome クラスを使ってウィンドウの外観を自由に作れます。非クライアント領域の部分に要素を配置する際は、IsHitTestVisibleInChrome 添付プロパティの設定をお忘れなきよう。

ぶっちゃけてしまうと Window.WindowStyle を None にして Window.AllowsTransparency を true にすれば、WindowChrome クラスを使わなくても似たような UI を作れるはずです。ですがですが、WindowStyle=”None” にすると、ウィンドウを最大化したときにタスク バーすら覆っちゃったりとか、ウィンドウの端を掴んでリサイズする部分を自作しなきゃいけなかったりとか、いろいろ面倒なことになったりならなかったり。特殊なウィンドウを除いて、ふつうのアプリケーションのメイン ウィンドウで WindowStyle=”None” にするのってあまりやりたくないんですよね… あくまで個人的にですが。

また、次は Visual Studio 2012 のような光るウィンドウを作った記録を投稿する予定で、今書いてるところです。
今回のサンプルで作ったコードは、この続きの記事のサンプルとまとめて GitHub か何かに上げるつもりですので、少々お待ちください。。。

WPF の FocusVisualStyle に関するメモ

最近調べ直したのでメモを。

以下の MSDN のページを参考に。
コントロールのフォーカスのスタイルと FocusVisualStyle

FocusVisualStyle は、フォーカスの移動がキーボードによって行われたときのみ有効になる表示スタイルです。デフォルトだと黒い点線になる、これ。

テンプレートでコントロールの外観を弄っていると、デフォルトの FocusVisualStyle が鬱陶しく感じることがあります (ありました)。

とりあえず消す

消す方法は簡単です。コントロールの FocusVisualStyle プロパティに null を入れてやります。

スタイルで定義する場合も同様です。

ただし、これで本当に消してしまうと、(キーボードでフォーカスを移動したときに) どのコントロールにフォーカスがあるのかを外観で判断できなくなってしまうので、あまりお勧めしません。

独自の FocusVisualStyle を設定する

コントロールの外観を作り込んでいるなら (そして既定の FocusVisualStyle が気に入らないなら)、同じように FocusVisualStyle も自分で作りましょう。
ただし、前述の MSDN のページにも書いてありますが、すべてのコントロール間で一貫した FocusVisualStyle を設定するべきです。キーボード フォーカスが移ったとき、それぞれのコントロールの外観がバラバラではユーザーも混乱してしまいます。

そこで、App.xaml にリソースとして定義し、すべてのコントロールがそれを使用するようにします。

赤い点線が引かれるようにしました。
で、各コントロールのスタイルに以下のように指定します。

と、このように。
キーボードでフォーカスを移すと赤い枠が出るようになります (あくまで例です、本当ならもうちょっと目立たない何かを作ります)。

ちなみに、FocusVisualStyle はコントロールのビジュアル ツリーとは別の装飾用ビジュアル ツリー上にオーバーレイ表示されます。そのため、Style の TargetType は必ず Control クラスです。
ActualHeight、ActualWidth、Margin、Paddin などのプロパティを使用して、コントロール本体を隠したりしないよううまく作りましょう。

また、フォーカスの変更に伴って視覚効果を追加したい場合、FocusVisualStyle だけでなく、スタイルかテンプレートで IsKeyboardFocus プロパティをトリガーにした実装も可能です。他のコントロールのキーボード フォーカスと異なる外観を持たせたい場合などでは、FocusVisualStyle ではなくトリガーを使用して外観を変更する方法が推奨されているようですね (MSDN ではトリガーが推奨されているようですが、VisualStateManager の方がいいかも)。

RIA アーキテクチャ研究会 #4 でスピーカーやりました

RIA アーキテクチャー研究会 第4回 セミナー でお話しさせて頂きました。 一応、セミナー形式の勉強会での初セッションとなります。推薦して下さった尾上さん (@ugaya40)、かずきさん (@okazuki)、本当にありがとうございました。

Exchange Server、SharePoint Server と併せてサーバー / インフラ周りの話で Lync が出ることはあるかと思いますが、クライアント サイドの開発の話ってあまり聞きませんよね、ということでその入門編 (のつもり) で 60 分。

  • Lync 概要
  • クライアント サイドの開発スタイル
  • Lync 2013 SDK Preview の新機能とか

本番に限って一部デモが動かなくなるというジンクス込みでいろいろお見苦しいところあったかと思いますが、ご容赦ください。。。本当は Contextual Conversation 等もっとお話ししたいこともあったのですが、それはまたの機会ということで。

セッション冒頭で Lync を使ったことある方に挙手頂いたんですが、なんと 2 名だけでした (うち常用してる方は 1 名)。MSC2012 の Keynote によれば「Lync は日本では昨年だけで 4 倍の成長」とのことですが、Lync 2013 になって Office との連携も強化されているようですし、今後もっと普及されるといいですね。