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