我正在研究一个小程序,但是在Visual Studio中运行我的程序时,我会收到以下错误:
getAsynckeystate'堆栈不平衡。这可能是因为托管PinVoke签名与非托管目标签名不符。
但是,当我将其构建到.exe时,它运行正好。但这使得很难调试程序。
这是引发错误的代码狙击手:
If InGame And Not GetAsyncKeyState(Keys.Tab) Then
If Settings.SkinChangera Then SkinChanger.Skinchanger()
End If
这是getAsynckeystate()
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
我建议您永远不会寻找或使用您从Internet获得的Declare Lib
语句。其中大多数都适用于 vb6 ,因此几乎总是与vb.net完全兼容。
而是坚持使用 DllImport
属性的解决方案。网站 pinvoke.net 是寻找P/Invoke声明的好地方。如果找不到P/Invoke声明的VB.NET版本,请拿C#版本并通过转换器运行,例如 telerik 。
话虽如此,您正在收到错误,因为参数和返回值不是正确的数据类型。 GetAsyncKeyState()
函数的参数应为 Integer
,其返回值应为 Short
。
使用正确的数据类型,请使用 DllImport
函数的版本,它应该有效:
<DllImport("user32.dll")> _
Public Shared Function GetAsyncKeyState(ByVal vKey As System.Windows.Forms.Keys) As Short
End Function
注意: System.Windows.Forms.Keys
枚举是类型Integer
。