Prima regola con VB.NET: non riciclare mai le dichiarazioni delle API di VB6, perché i tipi di dati non corrispondono.
codice:
Byte (Bit)   VB6          VB.NET
1 (8)        Byte         Byte (System.Byte)
2 (16)       Integer      Short (System.Int16)
4 (32)       Long         Integer (System.Int32)
8 (64)       n.d.         Long (System.Int64)
Tuttavia la dimensione in bit di molti tipi di handle (quelli di finestra compresi) varia a seconda della piattaforma, ossia è di 32 bit sotto Windows a 32 bit (e quindi corrisponderebbe ad un Integer di VB.NET) ed è di 64 bit sotto Windows a 64 bit (e quindi corrisponderebbe ad un Long di VB.NET). Per ovviare a questo problema è stata inventata la struttura System.IntPtr (INTeger PoinTeR, puntatore intero), le cui dimensioni variano correttamente a seconda della piattaforma su cui il codice IL viene jit-compilato (in effetti il suo unico campo privato, m_value, è un puntatore a void, che ha il genere di comportamento desiderato). Pertanto lavorando con gli handle si tende ad utilizzare tale struttura al posto dei normali tipi di dati Integer o Long.
Ecco il codice corretto:
codice:
Private Declare Auto Function FindWindow Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr


    Private Function GetWindowHandle(ByVal ps_WindowTitle As String) As IntPtr
        Return FindWindow(vbNullString, ps_WindowTitle)
    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


        Dim gea As ApplicationGE

        Dim sc As New ScreenCapture()

        gea = CreateObject("GoogleEarth.ApplicationGE")

        Dim hwnd As IntPtr = GetWindowHandle("Google Earth")

        sc.CaptureWindowToFile(hwnd, "c:\poba.gif", Imaging.ImageFormat.Gif)


        MessageBox.Show("ok")

    End Sub


End Class
.