AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Bemerken/Abfangen wenn der Monitor an geht
Thema durchsuchen
Ansicht
Themen-Optionen

Bemerken/Abfangen wenn der Monitor an geht

Ein Thema von F.W. · begonnen am 24. Okt 2010 · letzter Beitrag vom 27. Okt 2010
Antwort Antwort
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#1

Bemerken/Abfangen wenn der Monitor an geht

  Alt 24. Okt 2010, 23:20
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).

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!
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

AW: Bemerken/Abfangen wenn der Monitor an geht

  Alt 25. Okt 2010, 00:05
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.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#3

AW: Bemerken/Abfangen wenn der Monitor an geht

  Alt 25. Okt 2010, 00:33
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.
  Mit Zitat antworten Zitat
Benutzerbild von Björn Ole
Björn Ole

Registriert seit: 11. Jul 2008
166 Beiträge
 
Delphi XE Professional
 
#4

AW: Bemerken/Abfangen wenn der Monitor an geht

  Alt 25. Okt 2010, 01:46
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;
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#5

AW: Bemerken/Abfangen wenn der Monitor an geht

  Alt 25. Okt 2010, 08:17
...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???
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#6

AW: Bemerken/Abfangen wenn der Monitor an geht

  Alt 25. Okt 2010, 21:38
@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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Bemerken/Abfangen wenn der Monitor an geht

  Alt 25. Okt 2010, 22:43
klar ist das Programmieren cooler, aber auf die Idee den Schalter zu reparieren ist noch keiner gekommen
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#8

AW: Bemerken/Abfangen wenn der Monitor an geht

  Alt 27. Okt 2010, 20:35
@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!
Angehängte Dateien
Dateityp: rar DisplayControl.rar (29,6 KB, 15x aufgerufen)
Dateityp: rar DisplayControl_exe.rar (26,3 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:24 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