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
Antwort Antwort
Seite 1 von 2  1 2      
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
EKON 29
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
754 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Monitor einschalten

  Alt 14. Okt 2025, 11:13
Hey, wenn man eine physikalische Maus anschließt geht es? Virtuelle hast du ja probiert. Die Frage ist, ob bei einer virtuellen nicht das "Signal" einfach zu weit oben rauskommt.
Diese NFC Reader die ihre Daten als Tastatur eingaben senden, da tut sich was?
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
489 Beiträge
 
#3

AW: Monitor einschalten

  Alt 14. Okt 2025, 11:18
First and most important before diving into SetThreadExecutionState and SC_MONITORPOWER, as both are harsh and brute-force like, i suggest to check if the RFID reader on COM has the ability to turn the OS on,

See, i don't think Windows would break functionality like this, but it might easily change the default parameters, and i think it is somewhere between ACPI and how Windows configuring power management, example, many drivers for such devices like bar code scanners, fingerprint readers or card readers... comes with installer that change power settings for that driver, and when you installed the driver manually or by scanning instead of running the installer/setup you skipped some needed extra essential setting.

So first check if your RFID device power setting by running
Code:
powercfg -devicequery wake_from_any
The result should show many devices and almost all USB devices, and that for simple thing pressing a key on the keyboard or moving the mouse will turn the OS and the monitor from sleeping or hibernating even..

start there and compare the power setting for that device, after that you can have better and clearer picture.

ps: "powercfg /energy" can trace power request for 60 seconds, in general "powercfg" has many features to debug and solve power issues, so i highly suggest to start there before start changing or forcing behavior from an application instead of letting Windows manage its power.
Kas
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
489 Beiträge
 
#4

AW: Monitor einschalten

  Alt 14. Okt 2025, 11:27
Thinking more on this, is the RFID device is still on or switched off when the monitor turned off ?

I know this API GetDevicePowerState https://learn.microsoft.com/en-us/wi...vicepowerstate will return the state of the device, also there is WMI classes for plugnplay but i can't recall which one, so trace this too, in short find out if the RFID reader is configure to power saving or not.
Kas
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
489 Beiträge
 
#5

AW: Monitor einschalten

  Alt 14. Okt 2025, 11:29
Rereading the question again, , i don't know anything about your BDE and how it should work, so it might be waste of time, i mean what i wrote above, but how knows it might help.
Kas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Monitor einschalten

  Alt 14. Okt 2025, 12:48
Hey, wenn man eine physikalische Maus anschließt geht es?
Touch,
sowie Maus und Tastatur schalten den Bildschirm ein (auch wenn standardmäßig Diese eben nicht an diesem PC hängen ... TouchMonitor mit MiniPC, bzw. ThinkCentre aktuell)

Es soll halt auch passieren, wenn RFID gescannt wurde (oder was auch immer), also via Software.

Diese NFC Reader die ihre Daten als Tastatur eingaben senden, da tut sich was?
Genau das soll eben nicht, weil dann die Eingaben sonstwo landen und nicht "immer" dort, wo sie hin sollen.
Vor allem, wenn der Bildschirm aus ist, sieht ja niemand wo der Fokus grade steht. (abgesehn davon, dass eh niemand darauf achtet, selbst wenn er es sehn würde)

Der Code ist halt gewachsen und immer, wenn es etwas zum Ausprobieren gab, wurde es dort reingeschmissen.
(bzw. früher waren mehrere Varianten, an verschiedenen Stellen, und ich hatte das mal in eine gemeinsame Funktion reingeworden)

So first check if your RFID device power setting by running
Wie gesagt, das RFID-Gerät selbst macht hier nichts.
Es stößt eine Funktion im Programm an (der Nutzer wird eingeloggt), worauf hin dieses sichtbar sein soll, weswegen der Monitor angehn müsste, wenn er aus ist.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (14. Okt 2025 um 13:01 Uhr)
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
489 Beiträge
 
#7

AW: Monitor einschalten

  Alt 14. Okt 2025, 13:58
