Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Bemerken/Abfangen wenn der Monitor an geht (https://www.delphipraxis.net/155459-bemerken-abfangen-wenn-der-monitor-geht.html)

F.W. 24. Okt 2010 22:20

Bemerken/Abfangen wenn der Monitor an geht
 
Ich habe hier einen Laptop bei dem der Taster kaputt ist, der Windows wissen lässt, ob der Laptopdeckel zugeklappt ist oder offen.
Das ganze äußert sich wie folgt: Der Bildschirm geht beim Zuklappen kurz aus, jedoch wenn der Deckel ganz geschlossen ist wieder an ^^ Wenn der Laptop so eingestellt ist, dass er beim Zuklappen runter-, in den Ruhezustand oder Standby fahren soll ist das ja kein Problem, da reicht der kurze Kontakt. Wenn das Notebook aber längere Zeit mit zugeklapptem Deckel angeschaltet stehen bleiben muss (z.B. Runterladen von großen Datenmengen), wäre es schön, wenn der Monitor nicht die ganze Zeit an wäre.

Da habe ich mir gedacht, ich schreibe ein kleines Programm, was man starten kann, bevor man den Laptop zuklappt, welches dafür sorgt, dass der Monitor ausbleibt oder nachdem er angegangen ist nach ein paar Sekunden wieder ausgeht, bis eine Taste gedrückt wird oder so.

Monitor an- und abschalten ist kein Problem, sowas habe ich früher schonmal gemacht (mit SendMessage, WM_SYSCOMMAND und SC_MONITORPOWER).

:arrow: Die Frage ist jetzt, wie bekomme ich mit, wenn der Monitor wieder angeht :?:

Meine Überlegung bisher: Wenn man den Bildschirm per SendMessage ausmachen kann, müsste man doch eine solche Message auch abfangen können oder? Jedoch hat mir das Abfangen von ein WM_SYSCOMMAND in der Formularmessageloop nichts gebracht, gleiches gilt für das Application.OnMessage Ereignis.
Eventuell würde es mit einem globalen Hook gehen? Obwohl ich keine soo große Lust hätte dafür extra einen globalen Hook zu schreiben, das muss doch auch einfacher gehen?

Über Tipps und Vorschläge wäre ich dankbar!

BUG 24. Okt 2010 23:05

AW: Bemerken/Abfangen wenn der Monitor an geht
 
Wie findest du die Idee, einfach eine Energiespareinstellung zu erstellen, die den Bildschirm nach einer Minute abstellt und die du aktivierst, wenn du den PC stehen lassen willst.

Würde auf jeden Fall weniger Mühe machen.

F.W. 24. Okt 2010 23:33

AW: Bemerken/Abfangen wenn der Monitor an geht
 
Danke für die schnelle Antwort!

Ok, das ist natürlich keine schlechte Idee, die (obwohl ich kein Freund von den Energiesparplänen bin) wohl das einfachste ist :-)

Aber nachdem mir die Frage schonmal in den Sinn gekommen ist, wäre ich trotzdem noch an einer Lösung für das Monitor-Monitoring interessiert.

PS: Falls es Unterschiede zw. XP, Vista und Win7 gibt: Auf dem Laptop läuft übrigens Win7.

Björn Ole 25. Okt 2010 00:46

AW: Bemerken/Abfangen wenn der Monitor an geht
 
Nabend.
Funktioniert ab Vista, Stichwort: MSDN-Library durchsuchenRegisterPowerSettingNotification
Delphi-Quellcode:
TForm1 = class(TForm)
  private
    FPowerSetting: THandle;
  protected
    procedure WmPowerBrotkasten(var Msg: TMessage); message WM_POWERBROADCAST;
  end;

function RegisterPowerSettingNotification(hRecipient: THandle; PowerSettingGuid: PGUID;
  Flags: DWORD): THandle; stdcall; external 'user32.dll';
function UnregisterPowerSettingNotification(Handle: THandle): BOOL; stdcall; external 'user32.dll';

{...}

// Start monitoring
const
  GUID_MONITOR_POWER_ON: TGUID = '{02731015-4510-4526-99e6-e5a17ebd1aea}';
begin
  FPowerSetting := RegisterPowerSettingNotification(Handle, @GUID_MONITOR_POWER_ON, DEVICE_NOTIFY_WINDOW_HANDLE);
end;

// End monitoring
begin
  UnregisterPowerSettingNotification(FPowerSetting);
end;

// Receive notifications
procedure TForm1.WmPowerBrotkasten(var Msg: TMessage);
var
  pbSetting: POWERBROADCAST_SETTING;
begin
  pbSetting := PPOWERBROADCAST_SETTING(Msg.LParam)^;
  if pbSetting.Data[0] = 0 then
    // Monitor turned off
  else if pbSetting.Data[0] = 1 then
    // Monitor turned on
end;

hathor 25. Okt 2010 07:17

AW: Bemerken/Abfangen wenn der Monitor an geht
 
Zitat:

Zitat von F.W. (Beitrag 1057609)
...Ok, das ist natürlich keine schlechte Idee, die (obwohl ich kein Freund von den Energiesparplänen bin) wohl das einfachste ist :-)...

Du brauchst mal Prügel, oder???:lol::lol::lol:

F.W. 25. Okt 2010 20:38

AW: Bemerken/Abfangen wenn der Monitor an geht
 
@Björn Ole:
Danke für den Code! Klappt wunderbar!

@hathor:
Ok, ist schon ne geile Sache im Vergleich zu XP. Wahrscheinlich mag ich sie nur nicht so, weil man zu viel einstellen kann ;-)

himitsu 25. Okt 2010 21:43

AW: Bemerken/Abfangen wenn der Monitor an geht
 
klar ist das Programmieren cooler, aber auf die Idee den Schalter zu reparieren ist noch keiner gekommen :stupid:

F.W. 27. Okt 2010 19:35

AW: Bemerken/Abfangen wenn der Monitor an geht
 
Liste der Anhänge anzeigen (Anzahl: 2)
@himitsu:
Natürlich ist programmieren cooler ;-)
Nein mal im Ernst, ich glaube nicht dass man das reparieren kann, entweder ist es ein Wackelkontakt am Schalter oder es liegt daran, dass das Display mit der Zeit etwas Spielraum im Scharnier bekommen hat und beim Zuklappen verrutscht.

Ich habe das Programm inzwischen fertig und möchte es hier gern zur Verfügung stellen (als Alternative zum Energiesparplan sozusagen). Allerdings habe ich mich kurzer Hand dazu entschlossen es in VB.NET umzusetzen. Eventuell müsste der Thread in in die .NET Sprachen Sparte verschoben werden?

Als Anhang einmal der Quellcode, in dem auch oben gezeigter Code in VB.NET umgesetzt ist und einmal das fertige Programm selbst. (es speichert die Fensterposition in AppData, per Rechtsklick auf das Monitorsymbol kann man seinen Computern von diesen Spurend es Programms säubern!)

Nochmal vielen Dank an Björn Ole!


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz