2009-09-01 10 views
23

Próbuję ustawić Windows Form na monitorze pomocniczym, co następuje:Wyświetlanie formularza Windows na monitorze dodatkowym?

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; 
} 

Właściwości granice wydają się poprawne, ale w obu metod próbowałem, to maksymalizuje formularz na monitorze podstawowym. Jakieś pomysły?

+0

Po prostu, WindowState na MatrixView nie jest * Zmaksymalizowany *, czyż nie? –

+0

@Austin Nie, WindowState jest normalny. –

Odpowiedz

21

Spróbuj ustawić parametr WindowStartUpLocation jako "manual" w metodzie SetFormLocation.

+2

Tak, wykonanie formularza.StartPosition = FormStartPosition.Manual; załatwił sprawę. Każdy pomysł, dlaczego? –

+1

@Henk Nie, to Windows Forms. Oto link do niego: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.startposition (VS.80).aspx –

+3

Od MSDN: "Ustawienie WindowStartupLocation na Manual powoduje ustawienie okna zgodnie z jego wartością właściwości Left i Top .Jeżeli właściwości Left lub Top nie są określone, ich wartości są określane przez system Windows." http://msdn.microsoft.com/en-us/library/system.windows.window.windowstartuplocation.aspx – Sesh

2

Czy jesteś pewien, że screens[1] jest twoim drugorzędnym? Wypróbuj screens[0]. Twój kod jest w zasadzie poprawny.


Ok, sprawdziłem, trzeba będzie to zrobić po show():

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

który daje pewne niechciane migotania. Ale prawdopodobnie można zrobić:

n.SetBounds(-100, -100, 10, 10); // or similar 
n.Show(); 
setFormLocation(n, screens[1]); 
+0

Stosunkowo pewne - użycie ekranów [0] i ekranów [1] daje taki sam wynik. –

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

to odesłanie formularza.

+1

(+1) To powinna być zatwierdzona odpowiedź. Ta jedna linia kodu działała dla mnie, ale inni nie: D, nadążaj za pracą @Gengi – jkell311

+2

Wygląda jednak na to, że jest uporządkowany według innych kryteriów niż konfiguracja monitora Window. Moją podstawową była na przykład pozycja [1], podczas gdy mój drugi monitor znajdował się w [0]. – cvsguimaraes

1

użyłem to dla XNA 4 podwójne zastosowanie ekranu (Full Screen XNA gier Okno + WinForm)

W sposobie Form_Load(), należy umieścić następujący kod:

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); 
+0

Awesome man great ...! –

0

Set forma Startup Pozycja nieruchomość do ręcznego

public void MoveWindowToProjector() 
    { 
      Rectangle rectMonitor; 

      // Create New Process 
      Process objProcess = new Process(); 

      //Get All the screens associated with this Monitor 
      Screen[] screens = Screen.AllScreens; 

      // Get Monitor Count 
      int iMonitorCount = Screen.AllScreens.Length; 

      // Get Parameters of Current Project 
      string[] parametros = Environment.GetCommandLineArgs(); 
      // if (parametros.Length > 0) 
      // { 
       //objProcess.StartInfo.FileName = parametros[0]; 
       // objProcess.Start(); 
      // } 
      // Get Window Handle of this Form 
      IntPtr hWnd = this.Handle; 

      Thread.Sleep(1000); 


      if (IsProjectorMode) 
      { 
       if (iMonitorCount > 1) // If monitor Count 2 or more 
       { 
        //Get the Dimension of the monitor 
        rectMonitor = Screen.AllScreens[1].WorkingArea; 
       } 
       else 
       { 
        //Get the Dimension of the monitor 
        rectMonitor = Screen.AllScreens[0].WorkingArea; 
       } 

      } 
      else 
      { 
       rectMonitor = Screen.AllScreens[0].WorkingArea; 

      } 
      if (hWnd != IntPtr.Zero) 
      { 
       SetWindowPos(hWnd, 0, 
        rectMonitor.Left, rectMonitor.Top, rectMonitor.Width, 
        rectMonitor.Height, SWP_SHOWWINDOW); 
      } 

     } 
2

aby wyświetlić formularz na ekran pomocniczy:

Screen primaryFormScreen = Screen.FromControl(primaryForm); 
    //Use this if you are looking for secondary screen that is not primary 
    Screen secondaryFormScreen = Screen.AllScreens.FirstOrDefault(s => !s.Primary) ?? primaryFormScreen; 
    //Use this if you are looking for screen that is not being used by specific form 
    Screen secondaryFormScreen = Screen.AllScreens.FirstOrDefault(s => !s.Equals(primaryFormScreen)) ?? primaryFormScreen; 
    //Putting the form on the other screen 
    secondaryForm.Left = secondaryFormScreen.Bounds.Width; 
    secondaryForm.Top = secondaryFormScreen.Bounds.Height; 
    //Recommended to use, You can change it back later to the settings you wish 
    secondaryForm.StartPosition = FormStartPosition.Manual; 
    secondaryForm.Location = secondaryFormScreen.Bounds.Location; 
    Point p = new Point(secondaryFormScreen.Bounds.Location.X, secondaryFormScreen.Bounds.Location.Y); 
    secondaryForm.Location = p; 
    secondaryForm.Show(); 

Jeśli nie możesz się doczekać konkretnego ekranu, możesz włączyć "Screen.AllScreens" i skorzystać z powyższego procesu.

7

@ Odpowiedź Gengi jest zwięzła i działa dobrze. Jeśli okno jest zmaksymalizowane, nie przesuwa okna. Ten fragment rozwiązuje ten problem (choć podejrzewam okna „normalnych” wymiarów musi być mniejszy niż nowych wymiarów ekranu dla tej pracy):

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; 
      } 
     } 
    } 
-1
Screen[] screens = Screen.AllScreens; 
       sc aoc = new sc(); 
       aoc.Show(); 
    aoc.Location = Screen.AllScreens[INDEX OF YOUR AVAILABLE SCREENS TARGET].WorkingArea.Location; 

DLA PAŃSTWA zmaksymalizowane okno

aoc.WindowState = FormWindowState.Maximized; 

zA ŻADNE X, Y POZYCJA

aoc.Location = new Point(TARGET X POSITION, TARGET Y POSITION); 
Powiązane problemy