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.826 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
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
Benutzerbild von himitsu
himitsu

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

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
 
#4

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.826 Beiträge
 
Delphi 12 Athens
 
#5

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.826 Beiträge
 
Delphi 12 Athens
 
#6

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
Benutzerbild von blawen
blawen

Registriert seit: 30. Nov 2003
Ort: Luterbach (CH)
730 Beiträge
 
Delphi 13 Florence
 
#7

AW: Monitor einschalten

  Alt 14. Okt 2025, 16:18
Manuell funktioniert es ja weiterhin, also Touch, Tastatur und Maus,
aber es muß doch auch möglich sein, das via Software zu erledigen.
Und wenn Du den Mausklick, bzw. deren Bewegung einfach softwareseitig simulierst?

Delphi-Quellcode:
procedure WakeUpMonitor;
var
  Input: TInput;
begin
  // Maus minimal bewegen, um Aktivität zu simulieren
  ZeroMemory(@Input, SizeOf(Input));
  Input.Itype := INPUT_MOUSE;
  Input.mi.dx := 0;
  Input.mi.dy := 1;
  Input.mi.dwFlags := MOUSEEVENTF_MOVE;
  SendInput(1, Input, SizeOf(Input));

  // Wieder zurückbewegen, damit Cursorposition gleich bleibt
  ZeroMemory(@Input, SizeOf(Input));
  Input.Itype := INPUT_MOUSE;
  Input.mi.dx := 0;
  Input.mi.dy := -1;
  Input.mi.dwFlags := MOUSEEVENTF_MOVE;
  SendInput(1, Input, SizeOf(Input));
end;
Roland
  Mit Zitat antworten Zitat
Kas Ob.

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

AW: Monitor einschalten

  Alt 15. Okt 2025, 07:59
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.
Here the English translation, and i am really sorry, all what i want is try to help,

Zitat:
We support several devices
Devices means drivers, drivers means power management is involved, BUT from what i understand now the code is running and detecting signal from RFID (device) and execute fine, only the turning the monitor part is the failing part, right ?

Zitat:
To ensure its service life and save energy, Windows temporarily switches off the monitor.
This is the most important part, and yet it is not clear for me, Windows did turn the monitor OFF ? How ?
By power saving settings ? or by your code ? how did it figure it out that the monitor need to go off ? that what you should follow.

Zitat:
* Monitor active
* Screen saver (which is almost always deactivated)
* Monitor in standby (black image with active backlight)
* Monitor off, deactivated via Windows (here it is actually in standby, i.e. screen off, but it is waiting)
* Monitor completely off (manually switched off and does not respond to Windows)
Fantastic, now, when monitor in StandBy and/or monitor is off, is the display adapter (video card) is off too ? or in power saving regime?

I really believe it is ACPI and power management settings, most likely combined with different or updated drivers by Windows 11, see my Windows 10 sometimes reverts nVidia geforce driver to WHQL from Microsoft instead of sticking to the newer i downloaded from nVidia which is also WHQL, this happen when power is shut suddelnly and on next rerstart Windows decide to go back to older driver, same happen to my Android ADB drivers, keep returning to older ones.

ps : again, i suggest to check and log what devices are off every minute, this might reveal the real culprit, as i said when code request monitor to be turned on Windows might has different opinion about its state, or simply it can't because the code is asking different request from it should, so it might not fulfill this request as lets say the display card is off or even some other device controller is the one is off.
Kas
  Mit Zitat antworten Zitat
Kas Ob.

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

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
 
#10

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
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 14:17 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