空談録

世界で5人くらいに役立ちたい

PowerPointの発表者ツールのモニター拡張を抑止したいと思ったけどうまくいかなかった

はい!みんな大好き!VSTOのお時間です!(クソクソ言いながら)

というわけでPowerPointの発表者ツールがゴミという話です

そもそもPowerPointの発表者ツールは案外使いやすいぜ!っていうのがあると思いますし実際機能的にはかなり優れています
(たとえば時間表示とか次のスライドの表示とか)

しかしPowerPointで完結しないプレゼンの場合非常につらい現実となります
というのもこの発表者ツール、セカンドスクリーンを拡張で表示することで実現されている機能だからです

つまり
・プライマリスクリーンに発表者ツールを出す
・セカンダリスクリーン(プロジェクター)にスライドショーを出す
という仕組みなわけです

しかしモニターを拡張にしたまま戻してくれる的な気づかいがまったくないのでとりあえずアドインを作ってみようと思ったわけですが…
今度はWindowsの仕様に引っかかるという悲しみ

とりあえずソースは置いときます

PresentationWindowSwitcher.ThisAddin.vb

PowerPointがまずウィンドウハンドルくれないのでGetCurrentProcessからMainWindowHandle拾ってきてEnumChildWindowsでその子ウィンドウのハンドルを拾ってきて、タイマーであとはGetForegroundWindowでウィンドウハンドルが違ったらDisplaySwitcher.exeでもげもげする感じです
やりたいことをやるのにWin32APIをたたいていく感じとてもいいと思います!

これとりあえずモニターの表示は変わるんですけど一度プライマリにスライドショーのウィンドウが動いてしまうと戻すことができないため、おそらく毎回スライドショーを抜けてデモして~とかそんな感じにしないと対処不能です
つまるところスライドショーを抜けるときにDisplaySwitcher.exeをcloneで呼ぶだけでもだいぶよくなるとは思いますがよくわかりません
(この場合はWin32を呼ばなくてもよい?)

Alt+Tabでスライドショーを抜けるのに対処するのはできなくもないですが戻らなくなるというすさまじいつらみ
難しい割に何もできないやつや…

ちなみに複数のスクリーンが拡張で動いてるかどうかはWin32たたく必要ありそうに見えますがSystem.Windows.Forms.ScreenでAllScreenプロパティのLengthが2以上なら基本的には拡張なので大雑把にほしい程度ならこんな手段で行けるかなと思います
拡張以外の状態がほしいとかだとさすがにこれじゃ無理ですが

というわけで私はこんな面倒なことをするくらいなら最初から発表者ツールなんて使わなくてよくねと思うことにしました
壁紙が公開されるリスクを負うよりはマシかなという

もしどうにかしたい場合は上のソースをごにょごにょして見るといいと思います
たぶんこんなにいらないはずです

この辺で