NAME

Win32::GuiTest::Examples - collection of the scripts from eg

Synopsis

This module was autogenerated from the files in the eg directory of the distribution. For detailed (cough) documenataion see Win32::GuiTest. To run the examples either copy-paste them from here or download and unpack the distribution and take the files from the eg directory.

Examples

eg/ask.pl

#!perl -w

# $Id: ask.pl,v 1.4 2004/07/19 20:20:58 szabgab Exp $
#
# Just ask a number of questions on the command line using
# the functions provided by Win32::GuiTest::Cmd

use strict;
use Win32::GuiTest::Cmd ':ALL';

Pause("Press ENTER to start the setup...");

print "GO!\n" if YesOrNo("Setup networking component?");

my $address = AskForIt("What's your new ip address?", 
    "122.122.122.122");

my $dir = AskForDir("Where should I put the new files?", 
    "c:\\temp");

my $exe = AskForExe("Where is your net setup program?", 
    "/foo/bar.exe");

print "\nAddress '$address'\n";
print "Dir     '$dir'\n";
print "Exe     '$exe'\n";

eg/calc.pl

#!perl -w



#$Id: calc.pl,v 1.1 2004/07/17 16:07:42 szabgab Exp $

#

# Written by Gabor Szabo <gabor@pti.co.il>

# An example how to access the built in calculator (calc.exe) of Windows.

# This code assumes your calulator defaults to the Standard view (and not the Scientific)







use strict;



use Win32::GuiTest qw(:ALL);



if (not @ARGV or 

    ($ARGV[0] ne "keyboard" and  $ARGV[0] ne "mouse")) {

    die "Usage: $0 [keyboard|mouse]\n" 

}

   

system "start calc.exe";

sleep(1);

my @windows = FindWindowLike(undef, "Calculator");



if (not @windows) {

   die "Could not find Calculator\n";

}

if (@windows > 1) {

   die "There might be more than one Calculators running\n";

}



if ($ARGV[0] eq "keyboard") {

   PushButton '7';  

   sleep(1);

   PushButton '\*';

   sleep(1);

   PushButton '5';

   sleep(1);

   PushButton '=';

   sleep(2);

   

   # Catch the content of the first child, 

   # At this point we can only hope that this is the child that holds the result

   # as it does not have a title, maybe it has a type that we can check ?

   my @children = GetChildWindows($windows[0]);

   printf "Result: %s\n", WMGetText($children[0]);

   

   SendKeys("%{F4}");  # Alt-F4 to exit

}

if ($ARGV[0] eq "mouse") {

   my ($left, $top, $right, $bottom) = GetWindowRect($windows[0]);

   # find the appropriate child window and click on  it

   my @children = GetChildWindows($windows[0]);

   foreach my $title (qw(7 * 5 =)) {

       my ($c) = grep {$title eq GetWindowText($_)} @children;

       my ($left, $top, $right, $bottom) = GetWindowRect($c);

       MouseMoveAbsPix(($right+$left)/2,($top+$bottom)/2);

       SendMouse("{LeftClick}");

       sleep(1);

   }

   printf "Result: %s\n", WMGetText($children[0]);

   

   MouseMoveAbsPix($right-10,$top+10);  # this probably depends on the resolution

   sleep(2);

   SendMouse("{LeftClick}");

}

eg/excel.pl

#!perl -w
# $Id: excel.pl,v 1.4 2004/07/19 20:20:58 szabgab Exp $
#

use strict;

use Win32::GuiTest qw(FindWindowLike GetWindowText SetForegroundWindow);

$Win32::GuiTest::debug = 0; # Set to "1" to enable verbose mode

# Find top level (1) windows containg Excel in their title
my @windows = FindWindowLike(undef, "Excel", "", undef, 1);
for (@windows) {
    print "$_>\t'", GetWindowText($_), "'\n";
}
print "------------\n";

# Find all windows matching Microsoft Excel in the title, and XLMAIN$
# as the class. 
@windows = FindWindowLike(undef, "^Microsoft Excel", "^XLMAIN\$");
for (@windows) {
    print "$_>\t'", GetWindowText($_), "'\n";
    SetForegroundWindow($_);
}
print "------------\n";

