在VB.NET 2010中使用GetAsyncKeyState时PinVokesTack不平衡
我试图做的是使用以下代码在我的主窗体上跟踪Ctrl+Tab键在VB.NET 2010中使用GetAsyncKeyState时PinVokesTack不平衡,vb.net,dllimport,keypress,user32,Vb.net,Dllimport,Keypress,User32,我试图做的是使用以下代码在我的主窗体上跟踪Ctrl+Tab键 <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
<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
私有共享函数GetAsyncKeyState(ByVal vKey为System.Windows.Forms.Keys)简称
端函数
私有只读属性CtrlPressed为布尔值
得到
Dim keyval为整数
keyval=GetAsyncKeyState(Keys.ControlKey)
如果keyval=0,则
CtrlPressed=False
其他的
CtrlPressed=True
如果结束
结束
端属性
但是,在调用属性CtrlPressed
时,我得到了PinVokesTackDistancer
错误。我确信GetAsyncKeyState
的声明和导入的InteropServices
都是正确的,但是CtrlPressed
属性在语法上有问题。我如何解决这个问题
谢谢堆栈不平衡错误几乎总是意味着p/Invoke定义签名错误。首先要做的是仔细检查所有类型,确保它们与本机函数的文档签名相匹配。在这种情况下,它看起来不错 除了您已将
PreserveSig
设置为False
,我不确定原因。如该字段所示,它设计用于返回错误代码的非托管方法(例如,HRESULT
code)。它指示运行时自动将这些错误代码转换为异常。但是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
_
私有共享函数GetAsyncKeyState(ByVal vKey作为键)为短
端函数
私有只读属性被压缩为布尔值
得到
Dim显示为Short=GetAsyncKeyState(Keys.ControlKey)
返回(iPressed&H8000)!=0
结束
端属性
确保您已密切关注GetAsyncKeyState
函数的。具体而言,关于返回值的部分:
如果函数成功,返回值将指定自上次调用GetAsyncKeyState
以来是否按下该键,以及该键当前是向上还是向下。如果设置了最高有效位,则按键向下;如果设置了最低有效位,则在上一次调用GetAsyncKeyState
后按键。然而,你不应该依赖于这最后的行为;有关更多信息,请参阅备注
在以下情况下,返回值为零:
- 当前桌面不是活动桌面
- 前台线程属于另一个进程,桌面不允许挂钩或日志记录