#!/usr/bin/perl use strict; use Win32::API; use Win32::Clipboard; ############################################# ## MAIN BLOCK ## ############################################# print "Using device: " . getDeviceList() . "...\n"; captureImage(0); print "DONE!\n"; ############################################# ## SUBROUTINES ## ############################################# sub getDeviceList { my $device = ''; my $strName = " " x 100; #necessary for the API call my $strVer = " " x 100; my $i = 0; my $driverGet = new Win32::API('avicap32.dll', 'capGetDriverDescriptionA', 'IPIPI', 'I'); if($driverGet->Call($i, $strName, 100, $strVer, 100)) { #make API call to find devices $strName = unpack('A*', $strName); #trim trailing nulls $device = $strName; } return ($device ? $device : "Error - No device found"); #if theres a device, show it } sub captureImage { my $iDevice = shift; my $getD = new Win32::API('user32.dll', 'GetDesktopWindow', '', 'N'); my $desktopHwnd = $getD->Call(); #need the desktop handle my $cCreate = new Win32::API('avicap32.dll', 'capCreateCaptureWindowA', 'PIIIIIII', 'I'); my $sMsg = new Win32::API('user32.dll', 'SendMessageA', 'IIIP', 'I'); my $wDestroy = new Win32::API('user32.dll', 'DestroyWindow', 'I', 'I'); my $wDC = new Win32::API('gdi32.dll', 'CreateCompatibleDC', 'N', 'N'); #create memory DC as a temporary workspace my $memHwnd = $wDC->Call($desktopHwnd); my $handle = $cCreate->Call($iDevice, 0, 0, 0, 640, 480, $memHwnd, 0); #Invisible if ($sMsg->Call($handle, 1034, $iDevice, 0)) { #if DRIVER_CONNECT $sMsg->Call($handle, 1077, 1 , 0); print "Scale Set...\n"; $sMsg->Call($handle, 1074, 1, 0); print "Previewing...\n"; $sMsg->Call($handle, 1076, 1, 0); print "Preview Rate...\n"; $sMsg->Call($handle, 1054, 0, 0); print "Copying...\n";#copy to clipboard sleep 1; $wDestroy->Call($handle); } else { print "Device invalid or in use.\n"; $wDestroy->Call($handle); } #save the clipboard to file my $image = Win32::Clipboard::GetBitmap(); open (BITMAP, ">current_image.bmp"); binmode (BITMAP); print BITMAP $image; close (BITMAP); }