2012-08-16 11 views
7

Ich schreibe eine Anwendung, die zwei Anzeigen benötigt: eine für das Bedienfeld, die andere für die Ausgabe. Was ich habe, ist folgendes: Wenn es nur ein Display gibt, zeigt die Anwendung beide Formulare an, aber wenn es zwei gibt, geht das Ausgabeformular zum anderen. Das Problem ist, dass dies nur passiert, wenn die Anwendung gestartet wird. Mit anderen Worten, wenn die Anwendung bereits läuft, bevor die zweite Anzeige verbunden ist, passiert nichts, außer der Benutzer sendet die Ausgabe manuell an die neue Anzeige (vorausgesetzt, sie wissen, wie es geht). Was ich will ist, dass, wenn eine neue Anzeige verbunden ist, das Ausgabeformular automatisch gesendet wird, auch während die Anwendung läuft. Ich denke, es hat damit zu tun, einen Port in einem Thread abzufragen, aber ich weiß nicht, wie ich das machen soll. Kann mir jemand helfen, wie es geht? Wenn es eine bessere Lösung gibt, werde ich es gerne begrüßen.Erkennen, wenn neue Anzeige verbunden ist

(ich würde einen Teil des Codes zur Verfügung gestellt haben, aber ich schreibe dies von einem Telefon)

+0

Sie könnten eine Abfrageschleife regelmäßig überprüfen für eine neue Anzeige in einem Hintergrund-Thread/Hintergrund-Arbeiter erstellen. Z.B. Lesen Sie die Eigenschaft ['Screen.AllScreens'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.screen.allscreens.aspx) und führen Sie Code aus, wenn der Wert '> 1' ist . –

+0

Das ist, woran ich gedacht habe, aber ich brauche Code, wie es geht. Ich habe Probleme mit dem Schreiben von Threads. Kannst du helfen? – afaolek

+1

Sie können diese Klasse verwenden: http://msdn.microsoft.com/en-us/library/system.windows.forms.screen(v=vs.100).aspx Und Sie können den BackgroundWorker verwenden: http: // msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.100).aspx – Davio

Antwort

8

Lookie hier: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx

Es ist ein Beispiel, die Ihnen helfen sollen. Probieren Sie etwas wie folgt aus:

protected override void WndProc(ref Message m) 
    { 
     const uint WM_DISPLAYCHANGE = 0x007e; 

     // Listen for operating system messages. 
     switch (m.Msg) 
     { 
      case WM_DISPLAYCHANGE: 

       // The WParam value is the new bit depth 
       uint width = (uint)(m.LParam & 0xffff); 
       uint height = (uint)(m.LParam >> 16); 
       break;     
     } 
     base.WndProc(ref m); 
    } 
0

Sie können einen Timer umfassen, die beispielsweise überprüft alle 2 Sekunden, wenn die Anzahl der Bildschirme mehr als 1 beträgt. Der Code könnte wie folgt aussehen:

timer_tick() 
{ 
    if(Screen.AllScreens.Length >= 2) 
    { 
     //run code to use the second screen 
    } 
} 

Es ist einfach für Anfänger in C# zu verwenden.

+0

Das ist falsch! Sie müssen keinen Timer einbeziehen! – sergiol

+0

Das ist nicht falsch. Es klappt.Sie müssen keinen Timer einbauen, das ist richtig, aber bitte seien Sie genauer, was für ein Code ohne Timer würde aussehen. – Paedow

+0

@sergiol Ist es besser so? – ANeves

0

Sie WndProc und Screen.AllScreens.Length verwenden können:

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] 
    protected override void WndProc(ref Message m) 
    { 
     if (Screen.AllScreens.Length > 1) //example 
     { 


     } 
     base.WndProc(ref m); 
    } 

Weitere Informationen:

Verwandte Themen