AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Monitor einschalten

Ein Thema von himitsu · begonnen am 14. Okt 2025 · letzter Beitrag vom 15. Okt 2025
 
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.829 Beiträge
 
Delphi 12 Athens
 
#1

Monitor einschalten

  Alt 14. Okt 2025, 10:39
Wir haben hier ein BDE-Terminal, wo nach 'ner Weile der Bildschirm aus geht.
  • durch Windows : erst standby und dann ganz aus
  • hier bleibt dabei aber der Touch aktiv
  • während unser alter Testrechner (Win10) kaputt war, vorübergehend ein MS-Surface dastehn gehabt
    > wenn Monitor aus, ist auch der Touch aus (super, wenn ohne Tastatur und die Software den selbst nicht anbekommt)

Wenn ein RFID-Chip gescannt wurde, sollte die Anzeige aber von Alleine wieder angehn.
Das kommt über einen COM-Port rein und interessiert den Monitor naütlich nicht.


Im Windows 7 ging es super,
in Windows 10 funktinierte es mit der Zeit immer seltener
und im Windows 11 geht nun immer garnichts mehr.

Hab nun auch schon Mehreres versuchsweise drin (siehe unten),
aber der Monitor bleibt dennoch aus.



Überall wird SC_MONITORPOWER+MONITOR_ON vorgeschlagen.

Zuletzt nun auch SetThreadExecutionState mit drin.
Währen der Monitor an ist, bleibt er damit auch an. (weder Bildschirmschoner, noch Monitor-Standby schlagen zu)
Aber scheinbar verhindert es nur das AUS, aber AN bekommt man es damit wohl nicht, wenn schon aus.


Hat jemand noch eine Idee?
(Windows 11 Pro)


Delphi-Quellcode:
procedure TFormBDE.ActivateDisplay;
var
  B, M: BOOL;
  U: TLastInputInfo;
  P: TWindowPlacement;
  H: HWND;
  F{,C}: DWORD;
