Prima regola con VB.NET: non riciclare mai le dichiarazioni delle API di VB6, perché i tipi di dati non corrispondono.
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.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)
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

Rispondi quotando