NAME
Win32::Monitoring::WindowPing - Test Win32 Window for responsiveness
SYNOPSIS
use Win32::Monitoring::WindowPing qw(
GetActiveWindow
PingWindow
PingStatus
GetWindowCaption
GetProcessIdForWindow
GetNameForProcessId
WAS_ALIVE
WAS_TIMEOUT
WAS_NOTAWINDOW
WAS_OTHERERROR
);
my $HWND = GetActiveWindow();
my $pingstatus = PingWindow($HWND, $timeout_in_ms);
my $caption = GetWindowCaption($HWND);
my $processid = GetProcessIdForWindow($HWND);
my $nameforprocid = GetNameForProcessId($processid);
DESCRIPTION
The Win32::Monitoring::WindowPing module provides a function to check if a windows desktop window would be willing to respond to user input if there was any. As a bonus there is a set of companion functions included, such that you can implement a nice little window alive check program without requiring further modules.
- $HWND=GetActiveWindows()
-
Returns the window handle of the currently active window on the window desktop
- $status=PingWindow($HWND,$timeout_in_ms)
-
Determine is the window with the given HWND would react to user input. Return after timeout. Status is one of the following
WAS_ALIVE - The windows reacts WAS_TIMEOUT - No reaction within the timeout period WAS_NOTAWINDOW - The given HWND does not correspond to a window WAS_OTHERERROR - Something else went wrong check LastError
- GetWindowCaption($HWND)
-
Get the caption of the window. The function will climb the window hierarchy until it finds a window with a proper caption.
- $PID=GetProcessIdForWindow($HWND)
-
Find the process id connected with this window.
- GetNameForProcessId($PID)
-
Get the name of the binary for the process id.
EXAMPLE
#! perl
use strict;
use warnings;
use Win32::Monitoring::WindowPing qw(:all);
use Time::HiRes qw(gettimeofday usleep);
my %wl; # the watchlist
my $timeout = 200;
while(1){
for my $hwnd (keys %wl){
usleep(1000*25);
my $r = PingWindow($hwnd, $timeout);
if ($r == WAS_ALIVE){
my $duration = scalar gettimeofday() - $wl{$hwnd}{hangstart};
my $caption = GetWindowCaption($hwnd);
printf "%-10s hung for %8.3f s - $caption\n",
$wl{$hwnd}{process}, $duration;
delete $wl{$hwnd};
}
elsif ($r == WAS_NOTAWINDOW){
my $duration = scalar gettimeofday() - $wl{$hwnd}{hangstart};
printf "%-10s crash after %8.3f s\n",$wl{$hwnd}{process}, $duration;
delete $wl{$hwnd};
}
}
my $hwnd2 = GetActiveWindow();
if ($hwnd2 and not $wl{$hwnd2}){
my $r = PingWindow($hwnd2,$timeout);
if ($r == WAS_TIMEOUT){
my $id = GetProcessIdForWindow($hwnd2);
$wl{$hwnd2} = { hangstart => scalar gettimeofday(),
process => GetNameForProcessId($id),
id => $id,
};
}
}
usleep(1000*250);
};
SEE ALSO
Webpage: <http://oss.oetiker.ch/optools/>
COPYRIGHT
Copyright (c) 2008 by OETIKER+PARTNER AG. All rights reserved.
LICENSE
Win32::Monitoring::WindowPing is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
Win32::Monitoring::WindowPing is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with Win32::Monitoring::WindowPing. If not, see <http://www.gnu.org/licenses/>.
AUTHORS
Roman Plessl, Tobias Oetiker