die "You should start Excel before running this example.\n"
    unless @windows;

# Find all children of a specified window.
my @children = FindWindowLike($windows[0]);
for (@children) {
    print "$_>\t'", GetWindowText($_), "'\n";
}

eg/excel2.pl

#!perl -w

# $Id: excel2.pl,v 1.4 2004/07/19 20:20:58 szabgab Exp $
#
# Exercise Win32::GuiTest using MS-Excel. Will only work with non-localized
# versions of Excel (hard-coded hot-keys).
#

use strict;
use Win32::GuiTest qw(FindWindowLike GetWindowText 
SetForegroundWindow SendKeys);

$Win32::GuiTest::debug = 0; # Set to "1" to enable verbose mode

my @windows = FindWindowLike(0, "^Microsoft Excel", "^XLMAIN\$");

die "You should start Excel before running this example.\n"
    unless @windows;

print "$windows[0]>\t'", GetWindowText($windows[0]), "'\n\n";
SetForegroundWindow($windows[0]);
SendKeys("%fn~{PAUSE 1000}");
SendKeys("Randal, look!{TAB}");
SendKeys("Just{TAB}Another{TAB}Perl{TAB}Hacker{TAB}");
SendKeys("{DOWN}{LEFT 5}This is another test!{TAB}{DOWN}{LEFT}");
SendKeys("I hope we're on cell A3!{ENTER}");

my @xl_children = FindWindowLike($windows[0]);
for (@xl_children) {
    print "$_>\t'", GetWindowText($_), "'\n";
}

print "\n";

SendKeys("{PAUSE 2000}%to{PAUSE 2000}");
SendKeys("{ESC}Test finished.{ENTER}");

eg/fonts.pl

#!perl -w
# $Id: fonts.pl,v 1.4 2004/07/19 20:20:58 szabgab Exp $
# Use Win32::GuiTest to get a list of supported fonts from a
# dialog box.
# By Ernesto Guisado (erngui@acm.org).

use strict;

use Win32::GuiTest qw(:ALL);

#sub FontTxt { "Fuente"; } # i18n
#sub OpenFont { "%ef"; }   # i18n

# Let's see notepad
system("start notepad.exe");
sleep 1;

# Open the Font dialog
#SendKeys(OpenFont);
MenuSelect("F&ormat|&Font");  # this is also language dependent !
sleep(1);

# Find the Font dialog using the title and window class
# The Font dialog isn't a child of the notepad window
#my ($fontdlg) = FindWindowLike(0, FontTxt); 
my $fontdlg = GetForegroundWindow();
die "We could not fing the Font dialog\n" if not defined $fontdlg;
print GetWindowText($fontdlg), "\n\n";
sleep(3);

# Find the right combo using it's control id
my ($combo) = FindWindowLike($fontdlg, "", "ComboBox", 0x470);
die "Where is the combo with the font names?" unless $combo;

# Print all the font names
for (GetComboContents($combo)) {
    print "'$_'" . "\n";
}

# Close the dialog and notepad
SendKeys("{ESC}%{F4}");

eg/iswindowstyle.pl

#!/usr/bin/perl
# $Id: iswindowstyle.pl,v 1.3 2004/03/21 08:21:28 ctrondlp Exp $
#

use Win32::GuiTest qw(:FUNC :LVS);

# Test IsWindowStyle()

# Get handle to desktop listview.  Note: Tested on Win2k and NT4.
my ($pm) = FindWindowLike(GetDesktopWindow(), "", "Progman");
my ($sdv) = FindWindowLike($pm, "", "SHELLDLL_DefView");
my ($dlv) = FindWindowLike($sdv, "", "SysListView32");
# Check to see if desktop icons are marked for auto-arrange.
if (IsWindowStyle($dlv, LVS_AUTOARRANGE)) {
    print "Desktop icons are set to auto-arranged.\n";
} else {
    print "Desktop icons are NOT set to auto-arranged.\n";
    ## Code to auto-arrange desktop icons (MouseClick,SendKeys) ##
}

eg/keypress.pl

