投稿者 魔界の仮面弁士  (社会人) 投稿日時 2008/12/16 22:52:48
私なら、こう書くかな。

るきおさんの案(2行)に比べると、長く(3行)なっていますが、
 ・マルチモニタの場合、常に第1画面に移動してしまう。
   → 現在表示させている画面上の中央に配置。
 ・フォームが大きい場合、タスクバーの上に重なって配置されてしまう。
   → タスクバーを除いた、作業領域内に配置するようにした。
という点が異なります。(ついでに、画面解像度の変更に対応させる方法も書いていますが)


作成したいアプリの仕様に応じて、適当に手を加えながら使ってみてください。

たとえば、「常に最前面に表示させるアプリ」の場合は、作業領域ではなく、
タスクバーを無視したデスクトップ全体を利用した方が都合が良い場合があるでしょう。
他には、現在の画面ではなく、全画面領域(仮想画面)の中央に配置したい場合とか、
あるいは、現在の画面には大きすぎるが、隣の画面になら収まるので隣に表示…と
いった複雑な条件を付与したい場合もあるかも知れませんしね。


Public Class Form1
    Private Sub MoveToCenter()
        '現在のデスクトップを取得(マルチモニタの場合は、フォームの位置に応じた画面) 
        Dim r As Rectangle = Screen.FromRectangle(Me.DesktopBounds).WorkingArea
        '中央に配置 
        Dim s As Size = r.Size - Me.Size
        Me.SetDesktopLocation(r.Left + s.Width \ 2, r.Top + s.Height \ 2)
    End Sub

    Private Sub Button1_Click(ByVal sender As ObjectByVal e As EventArgs) Handles Button1.Click
        MoveToCenter()
    End Sub

    Private Sub Form1_Load(ByVal sender As ObjectByVal e As EventArgs) Handles Me.Load
        Button1.Text = "中央に配置"
        '画面解像度が変更された場合に、自動的に位置調整するなら、下記コメントを解除。 
        'AddHandler Microsoft.Win32.SystemEvents.DisplaySettingsChanged, AddressOf Button1_Click 
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As ObjectByVal e As FormClosingEventArgs) Handles Me.FormClosing
        'RemoveHandler Microsoft.Win32.SystemEvents.DisplaySettingsChanged, AddressOf Button1_Click 
    End Sub
End Class