|
分類:[.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
|