|  | 分類:[.NET 全般]
 
 
 開発環境
OS:Win10 Pro(20H2)
VisualStdio2012 VisualBasic、Framework4.5
PrintScreenを無効化する処理があり、以前は正常に動作していましたが、
VisualStdio2005、Framework2.0からVisualStdio2012、Framework4.5へコンバージョンしたところ、
キーボード入力時に以下のエラーメッセージが発生するようになりました。
*******
PlnvokeStacklmbalanceが検出されました。
CallNextHookExがスタックを不安定にしています。
Plnvokeシグネチャがアンマネージターゲットシグネチャに一致していないことが原因として
考えられます。呼び出し規約、およびPlnvokeシグネチャのパラメータがターゲットのアンマネージシグネチャに一致していることを確認してください。
*******
解決方法をご存知の方いらっしゃいましたら教えて頂けませんでしょうか?
宜しくお願い致します。
ソースの一部は以下となります
Public Declare Function SetWindowsHookEx Lib "user32" _
  Alias "SetWindowsHookExA" (ByVal idHook As Integer, _
  ByVal lpfn As KeyboardHookDelegate, ByVal hmod As Integer, _
  ByVal dwThreadId As Integer) As Integer
Private Declare Function CallNextHookEx Lib "user32" _
  (ByVal hHook As Integer, _
  ByVal nCode As Integer, _
  ByVal wParam As Integer, _
  ByVal lParam As KBDLLHOOKSTRUCT) As Integer
Public Structure KBDLLHOOKSTRUCT
    Public vkCode As Integer
    Public scanCode As Integer
    Public flags As Integer
    Public time As Integer
    Public dwExtraInfo As Integer
End Structure
'メイン処理
Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Call HookKeyboard()
End Sub
Public Sub HookKeyboard()
    callback = New KeyboardHookDelegate(AddressOf KeyboardCallback)
    KeyboardHandle = SetWindowsHookEx(WH_KEYBOARD_LL, callback, Marshal.GetHINSTANCE( _
      [Assembly].GetExecutingAssembly.GetModules()(0)).ToInt32, 0)
End Sub
Public Function KeyboardCallback(ByVal Code As Integer, _
  ByVal wParam As Integer, _
  ByRef lParam As KBDLLHOOKSTRUCT) As Integer
    If (Code = HC_ACTION) Then
        If (IsHooked(lParam)) Then
            Return 1
        End If
    End If
    Return CallNextHookEx(KeyboardHandle, Code, wParam, lParam) '←ここでエラー
End Function
Public Function IsHooked(ByRef Hookstruct As KBDLLHOOKSTRUCT) As Boolean
    'プリントスクリーン無効
    If (Hookstruct.vkCode = Keys.PrintScreen) Then
        Return True
    End If
    Return False
End Function
 |