#!/usr/bin/perl
# $Id: keypress.pl,v 1.3 2004/03/21 08:21:28 ctrondlp Exp $
# This example shows an easy way to check for certain keystrokes.
# The IsKeyPressed function takes a string with the name of the key.
# This names are the same ones as for SendKeys. 

use Win32::GuiTest qw(SendKeys IsKeyPressed);

# Wait until user presses several specified keys
@keys = qw/ESC F5 F11 F12 A B 8 DOWN/;

for (@keys) {
  until (IsKeyPressed($_)) {
    print "Please press $_...\n";
    SendKeys "{PAUSE 200}";
  }
}

eg/menuselect.pl

#!perl -w
# $Id: menuselect.pl,v 1.8 2004/07/28 11:45:13 szabgab Exp $

# Example how to get the names of the menus

use strict;

use Win32::GuiTest qw(:ALL);

system "start notepad";
sleep 1;

my $menu = GetMenu(GetForegroundWindow());
print "Menu: $menu\n";
my $submenu = GetSubMenu($menu, 0);
print "Submenu: $submenu\n";
print "Count:", GetMenuItemCount($menu), "\n";

use Data::Dumper;

my %h = GetMenuItemInfo($menu, 1);   # Edit on the main menu
print Dumper \%h;
%h = GetMenuItemInfo($submenu, 1);   # Open in the File menu
print Dumper \%h;
%h = GetMenuItemInfo($submenu, 4);   # Separator in the File menu
print Dumper \%h;

print "===================\n";
menu_parse($menu);

#MenuSelect("&Archivo|&Salir");

# Close the menu and notepad
SendKeys("{ESC}%{F4}");


# this function receives a menu id and prints as much information about that menu and 
# all its submenues as it can
# One day we might include this in the distributionor in some helper module
sub menu_parse {
	my ($menu, $depth) = @_;
	$depth ||= 0;
	
	foreach my $i (0..GetMenuItemCount($menu)-1) {
		my %h = GetMenuItemInfo($menu, $i);
		print "   " x $depth;
		print "$i  ";
		print $h{text} if $h{type} and $h{type} eq "string"; 
		print "------" if $h{type} and $h{type} eq "separator"; 
		print "UNKNOWN" if not $h{type};
		print "\n";
		
		my $submenu = GetSubMenu($menu, $i);
		if ($submenu) {
			menu_parse($submenu, $depth+1);
		}
	}
}


SendKeys("%{F4}");

eg/notepad.pl

#!/usr/bin/perl
# $Id: notepad.pl,v 1.2 2004/03/21 08:05:06 ctrondlp Exp $
#

use Win32::GuiTest;

system("start notepad.exe");
sleep 3;
Win32::GuiTest::SendKeys("If you're reading this inside notepad,\n");
Win32::GuiTest::SendKeys("we might consider this test succesful.\n");
Win32::GuiTest::SendKeys("Now I'll send notepad an ALT{+}F4 to close\n");
Win32::GuiTest::SendKeys("it. Please wait.......");
sleep 1;
Win32::GuiTest::SendKeys(".");
sleep 1;
Win32::GuiTest::SendKeys(".");
sleep 1;
Win32::GuiTest::SendKeys(".");
Win32::GuiTest::SendKeys("%{F4}{TAB}{ENTER}");

eg/notepad_text.pl

#!perl -w
# $Id: notepad_text.pl,v 1.3 2004/07/21 17:47:38 szabgab Exp $
# If you have a notepad window open this prints the contents.

use strict;

use Win32::GuiTest qw(FindWindowLike WMGetText);

my @windows = FindWindowLike(0, "", "Notepad");
die "More than one notepad open\n" if @windows > 1;
die "No notepad is running, please open one with some text in it.\n" if not @windows;

my $notepad = $windows[0];
my @edits = FindWindowLike($notepad, "", "Edit");
die "More than one edit inside notepad: " .  @edits . "\n" if @edits > 1;
die "No edit window found inside notepad\n" if not @edits;

print "----------------------------------------------------------\n";
print WMGetText($edits[0]);
print "\n";
print "----------------------------------------------------------\n";

eg/paint.pl

#!perl -w
# $Id: paint.pl,v 1.3 2004/07/21 17:47:38 szabgab Exp $
# Draw triangles in MS Paint.


