質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

解決済

.Netでのローカルフックの仕方について

xail2222
xail2222

総合スコア1366

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

1回答

0リアクション

0クリップ

791閲覧

投稿2022/02/20 06:54

前提・実現したいこと

VB.Netでローカルフックを行う処理をしたい。
現状のソースコードでは、グローバルフックになってしまう。

実際のプログラムは、ArcMapのアドインなのですが
とりあえず、今回の質問は普通のVB.Netのフォームアプリケーションに関しての質問となります。
(フォームアプリケーションで出来たら、その方法をArcMapのアドインでも試そうとしています。)

参考にしたのは
VB.NETでキーフック
ローカルフック
等です。

現状のソースコード

VB.Net

Imports System.Runtime.InteropServices Public Class Form1 <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> Public Overloads Shared Function SetWindowsHookEx _ (ByVal idHook As Integer, ByVal HookProc As CallBack, ByVal hInstance As IntPtr, ByVal wParam As UInteger) As Integer End Function <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> Public Overloads Shared Function CallNextHookEx _ (ByVal idHook As Integer, ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer End Function Public Delegate Function CallBack( ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer <StructLayout(LayoutKind.Sequential)> Public Structure KeyboardLLHookStruct Public vkCode As Integer Public scanCode As Integer Public flags As Integer Public time As Integer Public dwExtraInfo As Integer End Structure Const WH_KEYBOARD_LL As Integer = 13 Const WM_KEYDOWN As Integer = &H100 Shared hHook As Integer = 0 Private hookproc As CallBack Public Function KeybordHookProc( ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer If (nCode < 0) Then Return CallNextHookEx(hHook, nCode, wParam, lParam) End If Dim hookStruct As New KeyboardLLHookStruct() hookStruct = CType(Marshal.PtrToStructure(lParam, hookStruct.GetType()), KeyboardLLHookStruct) If wParam = New IntPtr(WM_KEYDOWN) Then MsgBox(hookStruct.vkCode) Return 0 End If Return CallNextHookEx(hHook, nCode, wParam, lParam) End Function Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click hookproc = AddressOf KeybordHookProc hHook = SetWindowsHookEx(WH_KEYBOARD_LL, hookproc, Nothing, 0) If hHook.Equals(0) Then MsgBox("SetWindowsHookEx Failed") End If End Sub End Class

起こっている問題と試した事

現状のソースコードでは、ローカルフックにならずグローバルフックになってしまっています。
また、二番目のリンクに書いてあった「第4引数にカレントのスレッドIDを指定する必要があるみたいです。 」ということかな?と思い
C# でスレッド ID を取得する
を参考にして

VB.Net

hHook = SetWindowsHookEx(WH_KEYBOARD_LL, hookproc, Nothing, System.Threading.Thread.CurrentThread.ManagedThreadId)

としてみるとSetWindowsHookExが失敗します。(SetWindowsHookEx Failedが表示される)

どうすればローカルフックが出来るのでしょうか。

補足情報(FW/ツールのバージョンなど)

.Net Framework 4.6

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。