Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Monitor 2 Ansteuern? (https://www.delphipraxis.net/44410-monitor-2-ansteuern.html)

Bernd29bln 19. Apr 2005 08:10


Monitor 2 Ansteuern?
 
Hallo ,

Ich habe eine Redion 9800 se Grafik Karte. Ich möchte nun den 2 Monitor ansteuern mit folgendem code.

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


end.
Es funtioniert aber nur über den S-Video ausgang. Ich hätte es aber gerne das er es über den DVI ausgang macht. :gruebel:

MfG

Muetze1 19. Apr 2005 08:17

Re: Monitor 2 Ansteuern?
 
Moin!

Vielleicht hilft dir folgendes aus der Suche: Monitor X per ChangeDisplaySettingsEx (A) akivieren ?

MfG
Muetze1

Bernd29bln 19. Apr 2005 08:51

Re: Monitor 2 Ansteuern?
 
Hallo,

Danke für deine n Link, aber der code der die info über die grafik karte geben soll geht net.

MfG

Muetze1 19. Apr 2005 08:53

Re: Monitor 2 Ansteuern?
 
Moin!

Zitat:

Zitat von Bernd29bln
Hallo,

Danke für deine n Link, aber der code der die info über die grafik karte geben soll geht net.

MfG

Tut mir leid, aber meine Glaskugel ist zur Eichung, daher: Was geht nicht? Nicht compilierbar? Nicht ausfürhbar? Absturz? Einfach keine Informationen? Falsche Informationen?

MfG
Muetze1

Bernd29bln 19. Apr 2005 08:55

Re: Monitor 2 Ansteuern?
 
Hi Mueztze1,

ne meine Listbox bleibt leer .

MfG

Muetze1 19. Apr 2005 09:19

Re: Monitor 2 Ansteuern?
 
Moin!

Schonmal debuggt? Die einzige Möglichkeit wäre ja, wenn "EnumDisplayDevices(Nil, Cntr, Info, 0)" der While Schleife fehlschlägt. Wenn dem so ist, was sagt er dir, wenn du danach einfach mal folgendes hizufügt?
Delphi-Quellcode:
ShowMessage(SysErrorMessage(GetLastError));
?

MfG
Muetze1

Bernd29bln 19. Apr 2005 09:43

Re: Monitor 2 Ansteuern?
 
Hi,

Da sagt er auch nix. ich hoffe doch ich hab nix vergessen. :gruebel:
also, es kommt keine fehler meldung. aber die listbox bleibt leer.
MfG

Muetze1 19. Apr 2005 10:15

Re: Monitor 2 Ansteuern?
 
Moin!

Da sagt er auch nix, kann nicht sein. Selbst wenn kein Fehler aufgetreten ist, sagt er dies "Es ist kein Fehler aufgetreten". Somit schau bitte nochmal nach. Schonmal durchdebuggt? Kommt er überhaupt in die Procedure rein?

MfG
Muetze1

Bernd29bln 19. Apr 2005 10:23

Re: Monitor 2 Ansteuern?
 
Hallo,

er ruft die procedure nicht auf, wieso nicht?

Delphi-Quellcode:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    lbMonitorList: TListBox;
    procedure Button1Click(Sender: TObject);
    Procedure FillMonitorList;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
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;
//***************************************************************************************************
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;
//***************************************************************************************************
Procedure TForm1.FillMonitorList;
Var
  Cntr       : Cardinal;
  Info       : TDisplayDevice;
  AdapterName : PChar;
  OldPos     : Integer;
Const
  DISPLAY_DEVICE_ATTACHED_TO_DESKTOP = $00000001;
  DISPLAY_DEVICE_MULTI_DRIVER       = $00000002;
  DISPLAY_DEVICE_PRIMARY_DEVICE     = $00000004;
  DISPLAY_DEVICE_MIRRORING_DRIVER   = $00000008;
  DISPLAY_DEVICE_VGA                = $00000010;
Begin
  lbMonitorList.Items.Add('------------------ Displays ----------------');

  Cntr := 0;
  Info.cb := SizeOf(Info);
  While EnumDisplayDevices(Nil, Cntr, Info, 0) Do
  Begin
    lbMonitorList.Items.Add('* Device '+IntToStr(Cntr)+':');
    lbMonitorList.Items.Add('   DeviceName : '+Info.DeviceName);
    lbMonitorList.Items.Add('   DeviceString: '+Info.DeviceString);

    OldPos := lbMonitorList.Items.Add('   StateFlags:  ');

    If ( Info.StateFlags And DISPLAY_DEVICE_ATTACHED_TO_DESKTOP ) = DISPLAY_DEVICE_ATTACHED_TO_DESKTOP Then
      lbMonitorList.Items.Add('     + Display Device Attached To Desktop')
    Else
      lbMonitorList.Items.Add('     - Display Device Attached To Desktop');

    If ( Info.StateFlags And DISPLAY_DEVICE_MULTI_DRIVER ) = DISPLAY_DEVICE_MULTI_DRIVER Then
      lbMonitorList.Items.Add('     + Display Device Multi Driver')
    Else
      lbMonitorList.Items.Add('     - Display Device Multi Driver');

    If ( Info.StateFlags And DISPLAY_DEVICE_PRIMARY_DEVICE ) = DISPLAY_DEVICE_PRIMARY_DEVICE Then
      lbMonitorList.Items.Add('     + Display Device Primary Device')
    Else
      lbMonitorList.Items.Add('     - Display Device Primary Device');

    If ( Info.StateFlags And DISPLAY_DEVICE_MIRRORING_DRIVER ) = DISPLAY_DEVICE_MIRRORING_DRIVER Then
      lbMonitorList.Items.Add('     + Display Device Mirroring Driver')
    Else
      lbMonitorList.Items.Add('     - Display Device Mirroring Driver');

    If ( Info.StateFlags And DISPLAY_DEVICE_VGA ) = DISPLAY_DEVICE_VGA Then
      lbMonitorList.Items.Add('     + Display Device VGA')
    Else
      lbMonitorList.Items.Add('     - Display Device VGA');


    AdapterName := StrAlloc(SizeOf(Info.DeviceName));
    StrCopy(AdapterName, Info.DeviceName);
    EnumDisplayDevices(AdapterName, 0, Info, 0);
    ShowMessage(SysErrorMessage(GetLastError));
    lbMonitorList.Items.Insert(OldPos, '   Monitorname : ' + Info.DeviceString);
    StrDispose(AdapterName);

    Inc(Cntr);
  End;
End;


end.
MfG

Muetze1 19. Apr 2005 10:53

Re: Monitor 2 Ansteuern?
 
Moin!

Ähm :wall: , ja, ok.... wie soll's sagen....

Wenn du die Procedure auch nicht aufrufst...
Woher sollte er denn Wissen wieso und wann er diese Procedure denn aufrufen sollte? Wie wär's denn mit einem neuen Button und in dessen OnClick einfach mal FillMonitorList; aufzurufen? Nur mal so als Vorschlag... :cheers:

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 Uhr.
Seite 1 von 2  1 2      

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