use strict;

use Win32::GuiTest qw(:ALL); 

system("start /max mspaint");
sleep 2;
my @windows = FindWindowLike(0, "Paint", "");
die "Could not find Paint\n" if not @windows;


SetForegroundWindow($windows[0]);
sleep 1;

# totaly guess work about the location of the area where one can draw.
# A better guess would be welcome
MouseMoveAbsPix((GetWindowRect($windows[0]))[0,1]);
SendMouse ( "{REL50,50}" );  

# Using high-level functions
SendMouse ( "{LEFTDOWN}" );
for (1..100) { SendMouse ( "{REL1,1}"  ); }
for (1..100) { SendMouse ( "{REL1,-1}" ); }
for (1..200) { SendMouse ( "{REL-1,0}" ); }
SendMouse ( "{LEFTUP}" );



# Using low level functions
SendMouseMoveRel(5,20);
SendLButtonDown();
for (1..100) { SendMouseMoveRel(1,1);  }
for (1..100) { SendMouseMoveRel(1,-1); }
for (1..200) { SendMouseMoveRel(-1,0); }
SendLButtonUp();

eg/paint_abs.pl

#!perl -w
# $Id: paint_abs.pl,v 1.3 2004/07/21 17:47:38 szabgab Exp $
#
# Draw an X and a box around it
#
use strict;
use Win32::GuiTest qw(FindWindowLike SetForegroundWindow 
    SendMouse MouseMoveAbsPix SendLButtonDown SendLButtonUp);

system("start /max mspaint");
sleep 2;
my @windows = FindWindowLike(0, "Paint", "");
die "Could not find Paint\n" if not @windows;

SetForegroundWindow($windows[0]);
sleep 1;

#Using low level functions
MouseMoveAbsPix(100,100);
SendLButtonDown();
MouseMoveAbsPix(300,300);
SendLButtonUp();


sleep 1;

MouseMoveAbsPix(100,300);
SendLButtonDown();
MouseMoveAbsPix(300,100);
SendLButtonUp();

sleep 1;
    
MouseMoveAbsPix(100,100);
SendLButtonDown();
MouseMoveAbsPix(300,100);
MouseMoveAbsPix(300,300);
MouseMoveAbsPix(100,300);
MouseMoveAbsPix(100,100);
SendLButtonUp();

eg/pushbutton.pl

#!/usr/bin/perl
# $Id: pushbutton.pl,v 1.4 2004/04/09 01:19:43 ctrondlp Exp $
#

use strict;
use Win32::GuiTest qw(PushButton FindWindowLike SetForegroundWindow
    SendKeys WaitWindow IsWindow);

				  
# Test PushButton()

# Remove old saved document
unlink("C:\\temp\\PushButton.txt");

system("start notepad.exe");
my @windows = WaitWindow("Untitled - Notepad");
#my @windows = WaitWindow(" - Bloc de notas");
die unless scalar @windows == 1 && IsWindow($windows[0]);
SetForegroundWindow($windows[0]);
SendKeys("Sample Text\n");
SendKeys("%{F4}");
# Push Yes button to save document
PushButton("Yes");
#PushButton("Sí");
# Type Filename
SendKeys("C:\\temp\\PushButton.txt");
# Push &Save to save and exit
PushButton("&Save");
#PushButton("&Guardar");

eg/rawkey.pl

#!/usr/bin/perl
# $Id: rawkey.pl,v 1.3 2004/03/21 08:21:28 ctrondlp Exp $
#

use Win32::GuiTest qw(:FUNC :VK);

while (1) {
    SendRawKey(VK_DOWN, KEYEVENTF_EXTENDEDKEY); 
    SendKeys "{PAUSE 200}";
}

eg/selecttabitem.pl

#!/usr/bin/perl
# $Id: selecttabitem.pl,v 1.2 2004/03/21 08:05:06 ctrondlp Exp $
#

use Win32::GuiTest qw(GetWindowID GetChildWindows GetWindowText
    GetForegroundWindow PostMessage PushButton SendKeys SelectTabItem);

use Win32::GuiTest::Cmd qw(System);

# Test 

