Windows Phone 7 エミュレーターをビルド後アクティブにする

タスクバー

追記: 少しコードを修正しました。

5/3 開催した プロ生勉強会 ぷちハッカソン で、はじめて Windows Phone 7 開発をした @sinpen さんの一言。

毎回、エミュレーターがウィンドウの後ろにいって、タスクバーのアイコンをクリックするのがめんどくさい。(的なことを言いました)」

で、ですよねー。わかっていたけど毎回その作業をしていた自分がはずかしい。

Visual Studio と Windows Phone 7 エミュレーターで開発していると、エミュレーターを起動したままの場合、デバッグ実行の開始時に、Visual Studio がアクティブウィンドウになってエミュレーターが非アクティブになる現象があります。毎回、エミュレーターを自分でアクティブにするのはめんどくさいですよね。

というわけで、Visual Studio のビルド イベントにコマンドを記述してアクティブにできるようにしてみました。

結論から。ビルド イベントに次のコマンドを書きます。

powershell -EncodedCommand JABhAD0AQAAiAA0ACgBbAEQAbABsAEkAbQBwAG8AcgB0ACgAIgB1AHMAZQByADMAMgAiACkAXQANAAoAcAB1AGIAbABpAGMAIABzAHQAYQB0AGkAYwAgAGUAeAB0AGUAcgBuACAASQBuAHQAUAB0AHIAIABGAGkAbgBkAFcAaQBuAGQAbwB3ACgAcwB0AHIAaQBuAGcAIABjACwAcwB0AHIAaQBuAGcAIAB3ACkAOwANAAoAIgBAAA0ACgAkAGIAPQBAACIADQAKAFsARABsAGwASQBtAHAAbwByAHQAKAAiAHUAcwBlAHIAMwAyACIAKQBdAA0ACgBwAHUAYgBsAGkAYwAgAHMAdABhAHQAaQBjACAAZQB4AHQAZQByAG4AIABiAG8AbwBsACAAUwBoAG8AdwBXAGkAbgBkAG8AdwAoAEkAbgB0AFAAdAByACAAaAAsAGkAbgB0ACAAbgApADsADQAKACIAQAANAAoAJABjAD0AQAAiAA0ACgBbAEQAbABsAEkAbQBwAG8AcgB0ACgAIgB1AHMAZQByADMAMgAiACkAXQANAAoAcAB1AGIAbABpAGMAIABzAHQAYQB0AGkAYwAgAGUAeAB0AGUAcgBuACAAYgBvAG8AbAAgAFMAZQB0AEYAbwByAGUAZwByAG8AdQBuAGQAVwBpAG4AZABvAHcAKABJAG4AdABQAHQAcgAgAGgAKQA7AA0ACgAiAEAADQAKACQAdwA9AEEAZABkAC0AVAB5AHAAZQAgAC0AbQBlAG0AYgBlAHIARABlAGYAaQBuAGkAdABpAG8AbgAgACQAYQAsACQAYgAsACQAYwAgAC0AbgBhAG0AZQAgACIAQQAiACAALQBuAGEAbQBlAHMAcABhAGMAZQAgAEIAIAAtAHAAYQBzAHMAVABoAHIAdQANAAoAJABwAD0AJAB3AC4ARwBlAHQATQBlAHQAaABvAGQAKAAcIEYAaQBuAGQAVwBpAG4AZABvAHcAHSApAC4ASQBuAHYAbwBrAGUAKAAkAG4AdQBsAGwALABAACgAIgBYAEQARQBfAFMAawBpAG4AVwBpAG4AZABvAHcAIgAsACQAbgB1AGwAbAApACkADQAKAFsAUwB5AHMAdABlAG0ALgBDAG8AbgBzAG8AbABlAF0AOgA6AFcAcgBpAHQAZQBMAGkAbgBlACgAIgBFAG0AdQBsAGEAdABvAHIAIABIAGEAbgBkAGwAZQA6ACAAewAwAH0AYABuAFMAaABvAHcAVwBpAG4AZABvAHcAOgAgAHsAMQB9AGAAbgBTAGUAdABGAG8AcgBlAGcAcgBvAHUAbgBkAFcAaQBuAGQAbwB3ADoAIAB7ADIAfQAiACwAJABwACwAJAB3ADoAOgBTAGgAbwB3AFcAaQBuAGQAbwB3ACgAJABwACwAMQApACwAJAB3ADoAOgBTAGUAdABGAG8AcgBlAGcAcgBvAHUAbgBkAFcAaQBuAGQAbwB3ACgAJABwACkAKQA=

ビルド イベント

とりあえず、うちの環境はこれでうまく動いています。コードに変更がない場合はビルドしないため、コマンドが実行されないです。

内容は Win32 API を呼び出して、エミュレーターのハンドルを取得し、ウィンドウをアクティブにしています。別途、それだけを行うアプリを作ればすぐにできたのだけど、ビルドイベントにコードを追記するだけで解決したい! ということで PowerShell で書きました。でも全然わからないので、PowerSehll の匠 @mutaguchi 師匠に Win 32 API の呼び出しや、コマンドプロンプトからの実行について教えてもらって実現しました。すぐに聴けるって素晴らしい。

上記のコマンドは、Base64 でエンコードした PowerShell のコードを引数として渡しています。エンコード前のコードのイメージはこちら。上記のコマンドはもう少し短くなるよう最適化してます。

$defFindWindow = @"
[DllImport("user32")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
"@
$defShowWindow = @"
[DllImport("user32")]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
"@
$defSetForegroundWindow = @"
[DllImport("user32")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
"@
$win32func = Add-Type -memberDefinition $defFindWindow, $defShowWindow, $defSetForegroundWindow -name "Win32Func" -namespace Win32Functions -passThru
$p = $win32func.GetMethod(“FindWindow”).Invoke($null, @("XDE_SkinWindow", $null))
[System.Console]::WriteLine("Emulator Handle: {0}", $p)
[System.Console]::WriteLine("ShowWindow: {0}", $win32func::ShowWindow($p, 1))
[System.Console]::WriteLine("SetForegroundWindow: {0}", $win32func::SetForegroundWindow($p))

コメントを頂いて解決しました → Visual Basic で試作したコードは成功するのに、PowerShell で書いた時 FindWindow の呼び出しが全然成功しなくて、第1・2引数ともに指定するとうまく動作しました。片方 $null だとうまくいかないです。ウィンドウ タイトルの「Windows Phone Emulator」は、エミュレーターの設定ファイルで変更可能な値なので注意です。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク