AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Monitor X per ChangeDisplaySettingsEx (A) akivieren ?

Monitor X per ChangeDisplaySettingsEx (A) akivieren ?

Offene Frage von "Y.Elm"
Ein Thema von Rumpi · begonnen am 2. Feb 2005 · letzter Beitrag vom 23. Nov 2011
Antwort Antwort
Seite 1 von 2  1 2   
Rumpi

Registriert seit: 26. Aug 2003
Ort: Berlin
72 Beiträge
 
#1

Monitor X per ChangeDisplaySettingsEx (A) akivieren ?

  Alt 2. Feb 2005, 23:29
Hallo,

ich versuche einen 2. Monitor ( inaktiv ) per API zu aktiviern,
leider geht das nicht so wie gewollt.

Zitat:
When adding a display monitor to a multiple-monitor system programmatically, set DEVMODE.dmFields to DM_POSITION and specify a position (in DEVMODE.dmPosition) for the monitor you are adding that is adjacent to at least one pixel of the display area of an existing monitor. To detach the monitor, set DEVMODE.dmFields to DM_POSITION but set DEVMODE.dmPelsWidth and DEVMODE.dmPelsHeight to zero.
Ich hole mir mit:
EnumDisplaySettingsExA( PChar('\\.\Display'+IntToStr(Index)), ENUM_REGISTRY_SETTINGS, DevModeExA, 0); Die Daten, des Index nicht aktiven Monitors, aus der Registry.

Leider liefert:
ChangeDisplaySettingsExA(PChar('\\.\DISPLAY'+IntToStr(Index)), DevModeExA, 0, 0, nil); immer nur : DISP_CHANGE_FAILED !

Das Lesen aller Daten geht
************************************************** *****************************************
1. Wide viewing angle & High density FlexView Display 1600x1200 on ATI MOBILITY FIRE GL T2
primary,
1600 x 1200 @ 0,0 - 32-bit - 60 Hz
workspace: 0,0 - 1600,1136 HMONITOR: 0x10001
Device: \\.\DISPLAY1\Monitor3

2. (Standardmonitor) on ATI MOBILITY FIRE GL T2
disabled,
1024 x 768 @ 1600,0 - 32-bit - 60 Hz
Device: \\.\DISPLAY2\Monitor0

************************************************** ******************************************

Vielen Dank für euren Input.
Rumpi
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?

  Alt 3. Feb 2005, 01:15
Moin!

Dumme Frage, aber sind die Werte für dmFields, dmPelsWidth und dmPelsHeight ordentlich gesetzt vor dem Aufruf von ChangeDisplayEx ? Weil das auslesen der Informationen sagt noch lange nicht aus, dass die Bits in dmFields ordentlich gesetzt sind.

MfG
Muetze1
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?

  Alt 3. Feb 2005, 01:17
kann der monitor mit windows aktiviert werden ? falls der treiber garnet funzt oderso
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Rumpi

Registriert seit: 26. Aug 2003
Ort: Berlin
72 Beiträge
 
#4

Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?

  Alt 3. Feb 2005, 07:18
Hallo,

Zitat:
Dumme Frage, aber sind die Werte für dmFields, dmPelsWidth und dmPelsHeight ordentlich gesetzt vor dem Aufruf von ChangeDisplayEx ? Weil das auslesen der Informationen sagt noch lange nicht aus, dass die Bits in dmFields ordentlich gesetzt sind.
Ja : das Ändern der Einstellungen funktioniert ja, wenn der Monitor aktiv ist.

Gruss Rumpi
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?

  Alt 3. Feb 2005, 11:20
Moin!

Zitat von Rumpi:
Hallo,

Zitat:
Dumme Frage, aber sind die Werte für dmFields, dmPelsWidth und dmPelsHeight ordentlich gesetzt vor dem Aufruf von ChangeDisplayEx ? Weil das auslesen der Informationen sagt noch lange nicht aus, dass die Bits in dmFields ordentlich gesetzt sind.
Ja : das Ändern der Einstellungen funktioniert ja, wenn der Monitor aktiv ist.

Gruss Rumpi
Und genau da vermute ich das Problem: Wenn der nicht aktiv ist, dann ist wahrscheinlich in dmFields auch nix gesetzt. Und da der Aufruf nur die Teile von DEVMODE benutzt und ändert zu welchem in dmFields das Bit gesetzt ist, wird dies wahrscheinlich nicht gemacht.

Das es unter einer ganz anderen Situation (Monitor ist aktiviert) funktioniert hilft uns in der Problemsituation (Monitor nicht aktiviert) nicht weiter. Es wird/muss/gibt einen Unterschied - grundlegend schonmal die Situation.

