Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Monitore einzeln auslesen (https://www.delphipraxis.net/134880-monitore-einzeln-auslesen.html)

Anonymos 31. Mai 2009 13:45


Monitore einzeln auslesen
 
gut'n Mittag

Ich würde gerne die Bildschirminformationen meiner Bildschirme einzeln / getrennt abfragen.

Dazu habe ich hier im Forum schon volgenden Code gefunden:
Delphi-Quellcode:
DC := GetDC(screen.Monitors[i].Handle);
hSize := GetDeviceCaps(DC, HORZSIZE);
Blöderweise funzt das bei mir so überhauptnicht.
Ich bekomme da als hSize immer 0
(Was warscheinlich heißt, dass das DC nicht stimmt)

Wenn ich statt "screen.Monitors[i].Handle"
Das Handle meines Forms verwende: "Form1.Handle"
dann bekomm ich die richtige Größe (Nachgemessen, stimmt)

Warum ist nun das Handle des Monitors über Screen falsch?

Danke für jede Hilfe

omata 31. Mai 2009 15:31

Re: Monitore einzeln auslesen
 
Was spricht gegen...
Delphi-Quellcode:
hSize:=Screen.Monitors[i].Height;

Anonymos 31. Mai 2009 15:49

Re: Monitore einzeln auslesen
 
Weil das nur die Höhe in Pixeln ausgibt.
HORZSIZE
Gibt aber die Reale Höhe des Bildschirms in Millimetern aus

Wenn ich die irgendwie anders berechnen könnte wäre mir des auch recht,
es muss nur Monitorspezifisch sein
(ich hab 2 verschiedengroße Bildschirme mit unterschiedlichen Auflösungen)

omata 31. Mai 2009 16:12

Re: Monitore einzeln auslesen
 
Hab hier leider nur einen Monitor. Aber versuch doch mal folgendes...
Delphi-Quellcode:
var DC:hwnd;
    hSize, Width:cardinal;
    i:integer;
begin
  DC := GetDC(0);
  hSize := GetDeviceCaps(DC, HORZSIZE);
  Width:=0;
  for i:=1 to Screen.MonitorCount do
    Width:=Width + Screen.Monitors[i-1].Width;
  for i:=1 to Screen.MonitorCount do
    ShowMessage(inttostr(i) + '. Monitor: ' + inttostr(round((hSize / Width) * Screen.Monitors[i-1].Width)));
  ReleaseDC(DC, 0);
end;
Der Desktop ist ein großes Bitmap und der Zugriff erfolgt mit GetDC(0).

Ist nur so eine Idee...

Anonymos 31. Mai 2009 16:26

Re: Monitore einzeln auslesen
 
Das Problem an der Sache ist ja, dass 1 Pixel des DesktopBitmap auf dem einen Monitor weniger "breit" (groß) sind wie auf dem anderen.

Ich kann also von dem einen nicht auf den anderen schließen, leider

hathor 31. Mai 2009 17:11

Re: Monitore einzeln auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
WMI hilft:

CIMV2
Win32_DesktopMonitor
PixelsPerXLogicalInch
PixelsPerYLogicalInch

Anonymos 31. Mai 2009 17:17

Re: Monitore einzeln auslesen
 
könntest du dich etwas preziser ausdrücken?
Ich kann jetz ausgenommen WMI mit garnix dieser Wörter anfangen
vllt en Codebeispiel?

mjustin 31. Mai 2009 19:51

Re: Monitore einzeln auslesen
 
Zitat:

Zitat von Anonymos
könntest du dich etwas preziser ausdrücken?
Ich kann jetz ausgenommen WMI mit garnix dieser Wörter anfangen
vllt en Codebeispiel?

WMI kann aus Delphi über eine importierte Typbibliothek angesteuert werden. Bei Zugriff auf den lokalen Rechner ist das relativ einfach. Ich weiss nicht ob dieser Artikel noch auf dem aktuellen Stand ist, aber er zeigt in etwa worum es dabei geht:

http://entwickler-forum.de/showthread.php?t=22427

MSDN dokumentiert alle möglichen WMI Klassen unter
http://msdn.microsoft.com/en-us/library/aa394084(VS.85).aspx

Die Win32_DesktopMonitor Klasse enthält dann z.B. die Properties PixelsPerXLogicalInch und PixelsPerYLogicalInch - eventuell ist das schon die gesuchte Information.

Es müßte aber eigentlich auch über eine Win32 Standard API möglich sein auf diese Informationen zuzugreifen...

zum Beispiel mit GetDeviceCaps:

http://msdn.microsoft.com/en-us/library/ms929230.aspx

LOGPIXELSX, LOGPIXELSY

Edit: Link zu WMI Klassenübersicht auf MSDN korrigiert
Und diese WMI Funktionen habe ich noch gefunden:

CIM_VideoHead
http://msdn.microsoft.com/en-us/library/cc136948(VS.85).aspx

CIM_MonitorResolution
http://msdn.microsoft.com/en-us/library/aa387921(VS.85).aspx

Anonymos 1. Jun 2009 09:27

Re: Monitore einzeln auslesen
 
Mit diesen Funktionen kann ich leider nur die Daten des Primärmonitors abfragen.

Vllt gibt es ja eine Möglichkeit, diesen zu wechseln?
(aus Delphi heraus)

mjustin 1. Jun 2009 09:45

Re: Monitore einzeln auslesen
 
Zitat:

Zitat von Anonymos
Mit diesen Funktionen kann ich leider nur die Daten des Primärmonitors abfragen.

Vllt gibt es ja eine Möglichkeit, diesen zu wechseln?
(aus Delphi heraus)

EnumDisplayDevices käme noch in Frage:

http://msdn.microsoft.com/en-us/libr...09(VS.85).aspx

Zitat:

The EnumDisplayDevices function lets you obtain information about the display devices in the current session.

Anonymos 1. Jun 2009 10:30

Re: Monitore einzeln auslesen
 
EnumDisplayDevices liefert mir Name und Grafikkarte für jeden Monitor, aber immernoch nicht die Größe

Mit GetDeviceCaps bekomm ich alle informationen, aber eben nur zum Primärmonitor

Und ich will doch nur die Realgröße jedes eizelnen Bildschirm.

Und den Primärmonitor zu wechseln geht nicht?

omata 1. Jun 2009 16:40

Re: Monitore einzeln auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Versuch doch mal folgendes...

himitsu 1. Jun 2009 16:47

Re: Monitore einzeln auslesen
 
Zitat:

Zitat von Anonymos
Mit GetDeviceCaps bekomm ich alle informationen, aber eben nur zum Primärmonitor

hast denn auch die richigen Monitorhandles der Funktion übergeben?

Anonymos 3. Jun 2009 18:38

Re: Monitore einzeln auslesen
 
@Omata Super, funktioniert einwandfrei

Also ich weiß ja nicht woran des gelegen hat, wenn ich normal mit GETDC(screen.Monitors[x].Handle) versucht habe das DC des Monitors zu bekommen hat des überhaupt nicht geklappt, wenn ich ein x-beliebiges anderes Handle übergeben hab hab ich immer die Daten des Primärmonitors erhalten.

Aber die Windows-CallBack-API EnumDisplayMonitors scheint da ja das richtige DC zu liefern.
Klasse, damit wär das ganze dann hiermit beantwortet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz