我用vb.net 调用 InvalidateRect 重绘桌面,怎么改参数,都是这个提示 对 PInvoke 函数“AbuBoard!AbuBoard.API::InvalidateRect”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。    Public Structure RECT
        Dim Left As Int32 '矩形左上角的X坐标
        Dim Top As Int32 '矩形左上角的Y坐标
        Dim Right As Int32 '矩形右下角的X坐标
        Dim Bottom As Int32 '矩形右下角的Y坐标
    End Structure    <DllImport("user32.dll")> _
    Public Shared Sub InvalidateRect(ByVal hwnd As Int32, ByVal lpRect As RECT, ByVal bErase As Int32)
    End Sub
        Dim r As API.RECT
        r.Left = 0
        r.Top = 0
        r.Bottom = My.Computer.Screen.Bounds.Height
        r.Right = My.Computer.Screen.Bounds.Width
        API.InvalidateRect(API.GetDesktopWindow, r, CType(1, Int32))

解决方案 »

  1.   

    Public Shared Sub InvalidateRect(ByVal hwnd As Int32, ByVal lpRect As RECT, ByVal bErase As Int32)
    确保 这里的 函数 参数个数
    和 类型匹配
      

  2.   

    C# Signature:
    [DllImport("user32.dll")]
    static extern bool InvalidateRect(IntPtr hWnd, IntPtr lpRect, bool bErase);VB Signature:
    Public Overloads Declare Function InvalidateRect Lib "User32" Alias "InvalidateRect" (ByVal hWnd As Int32, ByRef lpRect As RECT, ByVal bErase As Boolean) As Boolean
    Public Overloads Declare Function InvalidateRect Lib "User32" Alias "InvalidateRect" (ByVal hWnd As Int32, ByVal lpRect As IntPtr, ByVal bErase As Boolean) As Boolean
    Public Overloads Shared Function InvalidateRect(ByVal hWnd As Int32, ByVal bErase As Boolean) As Boolean
         Return InvalidateRect(hWnd, IntPtr.Zero, bErase)
    End Function
    Public Overloads Shared Function InvalidateRect(ByVal hWnd As Int32, ByVal lpRect As System.Drawing.Rectangle, ByVal bErase As Boolean) As Boolean
         Return InvalidateRect(hWnd, RECT.FromRectangle(lpRect), bErase)
    End Function
      

  3.   

    这是一个function,我定义成sub了,好像是这个问题,改了就好了,谢谢