2011-12-21 44 views
0

我試圖做的是用我的追蹤主窗體上Ctrl + Tab鍵按鍵下面的代碼PInvokeStackImbalance 2010

<DllImport("user32.dll", PreserveSig:=False)> 
Private Shared Function GetAsyncKeyState(ByVal vKey As System.Windows.Forms.Keys) As Short 
End Function 

Private ReadOnly Property CtrlPressed As Boolean 
    Get 
     Dim keyval As Integer 
     keyval = GetAsyncKeyState(Keys.ControlKey) 
     If keyval = 0 Then 
      CtrlPressed = False 
     Else 
      CtrlPressed = True 
     End If 
    End Get 
End Property 

但同時呼籲物業CtrlPressed我越來越PInvokeStackImbalance錯誤。我確定聲明爲GetAsyncKeyState,並且還導入了InteropServices,但CtrlPressed屬性在語法上有一些錯誤。我該如何解決這個問題?

感謝

回答

1

堆棧不平衡錯誤幾乎總是意味着你的P/Invoke定義簽名是錯誤的。首先要做的是仔細檢查所有類型,並確保它們與本機函數的記錄簽名匹配。在這種情況下,它看起來不錯。

除非您已設置PreserveSigFalse,我真的不知道爲什麼。由於該字段的documentation指示,它設計用於返回錯誤代碼的非託管方法(例如,HRESULT代碼)。它指示運行時自動將這些錯誤代碼轉換爲例外。但GetAsyncKeyState方法不會返回錯誤代碼,因此啓用此選項沒有多大意義。

下面的代碼工作正常,我:

<DllImport("user32.dll")> _ 
Private Shared Function GetAsyncKeyState(ByVal vKey As Keys) As Short 
End Function 

Private ReadOnly Property IsCtrlPressed As Boolean 
    Get 
     Dim isPressed As Short = GetAsyncKeyState(Keys.ControlKey) 
     Return (isPressed & &H8000) != 0 
    End Get 
End Property 

確保你已經關注到documentationGetAsyncKeyState功能。具體來說,在返回值的部分:

如果函數成功,返回值指定鍵是否因爲對GetAsyncKeyState最後一次通話壓,關鍵是目前向上或向下。如果設置了最高有效位,則該鍵關閉,如果設置了最低有效位,則在先前調用GetAsyncKeyState之後按下該鍵。但是,你不應該依賴這最後的行爲;欲瞭解更多信息,請參閱備註。

返回值是以下情況下零:

  • 當前桌面不是活動桌面
  • 前臺線程屬於另一個進程,並在桌面不允許鉤或日誌記錄。
+0

感謝:-)你一直在幫我處理.NET查詢...... – Kushal 2011-12-21 10:44:21

相關問題