VB.NETでグローバルマウスイベント(移動、クリック)に登録するにはどうすればよいですか?

バーナースク

軽量のリモートサービスアプリケーション(RDP、TeamViewerなど)を独自に実装するには、マウスの移動や左/右/中央などのクリックなど、システムの(またはグローバルな)マウスイベントをリッスンする必要があります。

システムのマウス位置を照会するためのマネージドインターフェイス/ APIがあることがわかりました。

Dim pos As System.Drawing.Point = Windows.Forms.Cursor.Position
Label1.Text = String.Format("Current Position: {0} - {1}", pos.X, pos.Y)

しかし、クラスWindows.Forms.Cursorにはイベントがないようです。登録/聞くことができます。Private WithEvents MyCurser As Windows.Forms.CursorのリストはありませんHandles

より明確にするために:私のアプリケーションはマウスイベントのみを転送するRDPやTeamViewerのようなリモートサービスアプリケーションであるため、アプリケーションの外部でマウスイベントを追跡したい(したがって、自分のフォームへのクリックイベントリスナーは適用されません)ディスプレイ)をリモートコンピュータに送信します。

マウスの位置の変更をイベントとして取得する管理された(.NET)方法はありますか(位置を照会するためのタイマーは必要ありません)、またユーザーがマウスのボタンをクリックした(クリックしている)かどうか(およびそれは何のボタンですか)?

ボーナスの質問:マウスの移動/クリックの「イベント」が、実際にマウスを操作している人間ではなく、別のソフトウェアによってトリガーされた場合、ソリューションは機能しますか?

ビジュアルヴィンセント

InputHelperという私のライブラリを使用できますこれは、.NET開発者がマウスとキーボードの入力をシンプルかつ正確にキャプチャしてシミュレートできるように構築されています。

ユーザーが非推奨のAPIを使用したり、P / Invoke署名を使用したりする、Stack Overflowの質問が多すぎるのを見て答えた後、これを.NETに適した入力管理方法として作成することにしました。ユーザーがインターネット上のさまざまな場所から収集した唯一の部分的に正しいコードと戦うため。

InputHelperは、ネイティブのWindows API(WinAPIの)を中心に構築されており、のような機能を利用しているSendInput()SendMessage()/PostMessage()そしてSetWindowsHookEx()その仕事を得るためには。

そのウィキはまだ遠い完全から私はマウスとキーボードのフックを文書化してきたように、ライブラリはあなたのコードを入力すると、自動的にIntelliSenseで表示され、その中のすべての機能を説明するコメントを含むXMLドキュメントファイルが含ましかし悲しいことです。したがって、ライブラリのミニドキュメントと概要については、いつでもVisual Studioのオブジェクトブラウザを開いて(F12任意のタイプまたは名前空間を押すか、に移動してView > Object Browser)、そこで見つけることができます。

InputHelperは現在、次の4つのケアで構成されています。

  • InputHelper.Hooks:システム全体のマウスおよびキーボード入力をキャプチャするためのクラス。これは、たとえば、ホットキーを作成するために使用できます。

  • InputHelper.Keyboard:物理的な(「実際の」)キーボード入力/キーストロークをシミュレートする方法。

  • InputHelper.Mouse:物理的なマウス入力をシミュレートする方法。

  • InputHelper.WindowMessages:より仮想的なレベルでマウスとキーボードの入力をシミュレートする方法。これはウィンドウメッセージ(Send-/PostMessage)を利用し、特定のウィンドウをターゲットにするために使用できます。

あなたが探しているのはInputHelper.Hooks、具体的にはInputHelper.Hooks.MouseHookです。

まず、[リリース]ページでライブラリのコンパイル済みバージョンをダウンロードし、プロジェクトへの参照として追加します。便宜上InputHelperLib、使用するファイルに名前空間をインポートします。

Imports InputHelperLib

ここで、マウスフックを作成する最も簡単な方法は、MouseHookクラスのインスタンスをクラスレベルでインスタンス化することです。

Dim MouseHook As New InputHelper.Hooks.MouseHook

これは、変数がスコープ外になるまで、または変数を呼び出すまで、マウスイベントをリッスンしますDispose()

フックをすぐに開始したくない場合は、変数を宣言して、いつでも初期化してください。

Dim MouseHook As InputHelper.Hooks.MouseHook

'Start the hook at the click of a button.
Private Sub StartButton_Click(sender As Object, e As EventArgs) Handles StartButton.Click
    If MouseHook Is Nothing Then
        MouseHook = New InputHelper.Hooks.MouseHook
    End If
End Sub

フックには4つのイベントが含まれます。

  • MouseDown -マウスボタンを押すか押したままにすると発生します。

  • MouseMove -マウスが動くと発生します。

  • MouseUp -マウスボタンを離したときに発生します。

  • MouseWheel -マウスホイールをスクロールすると発生します。

