複数のモニタを横に並べてたくさんの情報を表示しながらパソコンを操作。やってみたかったんです。でも今まではPCデスクの幅が広くてできなかった!しかし、新しいPCデスクではそれができる!さっそく試してみなくては!
実家で父親が使っていたデスクトップPCがありました。僕が秋葉原で組み立てたもので、かれこれ8年近く前に作ったものなのですが、それが去年あたりに壊れてしまいまして、余ったモニタがありました。こりゃ、もらいに行くしかないな!と思っていたら、なんとありがたいことに持ってきてくれました!というわけで、さっそく設置してみたのが上の写真です。
残念ながら幅も高さも違います。足の長さも違います。こんなんでマルチモニタが可能なのか!? と思ったんですが、どうやらうまく行くようですね。
ちなみにビデオカードは「NVIDIA GeForce GTS 240」でして、ビデオカードにDVIケーブルが2本させるようになっています。対して、モニタの方は「DELL ST2010」(16:9)と「ML-172CA」(4:3)の2台です。こちらはRGB(D-Sub15っていうのかな?)のケーブルとなっているため、DVIへ変換するための変換コネクタを購入しています。
高さや幅の違いを、OSはどのように解決してくれるのだろう?と思ったら、どうやら解像度の設定のところで、画面位置を選べるようです。
解像度の設定画面で、モニタの物理的な位置と似たような感じに、マウス移動してやれば完成です。ちなみにモニタ同士がつながっているところはマウスは通過してくれます。つながっていないところでは、マウスは止まります。
どんな設定でも可能なのかなぁと遊んでみたら、けっこうなんでも行けるらしい。
さて、プログラマの立場として気になるのは、これがプログラムからはどのように認識されるのか、といったところです。っていうか、半分以上の興味はそっちです。これまでに製作したソフトウェアは、この環境でどのように動くのか?と。
気になった点と、その答えを箇条書きにしてみます。
さて、これまでプログラミングをする上で当たり前だったことが、当たり前ではなくなる日がやってきたというわけです。例えば、
GetSystemMetrics APIでモニタの四隅の座標を取得していたプログラムは、改修が必要になります。「画面中央」という言葉を使っていた仕様書は、画面中央の定義についてもう一度見直す必要があるでしょう。
画面位置の保存・復帰と、不正座標の検出を行っていたプログラムについては、大幅に見直しが必要になるでしょう。GetMonitorInfo, MonitorFromWindow, MonitorFromPoint, MonitorFromRect, EnumMonitors などの活用が必要になりますが、Windows 95/NT 4.0 対応のプログラムは注意が必要です。なぜなら、これらのAPIは、Windows 95/NT 4.0では動かないので。
そもそも、画面位置の保存・復帰と、不正座標の検出は、よくよく考えてみると不要というケースもあると思いますので、場合によってはそういう機能を省くということも検討した方がよいかもしれません。どうしても実装したい場合は、参考になるサイトがけっこうあるようなので、自力で実装してみるよりはこういうところを参考にした方がよさそうです。
前にも他所で書きましたが(作者にも報告していますが)、最小化時にまで座標位置の保存を行っているために、(-32000, -32000)とかいう座標を誤って保存しているソフトがあったりするのは、ちょっと問題。
とりあえず、いじくるつくーるとListView to CSVについては、画面位置の保存・復帰を行っていますが、その際の「不正座標」の定義は「ウィンドウ左上の座標をMonitorFromPointにかけたときにNULLが返ってくるもの」と定義しています。多少例外はありそうですが、そう割り切るようにしないと、頭が痛くなりそうなので…。
疑似クラウドでは、多少のロスはありますが、GetSystemMetrics APIの SM_XVIRTUALSCREEN, SM_YVIRTUALSCREEN, SM_CXVIRTUALSCREEN, SM_CYVIRTUALSCREEN で得られる値を下に、オブジェクトの存在位置を定義するようにしています。
すっきり!! デフラグでは、画面位置の保存や復帰は行わないようにしています。