# Open System Properties
# Tested on Win2k an NT4
System();
#system("start RunDLL32.exe shell32,Control_RunDLL sysdm.cpl,\@0,2");
sleep(2);
# Select various items on tab control
# Using Window ID
SelectTabItem(12320, 0);
sleep(1);
SelectTabItem(12320, 2);
sleep(1);
SelectTabItem(12320, 1);
sleep(1);
#PushButton("^Cancel");
SendKeys("{ESC}");

eg/showcpl.pl

#!/usr/bin/perl
# $Id: showcpl.pl,v 1.2 2004/03/21 08:05:06 ctrondlp Exp $
# Shows how to open control panel apps programmatically
#

use Win32::GuiTest::Cmd qw(
    Accessibility AppWizard Console DateTime
    Display Exchange Internet Joystick Modem
    Mouse Multimedia Network Odbc Pcmcia Ports Ras
    Regional Server System Telephony Ups Users);

use Win32::GuiTest qw(SendKeys);

Modem(); sleep 1;
SendKeys("%{F4}");
Network();sleep 1;
SendKeys("%{F4}"); 
Console();sleep 1;
SendKeys("%{F4}"); 
Accessibility();sleep 1;
SendKeys("%{F4}"); 
AppWizard();   sleep 1;
SendKeys("%{F4}"); 
Pcmcia();     sleep 1;
SendKeys("%{F4}"); 
Regional(); sleep 1;
SendKeys("%{F4}"); 
Joystick(); sleep 1;
SendKeys("%{F4}"); 
Mouse(); sleep 1;
SendKeys("%{F4}"); 
Multimedia(); sleep 1;
SendKeys("%{F4}"); 
Odbc(); sleep 1;
SendKeys("%{F4}"); 
Ports(); sleep 1;
SendKeys("%{F4}"); 
Server(); sleep 1;
SendKeys("%{F4}"); 
System(); sleep 1;
SendKeys("%{F4}"); 
Telephony();sleep 1;
SendKeys("%{F4}"); 
DateTime();sleep 1;
SendKeys("%{F4}"); 
Ups();sleep 1;
SendKeys("%{F4}"); 
Internet(); sleep 1;
SendKeys("%{F4}"); 
Display(); sleep 1;
SendKeys("%{F4}"); 
Ras(); sleep 1;
SendKeys("%{F4}"); 
Users(); sleep 1;
SendKeys("%{F4}"); 

eg/showmouse.pl

#!/usr/bin/perl
# $Id: showmouse.pl,v 1.2 2004/03/21 08:05:06 ctrondlp Exp $
# This script has been written by Jarek Jurasz jurasz@imb.uni-karlsruhe.de

use Win32::GuiTest qw(GetCursorPos);

while (1)
{
  ($x, $y) = GetCursorPos();
  print "\rx:$x  y:$y   ";
  sleep 1;
}

eg/showwin.pl

#!/usr/bin/perl
# $Id: showwin.pl,v 1.2 2004/03/21 08:05:06 ctrondlp Exp $
# This script has been written by Jarek Jurasz jurasz@imb.uni-karlsruhe.de
# selectively show/hide a group of windows
# side effect: showing the window activates it

use Win32::GuiTest qw(:ALL :SW);


$name = shift;
$show = shift;
$class = undef;

die <<EOT unless $name;
Usage: $0 "^Title" [+1|-1]
+1 show windows
-1 hide windows
 0 or empty show status
Be careful when using bare title words: when running the script, the title of 
the console will change and include the title words, too...
EOT


# $name = "^Microsoft Excel" unless $name;
my @win = FindWindowLike(0, $name, $class);

showall(@win);

sub showall
{
  my @win = @_;
  for $win (@win)
  {
    # should normally be only one
    show($win);
    # children
    # showall(FindWindowLike($win, undef, undef));
  }
}

sub show
{
  my $win = shift;

  # dumpwin($win);
  if ($show > 0)
  {
    ShowWindow($win, SW_SHOW) unless (IsWindowVisible($win));
    # EnableWindow($win, 1);
  }
  elsif ($show < 0)
  {
    ShowWindow($win, SW_HIDE) if (IsWindowVisible($win));
  }
  
  dumpwin($win);
}