AddHandlerステートメントを使用してイベントをサブスクライブできます

Dim MouseHook As InputHelper.Hooks.MouseHook

'Start the hook at the click of a button.
Private Sub StartButton_Click(sender As Object, e As EventArgs) Handles StartButton.Click
    If MouseHook Is Nothing Then
        MouseHook = New InputHelper.Hooks.MouseHook

        AddHandler MouseHook.MouseDown, AddressOf MouseHook_MouseDown
        AddHandler MouseHook.MouseMove, AddressOf MouseHook_MouseMove
        AddHandler MouseHook.MouseWheel, AddressOf MouseHook_MouseWheel
    End If
End Sub

MouseDownイベントハンドラーの

Private Sub MouseHook_MouseDown(sender As Object, e As InputHelperLib.InputHelper.Hooks.MouseHookEventArgs)
    If e.Button = System.Windows.Forms.MouseButtons.Left AndAlso e.DoubleClick = True Then
        MessageBox.Show("Left mouse button was double-clicked.")
    End If
End Sub

MouseMoveイベントハンドラーの

Private Sub MouseHook_MouseMove(sender As Object, e As InputHelperLib.InputHelper.Hooks.MouseHookEventArgs)
    LogTextBox.AppendText("Mouse moved to (X: " & e.Location.X & ", Y: " & e.Location.Y & ")")
End Sub

MouseWheelイベントハンドラーの

Private Sub MouseHook_MouseWheel(sender As Object, e As InputHelperLib.InputHelper.Hooks.MouseHookEventArgs)
    If e.Delta > 0 AndAlso e.ScrollDirection = InputHelper.Hooks.ScrollDirection.Vertical Then
        MessageBox.Show("Mouse scrolled up")
    End If
End Sub

これで、機能するグローバルマウスフックができました。

フックとそのイベント引数の詳細については、プロジェクトのwikiを参照してください

ボーナスの質問:マウスの移動/クリックの「イベント」が、実際にマウスを操作している人間ではなく、別のソフトウェアによってトリガーされた場合、ソリューションは機能しますか?

はいといいえ。他のソフトウェアがどのようにイベントをトリガーしたかによって異なります。SendInput実際の物理的な入力をシミュレートするために使用するか、同様の場合は、はい。ウィンドウメッセージを使用して特定のウィンドウをターゲットにする場合は、いいえ。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

vb.netを使用する; スクロール可能なパネルでスクロールイベントをリッスンするにはどうすればよいですか?

分類Dev

未処理の例外をvb.netクラスライブラリプロジェクトに記録するにはどうすればよいですか?

分類Dev

vb.netでコントロールを動的に参照するにはどうすればよいですか?

分類Dev

ユーザーがvb6.0プロジェクトソフトウェアからログアウトしたときにネットワークドライバーのマップを解除するにはどうすればよいですか?

分類Dev

vb.netのフォームの任意の場所でマウスクリックを検出するにはどうすればよいですか?

分類Dev

vb.netコードビハインドで作成されたドロップダウンリストにハイパーリンクを追加するにはどうすればよいですか?

分類Dev

VB.Net:右クリックでグループボックスを表示するにはどうすればよいですか?

分類Dev

2週間ごとにタスクのリマインダーをvb.netで作成するにはどうすればよいですか?

分類Dev

vb.netのグラフのデータポイントにカスタムラベルを配置するにはどうすればよいですか?

分類Dev

サーバーにWindowsアプリケーションvb2008とmysqlデータベースをセットアップし、クライアントでアクセスするにはどうすればよいですか?

分類Dev

VB6に.ocxファイルを登録するにはどうすればよいですか?

分類Dev

VB.NETで複数のデータベースのログインページを設計するにはどうすればよいですか

分類Dev

ボタンをカレンダーのプロパティにリダイレクトし、vb.netで選択した日付をテキストボックスに入力するにはどうすればよいですか?

分類Dev

データベースとテーブルがvb.netプロジェクトのSQLサーバーに存在するかどうかを確認するにはどうすればよいですか?

分類Dev

vb.netでリストボックスにアイテムを上下に追加するにはどうすればよいですか?

分類Dev

VB6のインデックス付きコントロールにイベントハンドラーを追加するにはどうすればよいですか?

分類Dev

vb.netのボタンクリックでdatagridviewセルが空かどうかを確認するにはどうすればよいですか?

分類Dev

VB.netプロジェクト内にテキストファイルを保存するにはどうすればよいですか?

分類Dev

VB.NETでタブページのインデックスを名前で取得するにはどうすればよいですか?

分類Dev

vb.netの資格情報を使用してリモートフォルダーにアクセスするにはどうすればよいですか?

