2011-12-21 2 views
0

내가 코드를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 

를 사용하여 내 기본 폼에 Ctrl + Tab 키 누르기를 추적 따르고 할 노력하고있어하지만 부동산 CtrlPressed를 호출하는 동안 나는 PInvokeStackImbalance 받고 있어요 오류. 나는 GetAsyncKeyState의 선언으로 확신하지만 또한 InteropServices을 가져 왔지만 CtrlPressed 속성에는 구문 적으로 잘못된 것이 있습니다. 이 문제를 어떻게 해결할 수 있습니까?

감사

답변

1

스택 불균형 오류가 거의 항상 P/호출 정의 서명이 잘못된 것을 의미한다. 가장 먼저 할 일은 모든 타입을주의 깊게 체크하고 네이티브 함수에 대한 문서화 된 서명과 일치하는지 확인하는 것입니다. 이 경우에는 좋게 보입니다.

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 

것은 당신이 GetAsyncKeyState 함수의 documentation에주의를 지불했는지 확인하십시오. 특히, 반환 값의 영역 : 함수가 성공하면

, 반환 값은 키가 현재 위 또는 아래인지 키가 GetAsyncKeyState 마지막 호출 이후 눌렀는지 여부를 지정합니다. 최상위 비트가 설정되면 키는 작동 중지되고 최하위 비트가 설정되면 GetAsyncKeyState을 호출 한 후 키가 눌 렸습니다. 그러나이 마지막 동작에 의존해서는 안됩니다. 자세한 내용은주의를 참조하십시오.

반환 값은 다음과 같은 경우에 제로 :

  • 현재 바탕 화면 전경 스레드가 다른 프로세스에 속하는 활성 바탕 화면
  • 하지 않고 바탕 화면이 훅 또는 저널 기록을 허용하지 않습니다 .
+0

감사합니다 .-) 당신은 항상 .NET 쿼리를 도와주었습니다 ... – Kushal