Para garantizar que la rutina funcione en los sistemas de 32 y 64 bits, debe realizar una pequeña comprobación adicional. En casos como estos, utilizo el reflector para ver cómo el marco implementa los pinvokes. En particular, eche un vistazo a System.Windows.Forms.SafeNativeMethods y System.Windows.Forms.UnSafeNativeMethods.
A continuación se muestra el código que uso que aprovecha los métodos de extensión.
'See: System.Windows.Forms.SafeNativeMethods.SetWindowPos
<DllImport("user32.dll", CharSet:=CharSet.Auto, ExactSpelling:=True)> _
Private Function SetWindowPos(ByVal hWnd As HandleRef, ByVal hWndInsertAfter As HandleRef, ByVal x As Integer, ByVal y As Integer, ByVal cx As Integer, ByVal cy As Integer, ByVal flags As Integer) As Boolean
End Function
'See: System.Windows.Forms.UnSafeNativeMethods.GetWindowLong*
<DllImport("user32.dll", EntryPoint:="GetWindowLong", CharSet:=CharSet.Auto)> _
Private Function GetWindowLong32(ByVal hWnd As HandleRef, ByVal nIndex As Integer) As IntPtr
End Function
<DllImport("user32.dll", EntryPoint:="GetWindowLongPtr", CharSet:=CharSet.Auto)> _
Private Function GetWindowLongPtr64(ByVal hWnd As HandleRef, ByVal nIndex As Integer) As IntPtr
End Function
Private Function GetWindowLong(ByVal hWnd As HandleRef, ByVal nIndex As Integer) As IntPtr
If (IntPtr.Size = 4) Then
Return GetWindowLong32(hWnd, nIndex)
End If
Return GetWindowLongPtr64(hWnd, nIndex)
End Function
'See: System.Windows.Forms.UnSafeNativeMethods.SetWindowLong*
<DllImport("user32.dll", EntryPoint:="SetWindowLong", CharSet:=CharSet.Auto)> _
Private Function SetWindowLongPtr32(ByVal hWnd As HandleRef, ByVal nIndex As Integer, ByVal dwNewLong As HandleRef) As IntPtr
End Function
<DllImport("user32.dll", EntryPoint:="SetWindowLongPtr", CharSet:=CharSet.Auto)> _
Private Function SetWindowLongPtr64(ByVal hWnd As HandleRef, ByVal nIndex As Integer, ByVal dwNewLong As HandleRef) As IntPtr
End Function
Private Function SetWindowLong(ByVal hWnd As HandleRef, ByVal nIndex As Integer, ByVal dwNewLong As HandleRef) As IntPtr
If (IntPtr.Size = 4) Then
Return SetWindowLongPtr32(hWnd, nIndex, dwNewLong)
End If
Return SetWindowLongPtr64(hWnd, nIndex, dwNewLong)
End Function
'See: System.Windows.Forms.Control.SetWindowStyle
Private Sub SetWindowStyle(ByVal form As Form, ByVal flag As Integer, ByVal value As Boolean)
Dim windowLong As Integer = CInt(CLng(GetWindowLong(New HandleRef(form, form.Handle), -16)))
Dim ip As IntPtr
If value Then
ip = New IntPtr(windowLong Or flag)
Else
ip = New IntPtr(windowLong And Not flag)
End If
SetWindowLong(New HandleRef(form, form.Handle), -16, New HandleRef(Nothing, ip))
End Sub
<Extension()> _
Public Sub ShowCaption(ByVal form As Form)
SetWindowStyle(form, &H400000, True)
ApplyStyleChanges(form)
End Sub
<Extension()> _
Public Sub HideCaption(ByVal form As Form)
SetWindowStyle(form, &H400000, False)
ApplyStyleChanges(form)
End Sub
<Extension()> _
Public Function ApplyStyleChanges(ByVal form As Form) As Boolean
Return SetWindowPos(New HandleRef(form, form.Handle), NullHandleRef, 0, 0, 0, 0, &H37)
End Function
parece lo que estoy buscando, muchas gracias – beakersoft
la solución de @Contraptor a continuación es la solución correcta a este problema –