ぶっちゃけると

VB6->VB.NETよりVB6->VC++6のほうが遥に楽。

use strict;
use warnings;
use Win32::API;
use Win32::API::Callback;

$| = 1;
my %WindowTitle = ();
my $EnumWindows = new Win32::API('user32', 'EnumWindows', 'KN', 'N');
my $GetWindowText = new Win32::API('user32', 'GetWindowText', 'NPN', 'N' );

my $Callback = Win32::API::Callback->new(
    sub { 
        my($hwnd, $lparam) = @_;

            my $text = ' ' x 255;
            my $length = $GetWindowText->Call( $hwnd, $text, 255 ) || return 1;
            $text = substr( $text, 0, $length ) || return 1;
            push @{$WindowTitle{$text}}, $hwnd;

        return 1;
    },
    'NN', 'N');

$EnumWindows->Call($Callback, 0);

foreach(keys %WindowTitle)
{
    printf "%-40s : %-s\n", $_,  join ',', @{$WindowTitle{$_}};
}

perl でやるほうがらくかもしれんwww