sub dumpwin
{
  my $win = shift;
  print "Null handle\n", return unless ($win);
  print "$win>\tt:", GetWindowText($win), " c:", GetClassName($win);
  print " vis:", IsWindowVisible($win);
  print " en:", IsWindowEnabled($win);
  print "\n";
}

eg/spy--.pl

#!/usr/bin/perl
# $Id: spy--.pl,v 1.3 2004/03/21 08:21:28 ctrondlp Exp $
# MS has a very nice tool (Spy++).
# This is Spy--
#

use Win32::GuiTest qw(FindWindowLike GetWindowText GetClassName
    GetChildDepth GetDesktopWindow);

for (FindWindowLike()) {
    $s = sprintf("0x%08X", $_ );
    $s .= ", '" .  GetWindowText($_) . "', " . GetClassName($_);
    print "+" x GetChildDepth(GetDesktopWindow(), $_), $s, "\n";
}

eg/spy.pl

#!perl -w

use strict;



# Based on the spy--.pl within the distribution

# Parse a subtree of the whole windoing systme and print as much information as possible

# about each window and each object.

# This software is in a very early stage. Its options and output format will change a lot.

# Your input is welcome !



# Written by Gabor Szabo <gabor@pti.co.il>



# $Id: spy.pl,v 1.3 2004/07/21 21:38:22 szabgab Exp $

my $VERSION = "0.02";



use Getopt::Long;

use Win32::GuiTest qw(:ALL);

my %opts;

GetOptions(\%opts, "help", "title=s", "all", "id=i", "class=s"); 

usage() if $opts{help} or not %opts;





my %seen;

my $desktop = GetDesktopWindow();

my $root    = 0;

my $start;



$start = 0 if $opts{all};

$start = $opts{id} if $opts{id};

if ($opts{title} or $opts{class}) {

	my @windows = FindWindowLike(0, $opts{title}, $opts{class});

	#my @windows = FindWindowLike(0, $opts{title}) if $opts{title};

	#@windows = FindWindowLike(0, '', $opts{class}) if $opts{class};

	if (@windows > 1) {

		print "There are more than one window that fit:\n";

		foreach my $w (@windows) {

			printf "%s | %s | %s\n", $w,  GetClassName($w), GetWindowText($w);

		}

		exit;

	}

	die "Did not find such a window." if not @windows;

	$start = $windows[0];

}













usage() if not defined $start;





my $format = "%-10s %-10s, '%-25s', %-10s, Rect:%-3s,%-3s,%-3s,%-3s   '%s'\n";

printf $format,

		"Depth",

		"WindowID",

		"ClassName",

		"ParentID",

		"WindowRect","","","",

		"WindowText";





parse_tree($start);







sub GetImmediateChildWindows {

	my $WinID = shift;

	grep {GetParent($_) eq $WinID} GetChildWindows $WinID;

}



sub parse_tree {

	my $w = shift;

	if ($seen{$w}++) {

		print "loop $w\n";

		return;

	}



	prt($w);

	#foreach my $child (GetChildWindows($w)) {

	#	parse_tree($child);

	#}

	foreach my $child (GetImmediateChildWindows($w)) {

		print "------------------\n" if $w == 0;

		parse_tree($child);

	}

}



# GetChildDepth is broken so here is another version, this might work better.

 

# returns the real distance between two windows

# returns 0 if the same windows were provides

# returns -1 if one of the values is not a valid window

# returns -2 if the given "ancestor" is not really an ancestor of the given "descendant"

sub MyGetChildDepth {

	my ($ancestor, $descendant) = @_;

	return -1 if $ancestor and (not IsWindow($ancestor) or not IsWindow($descendant));

	return 0 if $ancestor == $descendant;

	my $depth = 0;

	while ($descendant = GetParent($descendant)) {

		$depth++;

		last if $ancestor == $descendant;

	}

	return $depth + 1 if $ancestor == 0;

}





sub prt {

	my $w = shift;

	my $depth = MyGetChildDepth($root, $w);

	printf $format,

		(0 <= $depth ? "+" x $depth : $depth),

		$w, 

		($w ? GetClassName($w) : ""),

		($w ? GetParent($w) : "n/a"),

		($w ? GetWindowRect($w) : ("n/a", "", "", "")),

		($w ? GetWindowText($w) : ""); 

}







