51

次のように、セカンダリ モニターに Windows フォームを設定しようとしています。

private void button1_Click(object sender, EventArgs e)
{
    MatrixView n = new MatrixView();
    Screen[] screens = Screen.AllScreens;
    setFormLocation(n, screens[1]);
    n.Show();
}

private void setFormLocation(Form form, Screen screen)
{
    // first method
    Rectangle bounds = screen.Bounds;
    form.SetBounds(bounds.X, bounds.Y, bounds.Width, bounds.Height);

    // second method
    //Point location = screen.Bounds.Location;
    //Size size = screen.Bounds.Size;

    //form.Left = location.X;
    //form.Top = location.Y;
    //form.Width = size.Width;
    //form.Height = size.Height;
}

境界のプロパティは正しいように見えますが、私が試した両方の方法で、プライマリ モニターのフォームが最大化されます。何か案は?

4

9 に答える 9

56
this.Location = Screen.AllScreens[1].WorkingArea.Location;

これはフォームリファレンスです。

于 2012-07-30T12:07:00.557 に答える
39

FormStartPosition.Manualメソッド内でStartPosition パラメータを設定してみてくださいSetFormLocation

于 2009-09-01T16:28:42.027 に答える
12

@Gengiの答えは簡潔で、うまく機能します。ウィンドウが最大化されている場合、ウィンドウは移動しません。このスニペットはそれを解決します(ただし、これが機能するには、ウィンドウの「通常の」寸法が新しい画面の寸法よりも小さい必要があると思います):

    void showOnScreen(int screenNumber)
    {
        Screen[] screens = Screen.AllScreens;

        if (screenNumber >= 0 && screenNumber < screens.Length)
        {
            bool maximised = false;
            if (WindowState == FormWindowState.Maximized)
            {
                WindowState = FormWindowState.Normal;
                maximised = true;
            }
            Location = screens[screenNumber].WorkingArea.Location;
            if (maximised)
            {
                WindowState = FormWindowState.Maximized;
            }
        }
    }
于 2015-12-14T09:16:07.630 に答える
3

screens[1]あなたのセカンダリは確かですか?試してみてくださいscreens[0]。あなたのコードは基本的に正しいです。


わかりました、確認しました。Show() の後に行う必要があります。

n.Show();
setFormLocation(n, screens[1]);

これにより、不要なちらつきが発生します。しかし、おそらく次のことができます。

n.SetBounds(-100, -100, 10, 10);  // or similar
n.Show();
setFormLocation(n, screens[1]);
于 2009-09-01T16:30:11.553 に答える
1

これを XNA 4 デュアル スクリーン アプリケーション (フル スクリーン XNA ゲーム ウィンドウ + WinForm) に使用しました。

Form_Load() メソッドに、次のコードを配置します。

var primaryDisplay = Screen.AllScreens.ElementAtOrDefault(0);  
var extendedDisplay = Screen.AllScreens.FirstOrDefault(s => s != primaryDisplay) ?? primaryDisplay;

this.Left = extendedDisplay.WorkingArea.Left + (extendedDisplay.Bounds.Size.Width / 2) - (this.Size.Width / 2);
this.Top = extendedDisplay.WorkingArea.Top + (extendedDisplay.Bounds.Size.Height / 2) - (this.Size.Height / 2);
于 2013-10-19T14:56:31.553 に答える
-2
  Screen[] screens = Screen.AllScreens;
                sc aoc = new sc();
                aoc.Show();
    aoc.Location = Screen.AllScreens[INDEX OF YOUR AVAILABLE SCREENS TARGET].WorkingArea.Location;

最大化されたウィンドウ状態の場合

aoc.WindowState = FormWindowState.Maximized;

任意の X、Y 位置

aoc.Location = new Point(TARGET X POSITION, TARGET Y POSITION);
于 2016-09-29T10:25:58.820 に答える