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

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

ただいまの
回答率

90.53%

  • Windows

    1678questions

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

  • VB.NET

    1047questions

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

  • Win32 API

    283questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 2,625

MUNEPON

score 5

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

Imports System.Runtime.InteropServices
Public Delegate Function CallBack(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer

Public Class MouseHookClass

    Dim WH_MOUSE_LL As Integer = 14
    Shared hHook As Integer = 0

    Private hookproc As CallBack

    <DllImport("kernel32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)>
    Public Overloads Shared Function GetModuleHandle(lpModuleName As String) As IntPtr
    End Function

    'Import for the SetWindowsHookEx function.
    <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 Integer) As Integer
    End Function

    'Import for the CallNextHookEx 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
    'Import for the UnhookWindowsHookEx function.
    <DllImport("User32.dll", CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
    Public Overloads Shared Function UnhookWindowsHookEx(ByVal idHook As Integer) As Boolean
    End Function

    'Point structure declaration.
    <StructLayout(LayoutKind.Sequential)> Public Structure Point
        Public x As Integer
        Public y As Integer
    End Structure

    <StructLayout(LayoutKind.Sequential)> _
    Public Class MouseLLHookStruct
        Public pt As Point
        Public mouseData As Integer
        Public flags As Integer
        Public time As Integer
        Public dwExtraInfo As Integer
    End Class

    'マウス操作の種類を表す。
    Public Enum MouseMessage
        'マウスカーソルが移動した。
        Move = &H200
        '左ボタンが押された。
        LDown = &H201
        '左ボタンが解放された。
        LUp = &H202
        '右ボタンが押された。
        RDown = &H204
        '左ボタンが解放された。
        RUp = &H205
        '中ボタンが押された。
        MDown = &H207
        '中ボタンが解放された。
        MUp = &H208
        'ホイールが回転した。
        Wheel = &H20A
        'Xボタンが押された。
        XDown = &H20B
        'Xボタンが解放された。
        XUp = &H20C
    End Enum


    Public Event MouseHook(sender As Object, e As MouseHookEventArgs)
    Public Class MouseHookEventArgs
        Inherits EventArgs

        Private _mousestatus As MouseLLHookStruct
        Private _mousemessage As MouseMessage
        Public Sub New(mousemessage As MouseMessage, mousestatus As MouseLLHookStruct)
            _mousemessage = mousemessage
            _mousestatus = mousestatus
        End Sub

        ''' <summary>
        ''' マウスカーソルの位置(スクリーン座標)
        ''' </summary>
        Public ReadOnly Property Point As Point
            Get
                Return _mousestatus.pt
            End Get
        End Property

        ''' <summary>
        ''' マウスの状態
        ''' </summary>
        Public ReadOnly Property Message As MouseMessage
            Get
                Return _mousemessage
            End Get
        End Property
    End Class


    ''' <summary>
    ''' 現在マウスをフックしているか返す
    ''' </summary>
    ''' <returns>False:フックしていない  True:フックしている</returns>
    ''' <remarks></remarks>
    Public ReadOnly Property Hooked As Boolean
        Get
            Return If(hHook = 0, False, True)
        End Get
    End Property

    ''' <summary>
    ''' マウスフックを開始する
    ''' </summary>
    ''' <returns>False:フックに失敗もしくはフック済み True:フックに成功</returns>
    ''' <remarks></remarks>
    Public Function MouseHookStart() As Boolean
        If hHook.Equals(0) Then
            'マウスフックを開始する
            hookproc = AddressOf MouseLLHookProc
            hHook = SetWindowsHookEx(WH_MOUSE_LL, hookproc, GetModuleHandle(IntPtr.Zero), 0)
            If hHook.Equals(0) Then
                Return False
            Else
                Return True
            End If
        Else
            'マウスフックがすでに開始されている
            Return False
        End If

    End Function

    ''' <summary>
    ''' マウスフックを終了する
    ''' </summary>
    ''' <returns>False:フック解除に失敗もしくはフックしていない True:フック解除に成功</returns>
    ''' <remarks></remarks>
    Public Function MouseHookEnd() As Boolean
        If hHook.Equals(0) Then
            'マウスフックが開始されていない
            Return False
        Else
            'マウスフックを終了する
            Dim ret As Boolean = UnhookWindowsHookEx(hHook)

            If ret.Equals(False) Then
                Return False
            Else
                hHook = 0
                Return True
            End If
        End If

    End Function

    Private Function MouseLLHookProc(ByVal nCode As Integer, ByVal wParam As MouseMessage, ByVal lParam As IntPtr) As Integer
        Dim MyMouseHookStruct As New MouseLLHookStruct()

        If nCode = 0 Then
            MyMouseHookStruct = CType(Marshal.PtrToStructure(lParam, MyMouseHookStruct.GetType()), MouseLLHookStruct)
            'イベントを発生させる
            RaiseEvent MouseHook(Nothing, New MouseHookEventArgs(wParam, MyMouseHookStruct))
        End If

        Return CallNextHookEx(hHook, nCode, wParam, lParam)
    End Function

End Class

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

Public Class Form1

    Private WithEvents MouseHook As New MouseHookClass

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Button1.Text = "MouseHook Start"
    End Sub

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
        If MouseHook.Hooked = True Then
            MouseHook.MouseHookEnd()
        End If
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        If MouseHook.Hooked = False Then
            If MouseHook.MouseHookStart() = True Then
                Button1.Text = "MouseHook End"
            End If
        Else
            If MouseHook.MouseHookEnd() = True Then
                Button1.Text = "MouseHook Start"
            End If
        End If
    End Sub

    Private Sub MouseHook_MouseHook(sender As Object, e As MouseHookClass.MouseHookEventArgs) Handles MouseHook.MouseHook
        Label1.Text = String.Format("X = {0}:Y = {1} : Message = {2}", e.Point.x, e.Point.y, e.Message)
    End Sub

End Class

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/18 19:36

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

    キャンセル

0

こんにちは。

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/18 19:42

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

    キャンセル

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

  • Windows

    1678questions

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

  • VB.NET

    1047questions

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

  • Win32 API

    283questions

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