We might be talking about different things, lost in translation or something.
So first check if your RFID device power setting by running
Wie gesagt, das RFID-Gerät selbst macht hier nichts.
Es stößt eine Funktion im Programm an (der Nutzer wird eingeloggt), worauf hin dieses sichtbar sein soll, weswegen der Monitor angehn müsste, wenn er aus ist.
The RFID will trigger a function, right !, but how without involving a driver that managed by OS ACPI !?

See, if Windows deemed the monitor is off then you only can request to turn it on, but you can't force it.

If you are going to manually turn (and manage) the monitor on and off then you can, and you should disable all power managing feature in the OS and drivers controlling and managing the monitor, OS and RFID (what ever it is this RFID)

Hope that clear things.
Kas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Monitor einschalten

  Alt 14. Okt 2025, 14:29
Es wird ein spezieller RFID-Reader genutzt, welcher direkt mit unserem Programm kommuniziert.
Es könnte prinzipiell auch ein Fingerabdruckscanner sein.
Es sind aber keine Geräte, welche mit Windows reden, über eine Autehtifizierungs-API, wie z.B. für Login via FaceID, RFID/NFC oder Fingerprint.

Es muß nicht zwangsläufig ein COM-Port sein.
Wir unterstützen mehrere Geräte, welche via COM-Port, Ethernet oder einen propitärem USB-Protokoll (via DLL) mit unserer Software reden.
Außerdem geht über COM/USB nicht nur die Info über einen angelegten RFID-Chip, sondern auch regelmäßig Statusinformationen von und zum Gerät.
(z.B. die Geräte von Datafax besitzen ein Display und konfigurierbare Buttons, welche vom Programm gestuert werden, ohne dass dabei der PC-Monitor aktiv sein muß)

Im Grunde läuft permanent ein Programm (24x7),
für Lebensdauer und Energieersparnis schaltet Windows vorübergehend den Monitor ab
und, wenn das Programm etwas mitteilen will, bzw. eine Eingabe erwartet, dann wird der Monitor aktiviert (sollte jedenfalls).


Es ist möglich, das Ausschalten zu verhinden, dann geht er aber nie aus, wie es z.B. Mediaplayer oft machen.
Und früher war es auch möglich den Monitor zu aktivieren, wenn er aus war, aber dieses funktioniert eben nicht mehr.

Manuell funktioniert es ja weiterhin, also Touch, Tastatur und Maus,
aber es muß doch auch möglich sein, das via Software zu erledigen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Monitor einschalten

  Alt 14. Okt 2025, 14:36
Im Prinzip gibt es vier/fünf Zustände
* Monitor aktiv
* Bildschirmschoner (der ist fast immer deaktiviert)
* Monitor im Standby (schwarzes Bild mit aktivem Backlight)
* Monitor aus, über Windows deaktiviert (hier ist er eigentlich im Standby, also Bildschirm aus, aber er wartet)
* Monitor ganz aus (maneull ausgeschaltet und reagiert nicht auf Windows)

Abgesehn vom letzten Zustand, kann Windows den Monitor wieder aktivieren und das möchte ich via Software erreichen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
839 Beiträge
 
#10

AW: Monitor einschalten

  Alt 14. Okt 2025, 15:11
Ich nutze für sowas immer einen freiprogrammierbaren USB-Stick mit einem geläufigen USB-Microcontroler.
Mit BT/BLE Funktionalität gibt es sowas für 10€.
z.b: google: "nrf52840 usb stick"

Via USB programmiert man simpel ein DualDevice mit CDC(serial) plus HID(keyboard) Funktionalität. Die Standard-LIBs dazu gibt es für alle möglichen Chips.

Dann einfach in der PC Software über den zusätzlichen COM-Port ein paar Zeichen in den Microcontroler schicken, der diese dann als echtes HW-Keyboard wieder an den PC ausgibt. Ist völlig unabhängig vom OS (MAC,WIN,Linux), funktioniert einfach. Wer basteln will, baut in den Stick noch einen WatchDog ein und prüft nach erstmaligem Empfang zyklisch mit TimeOut ob regelmäßig was von der PC-Software als Lebenszeichen kommt, bzw. wenn nicht dann kann per HW-Ausgang/Kontakt ein hartes HW-PC-Reset zum Neustart per Draht ausgelöst werden.

Klingt erstmal nach viel Aufwand, ist aber dann in der Praxis sehr simpel und definitiv Update/Patch fest
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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