Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VB.NET 2010中使用GetAsyncKeyState时PinVokesTack不平衡_Vb.net_Dllimport_Keypress_User32 - Fatal编程技术网

在VB.NET 2010中使用GetAsyncKeyState时PinVokesTack不平衡

在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

我试图做的是使用以下代码在我的主窗体上跟踪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
        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
后按键。然而,你不应该依赖于这最后的行为;有关更多信息,请参阅备注

在以下情况下,返回值为零:

  • 当前桌面不是活动桌面
  • 前台线程属于另一个进程,桌面不允许挂钩或日志记录