sub usage {

	print "Version: v$VERSION\n";

	print "Usage:\n";

	print "        $0 --help\n";

	print "        $0 --all\n";

	print "        $0 --title TITLE\n";

	print "\n";

	print "As the output is quite verbose, probably you'll want to redirect \n";

	print "the output to a file:   $0 options > out.txt\n";

	print "\n";

	exit;

}

eg/start.pl

#!/usr/bin/perl
# $Id: start.pl,v 1.1 2004/07/13 21:52:26 szabgab Exp $

# Disclaimer: I tried this on my WindowsXP,
# Other Windows, or other configurations might place the "Run" option
# of the "Start" menu in different place so before running this script
# make sure that your version of Windows will bring you to the "Run" option
# if you press the left windows key and then the Up key 3 times.

# Written by Gabor Szabo <gabor@pti.co.il>

use Win32::GuiTest;

# open the Start menu by pressing the Left Windows Key 
# and then close it by hitting ESC.
Win32::GuiTest::SendKeys("{LWI}");
sleep 2;
Win32::GuiTest::SendKeys("{ESC}");

# Check out the version of your perl by opening a cmd.exe and typing perl -v
# the sleep 1; lines were added only so the viewer can observe the process
# you could actually send all the keys in one SendKeys call.

Win32::GuiTest::SendKeys("{LWI}");
sleep 1;
Win32::GuiTest::SendKeys("{UP}");
sleep 1;
Win32::GuiTest::SendKeys("{UP}");
sleep 1;
Win32::GuiTest::SendKeys("{UP}");
sleep 1;
Win32::GuiTest::SendKeys("{ENTER}");
sleep 1;
Win32::GuiTest::SendKeys("cmd{ENTER}");
sleep 1;
Win32::GuiTest::SendKeys("perl -v");
sleep 1;
Win32::GuiTest::SendKeys("{ENTER}");
sleep 1;
Win32::GuiTest::SendKeys("exit");
sleep 1;
Win32::GuiTest::SendKeys("{ENTER}");

eg/tab.pl

#!/usr/bin/perl
# $Id: tab.pl,v 1.3 2004/03/21 08:21:28 ctrondlp Exp $
#

use Win32::GuiTest qw(:FUNC :VK);

SendRawKey(VK_MENU, 0);
SendKeys("{TAB}{PAU 1000}{TAB}{PAU 1000}{TAB}");
SendRawKey(VK_MENU, KEYEVENTF_KEYUP);

eg/waitwindow.pl

#!/usr/bin/perl
# $Id: waitwindow.pl,v 1.3 2004/03/21 08:21:28 ctrondlp Exp $
# Slightly modified from version submitted by anonymous contributor.
#

use strict;
use Win32::GuiTest qw(IsWindow FindWindowLike SendKeys
	PushButton WaitWindow); 


# Test WaitWindow()

# en i18n constants 
sub SOL  { "^Solitaire" }
sub GAME { "%G" }
sub OPT  { "O" }
sub OPTIONS { "^Options" }
sub CANCEL  { "Cancel" }

# es i18n constants 
#sub SOL  { "^Solitario" }
#sub GAME { "%J" }
#sub OPT  { "O" }
#sub OPTIONS { "^Opciones" }
#sub CANCEL  { "Cancelar" }

# Open program
system("start sol.exe");
# Wait for program window to appear.
die "Couldn't open solitaire program!\n"
    unless WaitWindow(SOL);
# Select game menu
SendKeys(GAME);
# Open options menu
SendKeys(OPT); 
# Wait for options menu to appear for up to 5 seconds.
WaitWindow(OPTIONS, 5);
# Close options menu
PushButton(CANCEL);
# Close program
SendKeys("%{F4}"); 

eg/which.pl

