Einzelnen Beitrag anzeigen

idontknow

Registriert seit: 21. Apr 2008
Ort: Schleswig-Holstein
60 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Windows-Energieoptionen: Monitor aus -> OpenGL friert ein

  Alt 27. Apr 2022, 14:04
Hallo TiGü, danke für die Info.

Auf dem Acer ist ein uralter intel-Treiber 20.19.15.4352. Was neueres lässt sich da anscheinend nicht installieren. Der intel-Installer beschwert sich dann mit "...Treiber, der an die Spezifikationen des Herstellers gebunden ist. Versuchen Sie... neuesten Treiber von der Herstellerseite... bla". Witzig.

Auf dem Rechner mit i7-10700K ist 27.20.100.8681, damit geht es.

Habe mittlerweile einen Workaround gefunden, scheint zumindest unter Idealbedingungen (sprich: Bei mir auf dem Schreibtisch, nicht beim Kunden) zu funktionieren.

Delphi-Quellcode:
...
procedure PowerMessageHandler(var MyMessage: TMessage); message WM_POWERBROADCAST;
...

procedure TDisplayPower.PowerMessageHandler(var MyMessage: TMessage);
var
  PowerBroadcastSetting: PPowerBroadcastSetting;
  fOldDisplayState: Integer;
begin
  // Beim Abschalten und Einschalten des Monitors landen wir hier!
  // Wir werden über Änderungen des Energieverbrauchs benachrichtigt (ab Vista), wenn
  // wir uns für den Empfang registrieren: RegisterPowerSettingNotification(Self.Handle, GUID_CONSOLE_DISPLAY_STATE, 0);
  fOldDisplayState := fDisplayState;
  if (MyMessage.WParam = PBT_POWERSETTINGCHANGE) then
  begin
    PowerBroadcastSetting := PPowerBroadcastSetting(MyMessage.LParam);
    if PowerBroadcastSetting^.PowerSetting = GUID_CONSOLE_DISPLAY_STATE then
    begin
      if (PowerBroadcastSetting^.DataLength > 0) then
      begin
        case PowerBroadcastSetting^.Data[0] of
          0: fDisplayState := 0; // Memo1.Lines.Add(timetostr(Now) + ' Console-Display aus');
          1: fDisplayState := 1; // Memo1.Lines.Add(timetostr(Now) + ' Console-Display an');
          2: fDisplayState := 2; // Memo1.Lines.Add(timetostr(Now) + ' Console-Display an (gedimmt)');
        end;
      end;
    end;

    if fOldDisplayState <> fDisplayState then
      if Assigned(fonNotify) then
        fonNotify(Self, fDisplayState, fPreviousDisplayState);

    fPreviousDisplayState := fDisplayState;
  end;
informiert über "Monitor eingeschaltet", dann wird am Fenster gewackelt


Delphi-Quellcode:
procedure TForm1.DisplayPowerNotify(Sender: TObject; State: Integer; PreviousState: Integer);
begin
  Info('DisplayPowerNotify: ' + State.ToString);

  if (PreviousState=0) and (State=1) then // Display wird wach.
    WakeUpGL();
end;

procedure TForm1.WakeUpGL;
var
  ws: TWindowState;
begin
  ws := Form1.WindowState;
  if (ws = TWindowState.wsMaximized) then
    Form1.WindowState := TWindowState.wsNormal;

  Left := Left+1;
  Left := Left-1;

  if (ws = TWindowState.wsMaximized) then
    Form1.WindowState := TWindowState.wsMaximized;
end;
und dann läuft die OpenGL-Darstellung sofort weiter...

Prmpff... Das kann es doch eigentlich nicht sein...
Oliver
  Mit Zitat antworten Zitat