前回の記事で「Formが主に所属するモニターを判断する方法を考える」をまとめたのですが、SNSでいただいたヒントから一発取得方法を見つけました。楽なことはいいことだ。Screen.FromControl(this);解説Screen.FromControlは指定したコントロールが最も広く所属するScreenを取得するメソッドです。Form相手にも使えます。Screen.cshttp://referencesource.microsoft.com/#system.windows.forms/winforms/Managed/System/WinForms/Screen.csこの実装コードを見ると、FromControlは内部的にFromHandleInternalを呼び出し、その中でWin32APIのMonitorFromWindowを呼び出しています。これこそが「指定したウィンドウがどのモニタ上で最大面積を持っているかを取得」する一発取得なWin32API。このAPIのドキュメントには下記のようにあります。パラメータにより示される内容が返ります。見つけ方は前回の記事で書いた考え方と同じでした。私は見つからなかった場合にプライマリモニターを指定していたので、dwFlagsにMONITOR_DEFAULTTOPRIMARYを指定したときの考え方です。FromHandleInternalはdwFlagsにMONITOR_DEFAULTTONEARESTを指定しているため、見つからなくとも近いモニターを選択することになり、より人間的な結果となります。4.6でリファレンスソースが公開された恩恵です。検索が強力な時代なので、実装コードが見えれば目的のものを探すのは容易。今後も活用したいと思います。いうことで、こちらを使っていこうと思います。前回の記事も考え方の整理ってことで参照いただけると幸いです。ついでに似たようなメソッドも解説ScreenのFromなんたらメソッドは4つ。これをうまく使うことでマルチモニター処理をうまいことやれるようになると思います。FromControl今回使ったやつ。内部的にFromHandleの実装となるFromHandleInternalを呼ぶので同じ動作になる。Windowハンドルとか意識しなくていいので.NET向き。FromHandle動きはFromControlと一緒。中でFromHandleInternalを呼んでるだけ。Windowハンドルを使えるんで、Win32APIから取得したWindowハンドルをそのまま使える。FromRectangle指定した矩形(Rectangle)の面積が最も大きく含まれるScreenを取得する。FormやControlではない領域を測る際に使えるかも。FromPoint指定した座標が含まれるScreenを取得する。これは目的も結果も分かりやすい。「かえかえ君」のプレビューは高速です。対象とほぼ同じように表示され、ほぼ遅延はありません。Formsアプリケーションを作っていると、Formsがどのモニターにいるか知りたいときがあります。FormにはPropertyGridという便利なコントロールがあります。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。