#!/usr/bin/perl
# $Id: which.pl,v 1.2 2004/03/21 08:05:06 ctrondlp Exp $
# Similar to UNIX which command.
#
# On my NT box:
# 
#  D:\src\perl\win32-guitest>eg\which.pl perl
#  D:\perl\bin\perl.EXE
#  D:\src\perl\win32-guitest>eg\which.pl regedit
#  C:\WINNT\regedit.EXE
#  D:\src\perl\win32-guitest>eg\which.pl notepad
#  C:\WINNT\system32\notepad.EXE
#  D:\src\perl\win32-guitest>
#

use strict;
use Win32::GuiTest::Cmd qw(WhichExe);
print WhichExe(shift);

eg/winbmp.pl

#!/usr/bin/perl
# $Id: winbmp.pl,v 1.2 2004/03/21 08:05:06 ctrondlp Exp $
# This script has been written by Jarek Jurasz jurasz@imb.uni-karlsruhe.de
# Save a given window as BMP file
# Copy the contents to the clipboard


use Win32::GuiTest qw(:ALL);

($w) = FindWindowLike(0, "^Calc");
$w = GetDesktopWindow unless $w;

$ds = new Win32::GuiTest::DibSect;
$ds->CopyWindow($w);
#$ds->CopyClient(GetDesktopWindow(), \@{[GetWindowRect($w)]});
# $ds->Invert();
#$ds->CopyClient(GetDesktopWindow(), \@{[GetWindowRect($w)]});
# $ds->Invert();
#$ds->ToGrayScale();
$ds->SaveAs("bla.bmp");
$ds->ToClipboard();

eg/wptr.pl

#!/usr/bin/perl
# $Id: wptr.pl,v 1.4 2004/07/22 22:25:13 ctrondlp Exp $
#

# Module Pragmas
use strict;
use warnings;

# Module Imports
use Win32::GuiTest qw(GetCursorPos GetClassName GetWindowText
	GetWindowRect WindowFromPoint GetWindowID IsKeyPressed WMGetText);
use Win32::Clipboard;

# Module Level Variables
my $Clip = Win32::Clipboard();
my $cur_info = "";
my $oldhwnd = 0;
my $oldcx = 0;
my $oldcy = 0;

# Core Loop
while (1) {
	my ($cx, $cy) = GetCursorPos();
	# Is different cursor position?
	if ( ($cx != $oldcx) || ($cy != $oldcy) ) {
		$oldcx = $cx;
		$oldcy = $cy;
		# Get handle of window
		my $hwnd = WindowFromPoint($cx, $cy);
		if ($hwnd == $oldhwnd) {
			# Same window as before, don't query information again.
			next;
		}
		# Different window, so cache the handle value.
		$oldhwnd = $hwnd;
		# Get information for the new window in which the cursor is over.
		$cur_info = GetWindowInfo($hwnd);
		ClearScreen();
		# Output window information to console.
		DispWindowInfo($cur_info);
		# Display menu.
		DispMenu();
	}
	# INSERT to copy window data to clipboard.
	if (IsKeyPressed("INS")) {
		$Clip->Empty();
		$Clip->Set($cur_info);
		select(undef, undef, undef, 0.50);
		print "Copied data to clipboard.\n";
	}
	# ESCAPE to exit this program.
	if (IsKeyPressed("ESC")) {
		print "Goodbye!\n";
		last;
	}
}


sub ClearScreen {
	system("command /c cls");
	return;
}

sub GetWindowInfo {
	my $hwnd = shift;
	my $info = 		"# Window Text: '" . GetWindowText($hwnd) . "'\r\n";
	$info = $info . "# Window Class: '" . GetClassName($hwnd) . "'\r\n";
	$info = $info . "# Window ID: " . GetWindowID($hwnd) . "\r\n";
	my ($left, $top, $right, $bottom) = GetWindowRect($hwnd);
	$info = $info . "# Window Rect: ($left, $top) - ($right, $bottom)\r\n";
print "Text: " . WMGetText($hwnd) . "\r\n";
	return($info);
}

sub DispWindowInfo {
	print shift;
	return;
}

sub DispMenu {
	print "\n\nPress <INSERT> to copy window text to clipboard.\n";
	print "Press <ESCAPE> to exit program.\n";
	return;
}

1 POD Error

The following errors were encountered while parsing the POD:

Around line 584:

Non-ASCII character seen before =encoding in '#PushButton("Sí");'. Assuming CP1252