2012-02-26 40 views
0

我的測試:插入項目爲形式的系統菜單

Public Class Form1 

    Public Const WM_SYSCOMMAND As Int32 = &H112 
    Public Const MF_BYPOSITION As Int32 = &H400 
    Public Const MYMENU1 As Int32 = 1000 
    Public Const MYMENU2 As Int32 = 1001 

    Dim hSysMenu As Long 


    Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long 
    Public Declare Function InsertMenu Lib "user32" Alias "InsertMenuA" _ 
     (ByVal hMenu As IntPtr, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As String) As Boolean 

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 
     MyBase.WndProc(m) 
     If (m.Msg = WM_SYSCOMMAND) Then 
     Select Case m.WParam.ToInt32 
      Case MYMENU1 
       MsgBox("1") 
      Case MYMENU2 
       MsgBox("2") 
     End Select 
     End If 
    End Sub 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     hSysMenu = GetSystemMenu(Me.Handle, False) 
     InsertMenu(hSysMenu, 5, MF_BYPOSITION, MYMENU1, "My Menu 1") 
     InsertMenu(hSysMenu, 6, MF_BYPOSITION, MYMENU2, "My Menu 2") 

    End Sub 
End Class 

,我得到一個錯誤:檢測

PInvokeStackImbalance 消息:對PInvoke的函數調用 'WindowsApplication1 WindowsApplication1.Form1 :: GetSystemMenu!'已經失去了平衡。這很可能是因爲託管的PInvoke簽名與非託管目標籤名不匹配。檢查PInvoke簽名的調用約定和參數是否與目標非託管簽名相匹配。

回答

1

在聲明中用Integer代替Long

+0

工作正常,謝謝 – 2012-02-26 12:18:42