Das wäre wie eine Frage warum der Ball nicht nass wird bei Regen wenn er im Haus liegt. Wenn er draussen ist und es regnet wird er ja schliesslich auch nass. Nach dieser Logik ist vieles unerklärlich...

MfG
Muetze1
  Mit Zitat antworten Zitat
Rumpi

Registriert seit: 26. Aug 2003
Ort: Berlin
72 Beiträge
 
#6

Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?

  Alt 3. Feb 2005, 13:27
Moin Mütze,

JA,

Delphi-Quellcode:
     Result := EnumDisplaySettingsExA( PChar('\\.\Display'+IntToStr(Index)), ENUM_CURRENT_SETTINGS, DevModeExA, 0);
     if Not Result then
       Result := EnumDisplaySettingsExA( PChar('\\.\Display'+IntToStr(Index)), ENUM_REGISTRY_SETTINGS, DevModeExA, 0);
     if Result then
      ...
        DevModeExA.dmFields := DM_POSITION;
Ich hole mir die Daten wenn der Monitor nicht aktiv ist aus der Registry.

dmField ist auch gesetzt.

Das Ändern mit ChangeDisplaySettingsEx oder ChangeDisplaySettingsExA geht.
Aber das deaktivieren mit dmPelsWidth und dmPelsHeight auf 0 geht nicht.

Ich kann von 800x600 auf 1024x768 umschalten aber nicht auf 0x0,
was zu einem deaktivieren des Monitors führen soll, lt. MSDN.

Gruss Rumpi
  Mit Zitat antworten Zitat
Rumpi

Registriert seit: 26. Aug 2003
Ort: Berlin
72 Beiträge
 
#7

Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?

  Alt 3. Feb 2005, 14:29
Hi,

Deaktivieren geht nun!

Man muss, wenn dmPelsWidth und dmPelsHeight 0 sind (deaktivieren)
unbedingt ChangeDisplaySettingsEx mit dwflags "CDS_UPDATEREGISTRY" aufrufen.

Beim ändern der Auflösung ist das nicht zwingend nötig!

Aktivieren geht aber immer noch nicht...

Gruss Rumpi
  Mit Zitat antworten Zitat
Rumpi

Registriert seit: 26. Aug 2003
Ort: Berlin
72 Beiträge
 
#8

Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?

  Alt 7. Feb 2005, 11:28
Hallo,

ich bekomme es einfach nicht hin den 2. Monitor
via ChangeDisplaySettingsEx zu aktivieren.

Nicht mal bei google kann man was dazu finden.

Das deaktiviern geht ja, aber den deaktivierten Monitor
wieder zu aktivieren geht bis dato noch nicht.

Jede Hilfe ist willkommen.

Gruss Rumpi
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?

  Alt 9. Feb 2005, 00:46
Moin!

Also bei mir funktioniert es - ich habe es endlich mal zeitlich hinbekommen dies auszuprobieren. Grundlegendes:

1. Was meinst du die ganze Zeit mit dmPelsWidth und dmPelsHeight? Das ist die Auflösung des Monitors und nicht seine Position im MultiMon System und bedeutet daher auch nicht die Aktivierung/Deaktivierung.

2. Die TDevMode[A/W] in Delphi (zumindes in Delphi 5 bei mir) ist fehlerhaft - besser: nicht vollständig - und daher kann man kein dmPosition angeben. Ich vermute mal ganz stark du hast einfach nach einem ähnlichen Member der struct gesucht.

3. Nach der MSDN gibt es einen Teil der Strukt wo an gleicher Stelle Monitorinformationen und Papier/Druckerinformationen liegen. Darunter fällt auch die dmPosition die ich mir dann mal definiert habe:

Delphi-Quellcode:
Type
  TPOINTL = Packed Record
    x : DWORD;
    y : DWORD;
  End;
  TPrinterMonitor = Packed Record
    Case Integer Of
      0 : (Paper: Packed Record
            dmOrientation: SHORT;
            dmPaperSize: SHORT;
            dmPaperLength: SHORT;
            dmPaperWidth: SHORT;
            dmScale: SHORT;
            dmCopies: SHORT;
            dmDefaultSource: SHORT;
            dmPrintQuality: SHORT;
          End;);
      1 : (Monitor: Packed Record
            dmPosition : TPOINTL;
            dmDisplayOrientation : DWORD;
            dmDisplayFixedOutput : DWORD;
           End;)
  End;
  TDevModeA_new = packed record
    dmDeviceName: array[0..CCHDEVICENAME - 1] of AnsiChar;
    dmSpecVersion: Word;
    dmDriverVersion: Word;
    dmSize: Word;
    dmDriverExtra: Word;
    dmFields: DWORD;

    /// !!!
    Dual : TPrinterMonitor;
    /// !!!

    dmColor: SHORT;
    dmDuplex: SHORT;
    dmYResolution: SHORT;
    dmTTOption: SHORT;
    dmCollate: SHORT;
    dmFormName: array[0..CCHFORMNAME - 1] of AnsiChar;
    dmLogPixels: Word;
    dmBitsPerPel: DWORD;
    dmPelsWidth: DWORD;
    dmPelsHeight: DWORD;
    dmDisplayFlags: DWORD;
    dmDisplayFrequency: DWORD;
    dmICMMethod: DWORD;
    dmICMIntent: DWORD;
    dmMediaType: DWORD;
    dmDitherType: DWORD;
    dmICCManufacturer: DWORD;
    dmICCModel: DWORD;
    dmPanningWidth: DWORD;
    dmPanningHeight: DWORD;
  end;
