- 寫了一個鼠標鎖程序,但是ClipCursor函數的.net下調用卻出了點問題。以下是代碼,調試時出現
- [quote]對 PInvoke 函數“鼠標鎖!鼠標鎖.Form1::ClipCursor”的調用導致堆棧不對稱。原因可能是託管的 PInvoke 簽名與非託管的目標籤名不匹配。請檢查 PInvoke 簽名的調用約定和參數與非託管的目標籤名是否匹配。[/quote]
- 查找了MSDN中API函數在.net上運行發現,在VB6中的數據類型long在VB2005中要變成integer,我改過來,但是仍然出現錯誤。先在這裏描述一下問題,等待解決問題的時候,會將結果寫出來。
- Public Class Form1
- Public Structure RECT
- Dim Left As Integer
- Dim Top As Integer
- Dim Right As Integer
- Dim Bottom As Integer
- End Structure
- Public Declare Function ClipCursor Lib "user32" (ByVal lpRect As RECT) As Integer
- Public Sub lockMouse()
- Dim lockRECT As RECT
- lockRECT.Left = 0
- lockRECT.Top = 0
- lockRECT.Right = 0
- lockRECT.Bottom = 0
- ClipCursor(lockRECT)
- End Sub
- Public Sub openMouse()
- Dim openRECT As RECT
- openRECT.Left = 0
- openRECT.Top = 0
- openRECT.Right = Me.Width
- openRECT.Bottom = Me.Height
- ClipCursor(openRECT)
- End Sub
- Private Sub btnLock_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLock.Click
- lockMouse()
- End Sub
- Public password As String
- Private Sub btnSetPassword_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSetPassword.Click
- Try
- password = InputBox("請輸入你的密碼:")
- Catch ex As Exception
- MsgBox("請輸入正確有效的密碼", MsgBoxStyle.OkOnly)
- End Try
- End Sub
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- End Sub
- Private Sub btnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOpen.Click
- Dim OpenPassword As String
- Try
- OpenPassword = InputBox("請輸入密碼:")
- If OpenPassword = password Then
- openMouse()
- Else
- MsgBox("密碼錯誤")
- End If
- Catch ex As Exception
- MsgBox(ex.Message)
- End Try
- End Sub
- End Class
出現錯誤的原因出於聲明變量的方式上。
之前是用byval按值傳遞,因爲它傳遞的是數值,如果每次按值傳遞的話,原函數是指針傳遞,就會出現參數類型不符,所以應該用Byref.