分類Dev

VB.NETで動的に作成されたコントロールを管理するにはどうすればよいですか?

分類Dev

FTPサーバーで更新された唯一のファイルをVB.NETを使用してクライアントマシンに転送するにはどうすればよいですか?

分類Dev

VB.Net(Windowsフォーム)アプリケーション内にMVCタイプ(グローバル)コントローラーを実装するにはどうすればよいですか?

分類Dev

JSからVBにポストバック引数を渡すにはどうすればよいですか?

分類Dev

vb.netのrichtextboxコントロールで水平オーバーフローを許可するにはどうすればよいですか?

分類Dev

VB.NETのインターフェイスでイベントを処理するにはどうすればよいですか?

分類Dev

Visual StudioMacでVB.NETプロジェクトを作成するにはどうすればよいですか?

分類Dev

VB.Netを使用して、ポップアップメッセージボックスに含まれるコントロールのプロパティを取得するにはどうすればよいですか。

分類Dev

Visual Studio 2010 UltimateのVB.NETで「catchwithrethrow」ブロックのコードカバレッジを100%取得するにはどうすればよいですか?

Related 関連記事

  1. 1

    vb.netを使用する; スクロール可能なパネルでスクロールイベントをリッスンするにはどうすればよいですか?

  2. 2

    未処理の例外をvb.netクラスライブラリプロジェクトに記録するにはどうすればよいですか?

  3. 3

    vb.netでコントロールを動的に参照するにはどうすればよいですか?

  4. 4

    ユーザーがvb6.0プロジェクトソフトウェアからログアウトしたときにネットワークドライバーのマップを解除するにはどうすればよいですか?

  5. 5

    vb.netのフォームの任意の場所でマウスクリックを検出するにはどうすればよいですか?

  6. 6

    vb.netコードビハインドで作成されたドロップダウンリストにハイパーリンクを追加するにはどうすればよいですか?

  7. 7

    VB.Net:右クリックでグループボックスを表示するにはどうすればよいですか?

  8. 8

    2週間ごとにタスクのリマインダーをvb.netで作成するにはどうすればよいですか?

  9. 9

    vb.netのグラフのデータポイントにカスタムラベルを配置するにはどうすればよいですか?

  10. 10

    サーバーにWindowsアプリケーションvb2008とmysqlデータベースをセットアップし、クライアントでアクセスするにはどうすればよいですか?

  11. 11

    VB6に.ocxファイルを登録するにはどうすればよいですか?

  12. 12

    VB.NETで複数のデータベースのログインページを設計するにはどうすればよいですか

  13. 13

    ボタンをカレンダーのプロパティにリダイレクトし、vb.netで選択した日付をテキストボックスに入力するにはどうすればよいですか?

  14. 14

    データベースとテーブルがvb.netプロジェクトのSQLサーバーに存在するかどうかを確認するにはどうすればよいですか?

  15. 15

    vb.netでリストボックスにアイテムを上下に追加するにはどうすればよいですか?

  16. 16

    VB6のインデックス付きコントロールにイベントハンドラーを追加するにはどうすればよいですか?

  17. 17

    vb.netのボタンクリックでdatagridviewセルが空かどうかを確認するにはどうすればよいですか?

  18. 18

    VB.netプロジェクト内にテキストファイルを保存するにはどうすればよいですか?

  19. 19

    VB.NETでタブページのインデックスを名前で取得するにはどうすればよいですか?

  20. 20

    vb.netの資格情報を使用してリモートフォルダーにアクセスするにはどうすればよいですか?

  21. 21

    VB.NETで動的に作成されたコントロールを管理するにはどうすればよいですか?

  22. 22

    FTPサーバーで更新された唯一のファイルをVB.NETを使用してクライアントマシンに転送するにはどうすればよいですか?

  23. 23

    VB.Net(Windowsフォーム)アプリケーション内にMVCタイプ(グローバル)コントローラーを実装するにはどうすればよいですか?

  24. 24

    JSからVBにポストバック引数を渡すにはどうすればよいですか?

  25. 25

    vb.netのrichtextboxコントロールで水平オーバーフローを許可するにはどうすればよいですか?

  26. 26

    VB.NETのインターフェイスでイベントを処理するにはどうすればよいですか?

  27. 27

    Visual StudioMacでVB.NETプロジェクトを作成するにはどうすればよいですか?

  28. 28

    VB.Netを使用して、ポップアップメッセージボックスに含まれるコントロールのプロパティを取得するにはどうすればよいですか。

  29. 29

    Visual Studio 2010 UltimateのVB.NETで「catchwithrethrow」ブロックのコードカバレッジを100%取得するにはどうすればよいですか?

ホットタグ

アーカイブ