軽量のリモートサービスアプリケーション(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]
コメントを追加