AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Kleine Testanwendung für Multi-Monitor-Systeme
Thema durchsuchen
Ansicht
Themen-Optionen

Kleine Testanwendung für Multi-Monitor-Systeme

Ein Thema von Codehunter · begonnen am 13. Dez 2012 · letzter Beitrag vom 4. Nov 2019
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#11

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

  Alt 14. Dez 2012, 10:49
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.

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?

Geändert von Codehunter (14. Dez 2012 um 10:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#12

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

  Alt 14. Dez 2012, 11:13
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".
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#13

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

  Alt 14. Dez 2012, 13:51
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.
Angehängte Dateien
Dateityp: zip Multimon_V2.zip (218,6 KB, 23x aufgerufen)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#14

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

  Alt 14. Dez 2012, 14:01

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.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.623 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#15

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

  Alt 14. Dez 2012, 14:05
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.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#16

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

  Alt 14. Dez 2012, 14:29
@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:
Miniaturansicht angehängter Grafiken
image2.png  
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#17

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

  Alt 14. Dez 2012, 14:56
Ob die Infos nun aus dem Baum kommen oder flach, die Hauptidee war, alles in der Memolist zu sammeln.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#18

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

  Alt 14. Dez 2012, 16:20
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!
Angehängte Dateien
Dateityp: zip Multimon_V3.zip (218,7 KB, 51x aufgerufen)
  Mit Zitat antworten Zitat
joehd

Registriert seit: 8. Okt 2008
Ort: Heidelberg
109 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#19

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

  Alt 3. Nov 2019, 13:39
Gibt es dazu auch einen Source ?
Denn manches könnte man ja in eigener Anwendung nutzen ..

Ja ist schon klar Beitrag aus 2012
joe
immer wenn ich was suche finde ich es hier komisch oder ?
Arbeite mit D3 D5 D2007 DXE Prof
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#20

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

  Alt 3. Nov 2019, 14:24
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.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:57 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