Avatar billede snowball Novice
03. august 2004 - 16:22 Der er 12 kommentarer og
1 løsning

Skærmens status (tændt, slukket osv.)

Hej.

Er det muligt at finde ud af hvilken tilstand skærmen er i? Her mener jeg om den er tændt, slukket eller i standby mode.

Via WMI (Windows Management Instrumentation) kan man i klassen Win32_DesktopMonitor (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_desktopmonitor.asp) læse netop den værdi (Availability) jeg gerne vil have, men problemet er bare at Win32_DesktopMonitor klassen ikke opdateres real time.

Kan jeg på nogen anden måde finde ud af det?

På forhånd tak.

/Snowball
Avatar billede stoney Nybegynder
03. august 2004 - 17:22 #1
Hvad får dig til at tro den ikke opdaterer real time ?

Stoney
Avatar billede snowball Novice
03. august 2004 - 17:47 #2
Har testet det, og har også spurgt forfatteren af det WMI komponent som jeg brugte.

"Am I doing something wrong, or is WMI values just not updated real time !?

That's correct, WMI is implemented this way.
Win32_DesktopMonitor.Availability property is inherited from
CIM_LogicalDevice class. That class is not smart enough
to update its properties when hardware device changes.

Some descendants of CIM_LogicalDevice may override this, but
it looks like Win32_DesktopMonitor gets its properties at
operating system boot time."
Avatar billede snowball Novice
03. august 2004 - 20:39 #3
hhhmmm. Kan man ikke lavet noget "omvendt" af nedenstående. Altså så man læser værdien i stedet for at sætte den.

SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 2);

Ovenstående sætter skærmen i standby.
Avatar billede snowball Novice
04. august 2004 - 11:46 #4
Er blevet foreslået nedenstående, men begge giver altid "Monitor standby" ligemeget hvad.

procedure TForm1.Timer1Timer(Sender: TObject);
  var stdby: boolean;
begin
  SystemParametersInfo(SPI_GETPOWEROFFACTIVE, 0, @stdby, 0);
  if stdby then
    ListBox1.Items.Add(TimeToStr(Now) + ' Monitor standby')
  else
    ListBox1.Items.Add(TimeToStr(Now) + ' Monitor not standby');

  SystemParametersInfo(SPI_GETLOWPOWERACTIVE, 0, @stdby, 0);
  if stdby then
    ListBox2.Items.Add(TimeToStr(Now) + ' Monitor standby')
  else
    ListBox2.Items.Add(TimeToStr(Now) + ' Monitor not standby');
end;
Avatar billede stoney Nybegynder
04. august 2004 - 17:18 #5
Du kan evt. udelade screensaver delen af nedenstående.
Af en aller anden grund registrerer den det 2 gange

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
  private
  protected
    procedure WMSysCommand(var Message : TWMSysCommand ); Message
WM_SYSCOMMAND;
    { Private declarations }
  public

    { Public declarations }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}



procedure TForm1.WMSysCommand(var Message : TWMSysCommand);
// Intercept screen saver or power monitor message and do something ...
begin

  //
  if  (Message.CmdType and $FFF0 = SC_SCREENSAVE) or(Message.CmdType and
$FFF0 = SC_MONITORPOWER) then begin

    memo1.Lines.Add(datetimetostr(now)+ ': Skærm i powersafe')
  end; {if}
  inherited; // let the message thru'
end; {WMSysCommand}


end.

Stoney
Avatar billede snowball Novice
04. august 2004 - 17:39 #6
stoney: Kanon. Det ser umiddelbart ud til at virke :)

Men hvordan finder jeg så ud af om den er gået ud af powersafe igen!?
Avatar billede stoney Nybegynder
04. august 2004 - 17:41 #7
Lav en boolean variable selv og check på denne måde
ved at sætte den true/false

Stoney
Avatar billede snowball Novice
04. august 2004 - 17:44 #8
Ja, men der kommer jo ikke nogen "event" når den går ud af powersafe mode!?
Avatar billede stoney Nybegynder
04. august 2004 - 17:51 #9
ok, jeg roder lige lidt videre med det.

Stoney
Avatar billede snowball Novice
04. august 2004 - 17:55 #10
Mange tak :)

Men en "quick and dirty" løsning kunne vel være at lave en global mouse/keyboard hook, for man må vel gå ud fra at skærmen altid går ud at powersafe hvis man bevæger musen eller trykker på en tast !?

Men det bedste er nok hvis du kan få fat i en event ligesom når den går i powersafe.
Avatar billede snowball Novice
10. august 2004 - 14:00 #11
stoney: Har du fundet ud af noget mere? :)

Under alle omstændigheder må du gerne lave et svar, for jeg kan godt bruge din kode fra din indlæg 04/08-2004 17:18:03
Avatar billede stoney Nybegynder
10. august 2004 - 14:34 #12
Nej, jeg er ikke kommet videre.
Jeg har prøvet med boolean variabler uden succes.
Jeg har søgt hele nettet igennem uden success (faktisk tror jeg hele nettet ligger
cached på min PC nu) :-)
Alle påstår hårdnakket at det er PC'ens APM (advanced power manegement) der styrer om skærmen skal være on/off

Stoney
Avatar billede snowball Novice
10. august 2004 - 14:37 #13
OK. Så må jeg få lavet en global mus/keyboard hook som kan nulstille min "powersave" variabel hvis den er sat :)

Tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester