Kleine Testanwendung für Multi-Monitor-Systeme
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!
Ich habe mal nach 8 Jahren die Multimon-Routinen aus meinem DelphiWorks überarbeitet und eine Komponente draus gemacht. Bevor ich die veröffentliche wäre es aber schick, wenn der eine oder andere mit mehreren Bildschirmen am Rechner die angehängte Testanwendung mal ausprobieren würde. Ich hab schließlich nicht so viele verschiedene Grafikkarten, Monitore und Betriebssysteme am Start. (Bei mir getestet unter Win 7 x64 SP1 mit NVidia GeForce GT 610 und zwei TFTs) Grüße Cody |
AW: Kleine Testanwendung für Multi-Monitor-Systeme
Bei mir funktionierts.
Grafikkarte und Monitore richtig erkannt. |
AW: Kleine Testanwendung für Multi-Monitor-Systeme
Die Schubserei vom Sample Window funktioniert auch? Screenshots?
|
AW: Kleine Testanwendung für Multi-Monitor-Systeme
Bei mir hat auch alles sauber funktioniert auf einem Windows 7 64Bit mit einer NVidia Geforce GTX670 mit vier Monitore.
|
AW: Kleine Testanwendung für Multi-Monitor-Systeme
soweit sogut funktioniert alles...
wenn ich den 2ten Monitor auswähle [Show sample window] wird das Fenster auf dem ersten Monitor angezeigt, gewollt so ? |
AW: Kleine Testanwendung für Multi-Monitor-Systeme
Bei mir funktioniert das auch. Win7 64 Bit Nvidia Karte aber nur 1 Monitor :lol:
|
AW: Kleine Testanwendung für Multi-Monitor-Systeme
Die Screenshots funktionieren.
Nur Show Sample Window wird bei beiden Monitoren auf dem ersten angezeigt |
AW: Kleine Testanwendung für Multi-Monitor-Systeme
@freeway: Das kann ich dir nicht genau beantworten warum das bei dir so ist. Ich lese die Videotreiber und Monitore in der Reihenfolge aus, wie sie Windows intern gespeichert hat. Die Reihenfolge wird immer beibehalten, so wie sie ursprünglich bei der Treiberinstallation gefunden wurde. Hast du evtl. in deinen Grafikeinstellungen die beiden Bildschirme vertauscht?
Guck mal nach, wenn du in meinem Testprogramm im Baum auf den Grafikkarteneintrag oberhalb der Monitore klickst, bei welchem von beiden "Primary display: YES" angeizeigt wird. Standardmäßig sollte das der erste der Einträge sein. Wenn man irgendwann händisch mal was geändert hat kann es auch ein anderer sein. Ebenso sollte beim ersten (im Baum obersten) Monitor "Desktop anchor coordinates: 0x0" stehen. Steht da was anderes wurde wohl irgendwann mal händisch was geändert. @v2afrank: Der Button "Show Sample Window" erzeugt erstmal das Sample-Fenster und das immer auf dem primären Display. Das ist gewollt so um die anderen Buttons "Move" und "Center" verdeutlichen zu können. EDIT: Hatte mich bei "freeway" verlesen. Daher die Streichung. Vielleicht hätte ich das "Show Sample Window" ein bissi anders machen sollen, scheint verwirrend zu sein. Aber es ist ja kein Anwenderprogramm wo es auf Usability ankommt ;-) |
AW: Kleine Testanwendung für Multi-Monitor-Systeme
An Win 7 64
Sieht ok aus, aber was macht "move relative.."? Ich hab's geschnallt, ist ok! Was die Details bedeuten ist mir nicht klar, aber sicher sagt es Dir was. Es gäbe mit den gleichen Monis noch ein XP 32 bit, dann müsste ich aber unter den Tisch krabbeln und ein Kabel einstecken. Könnte ich auf Wunsch auch machen. Daten:
Code:
Device name: \\.\DISPLAY1
Device string: ATI Radeon HD 5450 Active: YES Primary display: YES Screen is attached to desktop: YES Screen mirrors the desktop: NO Supports more modes than attached monitor: YES Removable device: NO VGA compatible video mode: NO Device name: \\.\DISPLAY1\Monitor0 Device string: PnP-Monitor (Standard) Height: 1200 Width: 1600 Desktop anchor coordinates: 0x0 Monitor rect (Left x Top : Right x Bottom): 0x0:1600x1200 Work rect without toolbars (Left x Top : Right x Bottom): 118x0:1600x1200 Current frequency: 60 Hz Current color depth: 32 Bit Device name: \\.\DISPLAY2 Device string: ATI Radeon HD 5450 Active: YES Primary display: NO Screen is attached to desktop: YES Screen mirrors the desktop: NO Supports more modes than attached monitor: YES Removable device: NO VGA compatible video mode: NO Device name: \\.\DISPLAY2\Monitor0 Device string: PnP-Monitor (Standard) Height: 1024 Width: 1280 Desktop anchor coordinates: 1600x0 Monitor rect (Left x Top : Right x Bottom): 1600x0:2880x1024 Work rect without toolbars (Left x Top : Right x Bottom): 1600x0:2880x1024 Current frequency: 75 Hz Current color depth: 32 Bit |
AW: Kleine Testanwendung für Multi-Monitor-Systeme
Hast du/jemand schon getestet was passiert wenn während der Laufzeit der Anwendung Monitore (Beamer bei Laptop) dazu bzw. weggenommen werden.
Hier hatte ich auch schon Problem da die Delphi-Interne Montorliste AFAIK nicht während der Laufzeit aktualisiert wird. |
AW: Kleine Testanwendung für Multi-Monitor-Systeme
Zitat:
Zitat:
Die Grafikkarte bzw. der Schnittstellentreiber Device name: \\.\DISPLAY1 --> Windows-interner Treibername Device string: ATI Radeon HD 5450 --> Gerätename so wie er im Gerätemanager angezeigt wird Active: YES --> Wird im Moment verwendet Primary display: YES --> Primäre Displayschnittstelle Screen is attached to desktop: YES --> Bildschirm ist Teil des Desktops (= "Anzeige auf diesen Bildschirm erweitern" bei Windows) Screen mirrors the desktop: NO --> Bildschirm spiegelt den Desktop (trifft oft auf Beamer zu) Supports more modes than attached monitor: YES --> Grafikkarte kann mehr Auflösungen, Farbtiefen, Refreshraten als der angeschlossene Monitor Removable device: NO --> Weiß ich auch nicht genau, ich vermute das bezieht sich auf USB-Grafikkarten (siehe DISPLAY_DEVICE structure im MSDN) VGA compatible video mode: NO --> Wird wohl nur im abgesicherten Modus als YES angezeigt (^= 640x480-8Bit@60Hz) Der Monitor, Beamer etc. Device name: \\.\DISPLAY1\Monitor0 --> Windows-interner Treibername Device string: PnP-Monitor (Standard) --> Gerätename so wie er im Gerätemanager angezeigt wird Height: 1200 --> Vertikale Auflösung Width: 1600 --> Horizontale Auflösung Desktop anchor coordinates: 0x0 --> Linke obere Ecke relativ zum gesamten Desktop Monitor rect (Left x Top : Right x Bottom): 0x0:1600x1200 --> Kompletter Bereich relativ zum gesamten Desktop, der auf diesem Bildschirm dargestellt wird Work rect without toolbars (Left x Top : Right x Bottom): 118x0:1600x1200 --> Bereich ohne z.B. die Taskleiste relativ zum gesamten Desktop, der auf diesem Bildschirm dargestellt wird Current frequency: 60 Hz --> Refresh-Rate Current color depth: 32 Bit --> Farbtiefe Interessant bei der ganzen Sache: Windows unterscheidet nicht strikt zwischen Videotreiber (im Baum als Karte dargestellt) und Bildschirmen (im Baum als blauer Flatscreen). Vielmehr sieht Windows beides als Einheit an, wobei der Monitor eine Untermenge der Grafikkarte ist. Es gibt auch virtuelle Grafiktreiber die keinen Monitor kennen (z.B. der VNC-Videotreiber). @Bernhard: Genau an dem Problem bastel ich gerade. Ich müsste die Message WM_DISPLAYCHANGE hooken. Allerdings beiß ich da im Moment noch auf Granit:
Delphi-Quellcode:
Ich hab schon die verschiedensten Hook-IDs für SetWindowsHookEx ausprobiert, die Hook-Proc SysMsgHook wird nie aufgerufen wenn sich die Bildschirmeinstellungen ändern. Entweder hab ich den Hook vermurkst (wahrscheinlich) oder Windows sendet einfach kein WM_DISPLAYCHANGE (unwahrscheinlich). Any suggestions?
var
Form1: TForm1; MainHook : HHOOK; function SysMsgHook(Code: Integer; wParam : WPARAM; lParam : LPARAM): Longint; stdcall; implementation {$R *.dfm} function SysMsgHook(Code: Integer; wParam : WPARAM; lParam : LPARAM): Longint; stdcall; var Buffer: TEventMsg; begin result:= 0; Buffer:= PEventMsg(lParam)^; if Buffer.Message = WM_DISPLAYCHANGE then begin ShowMessage('OK'); end; end; procedure TForm1.FormCreate(Sender: TObject); begin MainHook:= SetWindowsHookEx(WH_SHELL, SysMsgHook, hInstance, 0); end; procedure TForm1.FormDestroy(Sender: TObject); begin UnhookWindowsHookEx(MainHook); end; |
AW: Kleine Testanwendung für Multi-Monitor-Systeme
Nachtrag: Es gab hier zwar schon mal eine Anfrage, aber das geht ja nur über die WndProc bzw. Message-Handler im Hauptfenster. Dann müsste ich das "Refreshen" meiner Komponente aber von außen anstoßen. Das fände ich unschön, darum suche ich nach einer Möglichkeit mit einem Hook zu arbeiten. Dann könnte ich meiner Komponente auch ein Event spendieren, z.B. "OnDisplaySettingsChanged".
|
AW: Kleine Testanwendung für Multi-Monitor-Systeme
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe das Testprogramm noch ein bisschen erweitert. Klickt man im Baum auf einen Grafikkarteneintrag, dann enthält die Details-Liste jetzt auch eine komplette Auflistung aller Videomodes, welche die Grafikkarte unterstützt inkl. Vermerk, ob der angeschlossene Monitor die auch mit macht.
Man muss die Details-Liste einfach ein bissi nach unten Scrollen. |
AW: Kleine Testanwendung für Multi-Monitor-Systeme
Zitat:
Und wenn Du eh noch erweiterst und Tests haben willst: Die Baumdaten könnten auch mit in die Memobox oder noch besser, warum logst Du nicht gleich ALLES in die Box. (Diesen Modus dann vielleicht abschaltbar machen) Also: - "Moni3 im Baum geclicked" plus Moni Properties - Center Form für Moni2 geclicked - Testform x/y Koordinaten inkl welcher Monito (kontinuierlich) usw. usw. Das dürfte im Problemfall per Copy/ Paste das einfachste Feedback ergeben. |
AW: Kleine Testanwendung für Multi-Monitor-Systeme
Bei mir wird ein Monitor doppelt, der andere dreifach angezeigt:
Device name: \\.\DISPLAY1 Device string: Mobile Intel(R) 945 Express Chipset Family Active: YES Primary display: YES Screen is attached to desktop: YES Screen mirrors the desktop: NO Supports more modes than attached monitor: YES Removable device: NO VGA compatible video mode: NO Device name: \\.\DISPLAY1\Monitor0 Device string: Plug and Play Monitor Height: 1200 Width: 1600Desktop anchor coordinates: 0x0 Monitor rect (Left x Top : Right x Bottom): 0x0:1600x1200 Work rect without toolbars (Left x Top : Right x Bottom): 0x0:1600x1170 Current frequency: 60 Hz Current color depth: 32 Bit (und noch zweimal als Monitor1 und Monitor2) und Device name: \\.\DISPLAY2 Device string: Mobile Intel(R) 945 Express Chipset Family Active: YES Primary display: NO Screen is attached to desktop: YES Screen mirrors the desktop: NO Supports more modes than attached monitor: YES Removable device: NO VGA compatible video mode: NO Device name: \\.\DISPLAY2\Monitor0 Device string: Plug and Play Monitor Height: 600 Width: 1024 Desktop anchor coordinates: 1600x0 Monitor rect (Left x Top : Right x Bottom): 1600x0:2624x600 Work rect without toolbars (Left x Top : Right x Bottom): 1600x0:2624x600 Current frequency: 60 Hz Current color depth: 32 Bit (und nochmal als Monitor1) Der erste Monitor ist extern angeschlossen, der zweite ist der vom Notebook selbst. Die Funktionen zum Fenster und Screenshot scheinen sauber zu funktionieren. |
AW: Kleine Testanwendung für Multi-Monitor-Systeme
Liste der Anhänge anzeigen (Anzahl: 1)
@Jobo: Das mit dem Baum hat sich von selbst ergeben da meine Komponente intern jede Grafikkarte, jeden Monitor und jeden Videomode als Objekt kapselt. Dann brauchte ich jedem Node im Baum das jeweilige Objekt nur noch als TreeNode.Data zuweisen. Ist aber letztlich Geschmackssache, ich hätte es genausogut auch als flache Liste auswerfen können. Mir gings ja mehr darum zu schauen, ob das bei euch auch rund läuft.
@dummzeuch: Bitte mach mal einen Screenshot von deinem Gerätemanager mit aufgeklappten Grafikkarten- und Monitor-Zweigen wie hier: |
AW: Kleine Testanwendung für Multi-Monitor-Systeme
Ob die Infos nun aus dem Baum kommen oder flach, die Hauptidee war, alles in der Memolist zu sammeln.
|
AW: Kleine Testanwendung für Multi-Monitor-Systeme
Liste der Anhänge anzeigen (Anzahl: 1)
So, noch ein kleines Update für heute: Die Test-Anwendung sollte jetzt auf Änderungen der Einstellungen durch die Systemsteuerung reagieren und entsprechend die Daten neu auswerten. Sieht man besonders gut, wenn man die Auflösung des sekundären Monitors ändert, das Testprogramm auf dem primären liegt und Windows nach 15 Sekunden die alten Einstellungen wiederherstellt.
Soweit... Schönen dritten Advent! |
AW: Kleine Testanwendung für Multi-Monitor-Systeme
Gibt es dazu auch einen Source ?
Denn manches könnte man ja in eigener Anwendung nutzen .. Ja ist schon klar Beitrag aus 2012 |
AW: Kleine Testanwendung für Multi-Monitor-Systeme
Huh, das war DelphiWorks 1.5 und das Multimonitor-API von Windows 7. Teile davon waren undokumentiert und funktionierten seitens Microsoft eher schlecht als recht. Als dann auch noch die High-DPI-Problematik aufkam habe ich das Thema aufgegeben. Inzwischen hat Delphi vieles davon ja auch ab Werk eingebaut.
|
AW: Kleine Testanwendung für Multi-Monitor-Systeme
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz