{"id":55000278,"date":"2021-08-01T00:00:00","date_gmt":"2021-12-31T14:21:00","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=278"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Fensterposition_beim_Oeffnen_einstellen","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Fensterposition_beim_Oeffnen_einstellen\/","title":{"rendered":"Fensterposition beim &Ouml;ffnen einstellen"},"content":{"rendered":"<p><b>Nachdem ich mittlerweile mit zwei Bildschirmen arbeite (einer f&uuml;r die Hauptanwendungen, einer f&uuml;r andere Informationen wie Termine et cetera) und der Bildschirm f&uuml;r die Hauptanwendungen der zweite Bildschirm ist, nervt es mich etwas, dass Anwendungen beim Debuggen immer auf dem sekund&auml;ren Bildschirm angezeigt werden und ich diese immer erst auf den Hauptbildschirm ziehen muss. Also schauen wir uns in diesem Artikel an, welche M&ouml;glichkeiten .NET bietet, festzulegen, auf welchem Bildschirm eine Anwendung ge&ouml;ffnet werden soll.<\/b><\/p>\n<h2>Ausgangssituation<\/h2>\n<p>Die aktuelle Situation ist also, dass ich zwei Bildschirme habe &#8211; der linke Bildschirm zeigt unwichtige Anwendungen an, der rechte (oder auch zentrale) Bildschirm dient zum Arbeiten. Wenn ich nun Visual Studio auf dem zentralen Bildschirm ge&ouml;ffnet habe und eine Anwendung zum Debuggen starte, erscheint diese immer auf dem linken, sekund&auml;ren Bildschirm. Wenn ich die beim Debuggen erstellte <b>.exe<\/b>-Datei direkt aufrufe, wird diese wie gew&uuml;nscht im Hauptbildschirm angezeigt. Wie kann ich nun steuern, welcher Bildschirm die Anwendung beim Debuggen anzeigt<\/p>\n<h2>L&ouml;sung aus der Forms-Bibliothek<\/h2>\n<p>Die notwendigen Elemente f&uuml;r den Zugriff auf die Bildschirme finden sich in der Bibliothek <b>System.Windows.Forms<\/b>, die wir zun&auml;chst &uuml;ber einen entsprechenden Verweis zu unserem WPF-Projekt hinzuf&uuml;gen. Das erledigen wir &uuml;ber den Dialog, der nach dem Aufruf des Men&uuml;eintrags <b>Projekt|Verweise hinzuf&uuml;gen&#8230; <\/b>erscheint. Hier sehen Sie im Bereich <b>Assemblys <\/b>nach einer schnellen Suche den Eintrag <b>System.Windows.Forms<\/b>, den Sie per Klick in das Kontrollk&auml;stchen zum Projekt hinzuf&uuml;gen (siehe Bild 1). Anschlie&szlig;end k&ouml;nnen wir per Code auf die Elemente dieser Bibliothek zugreifen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2021_04\/pic_278_001.png\" alt=\"Hinzuf&uuml;gen eines Verweises auf die Bibliothek System.Windows.Forms \" width=\"700\" height=\"295,3259\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Hinzuf&uuml;gen eines Verweises auf die Bibliothek System.Windows.Forms <\/span><\/b><\/p>\n<h2>Die Screen-Klasse<\/h2>\n<p>Mit der <b>Screen<\/b>-Klasse er&ouml;ffnen wir uns die M&ouml;glichkeit, auf die Bildschirme des Systems zuzugreifen. Die <b>Screen<\/b>-Klasse liefert uns die folgenden interessanten Auflistungen und Eigenschaften:<\/p>\n<ul>\n<li><b>AllScreens<\/b>: Zugriff auf alle <b>Screen<\/b>-Elemente<\/li>\n<li><b>BitsPerPixel<\/b>: Anzahl der Bits im Arbeitsspeicher, die einem Pixel von Daten zugeordnet sind<\/li>\n<li><b>Bounds<\/b>: Ermittelt die Ma&szlig;e des Bildschirms. Dies liefert ein Objekt des Typs <b>Rectangle<\/b>, das wiederum die vier Eigenschaften <b>Left<\/b>, <b>Top<\/b>, <b>Width <\/b>und <b>Height <\/b>aufweist. Bei mehreren Bildschirmen werden die Werte bezogen auf das Gesamtsystem betrachtet. Wenn der linke Bildschirm beispielsweise eine Breite (<b>Width<\/b>) von 1920 Pixeln hat, dann ist der Wert f&uuml;r die Eigenschaft <b>Left <\/b>des rechten Bildschirms ebenfalls gleich 1920 Pixel.<\/li>\n<li><b>DeviceName<\/b>: Liefert den Namen des Bildschirms im System.<\/li>\n<li><b>Primary<\/b>: Gibt an, ob der Bildschirm der prim&auml;re Bildschirm ist.<\/li>\n<li><b>PrimaryScreen<\/b>: Liefert einen Verweis auf den prim&auml;ren Bildschirm.<\/li>\n<li><b>WorkingArea<\/b>: Ermittelt die Ma&szlig;e des Arbeitsbereichs des Bildschirms. Dieser unterscheidet sich von den mit Bounds ermittelten Ma&szlig;en, in dem es nur den Bereich ohne Elemente wie die Taskleiste oder angedockte Fenster und Men&uuml;s ermittelt &#8211; also den tats&auml;chlich verf&uuml;gbaren Arbeitsbereich. Die Eigenschaft <b>WorkingArea<\/b> liefert ein Objekt des Typs Rectangle, das wiederum die vier Eigenschaften <b>Left<\/b>, <b>Top<\/b>, <b>Width <\/b>und <b>Height <\/b>aufweist. Auch hier gilt: Bei mehreren Bildschirmen werden die Werte bezogen auf das Gesamtsystem betrachtet. Wenn der linke Bildschirm beispielsweise eine Breite (<b>Width<\/b>) von 1920 Pixeln hat, dann ist der Wert f&uuml;r die Eigenschaft <b>Left <\/b>des rechten Bildschirms ebenfalls gleich 1920 Pixel.<\/li>\n<\/ul>\n<p>Hier ist nun zu beachten, dass <b>Screen <\/b>selbst bereits ein Element des Typs <b>Screen <\/b>liefert, mit dem Sie einige Eigenschaften des Bildschirms wie <b>BitsPerPixel<\/b>, <b>Bounds<\/b>, <b>DeviceName<\/b>, <b>Primary <\/b>und <b>WorkingArea <\/b>auslesen k&ouml;nnen. Gleichzeitig k&ouml;nnen Sie aber &uuml;ber die Eigenschaft <b>PrimaryScreen <\/b>einen Verweis auf das <b>Screen<\/b>-Objekt im System ermitteln, das als prim&auml;rer Bildschirm angegeben ist.<\/p>\n<p>F&uuml;r den Zugriff auf die <b>Screen<\/b>-Klasse ben&ouml;tigen wir auch noch die folgende <b>Imports<\/b>-Anweisung:<\/p>\n<pre>Imports System.Windows.Forms<\/pre>\n<h2>Beispiel: Ausgabe der Bildschirmdaten per Meldungsfenster<\/h2>\n<p>Die folgende Methode, die wir in der Konstruktor-Methode des Fensters <b>MainWindow <\/b>der Beispielanwendung aufrufen, definiert eine Variable namens <b>objScreen <\/b>f&uuml;r ein Objekt des Typs <b>Screen<\/b>. In einer <b>For Each<\/b>-Schleife durchlaufen wir alle Elemente der Auflistung <b>AllScreens <\/b>des <b>Screen<\/b>-Objekts. Innerhalb der Schleife setzen wir eine Meldung zusammen, die alle relevanten Informationen &uuml;ber den Bildschirm enth&auml;lt und zeigen diese dann in einer Meldung an. Dabei greifen wir auf die einzelnen Werte der Eigenschaften <b>Bounds <\/b>und <b>WorkingArea <\/b>&uuml;ber deren Untereigenschaften <b>Left<\/b>, <b>Top<\/b>, <b>Width <\/b>und <b>Height <\/b>zu. Damit das m&ouml;glich ist, ben&ouml;tigen Sie noch einen Verweis auf die Bibliothek <b>System.Drawing<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>New()\r\n     InitializeComponent()\r\n     <span style=\"color:blue;\">Dim <\/span>objScreen<span style=\"color:blue;\"> As <\/span>Screen\r\n     For Each objScreen In Screen.AllScreens\r\n         MessageBox.Show(\"DeviceName: \" & objScreen.DeviceName & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n             & \"Primary: \" & objScreen.Primary & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n             & \"Bounds: \" & objScreen.Bounds.<span style=\"color:blue;\">Left<\/span> & \", \" & objScreen.Bounds.Top & \", \" _\r\n             & objScreen.Bounds.Width & \", \" & objScreen.Bounds.Height & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n             & \"WorkingArea: \" & objScreen.WorkingArea.<span style=\"color:blue;\">Left<\/span> & \", \" & objScreen.WorkingArea.Top & \", \" _\r\n             & objScreen.WorkingArea.Width & \", \" & objScreen.WorkingArea.Height & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n             & \"BitsPerPixel: \" & objScreen.BitsPerPixel)\r\n     <span style=\"color:blue;\">Next<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000278\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000278?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000278\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"9fac6dd15a\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nachdem ich mittlerweile mit zwei Bildschirmen arbeite (einer f&uuml;r die Hauptanwendungen, einer f&uuml;r andere Informationen wie Termine et cetera) und der Bildschirm f&uuml;r die Hauptanwendungen der zweite Bildschirm ist, nervt es mich etwas, dass Anwendungen beim Debuggen immer auf dem sekund&auml;ren Bildschirm angezeigt werden und ich diese immer erst auf den Hauptbildschirm ziehen muss. Also schauen wir uns in diesem Artikel an, welche M&ouml;glichkeiten .NET bietet, festzulegen, auf welchem Bildschirm eine Anwendung ge&ouml;ffnet werden soll.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662021,66042021,44000002,44000025],"tags":[],"yst_prominent_words":[],"class_list":["post-55000278","post","type-post","status-publish","format-standard","hentry","category-662021","category-66042021","category-Benutzeroberflaeche_mit_WPF","category-VBAProgrammierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000278","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000278"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000278\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000278"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000278"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000278"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000278"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}