begin
  // Bildschirm an (Screensaver oder Standby)
  U.cbSize := SizeOf(U);

  TDM1.LogEvent('WM_SYSCOMMAND+SC_MONITORPOWER: ' + IntToStr(FMonitorState) + ' -> ' + BoolToStr(not ((FMonitorState = -1) or (FMonitorState = 2)), True));
  TDM1.LogEvent('GetLastInputInfo: ' + BoolToStr(GetLastInputInfo(U), True) + ' ' + IntToStr(GetTickCount - U.dwTime));

  M := // Monitor im Standby
       not ( (FMonitorState = -1{MONITOR_ON})
             or (FMonitorState = 2{MONITOR_OFF})
           )
       // seit x Stunden keine Benutzeraktion
       or ( GetLastInputInfo(U)
            and (GetTickCount - U.dwTime > 1 * MinsPerHour * MSecsPerMin)
            );
  if M then
     SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1{MONITOR_ON}); // MONITOR_ON=-1, MONITOR_STANDBY=1, MONITOR_OFF=2

  {$REGION 'Bildschirm anfordern'}
  // ES_SYSTEM_REQUIRED = CPU anfordern (kein automatisches Standby/Hibernate/Shutdown)
  // ES_DISPLAY_REQUIRED = Anzeige anfordern (kein Bildschirmschoner oder Monitor-Standby)
  if miNoStandby.Checked and FeigRFIDReader.Enabled then
    SetThreadExecutionState(ES_DISPLAY_REQUIRED or ES_SYSTEM_REQUIRED)
  else
    SetThreadExecutionState(ES_DISPLAY_REQUIRED);
  //
  Sleep(55);
  if miNoStandby.Checked and FeigRFIDReader.Enabled then // eigentlich könnte der ExecutionState auch erst beim Logout zurückgesetzt werden -> DisableAufZeitIoVisuals
    SetThreadExecutionState(ES_SYSTEM_REQUIRED)
  else
    SetThreadExecutionState(0);
  {$ENDREGION}

  TDM1.LogEvent('SystemParametersInfo ' + BoolToStr(SystemParametersInfo(SPI_GETSCREENSAVERRUNNING{16}, 0, @B, 0), True) + ' ' + BoolToStr(B, True));
  //TDM1.LogEvent('GetDevicePowerState ' + BoolToStr(GetDevicePowerState(Self.Monitor.Handle, @B), True) + ' ' + BoolToStr(B, True));
  // GetDevicePowerState : https://docs.microsoft.com/de-de/windows/desktop/api/winbase/nf-winbase-getdevicepowerstate
  // Retrieves the current power state of the specified device. >>>This function cannot be used to query the power state of a display device.<<<
  if (SystemParametersInfo(SPI_GETSCREENSAVERRUNNING{16}, 0, @B, 0) and B) // Bildschirmschoner ist aktiv -> Bildschirmschoner wieder aus, sobald MONITOR_STANDBY
     or M{(GetDevicePowerState(Self.Monitor.Handle, @B) and not B)}
  then
  begin // Monitor NICHT angeschaltet -> siehe WM_SYSCOMMAND+SC_MONITORPOWER
    TDM1.LogEvent('do Keybd_Event');
    //Mouse_Event(MOUSEEVENTF_MOVE, +1, 0, 0, 0);
    //Mouse_Event(MOUSEEVENTF_MOVE, -1, 0, 0, 0);
    Keybd_Event(VK_LCONTROL, 1, 0, 0);
    Keybd_Event(VK_LCONTROL, 1, KEYEVENTF_KEYUP, 0);
  end;

  // Fenster auf (minimiert oder im Hintergrund)
  TDM1.LogEvent('IsIconic(Application) ' + BoolToStr(IsIconic(Application.Handle), True));

  if IsIconic(Application.Handle) then
    Application.Restore;

  TDM1.LogEvent('IsIconic(MainForm) ' + BoolToStr(IsIconic(Application.MainForm.Handle), True));

  if {Application.MainForm.WindowState = wsMinimized} IsIconic(Application.MainForm.Handle) then
  begin
    TDM1.LogEvent('do Application.MainForm.Restore');

    P.length := SizeOf(P);

    TDM1.LogEvent('GetWindowPlacement ' + BoolToStr(GetWindowPlacement(Application.MainForm.Handle, @P), True));

    if GetWindowPlacement(Application.MainForm.Handle, @P) then
    begin
      P.showCmd := SW_RESTORE;
      if P.flags and WPF_RESTORETOMAXIMIZED <> 0 then
        P.showCmd := SW_MAXIMIZE;
      SetWindowPlacement(Application.MainForm.Handle, @P);
    end
    else
      SendMessage(Application.MainForm.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
  end;

  TDM1.LogEvent('IsIconic(Self) ' + BoolToStr(IsIconic(Self.Handle), True));

  if {Self.WindowState = wsMinimized} IsIconic(Self.Handle) then
  begin
    TDM1.LogEvent('do Self.Restore');

    P.length := SizeOf(P);

    TDM1.LogEvent('GetWindowPlacement ' + BoolToStr(GetWindowPlacement(Self.Handle, @P), True));

    if GetWindowPlacement(Self.Handle, @P) then
    begin
      P.showCmd := SW_RESTORE;
      if P.flags and WPF_RESTORETOMAXIMIZED <> 0 then
         P.showCmd := SW_MAXIMIZE;
      SetWindowPlacement(Self.Handle, @P);
    end
    else
      SendMessage(Self.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
  end;

  // BDE aktiv (hat keinen Fokus)
  Application.BringToFront;
  Self.BringToFront;

  H := Self.Handle;

  if Self.FormStyle = fsMDIChild then
    H := Application.MainForm.Handle;

  TDM1.LogEvent('GetForegroundWindow ' + BoolToStr(GetForegroundWindow <> H, True));

  if GetForegroundWindow <> H then
  begin
    TDM1.LogEvent('do SetForegroundWindow');
    //C := GetWindowThreadProcessId(H, nil);
    F := GetWindowThreadProcessId(GetForegroundWindow, nil);
    TDM1.LogEvent('GetForegroundWindow ' + BoolToStr({C}GetCurrentProcessId <> F, True));
    if {C}GetCurrentProcessId <> F then
    begin
      AttachThreadInput(F, {C}GetCurrentProcessId, True);
      B := SetForegroundWindow(H);
      AttachThreadInput(F, {C}GetCurrentProcessId, False);
      TDM1.LogEvent('SetForegroundWindow ' + BoolToStr(B, True));
      if B then
        SetForegroundWindow(H);
    end
    else
      SetForegroundWindow(H);
  end;
end;

https://www.delphipraxis.net/140455-...nschalten.html
https://www.delphipraxis.net/111272-...ehle-mehr.html
https://www.delphipraxis.net/103659-...sschalten.html
https://www.delphipraxis.net/93050-s...uschalten.html
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
 


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 22:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz