Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Kleine Testanwendung für Multi-Monitor-Systeme (https://www.delphipraxis.net/172118-kleine-testanwendung-fuer-multi-monitor-systeme.html)

Codehunter 14. Dez 2012 09:49

AW: Kleine Testanwendung für Multi-Monitor-Systeme
 
Zitat:

Zitat von jobo (Beitrag 1195431)
Sieht ok aus, aber was macht "move relative.."?

Verschiebt ein Fenster unter Beibehaltung seiner zum Monitor relativen Koordinaten auf einen anderen Bildschirm. Wenn ein Fenster also z.B. Left=10 und Top=10 gesetzt hat, dann werden mit dieser Funktion die Koordinaten auf den anderen Monitor umgerechnet und das Fenster dort hin verschoben. So ähnlich wie man das in der VCL mit ScreenToClient und ClientToScreen hat.

Zitat:

Zitat von jobo (Beitrag 1195431)
Was die Details bedeuten ist mir nicht klar

Kurze Erläuterung:

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:
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;
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?

Codehunter 14. Dez 2012 10:13

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".

Codehunter 14. Dez 2012 12:51

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.

jobo 14. Dez 2012 13:01

AW: Kleine Testanwendung für Multi-Monitor-Systeme
 
Zitat:

Zitat von Codehunter (Beitrag 1195451)

Zitat:

Zitat von jobo (Beitrag 1195431)
Was die Details bedeuten ist mir nicht klar

Kurze Erläuterung:
...

Oh danke, ein paar der Angaben konnte ich mir ja schon selbst erklären. :)

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.

dummzeuch 14. Dez 2012 13:05

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.

Codehunter 14. Dez 2012 13:29

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:

jobo 14. Dez 2012 13:56

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.

Codehunter 14. Dez 2012 15:20

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!

joehd 3. Nov 2019 12:39

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

Codehunter 3. Nov 2019 13:24

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 Uhr.
Seite 2 von 3     12 3      

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