Die Struktur ist sogar gleich gross wie die TDevModeA (bzw. DEVMODEA) und ist somit kompatibel. Die Definition hätte man bestimmt auch anders hinbekommen, aber das war mir erstmal egal.

4. Deaktiviern eines Monitors funktioniert über das setzen des Monitors per DM_POSITION in Flags und setzen von dmPosition auf 0,0. Dieses funktioniert nur bei nicht primären Monitore! Primäre Monitor kann man nicht deaktivieren, da deren dmPosition immer bei 0,0 liegen. Um einen primären Monitor zu deaktivieren müsste man einen aktiven secondären Monitor auf dmPosition (0,0) setzen und (CDS_PRIMARY Or CDS_UPDATEREGISTRY) damit dieser Primär wird - danach kann man den nun neuen sekundären (bis zuvor noch primären) Monitor deaktivieren.

5. Ohne Angabe von CDS_UPDATEREGISTRY kann man keine Änderungen am MultiMon-System vornehmen - man muss es immer dauerhaft speichern - dynamische Änderungen sind dabei nicht zulässig.

6. Meine Routine um einen deaktivierten sekundären Monitor zu aktivieren:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
Var
  lDevMode : TDevModeA_new;
  lRes : Cardinal;
begin
    FillChar(lDevMode, SizeOf(lDevMode), 0);

    lDevMode.dmSize := SizeOf(lDevMode);
    lDevMode.dmBitsPerPel := 32;
    lDevMode.dmDisplayFrequency := 85; // alles hard kodiert für meinen 2. Monitor
    lDevMode.dmPelsWidth := 1280;
    lDevMode.dmPelsHeight := 1024;
    lDevMode.Dual.Monitor.dmPosition.x := 1280; // die Weite/Auflösung des primären Monitors bzw. Lage des Monitors in Relation zum primären Monitor mit 0,0 oben links
    lDevMode.Dual.Monitor.dmPosition.y := 0;
    lDevMode.dmFields := DM_BITSPERPEL Or
                                          DM_DISPLAYFREQUENCY Or
                                          DM_PELSWIDTH Or
                                          DM_PELSHEIGHT Or
                                          DM_POSITION;

    lRes := ChangeDisplaySettingsEx( PChar('\\.\DISPLAY2'),
                             TDevMode(lDevMode),
                             0,
                             CDS_UPDATEREGISTRY,
                             0);

    If lres <> 0 Then
      ShowMessage('hat nicht geklappt');
end;
HTH

MfG
Muetze1
  Mit Zitat antworten Zitat
Rumpi

Registriert seit: 26. Aug 2003
Ort: Berlin
72 Beiträge
 
#10

Re: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?

  Alt 9. Feb 2005, 09:47
Hallo Muetze,

vielen Dank, das es bei dir funktioniert finde ich super!

Ich hatte mir auch einen neuen TDeviceModeEx Type generiert.
Das verändern der Position ect. eines primären oder aktiven sekundären Monitors geht ja auch.
Aber bei meiner ATI Fire GL kann ich selbst mit deinem Sourcecode
in dem ich nur die
lDevMode.Dual.Monitor.dmPosition.x := 1280; auf
lDevMode.Dual.Monitor.dmPosition.x := 1600; verändert habe, da Monitor 1 bei mir 1600x1200 hat, den 2. Monitor
Delphi-Quellcode:
ChangeDisplaySettingsEx( PChar('\\.\DISPLAY2'),
                             TDevMode(lDevMode),
                             0,
                             CDS_UPDATEREGISTRY,
                             0);
nicht aktivieren.

Es sieht so aus als ob das Problem bei meinem Grafik Treiber liegt?

Gruss Rumpi
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 10:07 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