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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

VB.NET

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

Q&A

解決済

2回答

9505閲覧

VB.NETでのマウスのグローバルフックの方法

MUNEPON

総合スコア13

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

VB.NET

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

0グッド

1クリップ

投稿2017/02/04 11:38

いつもお世話になっております。

VB.NETでグローバルフックができない事は把握をしているのですが、グローバルフックのような手段を用いたいのでご協力いただけないでしょうか。

主に行いたい事は、
グローバルフックを仕掛けた状態でクリックを行った時のみForm外のマウスのポジションを取得をする。
です。

大まかな質問で申し訳ございませんがご教授いただけないでしょうか。
よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

適当にクラスを作ってみました。
エラー処理などしていないので注意してください。

VB.NET

1Imports System.Runtime.InteropServices 2Public Delegate Function CallBack(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer 3 4Public Class MouseHookClass 5 6 Dim WH_MOUSE_LL As Integer = 14 7 Shared hHook As Integer = 0 8 9 Private hookproc As CallBack 10 11 <DllImport("kernel32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> 12 Public Overloads Shared Function GetModuleHandle(lpModuleName As String) As IntPtr 13 End Function 14 15 'Import for the SetWindowsHookEx function. 16 <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _ 17 Public Overloads Shared Function SetWindowsHookEx(ByVal idHook As Integer, ByVal HookProc As CallBack, ByVal hInstance As IntPtr, ByVal wParam As Integer) As Integer 18 End Function 19 20 'Import for the CallNextHookEx function. 21 <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _ 22 Public Overloads Shared Function CallNextHookEx(ByVal idHook As Integer, ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer 23 End Function 24 'Import for the UnhookWindowsHookEx function. 25 <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _ 26 Public Overloads Shared Function UnhookWindowsHookEx(ByVal idHook As Integer) As Boolean 27 End Function 28 29 'Point structure declaration. 30 <StructLayout(LayoutKind.Sequential)> Public Structure Point 31 Public x As Integer 32 Public y As Integer 33 End Structure 34 35 <StructLayout(LayoutKind.Sequential)> _ 36 Public Class MouseLLHookStruct 37 Public pt As Point 38 Public mouseData As Integer 39 Public flags As Integer 40 Public time As Integer 41 Public dwExtraInfo As Integer 42 End Class 43 44 'マウス操作の種類を表す。 45 Public Enum MouseMessage 46 'マウスカーソルが移動した。 47 Move = &H200 48 '左ボタンが押された。 49 LDown = &H201 50 '左ボタンが解放された。 51 LUp = &H202 52 '右ボタンが押された。 53 RDown = &H204 54 '左ボタンが解放された。 55 RUp = &H205 56 '中ボタンが押された。 57 MDown = &H207 58 '中ボタンが解放された。 59 MUp = &H208 60 'ホイールが回転した。 61 Wheel = &H20A 62 'Xボタンが押された。 63 XDown = &H20B 64 'Xボタンが解放された。 65 XUp = &H20C 66 End Enum 67 68 69 Public Event MouseHook(sender As Object, e As MouseHookEventArgs) 70 Public Class MouseHookEventArgs 71 Inherits EventArgs 72 73 Private _mousestatus As MouseLLHookStruct 74 Private _mousemessage As MouseMessage 75 Public Sub New(mousemessage As MouseMessage, mousestatus As MouseLLHookStruct) 76 _mousemessage = mousemessage 77 _mousestatus = mousestatus 78 End Sub 79 80 ''' <summary> 81 ''' マウスカーソルの位置(スクリーン座標) 82 ''' </summary> 83 Public ReadOnly Property Point As Point 84 Get 85 Return _mousestatus.pt 86 End Get 87 End Property 88 89 ''' <summary> 90 ''' マウスの状態 91 ''' </summary> 92 Public ReadOnly Property Message As MouseMessage 93 Get 94 Return _mousemessage 95 End Get 96 End Property 97 End Class 98 99 100 ''' <summary> 101 ''' 現在マウスをフックしているか返す 102 ''' </summary> 103 ''' <returns>False:フックしていない True:フックしている</returns> 104 ''' <remarks></remarks> 105 Public ReadOnly Property Hooked As Boolean 106 Get 107 Return If(hHook = 0, False, True) 108 End Get 109 End Property 110 111 ''' <summary> 112 ''' マウスフックを開始する 113 ''' </summary> 114 ''' <returns>False:フックに失敗もしくはフック済み True:フックに成功</returns> 115 ''' <remarks></remarks> 116 Public Function MouseHookStart() As Boolean 117 If hHook.Equals(0) Then 118 'マウスフックを開始する 119 hookproc = AddressOf MouseLLHookProc 120 hHook = SetWindowsHookEx(WH_MOUSE_LL, hookproc, GetModuleHandle(IntPtr.Zero), 0) 121 If hHook.Equals(0) Then 122 Return False 123 Else 124 Return True 125 End If 126 Else 127 'マウスフックがすでに開始されている 128 Return False 129 End If 130 131 End Function 132 133 ''' <summary> 134 ''' マウスフックを終了する 135 ''' </summary> 136 ''' <returns>False:フック解除に失敗もしくはフックしていない True:フック解除に成功</returns> 137 ''' <remarks></remarks> 138 Public Function MouseHookEnd() As Boolean 139 If hHook.Equals(0) Then 140 'マウスフックが開始されていない 141 Return False 142 Else 143 'マウスフックを終了する 144 Dim ret As Boolean = UnhookWindowsHookEx(hHook) 145 146 If ret.Equals(False) Then 147 Return False 148 Else 149 hHook = 0 150 Return True 151 End If 152 End If 153 154 End Function 155 156 Private Function MouseLLHookProc(ByVal nCode As Integer, ByVal wParam As MouseMessage, ByVal lParam As IntPtr) As Integer 157 Dim MyMouseHookStruct As New MouseLLHookStruct() 158 159 If nCode = 0 Then 160 MyMouseHookStruct = CType(Marshal.PtrToStructure(lParam, MyMouseHookStruct.GetType()), MouseLLHookStruct) 161 'イベントを発生させる 162 RaiseEvent MouseHook(Nothing, New MouseHookEventArgs(wParam, MyMouseHookStruct)) 163 End If 164 165 Return CallNextHookEx(hHook, nCode, wParam, lParam) 166 End Function 167 168End Class 169

動作確認用フォームのソース

VB.NET

1Public Class Form1 2 3 Private WithEvents MouseHook As New MouseHookClass 4 5 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 6 Button1.Text = "MouseHook Start" 7 End Sub 8 9 Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing 10 If MouseHook.Hooked = True Then 11 MouseHook.MouseHookEnd() 12 End If 13 End Sub 14 15 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 16 17 If MouseHook.Hooked = False Then 18 If MouseHook.MouseHookStart() = True Then 19 Button1.Text = "MouseHook End" 20 End If 21 Else 22 If MouseHook.MouseHookEnd() = True Then 23 Button1.Text = "MouseHook Start" 24 End If 25 End If 26 End Sub 27 28 Private Sub MouseHook_MouseHook(sender As Object, e As MouseHookClass.MouseHookEventArgs) Handles MouseHook.MouseHook 29 Label1.Text = String.Format("X = {0}:Y = {1} : Message = {2}", e.Point.x, e.Point.y, e.Message) 30 End Sub 31 32End Class 33

投稿2017/02/05 00:42

YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MUNEPON

2017/02/18 10:36

返答が遅くなってしまい申し訳ございませんでした。 おかげさまで目的を達成することができました。
guest

0

こんにちは。

SetWindowsHookExで低レベルフックであれば出来るようなので
マウスクリック時のポジション取得は出来るのではないでしょうか。

https://support.microsoft.com/en-us/help/318804/how-to-set-a-windows-hook-in-visual-c-.net

投稿2017/02/04 12:53

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MUNEPON

2017/02/18 10:42

回答して頂いたにも関わらず返答が遅くなってしまい申し訳ございませんでした。 Tak1waさんのおかげで少し理解を深められたような気がします。 今後ともよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問