Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re: Detect if Windows screensaver is running or screen is locked (Lock Computer)

by Corion (Patriarch)
on Aug 07, 2006 at 07:56 UTC ( [id://565903]=note: print w/replies, xml ) Need Help??


in reply to Detect if Windows screensaver is running or screen is locked (Lock Computer)

After some quick digging in the MSDN, there is no WMI query but you have to use the raw Win32 API to access the tick count of the computer and the timestamp (in ticks) since the last user input. From the difference between the two you can determine the time the user has been idle (or rather, has been making no input, maybe because he's discussing some issue on the screen):

#!/usr/bin/perl -w use strict; use Win32::API; use POSIX qw(strftime); use Data::Dumper; my $GetLastInputInfo = Win32::API->new("user32.dll",'GetLastInputInfo' +,'P','I'); my $GetTickCount = Win32::API->new("kernel32.dll",'GetTickCount','','I +'); sub get_user_idle_time { my $buffer = pack "VV", 8,0; $GetLastInputInfo->Call($buffer) or die "Couldn't call GetLastInputInfo: $^E"; my ($size,$time) = unpack "VV", $buffer; my $now = $GetTickCount->Call; # Adjust time to return a reference in seconds return int (($now-$time) / 1000); }; while (1) { print strftime( "Idle since %M:%S\n", localtime(get_user_idle_time +)); sleep(2); };
  • Comment on Re: Detect if Windows screensaver is running or screen is locked (Lock Computer)
  • Download Code

Replies are listed 'Best First'.
Re^2: Detect if Windows screensaver is running or screen is locked (Lock Computer) (wrap)
by tye (Sage) on Sep 14, 2006 at 17:22 UTC
    my $GetTickCo­unt = Win32::API­->new("ker­nel32.dll"­,'GetTickC­ount', +'','­I');

    It is a lot easier to just use:

    my $now= Win32::GetTickCount();

    which is just built-in to Win32 perls.

    Note that tick counts wrap, so you need to have your math wrap and, if the user has been idle for 50 days, they will appear not idle again.

    If you are sure that your Perl isn't built to use 64-bit integers, then you can get the math to wrap with:

    my $ticks= do { use integer; Win32::GetTickCount() - $time };

    but that will show the user as not being idle for another 25 days into the future once they've been idle for 25 days.

    Better is probably something like:

    my $ticks= Win32::GetTickCount() - $time; $ticks += ~0 if $ticks < 0;

    Or replace ~0 with 0xffffffff if you might have a 64-bit version of Perl.

    - tye        

Re^2: Detect if Windows screensaver is running or screen is locked (Lock Computer)
by nicc777 (Initiate) on Aug 09, 2006 at 08:57 UTC
    Thanks - this does seem like the best way at the moment.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://565903]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others imbibing at the Monastery: (4)
As of 2024-04-19 05:05 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found