Einzelnen Beitrag anzeigen

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, 09: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 09:54 Uhr)
  Mit Zitat antworten Zitat