Wyłączanie jednego z dwóch monitorów

0

Witam
Do wyłączania monitora używam

SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 2);

Niestety jak się można spodziewać podany przykład wyłącza oba podłączone monitory.
Aby wyłączyć jeden monitor próbowałem

SendMessage(Screen.Monitors[0].Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 2);

Lecz taki sposób nie wyłącza już nic.

Może ktoś z forumowiczów pomoże?

1

W ten sposób (mam wątpliwości czy w jakikolwiek sposób się da) nie możesz wybrać, który wyłączasz. Btw to nie jest włączenie monitora tylko uśpienie dokładnie takie jak w zarządzaniu energią

3

Jak chcesz konkretny to poniższy przykład pokazuje jak wyłączyć a po 5 sekundach włączyć wybrany monitor.
Przykład pochodzi z https://stackoverflow.com/questions/59066291/c-sharp-how-to-turn-off-specific-monitor tylko go skróciłem do potrzeby obsługi konkretnego monitora i przetłumaczyłem na Delphi.

var
  Form2: TForm2;

  const DXVA2_DLL_NAME = 'Dxva2.dll';


  const POWER_MODE: Byte = $D6;
  const POWER_ON: DWORD = $01;
  const POWER_OFF: DWORD = $04;


type
   TPsychicalMonitor = record
      hPhysicalMonitor: HMONITOR;
      szPhysicalMonitorDescription: array [0..127] of WideChar;
   end;
   PPsychicalMonitor = ^TPsychicalMonitor;

   function GetPhysicalMonitorsFromHMONITOR(HMONITOR: HMONITOR;
     dwPhysicalMonitorArraySize: DWORD; pPhysicalMonitorArray: PPsychicalMonitor): Boolean;
     stdcall; external DXVA2_DLL_NAME name 'GetPhysicalMonitorsFromHMONITOR';

   function SetVCPFeature(hMonitor: HMONITOR; bVCPCode: Byte; dwNewValue: DWORD): Boolean;
     stdcall; external DXVA2_DLL_NAME name 'SetVCPFeature';

implementation

{$R *.dfm}

procedure TForm2.TestMonitorOnOffClick(Sender: TObject);
var
  hCurrentMonitor: HMONITOR;
  PsychMonitor: array [0..0] of TPsychicalMonitor; //tylko 1 monitor
begin
  hCurrentMonitor:=  Screen.Monitors[0].Handle; //który monitor
  try
    if GetPhysicalMonitorsFromHMONITOR(hCurrentMonitor, Length(PsychMonitor), @PsychMonitor[0]) then //pobierz fizyczny uchwyt (i opis) monitora
    begin
      Application.MessageBox(PChar('Monitor: ' + PChar(@PsychMonitor[0].szPhysicalMonitorDescription[0])), PChar(Application.Title),MB_ICONINFORMATION); //wyświetl info
      if SetVCPFeature(PsychMonitor[0].hPhysicalMonitor, POWER_MODE, POWER_OFF) then //wywołaj funkcję Virtual Control Panel 2 parametr przekazany jako stała POWER_MODE, bo chodzi o zasilanie, 3 za wyłączenie
      begin
        Sleep(5000); // poczekaj 5 sek.
        if not SetVCPFeature(PsychMonitor[0].hPhysicalMonitor, POWER_MODE, POWER_ON) then //jak wyżej tylko włączenie
          RaiseLastOSError; //ewentualny błąd przekaż do obsługi wyjątków
      end
      else
        RaiseLastOSError; //ewentualny błąd przekaż do obsługi wyjątków
    end
    else
      RaiseLastOSError; //ewentualny błąd przekaż do obsługi wyjątków
  except
    on E: Exception do
      Application.MessageBox(PChar(E.Message), PChar(Application.Title), MB_ICONERROR); //pokaż komunikat ewentualnego błędu
  end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1